From 15a2c9de01e9fe240ce134f8d379d5478d8d455d Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 17 Nov 2020 20:02:11 +0100 Subject: [PATCH 1/2] firefox update to 83.0 --- .../firefox/patches/avoid-redefinition.patch | 4 +- .../patches/fix-webrtc-glibcisms.patch | 4 +- srcpkgs/firefox/patches/qcms_neon.patch | 65 +++++++++++++++++++ srcpkgs/firefox/patches/sandbox-fork.patch | 4 +- srcpkgs/firefox/patches/wasm.patch | 62 ++++++++++++++++++ srcpkgs/firefox/template | 4 +- 6 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 srcpkgs/firefox/patches/qcms_neon.patch create mode 100644 srcpkgs/firefox/patches/wasm.patch diff --git a/srcpkgs/firefox/patches/avoid-redefinition.patch b/srcpkgs/firefox/patches/avoid-redefinition.patch index 0f17779c401..22eb8baa1b5 100644 --- a/srcpkgs/firefox/patches/avoid-redefinition.patch +++ b/srcpkgs/firefox/patches/avoid-redefinition.patch @@ -3,8 +3,8 @@ Reason: FF is mixing userspace net headers (net/if.h) and kernelspace ones (linux/if.h), leading to redefinitions. We need to include net/if.h before linux/if.h because linux/if.h has redifinition guards whereas net/if.h doesnt Upstream: No ---- media/mtransport/third_party/nICEr/src/stun/addrs-netlink.c.orig 2020-07-28 19:24:32.359751046 +0200 -+++ media/mtransport/third_party/nICEr/src/stun/addrs-netlink.c 2020-07-28 19:24:37.856343751 +0200 +--- dom/media/webrtc/transport/third_party/nICEr/src/stun/addrs-netlink.c.orig 2020-07-28 19:24:32.359751046 +0200 ++++ dom/media/webrtc/transport/third_party/nICEr/src/stun/addrs-netlink.c 2020-07-28 19:24:37.856343751 +0200 @@ -31,6 +31,7 @@ */ diff --git a/srcpkgs/firefox/patches/fix-webrtc-glibcisms.patch b/srcpkgs/firefox/patches/fix-webrtc-glibcisms.patch index cf895dd8448..e38d1b9dd8f 100644 --- a/srcpkgs/firefox/patches/fix-webrtc-glibcisms.patch +++ b/srcpkgs/firefox/patches/fix-webrtc-glibcisms.patch @@ -1,5 +1,5 @@ ---- media/webrtc/trunk/webrtc/system_wrappers/source/cpu_features_linux.c.orig 2019-01-29 11:20:52.298793223 +0100 -+++ media/webrtc/trunk/webrtc/system_wrappers/source/cpu_features_linux.c 2019-01-29 11:21:48.250250850 +0100 +--- third_party/libwebrtc/webrtc/system_wrappers/source/cpu_features_linux.c.orig 2019-01-29 11:20:52.298793223 +0100 ++++ third_party/libwebrtc/webrtc/system_wrappers/source/cpu_features_linux.c 2019-01-29 11:21:48.250250850 +0100 @@ -14,7 +14,7 @@ #ifndef __GLIBC_PREREQ #define __GLIBC_PREREQ(a, b) 0 diff --git a/srcpkgs/firefox/patches/qcms_neon.patch b/srcpkgs/firefox/patches/qcms_neon.patch new file mode 100644 index 00000000000..7b19e0c30f7 --- /dev/null +++ b/srcpkgs/firefox/patches/qcms_neon.patch @@ -0,0 +1,65 @@ +this is still experimental in rust-1.46 for arm and aarch64 + +--- gfx/qcms/src/lib.rs.orig 2020-11-17 22:03:09.868746869 +0100 ++++ gfx/qcms/src/lib.rs 2020-11-17 22:03:27.795605120 +0100 +@@ -47,8 +47,8 @@ + pub mod transform; + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + pub mod transform_avx; +-#[cfg(any(target_arch = "aarch64", target_arch = "arm"))] +-pub mod transform_neon; ++//#[cfg(any(target_arch = "aarch64", target_arch = "arm"))] ++//pub mod transform_neon; + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + pub mod transform_sse2; + pub mod transform_util; +--- gfx/qcms/src/transform.rs.orig 2020-11-17 22:15:03.413104913 +0100 ++++ gfx/qcms/src/transform.rs 2020-11-17 22:15:17.128996464 +0100 +@@ -21,11 +21,11 @@ + // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-#[cfg(any(target_arch = "arm", target_arch = "aarch64"))] +-use crate::transform_neon::{ +- qcms_transform_data_bgra_out_lut_neon, qcms_transform_data_rgb_out_lut_neon, +- qcms_transform_data_rgba_out_lut_neon, +-}; ++//#[cfg(any(target_arch = "arm", target_arch = "aarch64"))] ++//use crate::transform_neon::{ ++// qcms_transform_data_bgra_out_lut_neon, qcms_transform_data_rgb_out_lut_neon, ++// qcms_transform_data_rgba_out_lut_neon, ++//}; + use crate::{ + chain::qcms_chain_transform, + double_to_s15Fixed16Number, +@@ -1424,18 +1424,18 @@ + (*transform).transform_fn = Some(qcms_transform_data_bgra_out_lut_sse2) + } + } +- } else if cfg!(any(target_arch = "arm", target_arch = "aarch64")) && qcms_supports_neon +- { +- #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] +- { +- if in_type == QCMS_DATA_RGB_8 { +- (*transform).transform_fn = Some(qcms_transform_data_rgb_out_lut_neon) +- } else if in_type == QCMS_DATA_RGBA_8 { +- (*transform).transform_fn = Some(qcms_transform_data_rgba_out_lut_neon) +- } else if in_type == QCMS_DATA_BGRA_8 { +- (*transform).transform_fn = Some(qcms_transform_data_bgra_out_lut_neon) +- } +- } ++ // } else if cfg!(any(target_arch = "arm", target_arch = "aarch64")) && qcms_supports_neon ++ // { ++ // #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] ++ // { ++ // if in_type == QCMS_DATA_RGB_8 { ++ // (*transform).transform_fn = Some(qcms_transform_data_rgb_out_lut_neon) ++ // } else if in_type == QCMS_DATA_RGBA_8 { ++ // (*transform).transform_fn = Some(qcms_transform_data_rgba_out_lut_neon) ++ // } else if in_type == QCMS_DATA_BGRA_8 { ++ // (*transform).transform_fn = Some(qcms_transform_data_bgra_out_lut_neon) ++ // } ++ // } + } else if in_type == QCMS_DATA_RGB_8 { + (*transform).transform_fn = Some(qcms_transform_data_rgb_out_lut_precache) + } else if in_type == QCMS_DATA_RGBA_8 { diff --git a/srcpkgs/firefox/patches/sandbox-fork.patch b/srcpkgs/firefox/patches/sandbox-fork.patch index 72640cb7f70..8f7c9ab8201 100644 --- a/srcpkgs/firefox/patches/sandbox-fork.patch +++ b/srcpkgs/firefox/patches/sandbox-fork.patch @@ -2,12 +2,14 @@ make SYS_fork non-fatal, musl uses it for fork(2) --- security/sandbox/linux/SandboxFilter.cpp +++ security/sandbox/linux/SandboxFilter.cpp -@@ -1253,6 +1253,8 @@ +@@ -1420,6 +1420,10 @@ // usually do something reasonable on error. case __NR_clone: return ClonePolicy(Error(EPERM)); ++# ifdef __NR_fork + case __NR_fork: + return Error(ENOSYS); ++# endif # ifdef __NR_fadvise64 case __NR_fadvise64: diff --git a/srcpkgs/firefox/patches/wasm.patch b/srcpkgs/firefox/patches/wasm.patch new file mode 100644 index 00000000000..a905aaa1f96 --- /dev/null +++ b/srcpkgs/firefox/patches/wasm.patch @@ -0,0 +1,62 @@ +From 71597faac0fde4f608a60dd610d0cefac4972cc3 Mon Sep 17 00:00:00 2001 +From: Jonathan Wakely +Date: Tue, 17 Nov 2020 12:56:17 +0000 +Subject: [PATCH] Fix GCC build failure in WasmBaselineCompile.cpp + +GCC does not yet implement C++ Core DR 727, so explicit specializations +at class scope aren't allowed. This replaces it with a different C++17 +feature: using if-constexpr inside the function body and checking the +template argument there. + +See https://bugzilla.mozilla.org/show_bug.cgi?id=1677690 +and https://bugzilla.redhat.com/show_bug.cgi?id=1897675 +--- + js/src/wasm/WasmBaselineCompile.cpp | 24 ++++++++++-------------- + 1 file changed, 10 insertions(+), 14 deletions(-) + +diff --git a/js/src/wasm/WasmBaselineCompile.cpp b/js/src/wasm/WasmBaselineCompile.cpp +index 676dbfa73d33a..b82aa242d3c6b 100644 +--- js/src/wasm/WasmBaselineCompile.cpp ++++ js/src/wasm/WasmBaselineCompile.cpp +@@ -655,15 +655,13 @@ class BaseRegAlloc { + + template + bool hasFPU() { +- return availFPU.hasAny::value>(); +- } +- + #ifdef RABALDR_SIDEALLOC_V128 +- template <> +- bool hasFPU() { +- MOZ_CRASH("Should not happen"); +- } ++ if constexpr (t == MIRType::Simd128) ++ MOZ_CRASH("Should not happen"); ++ else + #endif ++ return availFPU.hasAny::value>(); ++ } + + bool isAvailableGPR(Register r) { return availGPR.has(r); } + +@@ -746,15 +744,13 @@ class BaseRegAlloc { + + template + FloatRegister allocFPU() { +- return availFPU.takeAny::value>(); +- } +- + #ifdef RABALDR_SIDEALLOC_V128 +- template <> +- FloatRegister allocFPU() { +- MOZ_CRASH("Should not happen"); +- } ++ if constexpr (t == MIRType::Simd128) ++ MOZ_CRASH("Should not happen"); ++ else + #endif ++ return availFPU.takeAny::value>(); ++ } + + void freeGPR(Register r) { availGPR.add(r); } + diff --git a/srcpkgs/firefox/template b/srcpkgs/firefox/template index 716d932356b..8383fcc952f 100644 --- a/srcpkgs/firefox/template +++ b/srcpkgs/firefox/template @@ -3,7 +3,7 @@ # THIS PKG MUST BE SYNCHRONIZED WITH "srcpkgs/firefox-i18n". # pkgname=firefox -version=82.0.3 +version=83.0 revision=1 build_helper="rust" short_desc="Mozilla Firefox web browser" @@ -11,7 +11,7 @@ maintainer="Johannes " license="MPL-2.0, GPL-2.0-or-later, LGPL-2.1-or-later" homepage="https://www.mozilla.org/firefox/" distfiles="${MOZILLA_SITE}/${pkgname}/releases/${version}/source/${pkgname}-${version}.source.tar.xz" -checksum=4df40aecf4b71107c4816db585bcd425f093123f29d8563bc2443a8659058691 +checksum=d69e84e8b8449f828683d274c24e03095858362bfed21b08bdd7fe715eea5398 lib32disabled=yes From e5159c29bbdf712f0083183fb791700085fac0ab Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 18 Nov 2020 22:07:47 +0100 Subject: [PATCH 2/2] firefox-i18n: update to 83.0. --- srcpkgs/firefox-i18n/template | 194 +++++++++++++++++----------------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/srcpkgs/firefox-i18n/template b/srcpkgs/firefox-i18n/template index f191a73a57e..2710c0df861 100644 --- a/srcpkgs/firefox-i18n/template +++ b/srcpkgs/firefox-i18n/template @@ -1,6 +1,6 @@ # Template file for 'firefox-i18n' pkgname=firefox-i18n -version=82.0.3 +version=83.0 revision=1 build_style=meta short_desc="Firefox language packs" @@ -140,99 +140,99 @@ _pkgtmpl() { } } -checksum="5514206e7f44214f3c39bca279f9bab57d0678d3de27179d3ce8c31cbd1993d0 - 4ef22df523a86b4a3d4c0727894f192a1d314250cddfe428f6a0aa7f3dc67349 - 0bda85b614cce9cff8d29f50f330abd467f5bedeeacc1060a83899a708f17977 - 2ce68308195cf7d323a6a1f0ba7afda77c641bee7a35b03d0413dd7759a676df - 26242521dde6b9506c38b1b6793b5b74523a6818af9b31bc809278ff8480ad63 - a7764763adcfce9a9ca7ff3ab23f0d3bcdb5eba681a20e16c169c90b29e902f4 - 9b87238a74b1ab3167db45576cb81f56c9f2caf99dc96d9cfb2d23b2c32f4149 - 98a22b059d5f2d8ff2c06736f41930141599af50489dce5e0d57af714f558fe8 - 9358d85e5872a6366f5fefc5aa273328f0d4bcea5c99116d24ce06855aa4b06a - 156da1b0a75f4aea7c22a5c7e01910c2ae69d9e5843c2cf70a009330c1f53a0a - 93232cccacf3b0dae4abffec9a034bdee079e5a15586ebb8442fbe1451c31cd0 - 25e1591c5b28966096f79a6136b89c11200a123bde1084e8b8b1fcda0659725f - 37328b286ea2c7183da9d23296c87b69327cdfdb24f3a88d97e2c81bd7fe8efe - fcce82357cf018c15f7d31cfd6dac98f7c5f4638003b60cd4d95ed4278e10bf5 - 6971ae4f97791864cc40ecd77f00b2037ccc8221ac4e72036408f5305b2e9b1c - ef0734f1d4d879d065dc390965f49a63fc96563a4b4b6e759ebb9c6c10389bf6 - 96e8c0be96a8f7274f5d704d352db772e36315310c2b1a645ad03584408f01bd - 4958880c3cee8c284fad069627deb252f9e2cd1a7cce39abd7136cb9102b8c08 - 0ce2126ebd227b4937c4d6979b4af9f3ea42d3e8c8b20338c5a33f158e13864c - 9ba2e4f71268acbf123cb64a82b23f8968dd106cce6b8ca623f25a389e2768f9 - c87fa995402ede4418955c4f0a048d9f3a28357c044715632bfba989bc88e89a - 50fa9eb50529937bfc2981f8e596aaf5212abac4215e4ba1e08f27d9941d1597 - 9996260d4f532528b556ff417ec47e271670c92bd6ce237ce4e9498f55e4be4a - 71ed166233bafaee3c1cfe8630d7a99f07143284aec192d6a89ba68b9573f1c4 - 2e60b360e5b48f3066dd7219b4614b969e65dbe18e7ac028e772d3044bb0395e - 28b66a552bc8a982d4a1858f8630a888a1127717ec76d3f88b5cca1f22fc4aa6 - 286695d8f356ef0dcfdde343c6923325cc6b4de08ca6f72ad6a8474d993ef6d1 - 773c5296fec3747e96207a541c080d48352171f87c25a99238356605cbbf9b94 - 4104565143301c94b39966a50fab71d57e458d9c501a73ea86d55af5d20c4246 - ef0a3f45d7ebd0087e37fd6080fdf1191a4b8bce88c1c9aa11c96ce5d53cffc1 - 63890546a50523c3a39fe53d55d85486cb06a09d80ce816aadc0c5b6173eca7b - ad2cf24f020eb718cc79bc14f57f5b6d37ffb837104b23183ea59680f664dbdf - 5ad2e0c759db2d0311a38b579c63309e6a27a86872bd3c67d30b76e133f3419f - dfbf8e4e1db766a44a77e9c496e04e5d780e62092630780fe4b42d371ec5cbe3 - 1b0c49c006862ffa5841b9b147a3b5bb5f3a4d29fbbc0e761c91e5491ff7944d - 676fcc1cdc12afb799a045b96ff5d1fdd8935dd58f4113b4c716fd4fa6f090ea - 2ea51c7d92d82a8442a4f5dd00bac42fc4254a287c4f0ecd21527befe348abef - 498f6b742347fbe072f3031aff5f3b25ca53b4128efdae42a72977f45986afa8 - e037c9ca7ef6daa1aecf5e9174cea8ae8b4089c3773625a2e8a857f9582a5d34 - 74b965ca5095d970e566d2afe3794a5394df0fad41791d37bd6933e417085225 - b346add39e55e8e42c1b25a492d98d038bfbca982c9ab7902886077e7452ebc2 - 99e07b0deaa86cd4da94ed145f733585caa54f8ee8f21f478a5493a1162fb46d - b5482baf0702bd02a7faac2ecb2c7bf8fa81802532c200f356aa0179a150e63a - d4a96870091db124bb895717b048affddad3c97bfb8496fe3699af34f9346455 - cd624e1b0c851fe5a19b7464edeb10abae3953956e290b847333f842c0e2c358 - 279f96954d82024af9d85a2d98a1b0a6ce35a41525aa0d1c98e24cc04a92521e - bbaf1cf4865f202d0a57be95f04a70d53688d19ca54ecf15532badba6d6f721e - a6f3a85aee1a35d17ca33d944f7f7888d80ed2a99e829a08e102398952421409 - de0e3efa4373d7c1d6b35ea5a604666cad6389e67098ab30db99553a9c85b45a - 97321d14c7cfe5da7f537b9c6a2e2a1ded32d1d3ccbd7b595364b34d39c71634 - 85ddf51aaec9b95f072f98c219e7b0940f2c06a436f7f77839dcb210c4b1378a - c9e495c629d21a841b0313c6e82b44153fbb811e3e133dec4a03135eb1dddd2e - 218e5e3781ac629490fd5c4bcfeb665a1699b7d847ae4fd5068470b193246c00 - aa51a3adfe854f1fd731b96ebff54624a0bb36ab315dede6abb9a7ee37cbb828 - f749e9b0330a0347d7ae0e2e9ff52d708586ed7caff20a2639a0b7516b0468cc - ab764f80572ca17cd2e9d868e400397f71cbdfc2451c7755878cefe2dcdb6db0 - 08083f5613e9b38d5fed37b19ec26bf006a1f25de9238068943b0eacac4ff848 - 2cd8a556b7ccacfe16559a472fb6ee2381516f94a56e96af79a8b53f27219cda - fbbbfeda3cdb3c876447bc69fe1bc66f19302b262b41a6c77540fd114b8a98bc - e5e3abef092369799cdf55b65a82011c2348daf236d85ddaaaa60d6e7bdd4e33 - f0c522fdc8bb316fb4fbe340ae762e1c16ce3d78d85094926278aea3daceef51 - a652c781e31b8164639e29e2f1ef13d7292d03022089d0983ee1f5f1934c2bf2 - a7e8d0aaafd06710f07312859f0f3cb46ff3444d4fd9aca57ca044c5a9050652 - 86c54f1260360febfa0bbcb58668402d9db13ed00a965a0a071c6c9ad93f2815 - dc3204e90558d2ac35505f0171f9d815e297a013e9c373b3b2b6b2e739461f78 - b187e008e022f88acd365f68cdc992ebc8f3100e46db3b89e0fa02cba311e98a - 069def30d7864b2452bc14a584c129f9dfe2f6a26fae296ea5cb2350dcc1bf81 - 4c7c2b92168b67eabe76e08fb9c27a60307aa61c61095de1d3af2bbe5d8780a7 - 64685394baec35ff9753c77eb70feac5f7806f03050f62ae6ef3ff74595d8839 - f99d66ff27975557bbe452d66292503534b898cc935ad1fd5017b9cd6ec1fd27 - c20e02c0e02e9549b4cce131ddc5f874b236fcde3ad672df11696b741465cd62 - 5632d1698dd6a9119bdd0be326ad1ef54e43cd5a9de1a5fb6b97ac31e5674e09 - 2738ea85d7e0404441d4391f806915399872606b1eded842e0358ad13349029b - ab2d8e45778a6bac60570798e344b8bc3fc016383b10f2af52be9e8232ddcd1f - dadab90e8d5ae5ad8898f6ad35123fc61a8f0c99c1fff2e09ba70b30ff65a06c - 50afef352f62f41d403bb45a1bdec5de94e904d5fc0dbc3f74d725014ff415bd - a13c05c8c4d212f1510d1e98c910ed3d1004e33ad5ea119b3208fa46ea130b56 - 1b2864463f7f78219553493fab07617cee6b1270464e96380e2094e0a48cba7a - 0913baf2eafcc3e84b7f92c8bdb63b9a4693759b392fa96314d6530df767c1de - 167c0780f7ca979b97946b4e061bc468a4148169e90ce9c4ff3191a53cfb0758 - f92d646eeffcfe4f7adebac6c9aa9efbdc2c7b24823a170cd27fff547288245a - 14866188eec0b40cf834b06ddfc2539d8f1185d55f157a8244216c1e0077877b - 7d1ad9233c6137420fe6de01c52ce72015fdf0e8a60f73b36579c47d104733ba - b93e5fdbd23520346d90d416dfc939cb8917d69e596c661a1985483c5f8e4b8f - 513834b39831fccfede23867ed86775c33996be3de7042e73bb5b6ffb340bb81 - 08ffee7c586bfed9113ffa489cacc7a260aff1df09047fdb1dd48ae6d48f0785 - 9a5854130f904b8596e53a3a4b77b4d595727603c99e8f24674b2a4de4c13f7c - c4308fb31233f5c2430ceb760727bd506d3e8ccfbe5b14fe5700a0c1590799de - f4813aad53de25676e87a3a811b1037603a83c064485ccfd97234b08c53e45e0 - fcda650744c1522f44d9c0f27a22e489662f8070c7156179771cf0f373ca5086 - 6ab8fd80a01eeff038cdc2bd4252575dbc5ba39e189982b97bb2f6080f337608 - 4831cd2df36d59e8e7cfe584dbe25991186ec5b90b114c78c05db91329b7f522 - f07ce9c2d27937e29c25efef5f13191b611e6556c26fc4b449add4f4410ffffa - 6e61751d1a55a6386c27cc6f038e292876064db21f317a5c77a2717f7d46faec - 562ced1cd3f33057919280cf370d390958abbdbe210aa772d5bb57250e4792a6 - 1ba33e2383e582a04c8a6979c80ed450403273944fe1adb1d43cae4e29ad1662" +checksum="e8dcb0ec4400349637b1f333012a4df729080cd5fbdb7478414fc53875b54d16 + e43201660ea435d2b9c9059c012e86514e9c9a20890131847a9f39206b23f657 + a6f12f990523adf3eccbcae2c71f32f8499682f4672d902763c8eb53da450653 + c68247fab37710876f19e6ad5c5a3372b74f24805512c0d99b0b3d6a5590a733 + f8498364d19f34bdf4b34bace6683baf17854975040dfef0e4d88c7eecb2223b + 7f8a503eb25f7960efdc00cc70d4ce4493eec898051e5d2394914925b10a5093 + b733dfa35006b1dca5c82c8945345b0ddf9a8ed653da0b3d65cebacb52cc68a0 + d3aabab8b4dc6ce7c93295f05fb438ba0802435ad963a68947d87e10f8a8bf82 + f73791ddb70e0dd817d5a5b2171cd2f731482eec2c3260023b66699e562fcab9 + a19aa3cb4a08c33ef27493a2e8e4f139b9fbe1c685a2eb6b9c1a8d65fb826854 + 6143acdde106ce3741ff3e9a8728ed9b0b862c86791502803761271ab39c7fdf + 5f99d37dd82f43ffb87110cd531cbbb18d9626747cf7734037bb12b3e8142487 + 11b39e02beb72dc43172a223a51404cd44802017b99ddcae2dcd015f976ecf73 + ba524fbd87c9d2c8202ad5d813f06a37bf663fafec9672a1c1fef081b7b80878 + 2261f199e1f871b2f1f9002e246d66c9daf5abb7663e7e5397acd3d68004dce9 + e0a8adbf1d3016b43e6cf6bc4b3dc3968815b42ddd437bc5663990ef8fde2145 + 8089bc2fb7529b20cbed40e0ecd8945cbf03942207d1e0fbdd1a1dab117c56da + 0abf6811aa5cdb17ea711f9942c0ec31960ab2888d5f444d0352f5ba605ec6de + 3be1ca38db44e1dfe9498d8ef9aef03c0249540385569d4b96ab703ea0d11dad + 7b7ca80ffa8836c8bfa3af5bdc5a0ecef7829abbcdf0f2a7459b7b456d7b385b + 9cbba55711a62cb017e0cfaf74158956e39ef2b5912e50b28ad52eec56032509 + aa0337945a17ddce4e0b67f86a7f92596daf890995a63fdbe9d7f0a1c3cf00b6 + 02ab1b80c16f8eea11a51fe155eebb48799dff08e6369c51ac7195a78ce2a5f4 + 0a5433ab6abb9d6d57feeb6f437c560afd312cd450ec784b4a68a9e9f3c9bd2b + 16334002a2a3c42890547101c35bc7eb64bd220704241475abc4f975e242a42d + 3dac17dde3583cbfcf1e8e62a03e6c5844769a2a5b3d6d2256a9c726cf64b9c7 + c5d974818cfeeaf54a4126270c8867bd5f9164395c0952bbc5050b5bad3ad891 + 0da793b3d786c2073e5230f8110f855e302b71eb1e6c20273e01d15627750ecb + d457f4a168e39bf32ae49388cb9c4acb65eeba898669d4cf024d0782117018d8 + 90081533700831a47d1a8a9f801284269fc8102325294e9c5b9a6ca9f81fb2c6 + 189305fc3ab8627fc2799ab987b6dc5b6508ecbc49490a008c9548559b75e3cd + 70ec3f2c542a50ed2ba97943a55d121af05beb84dca9a6b0e3a8697c645b20b7 + 0d0f882d7b1c99ecb4375f07a6ac442ce04214e1692f879df0f8f472203655c1 + 8d9a8acbb05c4f691a3056069828a893bb9491f48cc235ce200316ac505370bd + 6fa3d4de1b3732601a64743a48411904b0eddb3feeb25f4ce7318ea4991cbc21 + 3bb0201f8ff0ce84cd1968b6e7151db7f526ffdad93eab36f50acd92f18a55d2 + 838e2a7f62edd74b4167b08ae11f13bd8b48964524500534b8dda7dc705d8f3f + 4905047d278100d0b72955e896a6c1f3cc093a52f73e8943b7eaafd05f04e5ae + 31f07b11c9a5348ea4a3f2c3b6e9068c0284b86de158c2bedcc0340f31ef3000 + 17fe88532c0c1712c5905341fe0a7fb6f1383a9b2574e0032b99738aeff9dd66 + 6cc9d24ef3d883acd1751f537497b0ed5f066de5ee5fc5af03d820a9eeae35bc + 9171e1594b89d47da9ee00bd5bbe06868532e0ef2edb7434af4fd3424e090998 + 00d77a69ef4c83ede3264a5214b52bc65c5706fa5185e1371c557cc15684b2e8 + 8224953de8e38141bb32e47d2f76ddca38d30c02e91df8f8122d879cd37300e4 + 5915395bd9697794c015505b0c3a3b2eea5f745a8adcba71589878d93700db76 + 46b9dff874c6d112985548f72da8c32508c61bd690c7403ddfc85fa2156657d2 + 48373d636158147b34a8b18639339f413b718bc5185ac5b487f699598c674aee + 34f74360dc392e736e62ef3d121b7bed9fffc6b2196d27f57a6b136528a35d0b + c8161bef9de35a5b3a976f50ec6b10767614768b97137174dee4b3d151e9a305 + b7dc7748700175786f7035608fa0eb04eae7dfe32515d955f7bde11e0bae3ea1 + 14d3bdd086fecbcc90fededf60253cae9190849ecd077e46df66a460859428a5 + 0b8a38c915d8671638fe179a2719c15f8692700d102db373db5c1cf2a8bd0f5f + a8dabc3940132c08a04017450720b257fd3f27ae3d1ea45a9d0eec1353212697 + 33f51f9389556ce6c8b7a76024f0bc79482abe720e46133200996e927c5f4c7c + 06c4ad53c6ed67b495afbe8d0a684d8fe3663c8c5a09c752891a1f8d423099bd + a2dd11f167c2a4c4a1e034429f58c738bdc692c50f0fb33ebba3a932bb43a6cc + 35af53ee5ee7759cc585f357b67abdc21742c9d86a01442d961f6771097e0955 + b7adf74ec9120aa5ca7b50a0a5226d81e4d8a31081143f6ce59f1a338ae1243f + ae106240d1755965de216251418afce510493b605a2af6c26de5dbc751e4f3f1 + 9de8866f563402f80c92eabc9e654df4f007544303d0630acdadca6502e90144 + d638039dd93a7d2de4413fb31f2262055730a8ae3bf31e6a59a7f69457eb2a35 + d62dd2ed3c450034d1046c6b2e77ee0fefa0527b3ca9ad1c40d64914f3cd8e2f + c99c0f52797ef4cfa30189b7298c3f897da67d09eca63cce9bf8e3f0ca8a7bfb + 42f07cbec3786531f4d77878476f3cccb4313f5af5c7652007f0da8922657e03 + b9dbffbcd7ecb2e1b2cf49632c11c05cc5616cf80b61ef6dd42207c95b3aec80 + b5845bce6f501e7dd6e6cc37fb97de541d8c5c6457b760b6848033c863ccbda4 + 08704f830640d156288dc0e5af77b03279b4ca82536f464518b14c5cde1671cb + 20ae693e61e8daefa77c24c29d4fd2347ab71297cc9b0e3b716d00446b640db7 + c9f69c490740523e2b18205fc894c343444b8a04e1e76fa2bdce768f39f9e7ea + 0af926f8c33f3a6b73eaa43513737f7634c56f0673c8f0adfa9fc089d5331cc3 + 0a0accddc498ac7b758bd0edb50f4d3ceac230f01f5c19162e1d6819589f35ba + b997885fe3097eaca6f23415e41150728a151459cc44fde19d663ffc217a3594 + 263468524dee870b00cc6054b6c537d1995ede6041be6f3351b959b13de81c56 + ab8977b2722001685de28a002b16b0054f1bab1a077c37c7b0281052eeaedc1f + 3261948ebaad55b46371430b42504c653340ed7218c0c7c0256f12028375bdd5 + 83699712c49002716e474335a96b0b5e640b9e5f2d1db89c0bcfe1551fb8d0e9 + e3d4b408a8a4a481d29089a070947e7b2693d97c1c12b5f78c6bc08ee6ab0baf + 83c8c34c30e6466affaa0a272adc7e75c2faa5f5179ae389525ff1aa79c4ecee + 96bdaeb88dbc44aa7e288eb5803775001c12b1829e91e0f0eb63b44aa774b469 + b3dcc7700d15d5d30fe5bab74ae8e4c3467c2a22e6201eeb10a5a79138ed0075 + 0a94c7ce16f7c0cdab3ae0b27cd8ced6875c09d7987e5e68297a1af77d64195f + 94518e0f9e0a2f8e9322d40ca6de2e31ad24eee98eb4beb4551b10c404973275 + 0fe317dcad1bb745116876ff2dc72b50195c668ac88f2dd837c7ff14a35dc1de + 3a6e27019b697c77a3d1b031ebbe05bd0970834d9e9fd384984047001bc8306c + ac957380d3d87da171980516dc308b7dde903d86fa9506b409297f07825c4860 + a7a5df97fe466fc2691d6ba2327df972c15119c78d37d418bd0211dc53285e7b + e41f529f5fa62c2048cdffd0a671e987f51b62e9978ca50d01d78ced4212dca8 + 765e962f4fbc2addcd3a9487de5521358bf5802d92621654b93d510023123eb9 + 0b31e67f55d6f470fa80572678ed6be1700bbe159ca4835faf693a510e1b089c + f5b3f23b8894f6f1268b04d3ce748f6ba0a7f5a56e9a10cac9c8ea840fe6148a + cf15d22f75c77738cd6ba0163ba91d896781ba4ac1e4fd2c1e75d097d458aa12 + 1d8f651cefbbc736af1cd4493eee08159eafeb03ec1fad09e3fd63ca4989afc0 + e45d53f2ab6cc43b4ce084d2a53bd73e4bb56b636936a42c3288ac3b75856c66 + bfecd3e86df2249757a6ea1b14c9ea73384a813f1650a022a95547eaa5e78432 + bbe62efc388950f5a66042f6fb6e075a7920f1a1ed690a705551bee60ff17af4 + a0125e034dd9a495edfd8bf829d057f1a0d5011d1d86fa63ace6339ec5f0ec17"