From 3aef522f5a12712fe3e175ded007caec07909d8a Mon Sep 17 00:00:00 2001 From: Pascal Huber Date: Wed, 26 Apr 2023 12:09:15 +0200 Subject: [PATCH 1/2] thunderbird: update to 102.12.0 --- .../thunderbird/patches/flac-no-ffvpx.patch | 3 +- srcpkgs/thunderbird/patches/lto-thin.patch | 21 +- srcpkgs/thunderbird/patches/mallinfo.patch | 24 +- srcpkgs/thunderbird/patches/python3.11.patch | 238 ------------------ .../thunderbird/patches/rust-configure.patch | 20 +- .../thunderbird/patches/sandbox-fork.patch | 11 +- srcpkgs/thunderbird/template | 6 +- 7 files changed, 47 insertions(+), 276 deletions(-) delete mode 100644 srcpkgs/thunderbird/patches/python3.11.patch diff --git a/srcpkgs/thunderbird/patches/flac-no-ffvpx.patch b/srcpkgs/thunderbird/patches/flac-no-ffvpx.patch index ebf48deb9720..2e475e8c6940 100644 --- a/srcpkgs/thunderbird/patches/flac-no-ffvpx.patch +++ b/srcpkgs/thunderbird/patches/flac-no-ffvpx.patch @@ -12,7 +12,7 @@ index 53fc3c9937f7..b23771ab80fa 100644 namespace mozilla { -@@ -14,6 +15,10 @@ namespace mozilla { +@@ -14,5 +15,9 @@ namespace mozilla { bool FlacDecoder::IsEnabled() { #ifdef MOZ_FFVPX return StaticPrefs::media_flac_enabled(); @@ -21,5 +21,4 @@ index 53fc3c9937f7..b23771ab80fa 100644 + return StaticPrefs::media_flac_enabled() && + platform->SupportsMimeType("audio/flac"_ns); #else - // Until bug 1295886 is fixed. return false; diff --git a/srcpkgs/thunderbird/patches/lto-thin.patch b/srcpkgs/thunderbird/patches/lto-thin.patch index e85cbce36583..17cd0a5e9458 100644 --- a/srcpkgs/thunderbird/patches/lto-thin.patch +++ b/srcpkgs/thunderbird/patches/lto-thin.patch @@ -1,15 +1,18 @@ -$OpenBSD: patch-config_makefiles_rust_mk,v 1.6 2021/01/26 15:52:58 landry Exp $ +This patch is a modified version of the OpenBSD patch -use lto=thin to reduce memory pressure when building gkrust +try to consume less memory when linking gkrust with debug symbols ? + +openbsd patch: https://github.com/openbsd/ports/blob/master/mail/mozilla-thunderbird/patches/patch-config_makefiles_rust_mk https://bugzilla.mozilla.org/show_bug.cgi?id=1644409 https://bugzilla.mozilla.org/show_bug.cgi?id=1640982 - -Index: config/makefiles/rust.mk ---- a/config/makefiles/rust.mk.orig -+++ a/config/makefiles/rust.mk -@@ -70,7 +70,8 @@ ifndef MOZ_DEBUG_RUST - # gkrust_gtest. And not when doing cross-language LTO. - ifndef MOZ_LTO_RUST_CROSS +--- +diff --git a/config/makefiles/rust.mk b/config/makefiles/rust.mk +index a243ee5f7f..89593f1fe1 100644 +--- a/config/makefiles/rust.mk ++++ b/config/makefiles/rust.mk +@@ -90,7 +90,8 @@ ifndef rustflags_sancov + # Never enable when coverage is enabled to work around https://github.com/rust-lang/rust/issues/90045. + ifndef MOZ_CODE_COVERAGE ifeq (,$(findstring gkrust_gtest,$(RUST_LIBRARY_FILE))) -cargo_rustc_flags += -Clto +cargo_rustc_flags += -Clto=thin diff --git a/srcpkgs/thunderbird/patches/mallinfo.patch b/srcpkgs/thunderbird/patches/mallinfo.patch index 0d704301f39f..a3b3e1cb53ac 100644 --- a/srcpkgs/thunderbird/patches/mallinfo.patch +++ b/srcpkgs/thunderbird/patches/mallinfo.patch @@ -1,14 +1,16 @@ ---- a/xpcom/base/nsMemoryReporterManager.cpp 2019-03-19 17:12:20.844810044 +0100 -+++ b/xpcom/base/nsMemoryReporterManager.cpp 2019-03-19 17:13:32.505133615 +0100 -@@ -123,6 +123,7 @@ - return GetProcSelfSmapsPrivate(aN); +diff --git a/xpcom/base/nsMemoryReporterManager.cpp b/xpcom/base/nsMemoryReporterManager.cpp +index 30bc60e01a..caf9f740d2 100644 +--- a/xpcom/base/nsMemoryReporterManager.cpp ++++ b/xpcom/base/nsMemoryReporterManager.cpp +@@ -127,6 +127,7 @@ using namespace dom; + return GetProcSelfSmapsPrivate(aN, aPid); } +#ifdef __GLIBC__ # ifdef HAVE_MALLINFO # define HAVE_SYSTEM_HEAP_REPORTER 1 - static MOZ_MUST_USE nsresult SystemHeapSize(int64_t* aSizeOut) { -@@ -142,6 +143,7 @@ + [[nodiscard]] static nsresult SystemHeapSize(int64_t* aSizeOut) { +@@ -146,6 +147,7 @@ using namespace dom; return NS_OK; } # endif @@ -16,16 +18,16 @@ #elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || \ defined(__OpenBSD__) || defined(__FreeBSD_kernel__) -@@ -642,6 +644,7 @@ +@@ -653,6 +655,7 @@ static bool InSharedRegion(mach_vm_address_t aAddr, cpu_type_t aType) { return NS_OK; } +#ifdef __GLIBC__ # define HAVE_SYSTEM_HEAP_REPORTER 1 - // Windows can have multiple separate heaps. During testing there were multiple - // heaps present but the non-default ones had sizes no more than a few 10s of -@@ -698,6 +701,7 @@ - *aSizeOut = heapsSize; + // Windows can have multiple separate heaps, but we should not touch non-default + // heaps because they may be destroyed at anytime while we hold a handle. So we +@@ -685,6 +688,7 @@ static bool InSharedRegion(mach_vm_address_t aAddr, cpu_type_t aType) { + *aSizeOut = heapSize; return NS_OK; } +#endif // __GLIBC__ diff --git a/srcpkgs/thunderbird/patches/python3.11.patch b/srcpkgs/thunderbird/patches/python3.11.patch deleted file mode 100644 index 2facee5ebb2b..000000000000 --- a/srcpkgs/thunderbird/patches/python3.11.patch +++ /dev/null @@ -1,238 +0,0 @@ -Patch-Source: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=267709 -Patch-Source: https://hg.mozilla.org/mozilla-central/rev/f54162b2c1f2fe52c6137ab2c3469a1944f58b27 ---- a/xpcom/idl-parser/xpidl/xpidl.py -+++ b/xpcom/idl-parser/xpidl/xpidl.py -@@ -1633,13 +1633,13 @@ class IDLParser(object): - t_ignore = " \t" - - def t_multilinecomment(self, t): -- r"/\*(?s).*?\*/" -+ r"/\*(\n|.)*?\*/" - t.lexer.lineno += t.value.count("\n") - if t.value.startswith("/**"): - self._doccomments.append(t.value) - - def t_singlelinecomment(self, t): -- r"(?m)//.*?$" -+ r"//[^\n]*" - - def t_IID(self, t): - return t -@@ -1652,7 +1652,7 @@ class IDLParser(object): - return t - - def t_LCDATA(self, t): -- r"(?s)%\{[ ]*C\+\+[ ]*\n(?P.*?\n?)%\}[ ]*(C\+\+)?" -+ r"%\{[ ]*C\+\+[ ]*\n(?P(\n|.)*?\n?)%\}[ ]*(C\+\+)?" - t.type = "CDATA" - t.value = t.lexer.lexmatch.group("cdata") - t.lexer.lineno += t.value.count("\n") - - -# HG changeset patch -# User ahochheiden -# Date 1654151264 0 -# Node ID f54162b2c1f2fe52c6137ab2c3469a1944f58b27 -# Parent 6e7776492240c27732840d65a33dcc440fa1aba0 -Bug 1769631 - Remove 'U' from 'mode' parameters for various 'open' calls to ensure Python3.11 compatibility r=firefox-build-system-reviewers,glandium - -The 'U' flag represents "universal newline". It has been deprecated -since Python3.3. Since then "universal newline" is the default when a -file is opened in text mode (not bytes). In Python3.11 using the 'U' -flag throws errors. There should be no harm in removing 'U' from 'open' -everywhere it is used, and doing allows the use of Python3.11. - -For more reading see: https://docs.python.org/3.11/whatsnew/3.11.html#changes-in-the-python-api - -Differential Revision: https://phabricator.services.mozilla.com/D147721 - -diff --git a/dom/base/usecounters.py b/dom/base/usecounters.py ---- a/dom/base/usecounters.py -+++ b/dom/base/usecounters.py -@@ -3,17 +3,17 @@ - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - - import collections - import re - - - def read_conf(conf_filename): - # Can't read/write from a single StringIO, so make a new one for reading. -- stream = open(conf_filename, "rU") -+ stream = open(conf_filename, "r") - - def parse_counters(stream): - for line_num, line in enumerate(stream): - line = line.rstrip("\n") - if not line or line.startswith("//"): - # empty line or comment - continue - m = re.match(r"method ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$", line) -diff --git a/python/mozbuild/mozbuild/action/process_define_files.py b/python/mozbuild/mozbuild/action/process_define_files.py ---- a/python/mozbuild/mozbuild/action/process_define_files.py -+++ b/python/mozbuild/mozbuild/action/process_define_files.py -@@ -31,17 +31,17 @@ def process_define_file(output, input): - - config = PartialConfigEnvironment(topobjdir) - - if mozpath.basedir( - path, [mozpath.join(topsrcdir, "js/src")] - ) and not config.substs.get("JS_STANDALONE"): - config = PartialConfigEnvironment(mozpath.join(topobjdir, "js", "src")) - -- with open(path, "rU") as input: -+ with open(path, "r") as input: - r = re.compile( - "^\s*#\s*(?P[a-z]+)(?:\s+(?P\S+)(?:\s+(?P\S+))?)?", re.U - ) - for l in input: - m = r.match(l) - if m: - cmd = m.group("cmd") - name = m.group("name") -diff --git a/python/mozbuild/mozbuild/backend/base.py b/python/mozbuild/mozbuild/backend/base.py ---- a/python/mozbuild/mozbuild/backend/base.py -+++ b/python/mozbuild/mozbuild/backend/base.py -@@ -267,17 +267,17 @@ class BuildBackend(LoggingMixin): - If an exception is raised, |mach build| will fail with a - non-zero exit code. - """ - self._write_purgecaches(config) - - return status - - @contextmanager -- def _write_file(self, path=None, fh=None, readmode="rU"): -+ def _write_file(self, path=None, fh=None, readmode="r"): - """Context manager to write a file. - - This is a glorified wrapper around FileAvoidWrite with integration to - update the summary data on this instance. - - Example usage: - - with self._write_file('foo.txt') as fh: -diff --git a/python/mozbuild/mozbuild/preprocessor.py b/python/mozbuild/mozbuild/preprocessor.py ---- a/python/mozbuild/mozbuild/preprocessor.py -+++ b/python/mozbuild/mozbuild/preprocessor.py -@@ -526,17 +526,17 @@ class Preprocessor: - if not options.output: - raise Preprocessor.Error( - self, "--depend doesn't work with stdout", None - ) - depfile = get_output_file(options.depend) - - if args: - for f in args: -- with io.open(f, "rU", encoding="utf-8") as input: -+ with io.open(f, "r", encoding="utf-8") as input: - self.processFile(input=input, output=out) - if depfile: - mk = Makefile() - mk.create_rule([six.ensure_text(options.output)]).add_dependencies( - self.includes - ) - mk.dump(depfile) - depfile.close() -@@ -855,17 +855,17 @@ class Preprocessor: - self.checkLineNumbers = False - if isName: - try: - args = _to_text(args) - if filters: - args = self.applyFilters(args) - if not os.path.isabs(args): - args = os.path.join(self.curdir, args) -- args = io.open(args, "rU", encoding="utf-8") -+ args = io.open(args, "r", encoding="utf-8") - except Preprocessor.Error: - raise - except Exception: - raise Preprocessor.Error(self, "FILE_NOT_FOUND", _to_text(args)) - self.checkLineNumbers = bool( - re.search("\.(js|jsm|java|webidl)(?:\.in)?$", args.name) - ) - oldFile = self.context["FILE"] -@@ -909,17 +909,17 @@ class Preprocessor: - - def do_error(self, args): - raise Preprocessor.Error(self, "Error: ", _to_text(args)) - - - def preprocess(includes=[sys.stdin], defines={}, output=sys.stdout, marker="#"): - pp = Preprocessor(defines=defines, marker=marker) - for f in includes: -- with io.open(f, "rU", encoding="utf-8") as input: -+ with io.open(f, "r", encoding="utf-8") as input: - pp.processFile(input=input, output=output) - return pp.includes - - - # Keep this module independently executable. - if __name__ == "__main__": - pp = Preprocessor() - pp.handleCommandLine(None, True) -diff --git a/python/mozbuild/mozbuild/util.py b/python/mozbuild/mozbuild/util.py ---- a/python/mozbuild/mozbuild/util.py -+++ b/python/mozbuild/mozbuild/util.py -@@ -231,17 +231,17 @@ class FileAvoidWrite(BytesIO): - enabled by default because it a) doesn't make sense for binary files b) - could add unwanted overhead to calls. - - Additionally, there is dry run mode where the file is not actually written - out, but reports whether the file was existing and would have been updated - still occur, as well as diff capture if requested. - """ - -- def __init__(self, filename, capture_diff=False, dry_run=False, readmode="rU"): -+ def __init__(self, filename, capture_diff=False, dry_run=False, readmode="r"): - BytesIO.__init__(self) - self.name = filename - assert type(capture_diff) == bool - assert type(dry_run) == bool - assert "r" in readmode - self._capture_diff = capture_diff - self._write_to_file = not dry_run - self.diff = None -diff --git a/python/mozbuild/mozpack/files.py b/python/mozbuild/mozpack/files.py ---- a/python/mozbuild/mozpack/files.py -+++ b/python/mozbuild/mozpack/files.py -@@ -549,17 +549,17 @@ class PreprocessedFile(BaseFile): - self.defines = defines - self.extra_depends = list(extra_depends or []) - self.silence_missing_directive_warnings = silence_missing_directive_warnings - - def inputs(self): - pp = Preprocessor(defines=self.defines, marker=self.marker) - pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings) - -- with _open(self.path, "rU") as input: -+ with _open(self.path, "r") as input: - with _open(os.devnull, "w") as output: - pp.processFile(input=input, output=output) - - # This always yields at least self.path. - return pp.includes - - def copy(self, dest, skip_if_older=True): - """ -@@ -606,17 +606,17 @@ class PreprocessedFile(BaseFile): - return False - - deps_out = None - if self.depfile: - deps_out = FileAvoidWrite(self.depfile) - pp = Preprocessor(defines=self.defines, marker=self.marker) - pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings) - -- with _open(self.path, "rU") as input: -+ with _open(self.path, "r") as input: - pp.processFile(input=input, output=dest, depfile=deps_out) - - dest.close() - if self.depfile: - deps_out.close() - - return True - - diff --git a/srcpkgs/thunderbird/patches/rust-configure.patch b/srcpkgs/thunderbird/patches/rust-configure.patch index 61fb2ba891d9..b5ff2987008c 100644 --- a/srcpkgs/thunderbird/patches/rust-configure.patch +++ b/srcpkgs/thunderbird/patches/rust-configure.patch @@ -6,9 +6,11 @@ instead use what is set in RUST_TARGET Skip extra checks on cross builds (broken for arm*) ---- a/build/moz.configure/rust.configure 2020-12-12 01:35:33.000000000 +0100 -+++ b/build/moz.configure/rust.configure 2020-12-15 19:45:16.467750787 +0100 -@@ -91,9 +91,6 @@ +diff --git a/build/moz.configure/rust.configure b/build/moz.configure/rust.configure +index e64dc5d5ec..c4778f8cc8 100644 +--- a/build/moz.configure/rust.configure ++++ b/build/moz.configure/rust.configure +@@ -91,9 +91,6 @@ def unwrap_rustup(prog, name): return unwrap @@ -18,7 +20,7 @@ Skip extra checks on cross builds (broken for arm*) set_config("CARGO", cargo) set_config("RUSTC", rustc) -@@ -260,7 +257,9 @@ +@@ -274,7 +271,9 @@ def rust_supported_targets(rustc): data.setdefault(key, []).append(namespace(rust_target=t, target=info)) return data @@ -29,24 +31,26 @@ Skip extra checks on cross builds (broken for arm*) def detect_rustc_target( host_or_target, compiler_info, arm_target, rust_supported_targets ): -@@ -382,12 +381,12 @@ +@@ -396,12 +395,14 @@ def detect_rustc_target( return None - rustc_target = find_candidate(candidates) + rustc_target = os.environ['RUST_TARGET'] ++ if rustc_target is None: die("Don't know how to translate {} for rustc".format(host_or_target.alias)) - return rustc_target + return ensure_unicode(rustc_target, system_encoding) ++ @imports("os") -@@ -410,35 +409,6 @@ +@@ -423,35 +424,6 @@ def assert_rust_compile(host_or_target, rustc_target, rustc): - os.write(in_fd, ensure_binary(source)) + os.write(in_fd, source) os.close(in_fd) - - cmd = [ @@ -80,7 +84,7 @@ Skip extra checks on cross builds (broken for arm*) finally: os.remove(in_path) os.remove(out_path) -@@ -462,28 +432,7 @@ +@@ -475,28 +447,7 @@ def rust_host_triple( host, compiler_info, arm_target, rust_supported_targets ) if rustc_target != rustc_host: diff --git a/srcpkgs/thunderbird/patches/sandbox-fork.patch b/srcpkgs/thunderbird/patches/sandbox-fork.patch index d4584e74b91c..a8cb89394f87 100644 --- a/srcpkgs/thunderbird/patches/sandbox-fork.patch +++ b/srcpkgs/thunderbird/patches/sandbox-fork.patch @@ -1,8 +1,8 @@ -make SYS_fork non-fatal, musl uses it for fork(2) - +diff --git a/security/sandbox/linux/SandboxFilter.cpp b/security/sandbox/linux/SandboxFilter.cpp +index 20e9b59685..e053580992 100644 --- a/security/sandbox/linux/SandboxFilter.cpp +++ b/security/sandbox/linux/SandboxFilter.cpp -@@ -1420,6 +1420,10 @@ +@@ -1598,6 +1598,11 @@ class ContentSandboxPolicy : public SandboxPolicyCommon { // usually do something reasonable on error. case __NR_clone: return ClonePolicy(Error(EPERM)); @@ -10,6 +10,7 @@ make SYS_fork non-fatal, musl uses it for fork(2) + case __NR_fork: + return Error(ENOSYS); +# endif ++ - # ifdef __NR_fadvise64 - case __NR_fadvise64: + case __NR_clone3: + return Error(ENOSYS); diff --git a/srcpkgs/thunderbird/template b/srcpkgs/thunderbird/template index ec3fa3d4c35f..b388649dd835 100644 --- a/srcpkgs/thunderbird/template +++ b/srcpkgs/thunderbird/template @@ -3,15 +3,15 @@ # THIS PKG MUST BE SYNCHRONIZED WITH "srcpkgs/thunderbird-i18n". # pkgname=thunderbird -version=102.6.1 -revision=3 +version=102.12.0 +revision=1 build_helper="rust" short_desc="Standalone Mail/News reader" maintainer="Érico Nogueira " license="MPL-2.0, GPL-2.0-or-later, LGPL-2.1-or-later" homepage="https://www.thunderbird.net/" distfiles="${MOZILLA_SITE}/${pkgname}/releases/${version}/source/${pkgname}-${version}.source.tar.xz" -checksum=8b8cb5d7532ad8ee65061d2f284ae9f0470e7614dfcfc3c37ca945bcb96d1183 +checksum=5aa776b75dd47e77303185033c2c443a425488d28ced5c6e29e5bd64e7ac5afe lib32disabled=yes From cbeb82887483a607bec8bf5b3b27f614c3ef1e27 Mon Sep 17 00:00:00 2001 From: Pascal Huber Date: Wed, 26 Apr 2023 12:09:25 +0200 Subject: [PATCH 2/2] thunderbird-i18n: udpate to 102.12.0 --- srcpkgs/thunderbird-i18n/template | 135 +++++++++++++++--------------- 1 file changed, 67 insertions(+), 68 deletions(-) diff --git a/srcpkgs/thunderbird-i18n/template b/srcpkgs/thunderbird-i18n/template index 17830bddd777..c96f6f44176e 100644 --- a/srcpkgs/thunderbird-i18n/template +++ b/srcpkgs/thunderbird-i18n/template @@ -1,6 +1,6 @@ # Template file for 'thunderbird-i18n' pkgname=thunderbird-i18n -version=102.6.1 +version=102.12.0 revision=1 build_style=meta short_desc="Thunderbird language packs" @@ -106,70 +106,69 @@ _pkgtmpl() { usr/lib/thunderbird/extensions langpack-${_lang}@thunderbird.mozilla.org.xpi } } - -checksum="5935be82bcbd313b58520d95b04dc32c462e47df88f9724bb31b21686f8b4b77 - 142c0bd4d67b03320db94ae8002c8d67d9bc481a7ad728efa17ba7ae09e9a971 - 5547af80c73146c9892ad2dcd7fb5c6616c9a3a5b49868a23f03914ae2da1537 - e6f34bb2a5412ef9127aacd87823c84ca2881d47b15a45a96751a7557d1e0398 - cb35b936f2db79a897e1372ea34a1fb8237885030446f29269b940c0f221d733 - ada9c925979d25cb0e1549d20466b7e22653931715dd1a7fe85ca835caddf7f7 - 9b92561b20face8de88a77a579afa6d1404f55c69340993508fcc3153e1bd70b - 64db6133cc87197cb793e0e33b72345bc30dabf862a06f7574321ea783c54645 - db622d082616525302f8d32b9f41793804d51495d1a7b1f62125ed9daedd3fb2 - 919ccec7292a6cf9ccce66fc7a91bbae2a3f93d965ecb4237380256cc8c344dd - f160cb1db40b31815096c0c58f9aa75213e294600c12fef2d2deb741e24e22dd - ce4e51c46cb0860c2671606ef94bff741b2e3d5e70e485b9c5c90d0e481cc5b2 - 05a552baec6b12b7e3f9270a628ff6a3fe62ec17c232f905465317e85e40e731 - 6bc18f1db7d0233c9d3bc0cf277234322845d309918681636c30a2c131bd90e9 - a7cc9b51e57b4de49f958cf1ea47d526e6873318fba96b52ee42d541a2e35902 - bf1fac8be9eca95bdbc9f8542445301e146148afe69b40a4ea41bfdf64ab1034 - 85e3c40c5ef6bd2fdbf9951304bec1f17e2f7a212abdf20cf103a5e7b73f2be9 - 6489211d465c053182484faae07c708e076b82a88d0ebecfda071f4bb41b5677 - f0d0d4a58d6bac842c28bee253e6d5906e582b359173fdeedb6d4c40f0b9a4c8 - 4e3da06699c1cc87b735ef9d181f8cc33c989f44840d02c9b9e5dfd893a8c05e - 0dcabb9158d29001082801b1703946b1df9e22653fc7c66c9a725f102f2ada00 - 1e3ee2f9d0291ec2aa0a2d5939ca3074d6b6a7da533186e227da1d3cc2cc7974 - ab7931be527b56dea1939b048030647e4311b0c0eaa23b7843f3baab180801ba - a592cfeb20a346ad8b24facca3f0da2c5fdd65156aafea67b0c3793bb99ab0a1 - 32740a1261d43b6bec2b99e2da64bdf201c60b1d0651a5a5db548e1180cf5fb1 - e9e669a9917eab86af336c1d149910cb8606e21708c2b5707d87452c455905b0 - 777d625c67cbe9e710ac7fffda880e0a1fb523f8cafc6ac2c3b227b2d5de38f5 - 63728cede6b88d8352b9398c675c4537527de00ee8a0e120bcc905be9f47ae89 - 97f387a2b47303ca475eeab466a0d9f4bc64554b82c55a00f2da4cea431aaa03 - c875c6a19505c6a04cbeba85baad5d9432efd930d920eebb72413d6642a33d3f - 4ebd23d9533cf2c5b63ec4dc6b6f83df742c473d7d108dd70b9947d014a4ec45 - de78a9bdb410bd9850b4d1197442e263cfb7f3a112917aa40f76a5c50f5ae64c - b23fb2ac9a531848ef30e960fdd3174ae970f84b42a2adec1bb34329879acd96 - b7024f86fac5844692b7e5c859e91c721a8279ee60880cafe9479476559bd9fa - 7107ffa0816d059147381b63ee31d66b4ad9b6af77ed409c05994fc2eb5c597d - 1e1144a17959632ccce43025f4addc4adea7c0c225bac529f99b501604b96b53 - 3697fe13197519a9838584a17ed612ae08d9c603d56340df13c42fb971ddbca4 - d357fa261223596406a931867f84f1aefaa4ff8556257a005e0d5061c6b5e8cf - a85066ac413255ea51260e8c690b7a4fe8602ceb628e7d2fa6803ccafa02c9c8 - a9850ec702c480ab9ed2bbee16f8ffea2fa1e60da5f68f0f51b051699a3551de - cd784b2b6317748241bc8f5192d5d3e734cc8747b61955485a859faad4be151b - f67ba1abdbf107f5f18db505ea5c5b588bd4fbdd9c589991a643db0da1204f4b - 8de924873919f06468f58d8a1dae8e9d2886d3705aa59b2dc7d30b9659a5327a - 8b2b9ec349e0e562b7e681f8b9c910256c46953c1cd12f131d7e6f04469954f6 - 5ddd93aff16c17626a170fd0a5c95a72e9ab7bcaeaff67f36445ddd21100f42d - 7bbeb6237a36f375cf78820e59dc61e619854bcf031852a5e8201b783176deac - f77a1a325100e9f4bd84eeba002b35b63bad535b723ce854b0ce85e63776de38 - bf1573cca7b0892ca234a5bb2e44646ba997c0be8051017f35ae217aa7f60bdb - 671bb222053b1fa8bb609095e518392dd3cb1ce2dde780ed34441118324cb551 - 6c4c7032d76b31bb76abfae5c5e288bd0a82bbcf7d9bf8aa9197bea687c86a46 - 4195b95b23a643925488e969accb294d1c056247ccfec745748d6ee0b0c94851 - ebaa54f3a992514bbf54bce4ab82743390c715a81343739948efd0ac3ca33599 - 868b30b8b311aed6c74b8d5fc05b7c4a0f32f56602b594229ddcadff2733a1f3 - 75f7542f8d3d49cf4e16023fae32a329fa8e804c90bae236a6415a4a045f6ce0 - ea857d827ee2cc580fae43772648cc410c1bcd4c8612cff9a3a7d11b04e54725 - 25716f39d2d7d25f448dc9a68270f51124f1d234f0b9482743dcc0c1a00fa8b1 - 42d52c4ce57e8cae43667faf7600e98d085b0ab713e7607bc1dae1f34932be67 - 5319b79f719dd27e45ecca54d29482d6558f41947db5c4ec4b70c3e25bb8f55a - 88bcbfa7a2b006b93fd715810661b464e7b150006f046a94e6c03d2e067ae7e3 - 838d84317a7c51c13329c919d4479396b30233136b70fe025faf968b916ba1c1 - 5f686f697c1093c45ef882c3feb1def6064f458d5ae75a74962375b91c6027d5 - 9f9a7a4e6d73698fdc623384a666e677ce2d32990bc69e16aa631a34371cdf78 - 0ba4499c5805a83172e5dcbdc8fd8e464824827f94ed1849d9a1797a9b386e00 - 41f65c5307ec97310b33ace466439e4abf008d461be3835f545e4194e6c54940 - edd966278b660bb280e8e319300e18652ce2ef0fca5baeeb72696b5fd2a03d69 - 13d667aaf3338da21355c042b3a07567553ee48bf0dc071f9a55ef49451de21c" +checksum="a5fb5a432961b29b71572258e3aade26e4972c2a829c9b100906d764da783e2d + 07fd6bef784d73d578b147d097a7e62b8ec56fbae4e860f7c093d15c3abef0c6 + a490dcfe56781a750c67bbad12a626e1e011679c86411bc7c0ecabf3c995d17a + db0d639c5749181b64c66081cf2cd90084f07df7f17428cb529a14ce3cf30d4d + 82aa4b328ff3e573ee411a37401152b09c2d6433939e9da6f7ea2e06adee962a + c5419dd5eb37b49a4e82cce9a510730bcc184c4a580f074751ffb44e70450103 + b1ab6bd7cf8e66c27b40442e4494052a1ef358ed4bc54f1d3e205b342fd2deac + 5262c826dd68d5a3146a487b6978f2d86e7dbea6fe8c3112e6eadbba4862b676 + d4754cf089ca42ab5718088b83cd1995a10d0da2dda6191f12ea53e3cda51137 + 08d769aa1aae5a5d55f0d1c0308b808f343747a1a4ae2acf1811628ba66e2c20 + 1b50cdaa7a851f031858ebad0873ea548dd2462b297912086fb0ebb95dfa72a1 + 12bb4c9e4c681e01ed1c8d4e4a2673088604273ec046018c2747edfd3df9adab + cf715af1af15fbe8c2f7b32cd351d27800b2bf0ccfe37af26c975edd73ae158b + 88decc7c4dfadaa8f8aeb1af5d0b5ead84461fa1a321199839c68e31a3552d60 + 53dd6cbf524da32f15ef16ed6808bee567be2812a41289a7b4ece7f9feafe804 + 41cc906c7f364b4e097044a0a1938d9cdc9d77cc588be4c7524e4d4e01d140fc + 9e77c1668a98ea5640f8a111bcfccdf382d3468645bf4db4390aa435ddf94005 + e9472477200b37ae5dfc625340870d81475ff418de42f8be20d3c2c6b8a3d650 + c058b1d118e9f238b71947bd0ba49a8ab7595018cacf30edaa3cccf732de1cf9 + e87b2709a575ba43f127c2788e757950c6c5b2f2511d4f60daef4cd0f2b2b92a + e8ede54125de229d3cf97d04ca005d1829f62f75f720b12c248266572b221aaf + 9ec8383935e93cc1f7bd2b892d537bf2318ce12a42658d5f0595696efb25f056 + c35169b718ee3c3b9710edc44c17b4ba41a86f06dba8215707f5c9f53afc8809 + 072be46471819ac8a5fd987589abec657368636dc048f0806d33448c041bd733 + a92e38c3ef82f00ce353515f10bba644561e4dbb84d5b6f1ae93e48ac562eed7 + c6a403aef977426be44eec93548a875d96e9a6b7656da823bbdf4994100d40f3 + 0678f655f5376aec66161c2b7f20792985713b438ec70093686d615ceae5ff60 + 27e2d22321118eb8c337f9889ce1f922d6418ab9183c6180860c87657966670f + 2f72580b0b23f2a245d98f5713a7cf52b5fe06c9ccba8cd854929606ef1e5834 + f25b0cbf3d1205252f27b04b9ba75a5cd947b458b4cb1c4e0597f74bfe8187bd + df580b8f798f04020e33a8fac8bf072685b0bbd2bba8a8ffd0188bea4801a88a + 6c2b99d461609d91482e8c7a7f2610f7fc7b3ef4e7254a1a56bc2b10cb24fbbf + e519975c3bfe0f45f2dc50d2a9bad6e283d6d4eb3485ef1f3f8435080ffe5d7a + 00a2c8c98767a355f930d3090bafa7167adff5bbb5fdb19e93722de43e0c97c2 + 770cbfc15d2d049074cb3c884b33ed27e7313ff0000abbe4542e9738c2d524ad + c9925da390269221a92d11b7e8ad0003ad0d91298b9e4831a813578493f02f17 + ef149eba0018a292316d07140a2f028da577914202201de45e1279cc2efc44c1 + 1d64065e2233f49ff29a6d0dcefdee34517d46b7e15317180fe81cbcf748d99d + e57c617c3dba23eec6b1a11c884db266de3a2def216e5081cef5a3367b308ff8 + 94449a5cb6a24ac8229e296a9115fd5e8469a6b5f266f26aa760edf34a43c5b4 + 4cf695866443a0cf22f2a2b966af169c0de2595a24b9c3d227a72ecd259c99e8 + 44efa27a5e12670b713f90d33f8d413c4405c3c42fd11572c8a2f96e9a9a2773 + 282b8daa51d4d71d4d17f987ba9e541580bdbae313fb14ba18f9c29f0bd4ad1f + 5545a8300c5e6804440a63fa0119fe1de72c68996b7c7467a234569195cca7ad + a430bdb134da6b3e781acb67fccb89eb016f9519e5f4dc5dbc7d277cd243abaa + 831b85b41ade1b0335e0540d1c89c977281c33c040774b471dfac680d7aced65 + 0ca4e070ec96abd2b288415850e10f3c5df1d81c94d16a1f6920ed9723ebe5e3 + b572cfcdbbb81ddb09913fe6702580c6b3111942fe11dc4080ece92a61cd29a0 + 21ed6c4814dd9d201626c2f6e60da2ccda19df6edfbc7a8af54073d711535aa8 + 528cb945487b13840e3ce2466c3e53a737bc1436cc7d640d93b068feab219f9c + 24f1b994264700f780b38a022882e61b02f7e11b6781532dfdaa3a2097438677 + bd1c6838b28812b8e594edb55693f7b9b4b9ac188ce452340960497f2fd0e2cf + 9eb18c39fa8bec87e3bcf23f23cb79a840b6bbee096fb30b6c212034774d1ec7 + fa49e763488a12a5f25279730ac7f8925a5abc18d5a514bf09a71cbe2f9dfcd3 + 23c78f7b94b9d117b15f6a974dd429a502534287852bc3e255e59f3182d60c6c + e5596f945cea1503ce5079d7f457e4f9a4fc1ff24a2b9974cc17d5a77e5042ce + 41d04aa95f14e89aee2c0f21784c7a1b8e381b320bd9e6f7edb0a0817ab39942 + 1fc995e12fc9207baeedfe34dc26901aec4551b954afe73d121983581f59f16d + 54a5f3b8e5fc6f0cf49560d2ceb1b4073f94c9d3282357d372f47e9d05953172 + 88452593669bb4e023e5bc73503b235e196c34a9e13060f7c50f1ba55fe9210a + ef71309e7121bf1d75b504664ba1e858cb6351cb70dfec6b7c4f79f6df855dee + 4cd18fcdac7988a1a94fc31119713a0dac315a66bb29687b21062f161abf9214 + da5f4476a3e98ee7661c295263d1e41eb3e4aa62103268efa0a50cb9e5d67ff1 + 3985f70f8e05970286f8613fa5576933ea333fecf456008927e3124e5b53a145 + cd69c9e34a4468f5a3af469c79857b252985ef72fb1c1d75e0a902879bb97b5d + 6394f3f68ace9be167152b751bcfc5dc0dc6d07671d8a6c74ef38b8b14d4b316"