From 9f128e948f9c830152e3c753cb328cea0672c9f5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 3 Oct 2025 02:12:43 +0000 Subject: [PATCH 01/10] [android] Android 7.0 support Signed-off-by: lizzie --- src/android/app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index e8d8141711..60a22e1782 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -59,7 +59,7 @@ android { defaultConfig { // TODO If this is ever modified, change application_id in strings.xml applicationId = "dev.eden.eden_emulator" - minSdk = 28 + minSdk = 24 targetSdk = 36 versionName = getGitVersion() From f4f3425d86c7e1ed4b9094365cd39cc0bfa174a5 Mon Sep 17 00:00:00 2001 From: Calchan Date: Fri, 3 Oct 2025 04:46:27 +0200 Subject: [PATCH 02/10] [sockets] block more domains (#2632) * Bring in the domain-blocking code from the legacy branch * Make blockedDomains a `static constexpr const std::array` Co-authored-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2632 Reviewed-by: MaranBr Reviewed-by: crueter Co-authored-by: Calchan Co-committed-by: Calchan --- src/core/hle/service/sockets/sfdnsres.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index b07bd3e58e..68d73f0a59 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -53,6 +53,19 @@ enum class NetDbError : s32 { NoData = 4, }; +static const constexpr std::array blockedDomains = {"srv.nintendo.net", + "battle.net", + "microsoft.com", + "mojang.com", + "xboxlive.com", + "minecraftservices.com"}; + +static bool IsBlockedHost(const std::string& host) { + return std::any_of( + blockedDomains.begin(), blockedDomains.end(), + [&host](const std::string& domain) { return host.find(domain) != std::string::npos; }); +} + static NetDbError GetAddrInfoErrorToNetDbError(GetAddrInfoError result) { // These combinations have been verified on console (but are not // exhaustive). @@ -154,7 +167,7 @@ static std::pair GetHostByNameRequestImpl(HLERequestConte // For now, ignore options, which are in input buffer 1 for GetHostByNameRequestWithOptions. // Prevent resolution of Nintendo servers - if (host.find("srv.nintendo.net") != std::string::npos) { + if (IsBlockedHost(host)) { LOG_WARNING(Network, "Resolution of hostname {} requested, returning EAI_AGAIN", host); return {0, GetAddrInfoError::AGAIN}; } @@ -271,7 +284,7 @@ static std::pair GetAddrInfoRequestImpl(HLERequestContext const std::string host = Common::StringFromBuffer(host_buffer); // Prevent resolution of Nintendo servers - if (host.find("srv.nintendo.net") != std::string::npos) { + if (IsBlockedHost(host)) { LOG_WARNING(Network, "Resolution of hostname {} requested, returning EAI_AGAIN", host); return {0, GetAddrInfoError::AGAIN}; } @@ -359,5 +372,4 @@ void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) { rb.Push(ResultSuccess); rb.Push(0); // bsd errno } - } // namespace Service::Sockets From d04665881c9a8ffe1b865adc2b14c90379c0a2ce Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 3 Oct 2025 03:09:19 +0000 Subject: [PATCH 03/10] fix drawable Signed-off-by: lizzie --- .../{drawable => drawable-v26}/ic_launcher.xml | 0 .../app/src/main/res/drawable/ic_launcher.png | Bin 0 -> 2210 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename src/android/app/src/main/res/{drawable => drawable-v26}/ic_launcher.xml (100%) create mode 100644 src/android/app/src/main/res/drawable/ic_launcher.png diff --git a/src/android/app/src/main/res/drawable/ic_launcher.xml b/src/android/app/src/main/res/drawable-v26/ic_launcher.xml similarity index 100% rename from src/android/app/src/main/res/drawable/ic_launcher.xml rename to src/android/app/src/main/res/drawable-v26/ic_launcher.xml diff --git a/src/android/app/src/main/res/drawable/ic_launcher.png b/src/android/app/src/main/res/drawable/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea5c713802a62e149605cae9216a9fd65aacfbb GIT binary patch literal 2210 zcmV;T2wnGyP)Px-TuDShRCwCuoM((xMHI)kFRQVFyO!06Xxv~#jjq8Gv3@YI5ercX#E1nuilVV& z?1?QF;#vq13pUiKhzcSoD(EV@DkZ3hB1l`dvA%ut^TRt=XXnlB_rAB{B>(Jt@6Mb# z_kYivIdf+2mX!370+a(4KqXLK@_#Hs!U4cNKr^rr=)t}80GoiXrOkmr*_KAiw!ke4 z{Yu%|1vSB1FMNutW0%l#3L4V$$!GKfKp&QkO^ZBAVZA03R{8^(A7q0hU@6%>cgvUjPe%RXz?mNO@iQoFAZW8?aBY$vFn- z5X2@zHU56JXiZNySKDxCI(AZ8~~&h!`Ez+&J|V6PDJ&ImY>4F&cS zQbs$@SjcM%FdJlnebXjquMpEx7We>Y2q5V_B{& z2i^s)jG;$aQpA)>RD5kh1UdLlZnV_s?+M@!@pILdiD8|P7q|cMCizhb`X$d|lMRkn zSV+3ZoE^m(uT3~A-yF-5fJqdltnizLfge)pdtOv>c9-Zk4wPnbJu*fA2z(FxY+#Cq zE=^ic`Mb1VCKhEz=U;|J29AqDP#v(dhTVXA7wjT+>LgA&TwUy6HUN=8*pIX>wV~tUNI#pF4pivaV||+8q}B87qJ#L6oTviNVst z5f)kffKjp_?FK#v&KE~JB!VxhHBhJd%0q#v($C|L-;;;3n^w2ZLr$%q62pN{1q*!e zspMs{zzK#AxWGuac1m7oo;dDvV-BBJfsb4;N1wuloD&1w&jJ(+fCs!f?u;<3E|RuG zfo}rTzuKe!6UEwUfE|F59(A7!q2q5M@2T8vr5?7-0H%b<6i)MSs9jFbD8D@{-%0|q~-`)XKzN88?bV#%S}FQ)H_FhUvGpBE+nbB$#0yn(k)tjDkWHxRpK)~ z1Ktu#agy?7^0^6^EVp4LN$M+E+%_Zy+iWur_{uf@LO$LTmpA%d8bzS+W~Yam(Mw<4y{eAmdpMb*iY|ZOv;PV`hdP; zlw3d0L)H=tK{YAp{Jh@5ocKf6H6OCxxS63IV*B+DR$cwt8y1o_h4G02-0PpZ@LR=9 zV;rsSia)t$KbqdCAV1G9mj31y`GlYwLkEvSs5O z9Jn56)OK3ktl}&qqfnrt@UhU*CBUAs#CiLsR|76&chv}bIT`my$({R|7(-@Ks4)rh%MgA|@9d(EMIp0| zEudOtwSTNZ&|7lw;UD?Rz27u3z>KI@6={ey8hX5vjMI%Jp~tr57?+$*p_Dt&&|_+m zmKS=N>9%ja!B}5y2!V}(+NxgP0S>Zk1E~OQeV{gk)Zf86V4&C0kt!clSWp!KmEw=g zA@(TnNesEM;kB|KT7>EJI75d!3Okze%1wSbmR42RVQ)MjY6Tepjk`Hso z8U623M1pP)bIPorpgJ{VxdG$wrd(6fcNI&iUh2|*X?z`m`5p^FgC#?lHadatE&V&M zHRVCMeD^z+`-AU5(u`X0Duak->V$!iVhW|-WuTeq+V#Tqa@(Aiv4$IlW>61-#~}BsM|QP zwt6BEG(Ge<3g-xpvOJKq%c7(=0;i|sg8(L4`dby-CA(i*M;h<2x@G%RV9i`L{?gLd zZGm|SXRsZ_cy}ZSNpH}5msCIX9t8lKT@H=|DCOR^#|7EEr=jQo?xRp|KPO1|cD9*J zuC)PUW6Ccp){Qk>idMNV`4>`875*W#r@PEyKeaM}MZc`Cf*5uAzuLnLR_s^WFO19J@i_jtD{uRY+ kawlNdkb6hs)V`$a-=DRfGw8>|X#fBK07*qoM6N<$g1WRQ$N&HU literal 0 HcmV?d00001 From 521575dcc9847377b715cc368b18f8b4750e1355 Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 3 Oct 2025 00:19:05 -0400 Subject: [PATCH 04/10] script to make <26 sdk icon Signed-off-by: crueter --- .../app/src/main/res/drawable/ic_launcher.png | Bin 2210 -> 49032 bytes tools/VectorDrawable2Svg.py | 86 ++++++++++++++++++ tools/generate-legacy-icons.sh | 26 ++++++ 3 files changed, 112 insertions(+) create mode 100644 tools/VectorDrawable2Svg.py create mode 100755 tools/generate-legacy-icons.sh diff --git a/src/android/app/src/main/res/drawable/ic_launcher.png b/src/android/app/src/main/res/drawable/ic_launcher.png index 7ea5c713802a62e149605cae9216a9fd65aacfbb..6b586fc75761f49f0a7a67cb1ebdf58edcafe745 100644 GIT binary patch literal 49032 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 aH+6LR-^<8R@ya2}0Lt=j<-W;4L;epW>FkjJ literal 2210 zcmV;T2wnGyP)Px-TuDShRCwCuoM((xMHI)kFRQVFyO!06Xxv~#jjq8Gv3@YI5ercX#E1nuilVV& z?1?QF;#vq13pUiKhzcSoD(EV@DkZ3hB1l`dvA%ut^TRt=XXnlB_rAB{B>(Jt@6Mb# z_kYivIdf+2mX!370+a(4KqXLK@_#Hs!U4cNKr^rr=)t}80GoiXrOkmr*_KAiw!ke4 z{Yu%|1vSB1FMNutW0%l#3L4V$$!GKfKp&QkO^ZBAVZA03R{8^(A7q0hU@6%>cgvUjPe%RXz?mNO@iQoFAZW8?aBY$vFn- z5X2@zHU56JXiZNySKDxCI(AZ8~~&h!`Ez+&J|V6PDJ&ImY>4F&cS zQbs$@SjcM%FdJlnebXjquMpEx7We>Y2q5V_B{& z2i^s)jG;$aQpA)>RD5kh1UdLlZnV_s?+M@!@pILdiD8|P7q|cMCizhb`X$d|lMRkn zSV+3ZoE^m(uT3~A-yF-5fJqdltnizLfge)pdtOv>c9-Zk4wPnbJu*fA2z(FxY+#Cq zE=^ic`Mb1VCKhEz=U;|J29AqDP#v(dhTVXA7wjT+>LgA&TwUy6HUN=8*pIX>wV~tUNI#pF4pivaV||+8q}B87qJ#L6oTviNVst z5f)kffKjp_?FK#v&KE~JB!VxhHBhJd%0q#v($C|L-;;;3n^w2ZLr$%q62pN{1q*!e zspMs{zzK#AxWGuac1m7oo;dDvV-BBJfsb4;N1wuloD&1w&jJ(+fCs!f?u;<3E|RuG zfo}rTzuKe!6UEwUfE|F59(A7!q2q5M@2T8vr5?7-0H%b<6i)MSs9jFbD8D@{-%0|q~-`)XKzN88?bV#%S}FQ)H_FhUvGpBE+nbB$#0yn(k)tjDkWHxRpK)~ z1Ktu#agy?7^0^6^EVp4LN$M+E+%_Zy+iWur_{uf@LO$LTmpA%d8bzS+W~Yam(Mw<4y{eAmdpMb*iY|ZOv;PV`hdP; zlw3d0L)H=tK{YAp{Jh@5ocKf6H6OCxxS63IV*B+DR$cwt8y1o_h4G02-0PpZ@LR=9 zV;rsSia)t$KbqdCAV1G9mj31y`GlYwLkEvSs5O z9Jn56)OK3ktl}&qqfnrt@UhU*CBUAs#CiLsR|76&chv}bIT`my$({R|7(-@Ks4)rh%MgA|@9d(EMIp0| zEudOtwSTNZ&|7lw;UD?Rz27u3z>KI@6={ey8hX5vjMI%Jp~tr57?+$*p_Dt&&|_+m zmKS=N>9%ja!B}5y2!V}(+NxgP0S>Zk1E~OQeV{gk)Zf86V4&C0kt!clSWp!KmEw=g zA@(TnNesEM;kB|KT7>EJI75d!3Okze%1wSbmR42RVQ)MjY6Tepjk`Hso z8U623M1pP)bIPorpgJ{VxdG$wrd(6fcNI&iUh2|*X?z`m`5p^FgC#?lHadatE&V&M zHRVCMeD^z+`-AU5(u`X0Duak->V$!iVhW|-WuTeq+V#Tqa@(Aiv4$IlW>61-#~}BsM|QP zwt6BEG(Ge<3g-xpvOJKq%c7(=0;i|sg8(L4`dby-CA(i*M;h<2x@G%RV9i`L{?gLd zZGm|SXRsZ_cy}ZSNpH}5msCIX9t8lKT@H=|DCOR^#|7EEr=jQo?xRp|KPO1|cD9*J zuC)PUW6Ccp){Qk>idMNV`4>`875*W#r@PEyKeaM}MZc`Cf*5uAzuLnLR_s^WFO19J@i_jtD{uRY+ kawlNdkb6hs)V`$a-=DRfGw8>|X#fBK07*qoM6N<$g1WRQ$N&HU diff --git a/tools/VectorDrawable2Svg.py b/tools/VectorDrawable2Svg.py new file mode 100644 index 0000000000..20f168e1aa --- /dev/null +++ b/tools/VectorDrawable2Svg.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python2 +""" +VectorDrawable2Svg +This script convert your VectorDrawable to a Svg +Author: Alessandro Lucchet + +Usage: drop one or more vector drawable onto this script to convert them to svg format +""" + +from xml.dom.minidom import * +import sys + +# extracts all paths inside vdContainer and add them into svgContainer +def convertPaths(vdContainer,svgContainer,svgXml): + vdPaths = vdContainer.getElementsByTagName('path') + for vdPath in vdPaths: + # only iterate in the first level + if vdPath.parentNode == vdContainer: + svgPath = svgXml.createElement('path') + svgPath.attributes['d'] = vdPath.attributes['android:pathData'].value + if vdPath.hasAttribute('android:fillColor'): + svgPath.attributes['fill'] = vdPath.attributes['android:fillColor'].value + else: + svgPath.attributes['fill'] = 'none' + if vdPath.hasAttribute('android:strokeLineJoin'): + svgPath.attributes['stroke-linejoin'] = vdPath.attributes['android:strokeLineJoin'].value + if vdPath.hasAttribute('android:strokeLineCap'): + svgPath.attributes['stroke-linecap'] = vdPath.attributes['android:strokeLineCap'].value + if vdPath.hasAttribute('android:strokeMiterLimit'): + svgPath.attributes['stroke-miterlimit'] = vdPath.attributes['android:strokeMiterLimit'].value + if vdPath.hasAttribute('android:strokeWidth'): + svgPath.attributes['stroke-width'] = vdPath.attributes['android:strokeWidth'].value + if vdPath.hasAttribute('android:strokeColor'): + svgPath.attributes['stroke'] = vdPath.attributes['android:strokeColor'].value + svgContainer.appendChild(svgPath); + +# define the function which converts a vector drawable to a svg +def convertVd(vdFilePath): + + # create svg xml + svgXml = Document() + svgNode = svgXml.createElement('svg') + svgXml.appendChild(svgNode); + + # open vector drawable + vdXml = parse(vdFilePath) + vdNode = vdXml.getElementsByTagName('vector')[0] + + # setup basic svg info + svgNode.attributes['xmlns'] = 'http://www.w3.org/2000/svg' + svgNode.attributes['width'] = vdNode.attributes['android:viewportWidth'].value + svgNode.attributes['height'] = vdNode.attributes['android:viewportHeight'].value + svgNode.attributes['viewBox'] = '0 0 {} {}'.format(vdNode.attributes['android:viewportWidth'].value, vdNode.attributes['android:viewportHeight'].value) + + # iterate through all groups + vdGroups = vdXml.getElementsByTagName('group') + for vdGroup in vdGroups: + + # create the group + svgGroup = svgXml.createElement('g') + + # setup attributes of the group + if vdGroup.hasAttribute('android:translateX'): + svgGroup.attributes['transform'] = 'translate({},{})'.format(vdGroup.attributes['android:translateX'].value,vdGroup.attributes['android:translateY'].value) + + # iterate through all paths inside the group + convertPaths(vdGroup,svgGroup,svgXml) + + # append the group to the svg node + svgNode.appendChild(svgGroup); + + # iterate through all svg-level paths + convertPaths(vdNode,svgNode,svgXml) + + # write xml to file + svgXml.writexml(open(vdFilePath + '.svg', 'w'),indent="",addindent=" ",newl='\n') + +# script begin +if len(sys.argv)>1: + iterArgs = iter(sys.argv) + next(iterArgs) #skip the first entry (it's the name of the script) + for arg in iterArgs: + convertVd(arg) +else: + print("You have to pass me something") + sys.exit() diff --git a/tools/generate-legacy-icons.sh b/tools/generate-legacy-icons.sh new file mode 100755 index 0000000000..9bf14e8093 --- /dev/null +++ b/tools/generate-legacy-icons.sh @@ -0,0 +1,26 @@ +#!/bin/sh -e + +# Generate SDK <26 icons for android +# requires imagemagick, inkscape + +ROOTDIR=$PWD + +cd src/android/app/src/main + +pushd res/drawable +# convert vector to svg--needed to generate launcher png +cp ic_yuzu_icon.xml tmp + +python3 $ROOTDIR/tools/VectorDrawable2Svg.py tmp + +inkscape -w 768 -h 768 tmp.svg -o ic_tmp.png +magick ic_icon_bg_orig.png -resize 512x512 bg_tmp.png + +magick bg_tmp.png -strip -type TrueColor -depth 8 -colorspace sRGB -color-matrix "1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0" bg_tmp_rgb.png +magick -verbose bg_tmp_rgb.png ic_tmp.png -gravity center -composite -colorspace sRGB ic_launcher.png +echo + +rm *tmp* +popd + +# Add legacy here when legacy gets merged From 71a87b2c55eaf85582f0cc052e50861778790548 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 3 Oct 2025 23:08:20 +0200 Subject: [PATCH 05/10] [video_core] Fix stutters and freezes when playing FMV content in some games (#2650) This fixes stutters and freezes when playing FMV content in some games. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2650 Co-authored-by: MaranBr Co-committed-by: MaranBr --- src/video_core/engines/maxwell_dma.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/video_core/engines/maxwell_dma.cpp b/src/video_core/engines/maxwell_dma.cpp index 1a8a7c8dce..52ca9bbdb6 100644 --- a/src/video_core/engines/maxwell_dma.cpp +++ b/src/video_core/engines/maxwell_dma.cpp @@ -64,7 +64,6 @@ void MaxwellDMA::Launch() { // TODO(Subv): Perform more research and implement all features of this engine. const LaunchDMA& launch = regs.launch_dma; ASSERT(launch.interrupt_type == LaunchDMA::InterruptType::NONE); - ASSERT(launch.data_transfer_type == LaunchDMA::DataTransferType::NON_PIPELINED); if (launch.multi_line_enable) { const bool is_src_pitch = launch.src_memory_layout == LaunchDMA::MemoryLayout::PITCH; @@ -157,8 +156,6 @@ void MaxwellDMA::Launch() { } void MaxwellDMA::CopyBlockLinearToPitch() { - UNIMPLEMENTED_IF(regs.launch_dma.remap_enable != 0); - u32 bytes_per_pixel = 1; DMA::ImageOperand src_operand; src_operand.bytes_per_pixel = bytes_per_pixel; From 272df1fa837909ab514c8c36a24485fb4bb99add Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 4 Oct 2025 02:48:39 +0200 Subject: [PATCH 06/10] [settings] default to opengl on solaris (#2659) Vulkan support still wonky on most distros. Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2659 Reviewed-by: crueter Reviewed-by: MaranBr Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/settings.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 891bde608c..59e75d3ee0 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -320,11 +320,19 @@ struct Values { linkage, true, "cpuopt_unsafe_ignore_global_monitor", Category::CpuUnsafe}; // Renderer - SwitchableSetting renderer_backend{ - linkage, RendererBackend::Vulkan, + SwitchableSetting renderer_backend{linkage, +#if defined(__sun__) || defined(__managarm__) + RendererBackend::OpenGL, +#else + RendererBackend::Vulkan, +#endif "backend", Category::Renderer}; - SwitchableSetting shader_backend{ - linkage, ShaderBackend::SpirV, + SwitchableSetting shader_backend{linkage, +#if defined(__sun__) || defined(__managarm__) + ShaderBackend::Glsl, +#else + ShaderBackend::SpirV, +#endif "shader_backend", Category::Renderer, Specialization::RuntimeList}; SwitchableSetting vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList}; From 83730cd4c151bf88066bae0a3af846ae1f4eaa4c Mon Sep 17 00:00:00 2001 From: crueter Date: Sat, 4 Oct 2025 09:27:13 +0200 Subject: [PATCH 07/10] [cmake] update CI deps, feat: sirit CI + new CI spec (#2655) Updates sirit to our fork's latest version w/ SPIRV Headers included (end goal is to remove spirv-headers entirely, as spirv-tools-ci should include them inline as well) Adds a sirit CI on our fork for all platforms (saves a bit of compile time) My CI spec has changed a little bit, and now there is no need for an additional CMake file after the initial CMakeLists.txt (since targets are now global imported). Plus, UNIX amd64 now has the amd64 suffix like aarch64 and windows Updates SDL2 to 2.32.10 and OpenSSL to 3.6.0 Finally, on Solaris all CI packages (sans FFmpeg) are now built with OmniOS, which should in theory be fully compatible with OpenIndiana (our recommended Sun-based target) but obviously will need testing Need testing: - [ ] Make sure I didn't nuke shader emission - [ ] Make sure FreeBSD, OpenBSD, and OpenIndiana work fine with bundled sirit (check linking especially) - [ ] Make sure SDL2, OpenSSL work with OpenIndiana now - [ ] SDL2 on all platforms (input, etc) Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2655 --- CMakeLists.txt | 181 +++++-------------------- CMakeModules/CPMUtil.cmake | 24 ++-- cpmfile.json | 106 +-------------- docs/CPM.md | 24 ++-- externals/CMakeLists.txt | 159 ++++++++++++++++++++-- externals/cpmfile.json | 120 +++++++++++++++- externals/ffmpeg/cpmfile.json | 5 +- src/qt_common/CMakeLists.txt | 2 +- src/qt_common/externals/CMakeLists.txt | 2 +- src/shader_recompiler/CMakeLists.txt | 2 +- src/video_core/CMakeLists.txt | 2 +- src/yuzu/CMakeLists.txt | 2 - tools/cpm-fetch.sh | 4 +- 13 files changed, 340 insertions(+), 293 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a9ff2e9458..b397ba01aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,7 @@ if (ENABLE_SDL2) option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}") endif() +# qt stuff option(ENABLE_QT "Enable the Qt frontend" ON) option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF) @@ -163,8 +164,12 @@ if (MSVC OR ANDROID) endif() option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT}) +# ffmpeg option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT}) -cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" OFF "NOT WIN32 AND NOT ANDROID" OFF) +cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF) + +# sirit +option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${EXT_DEFAULT}) cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) @@ -312,7 +317,6 @@ endif() if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) set(HAS_NCE 1) add_compile_definitions(HAS_NCE=1) - find_package(oaknut 2.0.1) endif() if (YUZU_ROOM) @@ -452,22 +456,6 @@ if (YUZU_USE_CPM) add_library(zstd::zstd ALIAS libzstd_static) endif() - # Catch2 - if (YUZU_TESTS OR DYNARMIC_TESTS) - AddJsonPackage(catch2) - endif() - - # ENet - AddJsonPackage(enet) - - if (enet_ADDED) - target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include) - endif() - - if (NOT TARGET enet::enet) - add_library(enet::enet ALIAS enet) - endif() - # Opus AddJsonPackage(opus) @@ -482,31 +470,10 @@ if (YUZU_USE_CPM) if (NOT TARGET Opus::opus) add_library(Opus::opus ALIAS opus) endif() - - # VulkanUtilityHeaders - pulls in headers and utility libs - AddJsonPackage(vulkan-utility-headers) - - # small hack - if (NOT VulkanUtilityLibraries_ADDED) - find_package(VulkanHeaders 1.3.274 REQUIRED) - endif() - - # SPIRV Headers - AddJsonPackage(spirv-headers) - - # SPIRV Tools - AddJsonPackage(spirv-tools) - - if (SPIRV-Tools_ADDED) - add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static) - target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link) - endif() - - # mbedtls - AddJsonPackage(mbedtls) else() # Enforce the search mode of non-required packages for better and shorter failure messages find_package(fmt 8 REQUIRED) + if (NOT YUZU_DISABLE_LLVM) find_package(LLVM MODULE COMPONENTS Demangle) endif() @@ -515,7 +482,7 @@ else() find_package(lz4 REQUIRED) find_package(RenderDoc MODULE) find_package(stb MODULE) - find_package(enet 1.3 MODULE REQUIRED) + find_package(Opus 1.3 MODULE REQUIRED) find_package(ZLIB 1.2 REQUIRED) find_package(zstd 1.5 REQUIRED MODULE) @@ -527,29 +494,6 @@ else() find_package(Boost 1.57.0 REQUIRED) endif() - # OpenBSD does not package mbedtls3 (only 2) - if (PLATFORM_OPENBSD) - AddJsonPackage(mbedtls) - else() - find_package(MbedTLS 3 REQUIRED) - endif() - - find_package(VulkanUtilityLibraries REQUIRED) - find_package(VulkanHeaders 1.3.274 REQUIRED) - - # FreeBSD does not package spirv-headers - if (PLATFORM_FREEBSD) - AddJsonPackage(spirv-headers) - else() - find_package(SPIRV-Headers 1.3.274 REQUIRED) - endif() - - find_package(SPIRV-Tools MODULE REQUIRED) - - if (YUZU_TESTS) - find_package(Catch2 3.0.1 REQUIRED) - endif() - if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID) find_package(gamemode 1.7 MODULE) endif() @@ -563,90 +507,6 @@ if(NOT TARGET Boost::headers) AddJsonPackage(boost_headers) endif() -# DiscordRPC -if (USE_DISCORD_PRESENCE) - if (ARCHITECTURE_arm64) - add_compile_definitions(RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN) - endif() - - AddJsonPackage(discord-rpc) - - target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include) - add_library(DiscordRPC::discord-rpc ALIAS discord-rpc) -endif() - -# SimpleIni -AddJsonPackage(simpleini) - -# Most linux distros don't package cubeb, so enable regardless of cpm settings -if(ENABLE_CUBEB) - AddJsonPackage(cubeb) - - if (cubeb_ADDED) - if (NOT MSVC) - if (TARGET speex) - target_compile_options(speex PRIVATE -Wno-sign-compare) - endif() - - set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "") - target_compile_options(cubeb INTERFACE - -Wno-implicit-const-int-float-conversion - -Wno-shadow - -Wno-missing-declarations - -Wno-return-type - -Wno-uninitialized - ) - else() - target_compile_options(cubeb PRIVATE - /wd4456 - /wd4458 - ) - endif() - endif() - - if (NOT TARGET cubeb::cubeb) - add_library(cubeb::cubeb ALIAS cubeb) - endif() -endif() - -# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package -if (ENABLE_SDL2) - if (YUZU_USE_EXTERNAL_SDL2) - message(STATUS "Using SDL2 from externals.") - if (NOT WIN32) - # Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers - # Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095) - # Yuzu-cmd also needs: Video (depends on Loadso/Dlopen) - # CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809) - set(SDL_UNUSED_SUBSYSTEMS - File Filesystem - Locale Power Render) - foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS}) - string(TOUPPER ${_SUB} _OPT) - set(SDL_${_OPT} OFF) - endforeach() - - set(HIDAPI ON) - endif() - - if (APPLE) - set(SDL_FILE ON) - endif() - - if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck") - set(SDL_PIPEWIRE OFF) # build errors out with this on - AddJsonPackage("sdl2_steamdeck") - else() - AddJsonPackage("sdl2_generic") - endif() - elseif (YUZU_USE_BUNDLED_SDL2) - message(STATUS "Using bundled SDL2") - AddJsonPackage(sdl2) - endif() - - find_package(SDL2 2.26.4 REQUIRED) -endif() - # List of all FFmpeg components required set(FFmpeg_COMPONENTS avcodec @@ -677,6 +537,11 @@ add_subdirectory(externals) # pass targets from externals find_package(libusb) find_package(VulkanMemoryAllocator) +find_package(enet) +find_package(MbedTLS) +find_package(VulkanUtilityLibraries) +find_package(SimpleIni) +find_package(SPIRV-Tools) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) find_package(xbyak) @@ -690,6 +555,26 @@ if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER) find_package(cpp-jwt) endif() +if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) + find_package(oaknut) +endif() + +if (ENABLE_SDL2) + find_package(SDL2) +endif() + +if (USE_DISCORD_PRESENCE) + find_package(DiscordRPC) +endif() + +if (ENABLE_CUBEB) + find_package(cubeb) +endif() + +if (YUZU_TESTS OR DYNARMIC_TESTS) + find_package(Catch2) +endif() + if (ENABLE_QT) if (YUZU_USE_BUNDLED_QT) download_qt(6.8.3) diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index d84c069399..3347c7e884 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -107,7 +107,6 @@ function(AddJsonPackage) get_json_element("${object}" name name "${JSON_NAME}") get_json_element("${object}" extension extension "tar.zst") get_json_element("${object}" min_version min_version "") - get_json_element("${object}" cmake_filename cmake_filename "") get_json_element("${object}" raw_disabled disabled_platforms "") if (raw_disabled) @@ -124,7 +123,6 @@ function(AddJsonPackage) EXTENSION ${extension} MIN_VERSION ${min_version} DISABLED_PLATFORMS ${disabled_platforms} - CMAKE_FILENAME ${cmake_filename} ) # pass stuff to parent scope @@ -139,6 +137,7 @@ function(AddJsonPackage) endif() get_json_element("${object}" hash hash "") + get_json_element("${object}" hash_suffix hash_suffix "") get_json_element("${object}" sha sha "") get_json_element("${object}" url url "") get_json_element("${object}" key key "") @@ -208,6 +207,7 @@ function(AddJsonPackage) VERSION "${version}" URL "${url}" HASH "${hash}" + HASH_SUFFIX "${hash_suffix}" SHA "${sha}" REPO "${repo}" KEY "${key}" @@ -533,7 +533,6 @@ function(AddCIPackage) EXTENSION MIN_VERSION DISABLED_PLATFORMS - CMAKE_FILENAME ) cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN}) @@ -589,25 +588,28 @@ function(AddCIPackage) add_ci_package(android) endif() - if(PLATFORM_SUN AND NOT "solaris" IN_LIST DISABLED_PLATFORMS) - add_ci_package(solaris) + if(PLATFORM_SUN AND NOT "solaris-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(solaris-amd64) endif() - if(PLATFORM_FREEBSD AND NOT "freebsd" IN_LIST DISABLED_PLATFORMS) - add_ci_package(freebsd) + if(PLATFORM_FREEBSD AND NOT "freebsd-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(freebsd-amd64) endif() - if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux" IN_LIST DISABLED_PLATFORMS) - add_ci_package(linux) + if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(linux-amd64) endif() if((PLATFORM_LINUX AND ARCHITECTURE_arm64) AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS) add_ci_package(linux-aarch64) endif() - if (DEFINED ARTIFACT_DIR) - include(${ARTIFACT_DIR}/${ARTIFACT_CMAKE}.cmake) + # TODO(crueter): macOS amd64/aarch64 split mayhaps + if (APPLE AND NOT "macos-universal" IN_LIST DISABLED_PLATFORMS) + add_ci_package(macos-universal) + endif() + if (DEFINED ARTIFACT_DIR) set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE) set(${ARTIFACT_PACKAGE}_SOURCE_DIR "${ARTIFACT_DIR}" PARENT_SCOPE) else() diff --git a/cpmfile.json b/cpmfile.json index f1fd5ce1cf..4cf61f0ffc 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -4,8 +4,11 @@ "package": "OpenSSL", "name": "openssl", "repo": "crueter-ci/OpenSSL", - "version": "3.5.3", - "min_version": "1.1.1" + "version": "3.6.0", + "min_version": "1.1.1", + "disabled_platforms": [ + "macos-universal" + ] }, "boost": { "package": "Boost", @@ -66,20 +69,6 @@ "ZSTD_BUILD_SHARED OFF" ] }, - "catch2": { - "package": "Catch2", - "repo": "catchorg/Catch2", - "sha": "644821ce28", - "hash": "f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f", - "version": "3.0.1" - }, - "enet": { - "repo": "lsalzman/enet", - "sha": "2662c0de09", - "hash": "3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd", - "version": "1.3", - "find_args": "MODULE" - }, "opus": { "package": "Opus", "repo": "crueter/opus", @@ -91,97 +80,12 @@ "OPUS_PRESUME_NEON ON" ] }, - "vulkan-utility-headers": { - "package": "VulkanUtilityLibraries", - "repo": "scripts/VulkanUtilityHeaders", - "tag": "1.4.326", - "artifact": "VulkanUtilityHeaders.tar.zst", - "git_host": "git.crueter.xyz", - "hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964" - }, - "spirv-tools": { - "package": "SPIRV-Tools", - "repo": "KhronosGroup/SPIRV-Tools", - "sha": "40eb301f32", - "hash": "58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa", - "find_args": "MODULE", - "options": [ - "SPIRV_SKIP_EXECUTABLES ON" - ] - }, - "spirv-headers": { - "package": "SPIRV-Headers", - "repo": "KhronosGroup/SPIRV-Headers", - "sha": "4e209d3d7e", - "hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4", - "options": [ - "SPIRV_WERROR OFF" - ] - }, - "mbedtls": { - "package": "MbedTLS", - "repo": "Mbed-TLS/mbedtls", - "tag": "mbedtls-%VERSION%", - "hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da", - "version": "3", - "git_version": "3.6.4", - "artifact": "%TAG%.tar.bz2" - }, - "cubeb": { - "repo": "mozilla/cubeb", - "sha": "fa02160712", - "hash": "82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61", - "find_args": "CONFIG", - "options": [ - "USE_SANITIZERS OFF", - "BUILD_TESTS OFF", - "BUILD_TOOLS OFF", - "BUNDLE_SPEEX ON" - ] - }, "boost_headers": { "repo": "boostorg/headers", "sha": "95930ca8f5", "hash": "d1dece16f3b209109de02123c537bfe1adf07a62b16c166367e7e5d62e0f7c323bf804c89b3192dd6871bc58a9d879d25a1cc3f7b9da0e497cf266f165816e2a", "bundled": true }, - "discord-rpc": { - "repo": "eden-emulator/discord-rpc", - "sha": "1cf7772bb6", - "hash": "e9b35e6f2c075823257bcd59f06fe7bb2ccce1976f44818d2e28810435ef79c712a3c4f20f40da41f691342a4058cf86b078eb7f9d9e4dae83c0547c21ec4f97" - }, - "simpleini": { - "package": "SimpleIni", - "repo": "brofield/simpleini", - "sha": "09c21bda1d", - "hash": "99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c", - "find_args": "MODULE" - }, - "sdl2_generic": { - "package": "SDL2", - "repo": "libsdl-org/SDL", - "sha": "54772f345a", - "hash": "2a68a0e01c390043aa9d9df63d8a20a52076c88bb460ac4e0f33194ca7d9bc8fadbbcc04e7506872ac4b6354a73fbc267c036f82200da59465789b87c7d9e3a4", - "key": "generic", - "bundled": true - }, - "sdl2_steamdeck": { - "package": "SDL2", - "repo": "libsdl-org/SDL", - "sha": "cc016b0046", - "hash": "34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b", - "key": "steamdeck", - "bundled": true - }, - "sdl2": { - "ci": true, - "package": "SDL2", - "name": "SDL2", - "repo": "crueter-ci/SDL2", - "version": "2.32.8", - "min_version": "2.26.4", - "cmake_filename": "sdl2" - }, "llvm-mingw": { "repo": "misc/llvm-mingw", "git_host": "git.crueter.xyz", diff --git a/docs/CPM.md b/docs/CPM.md index 03d8a039f9..c01376469d 100644 --- a/docs/CPM.md +++ b/docs/CPM.md @@ -108,7 +108,9 @@ All dependencies must be identifiable in some way for usage in the dependency vi URLs: - `GIT_URL` -- `REPO` as a GitHub repository +- `REPO` as a Git repository + * You may optionally specify `GIT_HOST` to use a custom host, e.g. `GIT_HOST git.crueter.xyz`. Note that the git host MUST be GitHub-like in its artifact/archive downloads, e.g. Forgejo + * If `GIT_HOST` is unspecified, defaults to `github.com` - `URL` Versions (bundled): @@ -135,11 +137,11 @@ Adds a package that follows crueter's CI repository spec. * `windows-amd64` * `windows-arm64` * `android` - * `solaris` - * `freebsd` - * `linux` + * `solaris-amd64` + * `freebsd-amd64` + * `linux-amd64` * `linux-aarch64` -- `CMAKE_FILENAME`: Custom CMake filename, relative to the package root (default `${PACKAGE_ROOT}/${NAME}.cmake`) + * `macos-universal` ### AddJsonPackage @@ -155,10 +157,17 @@ The cpmfile is an object of objects, with each sub-object being named according If `ci` is `false`: - `hash` -> `HASH` +- `hash_suffix` -> `HASH_SUFFIX` - `sha` -> `SHA` +- `key` -> `KEY` - `tag` -> `TAG` + * If the tag contains `%VERSION%`, that part will be replaced by the `git_version`, OR `version` if `git_version` is not specified +- `url` -> `URL` - `artifact` -> `ARTIFACT` + * If the artifact contains `%VERSION%`, that part will be replaced by the `git_version`, OR `version` if `git_version` is not specified + * If the artifact contains `%TAG%`, that part will be replaced by the `tag` (with its replacement already done) - `git_version` -> `GIT_VERSION` +- `git_host` -> `GIT_HOST` - `source_subdir` -> `SOURCE_SUBDIR` - `bundled` -> `BUNDLED_PACKAGE` - `find_args` -> `FIND_PACKAGE_ARGUMENTS` @@ -172,7 +181,6 @@ If `ci` is `true`: - `name` -> `NAME`, defaults to the object key - `extension` -> `EXTENSION`, defaults to `tar.zst` - `min_version` -> `MIN_VERSION` -- `cmake_filename` -> `CMAKE_FILENAME` - `extension` -> `EXTENSION` ### Examples @@ -192,8 +200,8 @@ In order: OpenSSL CI, Boost (tag + artifact), Opus (options + find_args), discor "boost": { "package": "Boost", "repo": "boostorg/boost", - "tag": "boost-1.88.0", - "artifact": "boost-1.88.0-cmake.7z", + "tag": "boost-%VERSION%", + "artifact": "%TAG%-cmake.7z", "hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01", "git_version": "1.88.0", "version": "1.57" diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 754ba61a0b..f22b8753f8 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -39,6 +39,144 @@ if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) AddJsonPackage(oaknut) endif() +# enet +AddJsonPackage(enet) + +if (enet_ADDED) + target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include) +endif() + +if (NOT TARGET enet::enet) + add_library(enet::enet ALIAS enet) +endif() + +# mbedtls +AddJsonPackage(mbedtls) + +# VulkanUtilityHeaders - pulls in headers and utility libs +AddJsonPackage(vulkan-utility-headers) + +# small hack +if (NOT VulkanUtilityLibraries_ADDED) + find_package(VulkanHeaders 1.3.274 REQUIRED) +endif() + +# DiscordRPC +if (USE_DISCORD_PRESENCE) + if (ARCHITECTURE_arm64) + add_compile_definitions(RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN) + endif() + + AddJsonPackage(discord-rpc) + + if (DiscordRPC_ADDED) + target_include_directories(discord-rpc INTERFACE ${DiscordRPC_SOURCE_DIR}/include) + add_library(DiscordRPC::discord-rpc ALIAS discord-rpc) + endif() +endif() + +# SimpleIni +AddJsonPackage(simpleini) + +# Most linux distros don't package cubeb, so enable regardless of cpm settings +if(ENABLE_CUBEB) + AddJsonPackage(cubeb) + + if (cubeb_ADDED) + if (NOT MSVC) + if (TARGET speex) + target_compile_options(speex PRIVATE -Wno-sign-compare) + endif() + + set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "") + target_compile_options(cubeb INTERFACE + -Wno-implicit-const-int-float-conversion + -Wno-shadow + -Wno-missing-declarations + -Wno-return-type + -Wno-uninitialized + ) + else() + target_compile_options(cubeb PRIVATE + /wd4456 + /wd4458 + ) + endif() + endif() + + if (NOT TARGET cubeb::cubeb) + add_library(cubeb::cubeb ALIAS cubeb) + endif() +endif() + +# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package +if (ENABLE_SDL2) + if (YUZU_USE_EXTERNAL_SDL2) + message(STATUS "Using SDL2 from externals.") + if (NOT WIN32) + # Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers + # Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095) + # Yuzu-cmd also needs: Video (depends on Loadso/Dlopen) + # CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809) + set(SDL_UNUSED_SUBSYSTEMS + File Filesystem + Locale Power Render) + foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS}) + string(TOUPPER ${_SUB} _OPT) + set(SDL_${_OPT} OFF) + endforeach() + + set(HIDAPI ON) + endif() + + if (APPLE) + set(SDL_FILE ON) + endif() + + if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck") + set(SDL_PIPEWIRE OFF) # build errors out with this on + AddJsonPackage("sdl2_steamdeck") + else() + AddJsonPackage("sdl2_generic") + endif() + elseif (YUZU_USE_BUNDLED_SDL2) + message(STATUS "Using bundled SDL2") + AddJsonPackage(sdl2) + endif() + + find_package(SDL2 2.26.4 REQUIRED) +endif() + +# SPIRV Headers +# We only need SPIRV-Headers iff spirv-tools is bundled +if (SPIRV-Tools_FORCE_BUNDLED OR CPMUTIL_FORCE_BUNDLED) + set(NEED_SPIRV_HEADERS ON) +else() + find_package(SPIRV-Tools MODULE QUIET) + if (NOT SPIRV-Tools_FOUND) + set(NEED_SPIRV_HEADERS ON) + else() + set(NEED_SPIRV_HEADERS OFF) + endif() +endif() + +if (NEED_SPIRV_HEADERS) + AddJsonPackage(spirv-headers) +endif() + +# SPIRV Tools +AddJsonPackage(spirv-tools) + +if (SPIRV-Tools_ADDED) + add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static) + target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link) +endif() + +# Catch2 +if (YUZU_TESTS OR DYNARMIC_TESTS) + AddJsonPackage(catch2) +endif() + # getopt if (MSVC) add_subdirectory(getopt) @@ -68,15 +206,18 @@ if (VulkanMemoryAllocator_ADDED) endif() # Sirit -AddJsonPackage(sirit) - -if(MSVC AND USE_CCACHE AND sirit_ADDED) - get_target_property(_opts sirit COMPILE_OPTIONS) - list(FILTER _opts EXCLUDE REGEX "/Zi") - list(APPEND _opts "/Z7") - set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${_opts}") -elseif(MSVC AND CXX_CLANG) - target_compile_options(sirit PRIVATE -Wno-error=unused-command-line-argument) +if (YUZU_USE_BUNDLED_SIRIT) + AddJsonPackage(sirit-ci) +else() + AddJsonPackage(sirit) + if(MSVC AND USE_CCACHE AND sirit_ADDED) + get_target_property(_opts sirit COMPILE_OPTIONS) + list(FILTER _opts EXCLUDE REGEX "/Zi") + list(APPEND _opts "/Z7") + set_target_properties(siritobj PROPERTIES COMPILE_OPTIONS "${_opts}") + elseif(MSVC AND CXX_CLANG) + target_compile_options(siritobj PRIVATE -Wno-error=unused-command-line-argument) + endif() endif() # httplib diff --git a/externals/cpmfile.json b/externals/cpmfile.json index dcafc8f97d..cb32a75ed5 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -8,12 +8,18 @@ }, "sirit": { "repo": "eden-emulator/sirit", - "sha": "db1f1e8ab5", - "hash": "73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05", - "find_args": "CONFIG", - "options": [ - "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" - ] + "version": "1.0.1", + "tag": "v%VERSION%", + "artifact": "sirit-source-%VERSION%.tar.zst", + "hash_suffix": "sha512sum", + "find_args": "CONFIG" + }, + "sirit-ci": { + "ci": true, + "package": "sirit", + "name": "sirit", + "repo": "eden-emulator/sirit", + "version": "1.0.0" }, "httplib": { "repo": "yhirose/cpp-httplib", @@ -70,5 +76,107 @@ "sha": "73f3cbb237", "hash": "c08c03063938339d61392b687562909c1a92615b6ef39ec8df19ea472aa6b6478e70d7d5e33d4a27b5d23f7806daf57fe1bacb8124c8a945c918c7663a9e8532", "find_args": "CONFIG" + }, + "mbedtls": { + "package": "MbedTLS", + "repo": "Mbed-TLS/mbedtls", + "tag": "mbedtls-%VERSION%", + "hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da", + "version": "3", + "git_version": "3.6.4", + "artifact": "%TAG%.tar.bz2" + }, + "enet": { + "repo": "lsalzman/enet", + "sha": "2662c0de09", + "hash": "3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd", + "version": "1.3", + "find_args": "MODULE" + }, + "vulkan-utility-headers": { + "package": "VulkanUtilityLibraries", + "repo": "scripts/VulkanUtilityHeaders", + "tag": "1.4.326", + "artifact": "VulkanUtilityHeaders.tar.zst", + "git_host": "git.crueter.xyz", + "hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964" + }, + "spirv-tools": { + "package": "SPIRV-Tools", + "repo": "KhronosGroup/SPIRV-Tools", + "sha": "40eb301f32", + "hash": "58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa", + "find_args": "MODULE", + "options": [ + "SPIRV_SKIP_EXECUTABLES ON" + ] + }, + "spirv-headers": { + "package": "SPIRV-Headers", + "repo": "KhronosGroup/SPIRV-Headers", + "sha": "4e209d3d7e", + "hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4", + "options": [ + "SPIRV_WERROR OFF" + ] + }, + "cubeb": { + "repo": "mozilla/cubeb", + "sha": "fa02160712", + "hash": "82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61", + "find_args": "CONFIG", + "options": [ + "USE_SANITIZERS OFF", + "BUILD_TESTS OFF", + "BUILD_TOOLS OFF", + "BUNDLE_SPEEX ON" + ] + }, + "discord-rpc": { + "package": "DiscordRPC", + "repo": "eden-emulator/discord-rpc", + "sha": "1cf7772bb6", + "hash": "e9b35e6f2c075823257bcd59f06fe7bb2ccce1976f44818d2e28810435ef79c712a3c4f20f40da41f691342a4058cf86b078eb7f9d9e4dae83c0547c21ec4f97" + }, + "simpleini": { + "package": "SimpleIni", + "repo": "brofield/simpleini", + "sha": "09c21bda1d", + "hash": "99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c", + "find_args": "MODULE" + }, + "sdl2_generic": { + "package": "SDL2", + "repo": "libsdl-org/SDL", + "sha": "54772f345a", + "hash": "2a68a0e01c390043aa9d9df63d8a20a52076c88bb460ac4e0f33194ca7d9bc8fadbbcc04e7506872ac4b6354a73fbc267c036f82200da59465789b87c7d9e3a4", + "key": "generic", + "bundled": true + }, + "sdl2_steamdeck": { + "package": "SDL2", + "repo": "libsdl-org/SDL", + "sha": "cc016b0046", + "hash": "34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b", + "key": "steamdeck", + "bundled": true + }, + "sdl2": { + "ci": true, + "package": "SDL2", + "name": "SDL2", + "repo": "crueter-ci/SDL2", + "version": "2.32.10", + "min_version": "2.26.4", + "disabled_platforms": [ + "macos-universal" + ] + }, + "catch2": { + "package": "Catch2", + "repo": "catchorg/Catch2", + "sha": "644821ce28", + "hash": "f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f", + "version": "3.0.1" } } diff --git a/externals/ffmpeg/cpmfile.json b/externals/ffmpeg/cpmfile.json index 9b9efaadde..ff48ce742d 100644 --- a/externals/ffmpeg/cpmfile.json +++ b/externals/ffmpeg/cpmfile.json @@ -13,8 +13,9 @@ "version": "8.0", "min_version": "4.1", "disabled_platforms": [ - "freebsd", - "solaris" + "freebsd-amd64", + "solaris-amd64", + "macos-universal" ] } } diff --git a/src/qt_common/CMakeLists.txt b/src/qt_common/CMakeLists.txt index eb36de4cf2..aa931f113e 100644 --- a/src/qt_common/CMakeLists.txt +++ b/src/qt_common/CMakeLists.txt @@ -39,7 +39,7 @@ endif() add_subdirectory(externals) -target_link_libraries(qt_common PRIVATE core Qt6::Core SimpleIni::SimpleIni QuaZip::QuaZip frozen::frozen) +target_link_libraries(qt_common PRIVATE core Qt6::Core SimpleIni::SimpleIni QuaZip::QuaZip) if (NOT APPLE AND ENABLE_OPENGL) target_compile_definitions(qt_common PUBLIC HAS_OPENGL) diff --git a/src/qt_common/externals/CMakeLists.txt b/src/qt_common/externals/CMakeLists.txt index 189a52c0a6..e7b2e7b3e6 100644 --- a/src/qt_common/externals/CMakeLists.txt +++ b/src/qt_common/externals/CMakeLists.txt @@ -17,4 +17,4 @@ AddJsonPackage(quazip) # frozen # TODO(crueter): Qt String Lookup -AddJsonPackage(frozen) +# AddJsonPackage(frozen) diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index 55cdc17c1f..79a4bf4fd2 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt @@ -246,7 +246,7 @@ add_library(shader_recompiler STATIC ) -target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit SPIRV-Tools::SPIRV-Tools) +target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit::sirit SPIRV-Tools::SPIRV-Tools) if (MSVC) target_compile_options(shader_recompiler PRIVATE diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 27c8ed9c1d..4a168241a4 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -333,7 +333,7 @@ target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS}) add_dependencies(video_core host_shaders) target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE}) -target_link_libraries(video_core PRIVATE sirit) +target_link_libraries(video_core PRIVATE sirit::sirit) # Header-only stuff needed by all dependent targets target_link_libraries(video_core PUBLIC Vulkan::UtilityHeaders GPUOpen::VulkanMemoryAllocator) diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 00e03bd935..c03f7a3abf 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -397,8 +397,6 @@ if (NOT WIN32) target_include_directories(yuzu PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) endif() -target_link_libraries(yuzu PRIVATE Vulkan::Headers) - if (UNIX AND NOT APPLE) target_link_libraries(yuzu PRIVATE Qt6::DBus) diff --git a/tools/cpm-fetch.sh b/tools/cpm-fetch.sh index 088df8464e..0219845707 100755 --- a/tools/cpm-fetch.sh +++ b/tools/cpm-fetch.sh @@ -84,7 +84,7 @@ ci_package() { echo "-- CI package $PACKAGE" - for platform in windows-amd64 windows-arm64 android solaris freebsd linux linux-aarch64; do + for platform in windows-amd64 windows-arm64 android solaris-amd64 freebsd-amd64 linux-amd64 linux-aarch64 macos-universal; do echo "-- * platform $platform" case $DISABLED in @@ -227,7 +227,7 @@ do HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}" fi - HASH=$(curl "$HASH_URL" -L -o -) + HASH=$(curl "$HASH_URL" -sS -L -o -) fi download_package From d29824501c54ad45f8e1be6ccc828db3730a35cc Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 3 Oct 2025 02:12:43 +0000 Subject: [PATCH 08/10] [android] Android 7.0 support Signed-off-by: lizzie --- src/android/app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index e8d8141711..60a22e1782 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -59,7 +59,7 @@ android { defaultConfig { // TODO If this is ever modified, change application_id in strings.xml applicationId = "dev.eden.eden_emulator" - minSdk = 28 + minSdk = 24 targetSdk = 36 versionName = getGitVersion() From 0f3eebe3c3aeb1bd78f00f941d8fb4170ac34402 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 3 Oct 2025 03:09:19 +0000 Subject: [PATCH 09/10] fix drawable Signed-off-by: lizzie --- .../{drawable => drawable-v26}/ic_launcher.xml | 0 .../app/src/main/res/drawable/ic_launcher.png | Bin 0 -> 2210 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename src/android/app/src/main/res/{drawable => drawable-v26}/ic_launcher.xml (100%) create mode 100644 src/android/app/src/main/res/drawable/ic_launcher.png diff --git a/src/android/app/src/main/res/drawable/ic_launcher.xml b/src/android/app/src/main/res/drawable-v26/ic_launcher.xml similarity index 100% rename from src/android/app/src/main/res/drawable/ic_launcher.xml rename to src/android/app/src/main/res/drawable-v26/ic_launcher.xml diff --git a/src/android/app/src/main/res/drawable/ic_launcher.png b/src/android/app/src/main/res/drawable/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea5c713802a62e149605cae9216a9fd65aacfbb GIT binary patch literal 2210 zcmV;T2wnGyP)Px-TuDShRCwCuoM((xMHI)kFRQVFyO!06Xxv~#jjq8Gv3@YI5ercX#E1nuilVV& z?1?QF;#vq13pUiKhzcSoD(EV@DkZ3hB1l`dvA%ut^TRt=XXnlB_rAB{B>(Jt@6Mb# z_kYivIdf+2mX!370+a(4KqXLK@_#Hs!U4cNKr^rr=)t}80GoiXrOkmr*_KAiw!ke4 z{Yu%|1vSB1FMNutW0%l#3L4V$$!GKfKp&QkO^ZBAVZA03R{8^(A7q0hU@6%>cgvUjPe%RXz?mNO@iQoFAZW8?aBY$vFn- z5X2@zHU56JXiZNySKDxCI(AZ8~~&h!`Ez+&J|V6PDJ&ImY>4F&cS zQbs$@SjcM%FdJlnebXjquMpEx7We>Y2q5V_B{& z2i^s)jG;$aQpA)>RD5kh1UdLlZnV_s?+M@!@pILdiD8|P7q|cMCizhb`X$d|lMRkn zSV+3ZoE^m(uT3~A-yF-5fJqdltnizLfge)pdtOv>c9-Zk4wPnbJu*fA2z(FxY+#Cq zE=^ic`Mb1VCKhEz=U;|J29AqDP#v(dhTVXA7wjT+>LgA&TwUy6HUN=8*pIX>wV~tUNI#pF4pivaV||+8q}B87qJ#L6oTviNVst z5f)kffKjp_?FK#v&KE~JB!VxhHBhJd%0q#v($C|L-;;;3n^w2ZLr$%q62pN{1q*!e zspMs{zzK#AxWGuac1m7oo;dDvV-BBJfsb4;N1wuloD&1w&jJ(+fCs!f?u;<3E|RuG zfo}rTzuKe!6UEwUfE|F59(A7!q2q5M@2T8vr5?7-0H%b<6i)MSs9jFbD8D@{-%0|q~-`)XKzN88?bV#%S}FQ)H_FhUvGpBE+nbB$#0yn(k)tjDkWHxRpK)~ z1Ktu#agy?7^0^6^EVp4LN$M+E+%_Zy+iWur_{uf@LO$LTmpA%d8bzS+W~Yam(Mw<4y{eAmdpMb*iY|ZOv;PV`hdP; zlw3d0L)H=tK{YAp{Jh@5ocKf6H6OCxxS63IV*B+DR$cwt8y1o_h4G02-0PpZ@LR=9 zV;rsSia)t$KbqdCAV1G9mj31y`GlYwLkEvSs5O z9Jn56)OK3ktl}&qqfnrt@UhU*CBUAs#CiLsR|76&chv}bIT`my$({R|7(-@Ks4)rh%MgA|@9d(EMIp0| zEudOtwSTNZ&|7lw;UD?Rz27u3z>KI@6={ey8hX5vjMI%Jp~tr57?+$*p_Dt&&|_+m zmKS=N>9%ja!B}5y2!V}(+NxgP0S>Zk1E~OQeV{gk)Zf86V4&C0kt!clSWp!KmEw=g zA@(TnNesEM;kB|KT7>EJI75d!3Okze%1wSbmR42RVQ)MjY6Tepjk`Hso z8U623M1pP)bIPorpgJ{VxdG$wrd(6fcNI&iUh2|*X?z`m`5p^FgC#?lHadatE&V&M zHRVCMeD^z+`-AU5(u`X0Duak->V$!iVhW|-WuTeq+V#Tqa@(Aiv4$IlW>61-#~}BsM|QP zwt6BEG(Ge<3g-xpvOJKq%c7(=0;i|sg8(L4`dby-CA(i*M;h<2x@G%RV9i`L{?gLd zZGm|SXRsZ_cy}ZSNpH}5msCIX9t8lKT@H=|DCOR^#|7EEr=jQo?xRp|KPO1|cD9*J zuC)PUW6Ccp){Qk>idMNV`4>`875*W#r@PEyKeaM}MZc`Cf*5uAzuLnLR_s^WFO19J@i_jtD{uRY+ kawlNdkb6hs)V`$a-=DRfGw8>|X#fBK07*qoM6N<$g1WRQ$N&HU literal 0 HcmV?d00001 From ac87d694ffb3260b62c305b8bae6bc736586e89d Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 3 Oct 2025 00:19:05 -0400 Subject: [PATCH 10/10] script to make <26 sdk icon Signed-off-by: crueter --- .../app/src/main/res/drawable/ic_launcher.png | Bin 2210 -> 49032 bytes tools/VectorDrawable2Svg.py | 86 ++++++++++++++++++ tools/generate-legacy-icons.sh | 26 ++++++ 3 files changed, 112 insertions(+) create mode 100644 tools/VectorDrawable2Svg.py create mode 100755 tools/generate-legacy-icons.sh diff --git a/src/android/app/src/main/res/drawable/ic_launcher.png b/src/android/app/src/main/res/drawable/ic_launcher.png index 7ea5c713802a62e149605cae9216a9fd65aacfbb..6b586fc75761f49f0a7a67cb1ebdf58edcafe745 100644 GIT binary patch literal 49032 zcmW(+1yCGK)86CYaJRz`x8UxF1$Tl3hakZrxE>mULm+5yCrAi^;O_2(ym)X3?)LNj zwO6%Qv$Z`vJv%*5Ki%_5Q(XZYgB$|@0Bj{iIc)$ydije4p#AUWPcB>aa)VhZYO4W& z9}@r|!U5p!r3tYM0G`|cux}0kqUiuY>YClGCI0dNVyU7a2R#4p%4;kA{L+Hzp`<2{ zx`zQqCJ?1`(1X6b3@FJ->-sDmnRuo%^!*NQDYf;oF>!X8ApV!wv%E||8A>Rln25%s z2!m(iA>GO#ei8mhi1x2bM0m&e+Sz4m-d4e=UCO?pp=2r0rXgrzMWTgoZtl(8+_6#3 zhnbQPPZo?5aWtfpfOSGch!(OT1XvS3cPN~a;gbg`AsIpp1)CEQ%v@IW^>b_^?`w%tFEP zs9UF7;sh$c#_}zuRSS(;{)U#ePCxUfItUXx!{q|9z0G$GSXl>yuPiysK9>^l85%TO z8ZlL6V{Mf$7-gR)5w4Mv{LVf5uP}Br;U^-=Z)>usvM92Fij6FIMtgz;tl8LY#ZQX+ z+9}l6(@EuOUcq^X*x95zP?2i zJt<}}C|T6NWEb&X6ds$prFs>Ew98i1Bl8LwGqph-zWX>eo59PS@{0RX!G^;HcW<{C z;3oZ6QH1y5$6d0S$g{o7^e^8sW(y$tQTM?7Yg z^|}FhB2^cQ7%Z8~#cPz`W_dtV^PZsA?k#)=-#v?$x>IxbWHS+m?OG1ETuOA#cUPfT zQwgtDO7d!7`kvwl8WRap`wY0_3M>x{5=1CUN#55w4QqyK(o9$RNEw0N=UfgaL=owT zud`sKqUPvsCN2eh+o<2A4_8C_d-ZddoMA+soFQhP9uf&#AE2cI$tT__Jhl<&K-q9n zXv~uXbjWEB^gz8Tinx5Om~rT$dy(N92C=BzDL5AaENul(x(~G9$kiA z7Wg;(ZX9rgS3pv38P9CBv|`q~TFfC8gyyGEDsOEF#3dwSz_E{y*K-k@roTEAlw4pSN2B+l@R51}=O-e~%vNllCUR2Es5neR^Pt7!q} z0K2H48a3j4h0M5M8>EV6js^|6)$}VU=(3Fd_~l*XDexIA$cmxq@gE5;tPf3x5Q&(w z6RR5wBziEjbwXe@K?5p=DClQ8?CvknEU3VNc`=`~)>5 zlFx`_ZpMROnc_iTRJW~N6AZ5bus;KVF){?*fs^joHKm z*Op+#TkBSBP{5L4u^%&198NR<#o~i-{|eENOabX%SZC!Tkx5jPo}A+D#9!cn0h6y3u~odGS;W zqixBGiO!3+L5nMh zug&Q^dGA7~qutK*F+lHvj%L-R=!Pz$Mx7k?-pdn7cW z#A9(Q67s9ZOL1CcPS0V-#=y%cP$92SeK1=>+Dnd>HG^k6F5fpNXycH^YaH~usuG^i z*Dj{-(2|@xdDg>jhF$Sc6tc-$AY>oJ{~mlIRp(MnkHwl)A$&*fE$bOWVTFl&*B8h0 zaew%;l;kjP zGPW?;nw&2*{t?MZKCjI9W&1kYkRgRR>V9j#=;*Pp);ZnsKIB_b!!z0+3!Ad_+Fng7 zVMWLB=ZL!*;e`gQq-dwBmRBrL=P8cVNUl+^ht8sx&24@cP9H{GvQo5g8ien0@K@pF zOr$lV{PNi;|HkWeKb6IMsfjQM7J>lmAC322-`>>#>ZoguhWyOCxk&Jtxi|)8`*ql$ z0t|W7wXFGsh;J5}Yo7A_Q5j#FHMEwnn!0Q=A*9g0ud^#<*+&n`3@?FLxryU!tAvbh zIgsj>rJ1Z9o>GSJt;!2cFP9wP8V465L6_zIF&idIp(nUH!)p~`l{DrOMuG7#1SQHsGYX<}gR z97Rx4mvFKybf~vR#3xwqQf$vDS%;6MRoUyFMyt#AX?2A7#FA#MEktn6}3x` zUP))h94(k68d!nd)F!iPON+$*+l>rewf*~`V#Ha6!_#f%$Ba3T`Y2v(-FdlB!d2lD z0HB&J?Dicctd=XjP_{=|uKNrx9h&qG(}M+H>5jOs;!EKf0v9zsbWUf{1zWDm1O35!)qRSv7g`;>ZPFNM^KW5?<$BXki~4AKZqfF2?pKVuk4 z1gK-evLsD>__G_zM!>|$3%vm$O9%1>` z!Bw7x-q_Er7@qMGlkBP3<|+tc?P?qb{%uOVfAJhcSPh8O+|)*9{1@XCpLDZd#emH3 z)Z0c4G&|`~{MJXjuM;h}^bQj<$*HxQq}x<>y*)%chP|g|9YU2vNGLgwMpEno z50PfLj5$jz^#r(e_fI>BI@7v`-TN+suv-J&RLO(|VcBg;l#af%?NjzIoPbhobm7Ev{moOvfULd}yS-7Lv>1Ii&%??JiR z5|Uir+~l?)&YW8-3v>F74oVrrv*tb7dmSaXb-v^Xd>%P_3vU}*66n|7r;njPr;#ks zTIR>a((AmCY7a#X)TY3Abp~h~cfNI>CX6IP8rBW(?dji34#-3)am#dsk#ksrw=i4T z0moeQ+VUX`p6+I`lnpf^vP*9quZL^mR-STf=#7WQwDXwv8?}u&7bZr=a7i)L$`I1t z-4~K)8!Hk|&VNyt+(a?o82|;MVl&x0oJBE{qrb zZV=-2nNuUvHh=+Hlj2j+Q`xu5n%DPkC=HSAGKdXb2fZ^MWb~Lm0INdAlG(ZX+q4`7 zmzYx4#oPU@XjeffFDsHHZ=o!IMrOe)Q~kfLvEFFvcab`M@4ukagQt`lKF;?pq)cs+ zIATA(rX|H=D%8wQpfzS>DiMR+2Inm*$p`>%A$qDo1f}l$Z)MyjA$k9Y&!-lY`*jO=AP*92-4~v9AHjqpd`XuDaDrC(H174TDh?#MIrx2EVE*a>J? zB!c&_i&3HVp{H!{TD&XfenkkZXZPP4az=)9=}+$E3HZWynZ?H4d4LLc1`;Ag6+j)$ zn52`4@-v0FVKQ|R2oJs+b&@;#{ELTJ+Q~t8Q3o>t+Ym)YivO3Py}fVKi_}5!$Yn;N z2$6ff6dwM4kfzPt^mlY4E(m| zDClAyOj#;{jOjv3R{B0WX=^q(+M{D{=Ne=Q#bPq%>qJ_jSt79&Q2cLT4hfH_z`(#T zJ@iz2Q#o;wAs*GG&oIiE(bGg}6z6LyguV(Xn%5>5eqdZufba{=<0W3(lsBA+x5$>A z{L`KpB&|s(*Dc!vC9E&rSFXWH4Q96r5=N3&{ug znVwFlnak%BPe3}u4zxOPsnF zLZNoE3B%-nt9{{7h9y&sr@u?9c(2TQTrdppbIh6!SCWP%qq4|l_PDOv@?PlksU=D~ zauX9955qojjVJDN^mWm;6H&Nkqmc8Nv&EsV*c=Ahn6prwlqkVP=s0i%3nB->!f!HR zGnPQq{O1yLmXEXWqRVdmF$(pY!Xe0E$uom5V3>xzGh`u-=n`FYJ|+Hw(QP*jV!>67 z5=T^!0e$}RQ$ygloNr+;gOpX-t?2XiJ=TbCKR{}pcuO|KB{-HRxDD}CSmT|aQTcVK z;WmM^4oZ<{iG!9vQ5r*;Fmmz9_gxu6I-)mp#={n?xX@ZqujP?4xQHcB5S^RbK$Z~XTU=o7muAY3|792-N3@biAI9pUY;PC8cixa zMxN&xjsnV%7>i2YeU932$~j~4VR;lz?H+wFoI{^*-ELcou2e3O*Ilsk@0qe>@w-qX zXNYVb)!-T`vZn_zf{{9p#p?J&)E-^g1+MNepXUiFajVX-I09MZsk2{o%OCc6avjS~ zFH-I*>^c^eH?CWaD3ckTkV!7nD7+tC#>(NHj7rh>Pc=0$v$H1xo&la5W;4+85A%WA z>ewnnw7%~Q)Nw}WAEz~I_$TSFjuP+gin^S?d$%n9kln}JwTM+&n*mz^lG3htClR?A zx00KK6R^VP@)u?ProBb$6fKxeV=u3zAHyOcN#*{hP(VZqhO@!4QOCZpz@n|r!Y|ha z&MrS#@_9v%rIR~lajIsLf903A%X(F>cgk~|7DV*(e=14*u2p+I?o8Su)|S7e7P7qsCUHKZiN@$gP*DSU91EzFw@Ssqus0HDMROd3cndbk#{A?OKILn&15mJg}6hBQk$ zxqIEwPs}l(H6nO+1zoyZS4T1mxfGFDq_*MEtY&L9VRD9U%= z7QxX~dcol1US}=!TJ8b@`Rtk{j`kVn)2}DYtRii6Ene?!F1ttT5{l&mr{RlMuP8KY zT(@YA*CVq82M6125iZ=lnWK!hzk)p*aliR`s@G zYn8%}0vNymsW=cd2xx9q^^P3TfB}|hKAE78H|>j;c;!_9jD#KQ+XWe*K2jm%b~!~o z5t@nf^L{F&E2$iDMlHDgi1soyxxN1sbdQ65E}#5$$2OHMs(Sjr7!MfjMbt2@`tn_B znGT`)9=KZoc8-H6zbg&X(7>JhliC)*T0E+2pQj2pu4YO>&o3H^cyd9*BJ@X^7~bzv90&}gDtXWih%bkF34Ico~9@kBH*V=6bPY1jo>O81Qk89#B?C-@e$o|a9{z$)1TWPg{$EB5(<`nmZU42v^ETEuE<>9z7 zS?GXcPeR^fI_2KYnpI{be;Ua{oKRKwhlQndk{Ocytr^7*MjE z-a~+@>n3?;r^hC#%7GnumqvfWZVZBbmhxC!nL{{v6uXeBs^UiIcd0{EL2 z53CE{ONMdV9TP)yJ} zrLbvK-+l!zqUp!gFL>s_#q0IWj!bMjzw2Wyf#;3>nTay7b}#WJm%F%NY;nfWvTLVU z!XTkb1)ajrfO+oCzuYP@K@M9prS`{*N%oqAR+?H=Etb6Q)L|k!j2m5YPGp_X>i8=< z`k<;4;O}4*CoW_kS-OZz+!~23(0mS?#IjS27Kr}oWiJSa+^NUb2UM@8oKvW05N6?D zRp^q}x&Q0xvc)Dhp7voXc!Hw0@7LdLs#i)m!^!WCPbh+qgB?A+tQOBtNR8bv2J6BK zZmQ86Q9ya{w3nbXRfy<2whov3G%1=P%3%LHXK)QQv%=qM+6X`!QD1Mj?shzQNXlgP z62uw3p{fCYtBA^Nz&~Z?3_Y36w7s`EzkmJjYTP_37z>&aTw^C$^Ttl_U&!V!*@|n) zBEMsrD6?S4liT2zSjFTJ-T&>1tXj-4ibb)iARy#052fOv%C(tCJ;(^24H_u&omZ1f z-fkN-U?U<#`1MmN^1W&x%83&_L>UkS69vlmw-_D@lKe=)D2Q-*3fLq|6Z&dW_i2$0 zJ@=hn_V+FOHkX6jOz&;Ud1!g#oUJK-E=ADeaiB&}wqeQdyw(kXAGL;**2T}_#0^j+ ztR9aKqsx|!0mE6p%D#ditOgQA2W18Gn2}Q=NI|7+=%404@{I)TQ~xNK;dBwb@4lNM z40y9R!fkqT9aOmaJU2%Ar}zoL+Y0B~*AOmz3b)P>2tM-vTb`fB&Z;D^RcNp=S@cv4 zIPcHWy|&lF0jfr&N?KI{H(-IPZWJ|(h#Wk`=jgRh@I579KZ>LEBM?oUaoJ|g20A2O z-J%#X6K>zu{8G%U=n>O~>hh4CGv6*UeKMXsU{CMdRwcOA@YweJ9ToNIvzGhr=ejSz zAZy~D?JHA)B4qQE$Vg6*965QvF3+Opw2z4}-54*KtQ<+yLKdKJ-1+s4m!U-)6)pl! zeE^(De`27$>iva+-ir43VkjNL5|7tlXV|T7JezVI$8~et>$1wf&ipx})VR!h12Lr#`a>acWQSKRPPCF-;a>0eya=O*eV{qsLc-QkVf;u}qz z)f$vH1D%Ay`+@J|lu~~pBk~&5G6iwqNVR2Z=!QsTHK;HsE18savnZvOaYQTL#aE{b zb;@5fqkz(TI0qhrN*#_NwBIUP%nDj76lHvG5v24<4dPJ!n*%r``g*(h<@h1*(t*!P zrzhv%OQ`h0oB)sA z9S#rxsc63eMp_U|bDVj83z!r_PyEa?Cz31|mkdGRp%GQx>186JB4xNFP%5$dgS1}a zkR>*`Xr0N4Ap1#;rz^m%>NNYr&#wc)+b#CBl__2~NYnV}d1u(FKP~9EmA|n)~ zN*J;uxT)08Vce4+F~_y&?55?E=1{%XXqDZGvP&XW4IqWO39(1r9kM)brPPAz4q6+h zoqyYDS;Z9I32o@Uug0$PbM4I43GP;_GUJJ3wnW2vh6br>SbtZU%bqz%z;R&wGTYP&0C)`GpnM3oXLlyR|7UMaTb1XG_8ihsJhoXzN){Qz{#J zTsi_bZ{5W+y%_}Li^0QggdCaMO|L(ARRxU15mrl9UNMxMunIgl+zg3FWg0m*F18Xn z#A8|OQVx85<2~&*_i;tyX5s#0P6``~m#RbEwiEv+Y8+O^Kq71+hWJOFK(mmh4^FSX zSpAdBG@cFK2Ynr$>zdJREXw&<&ukT#LVR0|q?_v_YR8Gc##JtMpA~0TvFXrFO$3gs z&laiJ%ntHZJpUtA|FrQdv!{oe{@ZZXeOJ60$1ul-)i<|DIuPx3)usX{r3HObvbr(b zB6-Hh`$d6PI|6F~KJL8beuBu4I_#{jl!s)0E_cR+Mia)+{a;}%`MCd$c#-_!fU_(! z*zwZB0v8W3Pg_(^P<>ja@0s{--dkhqP0n|p0><|e)(*&|(RQ|Br<7Y?mlkIG>?!HS z`#R=a`>Z{4V_X??X{}pj^!^58NmX1QHIjE2i{6RGZ*rDNJ*Mx=y8LTCFHUOgp^g{o z{HdgA9`~J$;5Ule*Kusl2@0F-esUA`7rCKT_epGQs8<-uT7`S#8r>2o`ntsnv*S`J z{&q?s7-zgUcAJOP=?-9KscMYqh9~g=*<1JLMfd zmTP@9UaJBy?2i(Zjj&G$%PP@AzW7nM?MEH9xI8lWiuy8IT}9ePSvAiV>|HUT&_~+n zLb?U=wsF>lOl`o_l?W#i4*73=AZ@L}+4*s)7~2-v)rT@k$LQR|sBfIQoQsw5W3h*} z5>qihz;NRe8*|nvq_CeA(Qnfp6gtVvCt6IaO?vhA3m&yn{F|qOt7jo*6a1@P4>$Eq zC53tFldnfo!GV7tYX>&){PxfvFoC+t;uBA9d$a~c>Njg?oBc8oRoC!3Gv|73@r|jCI1*kS0ozFLo04Ml1ggzg(y8##7tE>z;9cepL;{; z?Qzij5wGotGoM9{;!#m^Z?zVd$ruT*T%rGU=iozCSkh4!*&ungvwcAY?_k-?;)(lm zteoiO-jpo(iEmkXpD+XCk;{MKJ=)J$n>n@j8pQ=SF5a8kPj!!;;p(X9Z_SI1(AY%D-T320xJ{+kGO_*%>=iwZ;gkv<*zB2zfoZp3am-%7t-25?1~-0WHlDkl}AJ&XrXjQZ3^$=&Y0_EcO4`t&bb;7&qb0O*cH$Gy?>rUh;< zrw{NX5r&Ij-^BP*XLu5C(vy&1zKmpmxh z8M}2lww4NVxY-m+rom#TpQXCwE&Jv6n~sJqBj(eL@}MXy@A_H)2d?+xKP0t9v>d-~ z#Q#{T`M2Hz?*rniC3c_oIxzeZINv#2ZY!LGYKEM!{9)VXScuRM5Fm#n9K>x2)>VVn znvp=F=kx&UJR~G4j>+n&uh-Q%X5de6^GgH?T=4cQXp;~=p_S5qd29Y^yOR(Bbg%t1 zsaG0C@-s-$<}4t4(prERNgS(d+;&uH>H@tX@ki`rew(j*`_Tjc)PdU=FjRDsu*Q z_ZM!53->|^ETL_du-Hg1#0|q$fw97HmFR)QH+5tpsDKh93h>j|lbAH-{LNed-7vam z0QSTw5?b({|F4TJpdVoQWeLD%H)vVQZFm6g6aaAooq7k3*6xM8;sw`fc>aX(a@f7+ z1t!_-BUO4n*rbM}ZY*^xO7hM5CHXO%?L>5Dq`t$0-vn%CtUBKolyL1Gi9PwatUl^a zWIwvU2LTc|Y7lc?!3eSDt4{VzNpIaT>GdH_j5>KI8q#*R+U_kt6VB| zy}bGCP-@Y!qO{z<92sp`_rJL8JXJD8Geet(PM9SmF9+$hRnfn!v9#d)Q^%hjpP6uB zLPgSV{=wD}Abz?1@oK5P^ElfhU4fbTwuUV+Qd>!rB*PA#g?8Hi{i?5)>dz$gpipq$ z8VKCUm#>Os@0oast&j|=un$MSYoL7pY$K5Im1v#K&&65GR4=<$E z*M*zkpB)lvcS!_Tu(`&+8E2a|3IDKE^0Q8ub+HzY1#v^xw%)N=V;18e)i$mVRw@eS z4RA*@l@Nmv*)fWiZ#l8x9LSpDFKHze0uOd9AaoANt>P}AUpx=PQm8TLvabIJi}hg4 zP-D&V)8_21$O48p7PJHlf%>$z-=X!yhVhN_{^!0u4WaFZrOW@U zu>dIeBoTyY7mfOsaA@9>w2f^182v+&eck5Ilej8L*pT(_a7}&aq1cAKZWraq4zobl%N4!?of3Iwq4T&m0kJ#zks7gsd!Y@;y+zs7Uy@lFzebFr#lAG* zi~JOrnMwLH#eS`Y8A|p;9%;F!<9^veKmENOJk6^w(xEJx%qH zGkLNC{Ef+P;Zvev>!RzUycuyjmtx69Hm`CrIK}E+-%`wYnN+(xw^HnP-XH(sl5kha zZ%+y@lD}Efhv*~UWK5NxZ+<9M__KerB-&1LkTSU>i0&D2iK>Za*22Q9d+yfe{6Sfg z!{PoRc95QK@MTH!9yN_$>%^p`sdjR|IL}sFz{fJh8!tAecgR3N zHYt!oSdUEBNtAyyJ|uLLhOesI%W)eoaEtBmfkJAm$}s)yO2&~8&XOkcS+`FP6e#Nh`;E}7qB#=8Cs z%`En7^V@Fy@lR7v`$rxNjX*3zk?WuFG#!ZneE(VePdNn$!d5XFDFvU`=PP}=DwlxJ zB%wpXuMcN&YDsr6muAKer}e?Jh`lXLJ{5gip^a7-kX;Br8Q_OJ?+Xk_^LMZEociy~ z1~LtL{)l4y{if8pnc)5Y02I;vXuH4aRk@U5-^$u}v?^O8{$j6+Lx^poL)2_w@on;p zE7b2B=*|(vR!VAL@V%!Gn}`sGy!hjr9A^|GCgNg6D!D2dZo-nqgiQlIsgtb|Oy`W7 zxiuB(u_*PgQ^J>r{ht9CYq6vvR}lSeR~9{u^JwGduMh-k1Z9*(eWwJkiCsH1Vog}7 zy?w_kXLF)LLS$`@uTP`-SnJPwT-8G*?dMjycHxH(RLIlg)!;yUTr>XKgp2s)9lBYL zxs5s+CO)V8KoJE6ooDdAKf~d7ZX!Inc8+iBjDcDhjieYL!~I%|jsbA-=SQ=3=WL%# z{kNPr{*;;&<&xD`lbiOqD2NxvUr0eR;KScX-1FQb81Y|jJi}5SI77h^sqPx6ARutU ziSopDJ_mZm7QcSGE+nPO^(HvTiSf@92Mx?dy;CtTcc?RTz0NC zIC;TZUp|@DY}r58T-R76M1WubF&_HQKV)~vTRvzAY)uk#Ei5St7TgD?&+Q+yHpxO( z=5QF~-)5Vf{x|3_!DLn_9%I}MM?ro|>j-JjM>&e_d|vI%(x?%kJrn=~gX|mMvpAPi zR+VviAqlFtCa=dOlOHB9hlGCk{*EK5r`7hhIuIZg%AvmUI9ktr)L5Rrbm)8k6@9>* z4Tizk1)LlU8v_C6U?OShr?c+{=~%FSbZ?E@F53g;1%wjPhtQqZrpHNs%ieaQK&K>b zlw6+jTJX$Wp^klbWAIb)a}v$M`>du5x?6!6mCX@e5PV3x@jh zCzvyIx1Igq1+d5zNovMy8rV=H*PUSET=%Jjb(~=sfaKpp@sQMsH3t?}gpS5v_;B>y zpz5v<4=;vM(P-GV~Wwa{UCVF#ZA^DErE1VR7(T0?wGndL)t37$ofz)v(vY2 z(A*}qi+^9e5)`v!L38w6pUgP(S$NTtFyf1uM)R#vRhs_!C%n=h0(jyGRpijmuk9L;)qOe6$2q?@ zeJIG^>vh>}wo>v+-F}zEznKkU`L8d|_Q7e1%S+?X@ivp7FMII8$fT%TtCJL z1;g;$krBag;@>Kwux5NT*SAo)e^aM4!BBCq-Npe;hTBBWsYyV`=LtMvi=D;8AN%T( zE!!z~ibpS&O5t505grdGPj&|+=~&**ZS?y9TpiiIA8Ho=y=*jLW?#Iub05C#cxO^h zF@n?a-apOM8+FVEn4|u-{)s{g~?~c9}%%{d)Mtvx-i> zZVys->{oxox7}MZ5wGq-$Yk7lnbo8Sk>W~OBdjNQ&i9x{mwamcd2oNbpfDn2^@akVo zSh3V;{3G3V8XBqbp|7f_#s4?JAfIiMbJ;foK_Z|XRpPA<%ut6RZo;K0z8xU@0p(bCfLp`jdI|6e@8^y@B0T) z{mwo60lH2zvGqEa2IKJ$?Ge@=<1T-5kk*_1Vf}Y<$r%gMWTAy1{t&$`(IJG?6SS4< zfGtcwsSa2*E++(VhoZeCGVfz!0kL1ixWtAc_cHrq%#peNT<4!kdT4BbbITtu-f*iv zlaL9$%CGHf^PWn~Ol97$TE1$rq9JhNy(YccGyIQ47x%K+<X`(P#vXBraP+J4v$UNi6-<5 z3re<)D07&nd>>%9(e}aWX({}9{<#;|{~xd28UmE9>A(1rMI&yi%r|wMqC|uCGba<(T#tu!`p)&w@e6Re<*#{Rna|s*#o{<8L=&`CTew&qUAa_SqfQVN$mN$2+!pf&wxKyss* z<0fJD;W_r%YL+ISb())A)H8b0=Ib38{-G#|V!1Mfk;Z(~4emtP9owO^-&8-s#kWZ) z%k|&nBfHQ~LzZ6Q^@YzacW!@#1}H935qkNz>w6tqw!>B@VCx@kit2f>^KIP^uw1S? z>D)Em+IKj=5Ly!p;{2OJ#A~NyoCVpnnE4Vt;=sA5<4$RIZ^~5nEHKIG)Y5u>NBh3_ z&-X|F-BcIvm2C^XuzAIqO}-$1=N?u`PP_Mo@^*gj`dzluYTN5)wUtC)|KpeQdx)~?MT8bG~GH*O#% zf0$Zfa?u}%Mg~K?AMA*;%-R%xCK{EWX!#4po3S}pftUOQ&ZlEY(csnu;G{j^j@LK{sR88FOvgQWYNzdj?QkO*yJ3!K5g8J)73SXFu{y z!Ufz(PLlVEji6oR{;|m zEyun#yPmk%So_wedw~ob{JU8Bw$->;USzFKR3w{+FOZok-a62cx)YCLeT5YOpIV7M%e2H2F-Ys3v~0E0TY2~2-t?d{jY z{}iukhR|mTZJQ9v>L}q`lFD1Qu*Y>5rR(0>ZTSj0#e5?PYko6{)Fi*mqVDB3PDKqA zIkpcaa!b@%z7w&FL}%T7d#Py+!M1Sff*hvuT?I+=6uKy5ve~trss)oJUEMfatMiaAN5 z?l~kwT~Ly!?4d)R7q^ZqpX(c~Xv+C~Ve(JE0p%1>VqZ6&5z~=)rXY>+P5Vi!b+vSv z+R1me>fx2O|Hd%$ST0#pKV)U6vBZB>8gjBX$Lo z_w|J4T+Hs(#bbAYcm~|zQT%m^utsKEb+n9<_W@yTD<>A zdojSUK2mG`RiedD;t`hW@MQeMbeuxta2~|8HBjU=IBNs}gmFlEcfKyWZcv~4{wU;Q z<8`yzGq<)`jyPI9Oof~{_ug&$J_YvF~r_lnx<47Hw8Wi>wf-5F&GOIOE*Ixux_A zo?Q(tPNR)2lpHny<%xIwiige7%MmZL+x4m>+>VvgP09C@zqd%p0QoxNMQjT+$4y z&u()3<1IB-t+QGnvFf|h;PR{V$x8DV&Ch@stzcW>y6w*Ul1H}nEcMh;^0gHP_2yzF zZCVM?l7A>LwF}+D#f$}|Bm8_6dEt%#rW-25)x$`A?!w8O1+JI4rSn`Yv+YCBo!u89 zb#|HbcZa9#)`~KOVx-V1-R`l6**Y-aGco)plUckU};doA+XI-}W?aCXkO*57F~I%7LuzcvSs zT9FV9_ydpc_b1dVB-p~I`0VoOS1+45%oG@lUygOWdsLjB!;KDnt#s^yE3{MYIq>8> zoX}K@BbFK!*Hl&N*c#BQ{+3OLp4$tAgfNcx@|cfxbj`+$Iz#Gy74psSKqws>PUW*4QN+!-bhQ}kZzETV_)?wwjSN9`HrUCC%qH4JNSU~JUOgnlw|~rGGf?vA zG2Qskjw#8~Yl&j1_9$0~7Z)F>Vx!Lgg@V6PmO)#X?w~Kz7qbLu`VA-_wVXNWh#>dz zzFaDf#5Uy}8kJ|#(&vMCAD-L!#BAi3+RK;12vknmwdJS?h{hSoXq39I-CfO4I0=@i z#r4g&k^3J#n+2ne-ewH6mV-pCv72mls@pg|IO568bU7!M>fDIPoB%=i0xXV89~in& zNmobAsa~pKsI#B4l#=v*TExZrF`7IAcFnldZJu#S&G#i!=n+uy-U()t9i5-H+GcSn z;Ww!Ig>;zO7SC2hN%0KefZlpKJlG>{okSk>taW@ViWNZ4P2BEm-)6Hzz^UKM%`SL3 zm2s^~zyxIv&09QtE${Pd0SO)UU~x9Ftv80|FTqAO7qD@y6GYIcV=)UgIP6(j8T6h} z2E84n=4S3(qUGHxI9+yQmCcSDm-5830vg;5F5A-tzEWMWKvlWL1dpc3t{c!fZpJ$K$OzZwM!a_ZQs7#B4|%d$xcM*ZZO6XF$D;hGdIE~)L_OnIgyyE9n;%tw1I?^g zhA{d+5~x=9Tf0y>Z@pn@nb|4v!4fa_j^Y_rm9-bx+Fm&9UI5nV63+>0wnWY*A~Lz(Zq! zdoCT9m{YB@q6FRg#nm)-)U&^3KQ#ibk2PAE4u2r8`97yT%g0Js7&W~PG{(TV zKk{8P>Q(g`Ev`9MC)zBb==ZCr4;1R?{+d`6X8pyOnJ0R@Y#!P{}p7xA+~$t_wg+(lx%TeSN*?z}=?mA?Ydyp1BZYZbJ# zpkEa3ibGYRsRHdDZl^5gR*6Rb$HEogf`Idn4c8T?~LVFw!*L4IxKMOYQ5WTV+Z7mDhWzrI) zyZ(i6)8uoqtrF z(hKtl+f1kU$0`$*fcGJI!DkF^{3~G`6xu9u`wRKNE!-F%xP6L>m70Xxga;34sL`ci-yTIuSvn<+T@lt*&>wFODcrW<< zhtVMwqFp>qfxgQjo;qaN_qPcsn+C}i0kGUr3N>V5Z|v@eJ&Qc1={k919KEojP1r{p zR~#D+9Jfvsd{lpah()I2&y4%79o#OV%gog87O_q>ly~=*PYv-|ectJ}5s-JpJj*Rg zGy8e@MZJ9B@m}$Z0k>V4uIoBUL}Mxjl2B(UvW`JEX}Jr-Z{SR5&i~#uh0f1Ng0*@G zia-a$2nT&U%~&|`q}!p;St>U+f-?eM!_*O09dUTucLL+NIKrA+nN1PBmqP^dra30( z()L5sqZKdpPZaJ)v*jc-6k5xSyo6t@u51GF%Z58G^IOH$`pPb(OI|jgHlF(~^osPF z7pri$1!(#870eDZHW3dE!tlf=KI`X+Omo-R&u1@=qP#gLVencJXwdmjCZ(V(ii>$Q z$oysqw=M>u^B*^GW}g4M^Tr$>>c|6Jh`q!d`{e)8;z^s9xOL2$ciM2mzM;va<@G!J zuvr1kSU?hZf(&RE>x6EhyrIKjnFnjbk@A*>lwF4ZDk?5S$n0QvyDujRX*>*%F6wSR ziS<_NN3I6)-FDsYG0L8Cr#G?Zb-7k#b}GA_3P>T85ZcBU#Br!xq))>b&QAB^)?-$m zo`iN9+L8lyQrE9vDA{3F6ed~H2>pKJ$5_%~61vV8Ho{@GH#CgEpGLcF;;&t$+x=zJ z*fY7`L-}7!a8v!|O!Z2#c3%3+_jzkcXAVJxkO38ts3ljqGgpki?Tqw&j#U(ULH5?q zn>`pqV9FQpy$|I<68 z234q6h$H__of!Yc;!t7zcWd3DNQ-CrPL~>Z5d0X`FHaGqz8LbG3Fa@bZZQ$uNFE}y zz4_r3+cm-s8pF$9ahM{v!)L{Zu0Ll+I9#ZSVgHs6@7AN)(usfhe!LE#pCJ#>yAD81 z?5IeG{zv-Vh&Fbp-*eZ*%s?ty!-6DP!SU;|+~BCqRJ{+mZd9uK(=Hfpa8V+0(U&w! zmN;wf9h_ax041kIpCTCc4#LsWP5eRE^i&{Pf(r(kg@*-b^RR*=v;`=>ohRd9MW9Wz z6nTpNe&`>YCgXm)m^U|5!E@noQ7iYDX_{*C1_z&O4`maax<)Ge7mUvd!VSQ~RQ?lX z&|V*GTDyw7Wf6xd{^V zaW;lcrl(%oA1T6eNJ7x49+gzEouonHp*=Js?PH$E;bP-{!Dd6UUAqti0ESNkzX>N5 z-)Q+N5cxZ2>*ahdw_-4|%yDcF-TO*m!t#tXg6J)czc4WGW1^gUntfo1LN2bCHs zc!NLP4h_9JrE6o7bavYdbJ6`|ghsBu!U3vzROX#X3$cskSr)&~@R<;#W>G8LjM;t+ zJPEui-Ikl~h@Z5kR+Bj;B5S8dgjFgzoTMDGzc`Gz;EW!n8idWi^9;z}qo=e@5jp`k zEhW7TK_{_vmiGL3+uHLIv}BiG5uSy`-$aRwxQ<@0a<}SJn;+VOm>V3Yp%l1qnSVPK zbxmSMVK&k9{`8s+oLV3{xZ#sxz z?-)KsLgpufRboCo1WfU(l!($C)t(b6aWRiMwkguMOIl&PQNCovoRVClnV5~lmH>Z} zt0d(o2#RKb?+w|AklyJHvtAaDW#B{L7e1@GvHDEDrEWn8*VmLeEk92(+?8}HTH$+| zm6F$8!B~Ht(h>;eyhiL}2I)Xl&+_QE{z>+&DYL5aJsDwGBr66Ei)7@IWU}YUSK}ywYCd=E2n^?GtJO$XF|18A9Dqk(9#$^dQLjr2? z0K5I9VbqFvbWF7J1~B#@PmfIQ$5?q3xr6{{yGGx*8by~@(5Ire57=#Rpm*g=MkkVz z-2?q|N1TR{JBkv)oxz7?7vovIk~6dya^3l?RW^Gqx}`IxSJGt~X%>}0--|qUG2tuU z)Q~ewQ>S|qjH>XgXL`w>ou{Ve08(iimlbnE1F z@Z_OEPoJA1hSYI~lIZu#g8JZ38SBsdG&}}rTms9X3a&J7%zF9-+>BiT+y6w2=1hZS zc1#LQH|Iv(_bc3-ufKzAClz~XAQIspn=!CIC=_|Db7R+@JL?c#vli%nE#f$WA#osb zc;1R;H$6LV*6y?p9cR<7c`VGHilsmy!=oz_WKagd_Q6VHR#XuFGZr5)XhConUP3Qq z0*mI{H&g8|ZLNxDGdJ+w z0amM5`!sg0%m{S0oB>!0mVjjod8n!w7z?Nth?bOuSbD~d`9aU_@pD)dK_JUP3G_kt z?Tdv3OtgM8*R5A4&kbO~obk1kJ_-3?gaZyJ;;^=H=#_4*Wz<;1 zFLa9L;gLBYy?-c@k9J@jv;drE1GHTluF?t^N`+!}SyD$Qqqm-lE20*e+d^A01R`Qr zP>PGTA5f+H-5B{Z?K$PUi(Aj9}+KhfKX+e`pO=!?>Nx8?q#U^wXZBcMM6V)q`fpY4&F?Q@K>zj9H*Wc9r#6q3^SpJr__)78!sSNt)4`@BOUeu}_UY^B-LE7^ z22Eq^vGcilBOmLr>$EkEDk?zocZUCGiyhQU>1&NnC3z02Lgpw?lqvK9-D7To-Ij@_ zIz?avUxIvpKYS~UtC3E7Pb9q#s9mq`_v-8WkIh&wW{LC=6y62b={;eUi}!U{{r1pt ze@O1n8R+a*Ncf5uijqWIibpfz0cBPBAWDTnUc1o=%;MU5I>4F8n67PR(-$*<(BLAw zf+9D4WQuxTlTE{>82GT*?^hlNt)QuX^VZGdQp{xB`GB3?za09xGxN0hre&BuivU_2 z{U!vM(O{Zs1-?H)s*3prGZbBC?X#1CWA6D;i;gNmBT9ftpo8@_+L;X%ANf)8OC0kd zJ2CxqpteodTf?@QvD*s@@)e#Q?UpIj-W>VE;O@~T-I1TVync=|R|^yWW}ux{CP1|t zmW$JNoV#r|`orfY;sC;CC$cr4CRL)fgMki5Po~zg2cGc@D8DWOi2FlY%H}laW9{~% zV88I;*+z#gEq0^FWc`p9p}X-E@1DC+q3%hT`-3zRi3YMndn8pdO=nz{`oXP|YX7b* zo(?T;c|IBqLMR+J=^k!-wDe)|6eU}s*9<*0(Imj`@mlJl!i3;MpIXGQxWFZckAYp} z^l6G-g{egcFsJqF-m6EhTR5(R?hzmBdhR^Pmn)A2#d(k=cnqDy6gA%IU(^5644e%3 zitx6KjyO3iQ?>OvGlB5UZVCgHus5Y@iRk8R-RXx&6=Xjq73a^lSQ)AiI*?10i?#p^CSqyLTk%LS@Wq+Ne2#5?Law*L-{^ci4JxsAEh z{v6!9)BxxhlQ)N9x%l~}hzm*A-J1u=@=G0GpKoH0D@~ytDwX=P9tffqrpb6Dw3a6W zw5|uuvBkQ3{A!YI>x`sSYqs!)_iHn$3^iow^L}G@Wtx9JV?62EGY0J)(pXwoqq@29 zCy>YwPdT?tvSw32DfJIvFadZnF{jV>)x8?7b1K|sUk4Uf!`}hqp~r{J0M7gG$TrtlLwJ$; zd}_<+gsvStTEDQ9m-*KFiOdqfY9W1PlD^Bq+hDB+jb)T7L~c^pX?p;I6`Y>s`c2*f zrvkL~oQ3!Lm7x~+n@*z{>|Wmq&1pVmWSJtMibih@3$^PUTLdIEmWyxej~s&ug?a(Me)G-S;gxdOPwF_$(3|&oA1Ak z6qH7bfkb~J*m%>QbP%hyWGoOXT;sbYReXE=#*dN$x*HT^E7V<9VT(=D&tZ^mEq#11 zB{Y9$i!PC6blQJMS}O|Ex=mtScA*b-<_2OTSi!JoDN#o!V~mzSiw>!&Kq+Ewzy;Y@ z^DNBx*3x>gt{u__EDe;}@JubQyYzW<=9KN^r^(?#EZOh=$tD--z5`i2!7Z?HP`2V# z`R6v8%UDsdyC;5ON0~Ouzp4liOp$E#?S%GaXY)ppLwXk9vl^HcN`0naZ$Y9!n+VWh z0xd6hfc`fbC4)_H-quzATKKw=`(q{ub5vCi;Aa_DVOSHOnmsHTW-=m(g92z9ALt%4 zK4BMTXr!DIJ$~nenGu1$uau1AL%l#skN*JP@>S?tnR$gs^=>ok9OjThlxAHpysn4V zaS;79nTydewT?rhf?zE}HPqbZpWK2>)D-iSYb=Ye92d->_2C3XTsZqd0(y*8_?ECX zkTyR;V*FEC!z^FzN7MuY70wTc;i^&x+oyN?ISs`xzwh;wzJS-yd1Mb%oP>50AF4g0 zj!Wi_{!CA{-H6{nFO&u2y)E1F9e#n=pB3J~b<7q-ZqNzcGe(@QXek$Ic1+8fX0O_nOUbHMsa4J|>Iv)P}SwWIs#iy!{=AG9M{? zEcSiM;RfFau_A&beg=bUP+Arn>^Y0SaU;UQ!+*`9dxIRMT=F_KzC25JN)r&S6x*8^ z*66Rp%YZ8*^YG_${cHS(8@meNB&>+xJI`t9_on_Bkf6#J7mV_ELgwCmm}jnB0-mth zfmu>+;Wi>7=5k z8kx#q;cw_)#>t9L*Ck1xVi(0*34K1d@!Z|t98OPDM&eCwIJD$Qv=iiCk{Jd_xp9u- zDz=V+r9d0&W|gvFEWMdUQ`+JX3Mb#Yvzt+a{%L zhe%*#V&BCpC=+yV8g1;voVCkknUWlRdt6lvNQ956k7FK1jDUkQ^U-p5M}hE7vXJ58Bc(0~jxseDamH8sp!DtQ^qhHnQ4nq5=m z&yfe(uW*jMw`|{19r%Y<4?Rp8c4dxHs2U|mAqJs^y`e&d#2Zs{QnqhB+cANch4s6> z7Q-hbRI6gPTK{C*!_nF4@|)M^?U#nzJ45{_g`!deEFk0~(?aiUuQ}7L-j*GNvj#ik~H8R$diCDhNmul@KK` zCzFxX(oy_{DGtFr=ht2zS|u6AustE$1m{Xit*?^4UnNOZwBeQ2&4S0h)wllDEB`$a zF4a9UZOJN|PbDJ)_5;sHRTGkcrH+7gEnai^IjSP6XrZ*|i|j78eDEA3UNV68`X&2n zuaQpx zv!VHyb$y7L+zy&_U}S7jI^XsMkNk8kFX1kI!DQ zqc0X+pXQ1h;Tmqj*mid5DkE6;(CQ{#{%VvHlBE0^BUY?RFN^vWT;ZnE z{G7ABR=Jn?+jzU`ukVKhG3W!z{v`tgGIOj(WGqZk|FQKov+3i=n!yJzfmE8BUq)Wt zfFya6IS)BpcG_=-XvMlC`}OXbPJ8$MJ<1D5%sA(*@^#Qhe5vMXIdIZ+$|U=YvF@3X z6&dx**lQ5@S6D_%`ui8S6sx^uSI*Pq7*w=DAj-)J*`5iyQCr{9a5%P<5!@eh4%zKRXd52y;{vf-o~~mvnI0sC)Y*KsM!Ytw*-2=agdo)g30^|+w)1JX1JzY#Nn7SY#(V#{bk1Q6^EG>x=6cz*)znLD z)Y>IB&z0%>KwxZN>G#Rj1@!s-kZJyEtM0O_<6A@|ppY5I$XsIbwD(6a6DP#JFExRs zhBHxBscOvpi3RWWerC%8Hb8@wbMv@PrRJokyQL+knLjW8k$ZLm_swBrA1X3~1c{n6 zU$#kC#N!(~?-VRaXgaJW`BNOScqiQzrhWiGdKqJO=`9qXqhTV_Z|XZ53eM5VK8osp zd|awo0(}2|mV4~NJ>&uG>M8S&fL#1MvQ3$;;g!60OELx^#?ud$FIjID+#a;s@t=(( za>!t+%dLn=>%a{`z;C_amrvITOkaWJY4idO7<1hUEb(pp$5_G%q(*Qa9WjUoTTjX*N9lMrRPI=)K;v3(TaJ)-swQ*Qj6QX80}CEF*k(XiMx zRw{mAty~pJZ&F zR?G=d6lx77J|kNRdPBw9=^c$?qO`WuTw#A%nkd(64tk0YS0gsPEkFQre5-ndbHmUa zR1jf$eAj_li1pkk2YqS8p#P=sWpNhNG@8XQ=&=-7$ykrU*v+`E8)XHVuM1;w0=@I4 z27kFE5x;Cf(KRqi+DmfUZusC1pgNTua&r_Poi}iJk(xywTQjepZaQ9UuN2XJLzlds zz9PLav!>knrkqD>9>zUi0}x90xUWRtyrrds zEHdoB07cKc7IB47tLnT+#HNOXg^m7`UciX)6nMI?g>@G{iw2hL;+cLF>YHndHcVId z3Z{TasO8TFZI%enx7rUw1hO6LRI^;cc7K^-2oc*MfjTP+zzQL?+CG8_JWUU;9cRvS zA5{u;EYVV~Ok5If@c}F1XffJ^^ooG1fw4#tgtK05-+1;g%f6%$>=D&Mxh>W^YPVfX zy0?k+?xt#T!0x(F8P}kE-dCzkheUX+ow441MZ2em%|T?OuPIu0IA&yCxb<*zSaHN@ z<~^toSpz+)tKf5|JnI&7fqLO(M+_nD8DL-fmcU)hxe1-Y_^kVl@p_HT)4z60?hW@) zQdJSddp6w)?08NA0FPmi{zHXa;Rf9ew0Zvbh*w_u3C`!;Jt|=WxR(Wk2{f|IRzgxo&Zd!J5 zbW3_p>9E$TlzD#9kGRo>IVTFLVDFu}pY_{9(3YXQZhZ`T=@BDD=MtKKIPg6HkUlKI z+rAY2cbT5ZInSj71gN6}J4tCp!RLLg;Vip8Iw3WXKdB_$C|1PYp>1XV(v}RIoZoo; zWo+~CapV+I#CT3XZ zZG!`rf*9A;&84my%s_iQS`qj4P-^Cj>tFTO-pz0wa0YMhyzN>T=$sY`4&Owu$TI#*-&-N6s z>NW(>WEaLIY|!?<-NAgO3>iMe@2T)~Bh)T@kW!S)*lm1@`<0``zUrrnmygOr;{lGgkDA{0e|Y8d3l^ zs^kHWmO%G0x4DA4en(gMWwVtM7pQ1o>+R}wFHusS|GU(O^|;DFi=d&G1h#^NTh7CW ziu9*|Ir5ilaWR)VgnAqdUjqm9tfLm43yJuzs!yO_O*Chr7$mlH+|R11@dWpOkK4}p zL=FHK;d9NgVe=suVm6JK@YCPbdO(Q-$g&eTfWAKI;tp^Nc&vqNR)j}MY<^4d$|MhX zo)%h>`sCF5+A?f0Qtr&(x%vZK4f^BtAXzN2&z`;3I+HFO1h-&*^<-5Y$syY9MXwKVyeftTscV&wu*n{-o3-?-b{6tZX?V2+A|Ozsy?_U2C25WQRc;JF9r*V zfb!ekN`*c%|Ij9?z9mn=t=ksDGz`qx)%CvJI*L2^>zIQi96zWk+AC_Ea;jF`WUUjj0`@>)inJ=1`YYV7y7Q)X|<`h88OC znMZp^hISJ)?}S0wW#fL^5b<_VHTTuW;;cvfTC_Pvo;dScwKjAH7*A&21uLbgtZ9mW zdTsrR5co6Tk+9ArAI9ED<00Zyo81iw#8mcKw57RuUR=+e<@sl&XkX^EMn1T14w}%&q%df-T{NKR-LH zZg8OJk;FQ{)xCBu|gM^Tr*J&4;eTKQwUuu=Eu z_46sj#N%aVSE+5rSMXjTZrY(o=ts%~#q^KXw;-vwOWrAa9l6M8%P(RJOb9Z`HY zJ=XCZKSHep=k&X3@^n7)U~sWXxCpSN?gUB9>^rlmk~JM3Pcy9{Vzb4^hwey3{?RX3u)n2Z}(G=fK8)!KCj@WcA;?BHe_A#&7%5-c5ZH#-u1uWr#6*B6Fr>MfeunIMX!d9M+BtWR!FxJGZ?m&C zAgoFtR}WLFAZq%_f04a@&u{UPTvVeRE)+*Y*38O9+bVG2;|5D;^xud>ffjNP7ES#A z{>GYg1cqS_<~^?Xo;6^&6Pq*zRn*EUNmTyYSdy%&NQ|&;?gI}B+s?_6U+Qrj*o9=r zT5B<~jVD0R|Kj!piv;l~1r&rZr33J9x=G-&?LlmYF0WxVeli^DJB^on$+ z=AX8=PZ9`-62m%r0wN`HV$1Ca3~+nwh-Pi;MaEyFk%o|*&9@5cKRhvAZ)6Wg9$VZ} zoZqLVXkDH&;7>Llk^S`8k~ZLGW4=HOLxint32SCT>rUp!X2}l+qDKovU8Gf>D^68Z zeQ6W4FT8G7Z=)3E4tZ0_K9{DJM6_B+tB7*l9UY4Xa(Teh{ARjoYYmSCht$G9@VeZUP-h&BD#?G@-a zYfA3*Xl`#;KmTdmEGQD}9TjyjwoHA!BDyZ=h>og?-r{X}ID?TOWZGwXUa(QzHt)Ww zWqy$&cYr2$UhB>E%pJGv7dfpP~&>Aq;&Q_{FXPJ*@5LS{MmnXywx7(ve@R; zb1)8pa?ntW|0&ERWX0bG1akg7MJR3>ShlxflRS(U!v6O(91Myr6{Q>P`D`4l+4EyJ zs3H+9f<;gvO|_ZJTZ;v<9_00dCai-KNJz@+iGD>)WvKyJ|GDb~gR$^@hCwt1yq6lo zZ>NAD2(yjOb-_h3p|qYUFFV;;qfDO@`TJZK|tC^F&wb&ersk!Oah z3LcOy{tPMso7Oy#yYw!#%ijWt+S$IdL=Vx~Y6N^DZ0-zeyAj>xI}hnx z0r*4XqTM^5&J^^KHc*8`U)>QBP{N7lJx{s?Z3TgySkBOq1Xx@0%U*Z52(fR1dlrV& z>kG&-xYe^Ph}(l^to1o7mlKjTUP-(st?Ad&04er`FU{NTj(iIdxY74sUc3i1ysxP@ zLxt~uK9+H0kOqh{KN@BPq?-XAgl0{l!qGRjp-Ayew3g~HmW!Pav|2yVVUU2+J4f?4 z3z5y2p#1P{9DY$UQ@?%w>kzvYOT*U7sbQflJ|Oewi4^wkot)w6&j4HU(;pqQxmK%l z124U1XdVe^#>MG-cz@u!fw^BDYWsepiE6ziwxMkbhSodCydd8c))sXLC%#PM*vfez zU~yQ{3|JQ%$p@P#wtglXM*|*NYJs?s;?K`YSXJ5R4Qln~?Q6ocuEQ+KFOdep1kVrhWeiEiSqm5ZbHI4-Dj zq84e5>-^B<`sM)H613XhA|x4y^bxKx++roRayDWb`Cla%5|qV7+-`CsT2HjRHPP`} zB;IX{eIOTOnAXNAzMHZ^Xs$=%<7Jhw8b7Yes$2X+m6gb7;;B)IWR%N$(xHZ9Y|U55YE>7_*DixMHs1tx&gm9@v%c6*#+*2_DiB*T(BKW zI;(VJK_JB!blk=da?fiB~h^^t13n zaY4T&Z6G*i-`bPx>J^|5zl{)v3I9R`^||={@GKg0w-2kl-uUF_fyL}_ySXiali=!KpAkp^#mWE_GJGa^h5De_8uzwqC204^{G z(LIb4b%#xaWHX#viASc++@Y=_$j5}qKd;fR`JCLa-$qKY?V?3-F?VGshMKXZ}qq%ZkqdMD} zGBCQUjH5^SvhAXSjk_W!gtI4lfBN<3-5+*$BP6y&dmsdEsi$lpLzXC7^=PLPU2PD# z15v`J=aM$`nd0kurvNeb3-?t~kW+3@kH_u&6Fa{V?l9Hb2Y)k%7a8#>8o-kbT0grB zGIjbpY)v2a1A84|c|IscGA*L?=d-dg6AR6-`?%N)$3pdc9}mW@o$XgLBZ9rnHpgf4 zWciyP-?_(PoBwjQ_2`JJMG~9^vlXB%&i8n<*~I7RNKAI@?r7^+cfl6O3cdAqDxse%nh1)X25+`;;zj z)#a5mzL4K%3!Ro@w&j;O%Ima@|7UCoY<(en$}j0(`*%Ok`yrfOM1Xz@>!may&NW-m z_y_UN4{tIXOCPb?4x83Oz%gv^vP&hj1XC`b07S%e?cr_9eznc-bF8TV-;>>PLFS6; zch%~r#W_}qHC;TPVszVO+y^dBbYKxw`t(DCK#MwyGoiDWmh?V){LVSdI9hE!C1eJI zyo@n@a?qsjJ9T_$#_Wxt^+-5#fAyz@j==S+8r^)-btc&_`Iq~_{w3eJgX?r4%qsKB zIB{C+J9Ibc$o0(PS#X^mS$R6V{H=J!JqU#Qm;NeZ zy(mxJ!DRTPwn>|Mse&;d%31AU#Y%~ddo15$wv}noM4mYHsG3srOntGCwl;*;A5QmG zqmC~IERLkZ+(Z$%g&Omllc#vo3YEoszZIAQey?beQ%w!usEHHps(zj3mAp;WbzVQIZPX?f+9KYV=NK z-yc#NufqnTd`PxI=r_VMCH)HPk7?0DP-a$_q$&T{=8DqF)JxE#q2)3m)anU%MpAe( zBy|V^>91XSRc0JO|IKy?e?}@&2gK`7qZ~`CpUDi1j~4?E@~nI94-gPYT?Hr?yG(Ec&wC@@&XGhTp8&)tNpFKjD3A)inZ$*u}M23W{s zXGC(t(2FDXVS!on?%Q`I!tOl;k$$fc3xV?}PKDHui-r*bS-xY%Y3xt_YmmCKgJG|5 z(X%SRviP$5)f6KdOf{n;W{RzYjnxjIoa!LtF3@+x3V(zYs@_&vHJ=3urM+f83J#W- zl2ON+)c}p0>rbrUP=9kEJs`jr<^HSCT@>j^@}?$%1=jg56y14ckD0gn8iAZdmIm$` zZaLHyOXf11`lmfL^JskN>%&>|rEm5kWc4>tkEoBduZgPvQ0Kdn>D~#n41X8e+^s8D z!!i7SdkPaMQ8-C}#zfof_k6@NfTPGT);h0jdbftVRzzNqkBqlR6_ieoHeeAgvXgRrCN4i(Br_Q^>Z_HPb zx`ryBJq>_8<4&JqzO(B&WxDI;B!Mm8=K!Bs*N$^-(ywT)Q`ByG%gsyQj+sZ$14@I# zA14B>cTM9)u?nsSPJ6NvMt?HrTpfc34_c^gn;fStyi5N3g0xl4N_hIK!XS@{F~5_- zDb(ye(YIg*FV!kkk(=lGNeH%#B?or_1LC;A!F?AtNLt3oLU3aK9wT!>7)N?g6;=Oj zJww}vq~&5x&Pn^iDO^}PikI?V!BKrhzfmHXt{M^%A|f=NzPQ~GAHf+b=YtwDE9xh) z0D$7BI=AyQ9yEZLNRI+ux;tu!jUr8hzNwwviTt4WR6|~1D57g%$GE6i)|(agy<{~XXQ^B(5 zyn@4$_JcW`sR}L#gq-gDm~)!;a3L6LWtGLjXn?Euo&{Cy?Rr88ME`XKAGp^x$r|r& zBm2UhY?wz{$DxjTX`1>8gw~($7!m&M924BA9QnFz5d)Qcvza~PjLw!Uo@9~($nHx? zbr5g`+{KEy->1CWA4(G7VV)*rMP&|usY-Cl2AqhJKR2}Vr{tra`<3d}5ycv-m&V3^+FI zO9c;1x!VeUSZ}wXBK(+m@yjmLYN8=eh~H8C1CJ)-y3w`>*4|tu37dj(s=h<9KOW`o z#}(M#9i{RUBEw?us=+(3H?YkOg0LCvV8fuGDRC_uwk(5;w?W95!rfxmHZ&onKtP5` zph*Pn5w>vsQsJMU>qR`pF5l2F3sx_=J>={HwEIjjPRIM_8c(~OKIVNPReEiYBVS|+ z2RjUT@&at)fpDP0X06&zX(jh{w zc}7D#rhatn90`~;Tmc=aguy^S@z(6<6XvZkXKJ?Y3BRMWOjqbeth2u3x6+%PPk@6S z@288&7Jx^oMt*ls2;u6CPlk@zAmofo<_5N>Q>BDJTdPnzMN*(!joYNa!Y=0cZJ?B% zf=_HK%Q7uT=UTietwasi2TUNHK^!IM%$|#GVFU%_s*S8%8#98hoq;!z5X6``d9s=; zru`yz{O>m6wKJ_>vDlEQ$|D$Q#N!_B6(e(0*1N!SOf?^M2D|TUhIUjjTO|nC)A1)% zTvNVRzfuHPS2xIPZ0B&nNfWrPQ*jx@sj0X3$yZH~>{p>D8Wl*`9l9E6%ulL)>zsBr zR|$EXb)JF4SDYK5I*or=Rbf4<(lM-o|6LYP!0@dHgdMh>@H^e-#ZVf#r^U7$ZoHdnE4afk}!Otx*EbQ8)bhw7S{Eum5+v;&XNIc?H7mUW&&+6#SMQwVf_ z9mo55u@ttwVJ@hUht>J^q#`R4$qq;Sm-9-fhi#E~3cj6;XH4lgC!KrP=$dzqRrOsq zXMf=a;~#8_D9v41rYY|sKr#TTU(DRa2_P4@H2-tc8sKQTn<=hexiB~|PJRy~LnooQ zAea7Y`D%g+WsuayI$kY4YX!~-#ZM+R+d%)qvyQyaWY|;&2ctI>WXc)@)vddc8H+9_ z-Hc{oQvdtrt}TI9v`d-BFm3I}|2#n`)OP85a9n#IV?2o&HLz9kCw8i?zjVxrLj8#N zi@}|9Fi3va78PMzdjVtZuzBn6sOf%fW6?ca6|yJ1_Xs{?*JS@8?dc(gLitk(<&<2V zVogvf9lwq#Aoertf9-ff1YwY&`b-|XdD+|oQ7hNUFE}*2+t{R{ky9 z*R@jig48(#31V(t^mUHI5WAgTS4uOjMOIGX`}OrTo#I#aKZ+LPBfhfTH$+%4^%*=1 z5GG7to({MBBQr`gIGJo28T`^xrZu*dqcUPM70O6IgP)G`R_38wg^2>Gf5>NKjL?ux z3pPQ+^B|-pYGxf}OyTTw+IH3Yx9Fb6h{-H}9({z*f6|QMa>fXp7~F&dN5--x0QgJa zqUzVx|5o>FI*s!v#aZB@wSAQSeBlBt8aQ3Ga>rq(%8aNr;>FxpF*}Lp`-^5#LMmk5 z8R1!rC0|bfrW03T*KHDu>t{qr1_(5Xz|okI9FlE zsx}pvj*B(xj$s&L$rFtDBgP#xB(%}(jb}0K+h^G775fF2xh=kf48;uuQ|AC~D$Jev zKC@)(vzXmd&%t*L=!%=>>suxZ%$yRMfJEb02VWnloKi+EK@&2uKMZQLJQ|8&4Bdao zj+?Ygvxn5*>h$O)W#;SzF{$7Pu)W0uW35>9o&Ie@PbU}3aW?&V7FY}91L~4)q1xwC zEPRS{5~U9 zk?r0tT7Ey00L?r9errA!Hj&(@neA*{A&8vz2LyVajJhchZ{MD0^P2;P(0aIqYb~-I zoE-#>?jUF1OD}-RJqjCse{1{=nJEHDuF6e15h>dkL{;ud!J+ZA)DD)S@^oz8$}YCs&J?4W2iuv_Wfj+NYM z9oqQQ-G+Hw+HVmmA4g(T0)lQ3KIaj2G~qN#sXCEc`>WCAn61_^`Art88ossPstLNY zsJP2}ch7l! z9bB$eZ5borKfy#Wh!Zbje!(s&n5tvORBQvw=&ScA97sZL)f4?}dLJ15rTun@*Bri# z{)PkWUj6M_5*@$OoIo%ogMcX(cp`ZV@X|%`vB@M5qI#sxos3bXIOtEG8!~tfmzatH z9J0IyeSA22M4AcHzf{6oI&K0fM~|ZTO`}^w^a~kiop*qPp7nL;GAt9;CCyZ3z-~oA z#4tXIGd8^1P<60A`WF7TKX7oc5+n5kLBuBKbvSs?xog42VEa0fB4CaAiA%>EM@MrF zTqZTo5jOvl2M{74pv#1Vj-HFf27~7SXKxdM6s{7yP|EBSb|X8*twL%N9nk%r(5Wq& zp0PO)5e?OthL$S65P{x3N2Fao={f4vW>Ra5VLxYvMn+DURiGguf(jaR(>iqNa>Z_c zC1WZEgX58WKHR$4=qA?^)pnSwM@xQ}{7y}aDK$KSOvD7YbWvvv1A(%#pM;2@Jz3M_ zH`vY63LGHmTXjivEj$R0zx3?{XQmZ;16X3i?F(wuq)kQCvEY&2=4dw%7m8)T4qQlU?eK~nTMABvawzDv@ zj>l)4^3-@~kHW;X^PwLdl+w|aOm6mJDWnIk3d~0kkAY2b_`FdqeDdxyN&$Zc67Y@j zIhAl$4I;#LhVMv|sVX?WyuyDgPtH3`UQOm53f~~O^dsjPiZx^jcei-1)gm&`I8bJU zsD%9O&jGK_;ww4Mr?dee>ot%2jz#=kSo|9b2`VwpCLqK{0PGAP zDiQ=0CJS7h2SWIW=)uF;^4teWe6pBvFxrMsge+KARb=AhhBUIdmN^R}d^hN7%`Cz9|aX9<}NZnI| zW!yo+;Op=ez01UFJVMm70`#u@tu`5$f^K^?F*3?2qE!2`wlfEHNmCe{D4 z3<~~ydec@K%P0`+M-3teE1CYqz!l>Hv50J13TGd^KNrQZrYFr(4x72k8AbYseH|TM z3%zWZaiSn<&{izad@67 zozS1IkJXkqc#8chAHwoz29KEL_|WMCA1|PE0}GDL2YM>vD_*L%P^ z&FUTZIrIoGGU^fu!0PNJ&|p9YkzpmSPvd66u)&OQiT+W4vq9y+N`(Usb^l}e20*Wi zTXvF-GIB%sLLb&uh3@0qeSI#BR8dhQB>o`o8(E$eWE*WVC%q8dByxQTVasQts>Qi0 zvoq|>z>s3x{JNScy7G8gA-C}s$cEM1io<$A?7M-(V{m<)=XWUZQROUOMYSBaiYy~lJ; zy4GV>y!arUnXlKdZk-iVj10G)WLwS1c`ex#m{YHP_Xu~L>2tAnJ7~Iwv?+?95idH- z^za(S+MCQCFGIyvCD_Ds^wt^~{Ctnu2Nu(i=>~J$Vc6F6oYYMZpKemZ-+Iw}ZK5N% zy56?xhtdjAd^rH~QysUMEi9ldVb$5_Dk-vcR+fx!p+Pjl(N1R+g=abMf>`yJZe+-Q z*@G?&(`#8ckS7Y3*qnDk(zP>qStRl8zuOwXu@qk>K#t5JW-Q4o+1ntHn300Cq*j35 zfQOZ?YTPN#J`>lM7%(9pC{zK2{$_m`0ok^S8zgr9(-m!u+PmNRgIj+AshT2n5tyJR z7lq3Uql(yJkkuC5tl3<`lMT#JLWLeeO!sy!!E{S=&({MBB9Ur7K@nE8;LLpbSVmeY(kjtrPz z#68O|u)kl?X~iOW_)_v-&wW}iO~NaDrLLqtR5R~Wi?~6}Sm5k3{ySbn-q;xV~e4sjQBJ|3_O(5rwh!X@{3EfHR zgC--ao&P|U;+6L~V)8=XYt`HbJFH4d6E0a?(l3U}KovC*O5JR!_f)dchfxVum0`dq)z)|a zE?E3T{0VIRsxDJ1-vTleloN6IcQkA1I+uK*Lq0u6GkjzL1p8i`sze-%VG_rzRnIiJ z0=C~gp_JF`kdcLMfKrFDjE{Qky6d89lwF!SnBycHuVl_D8^w04NO=hdRwGrOn#T(R zGM&p0U)d=Q4=~(FCmH`6AIxL@^kdRzIuDsHHIq7mJzo#ZDMLwa@s{$7r@Muoo-r1H z&kvrsxJD&%9kO>c64*pX5O@AFAH*U=VKi7sH);I*K~7-(zjaX#cYx=Yj(o78lOZ=O zombFO8A&3BggPEIlHOIArQp=tj-eWm$E2-fT)~vpjUok5NB?DW-O0MyZKlW~Q{#)~ z(s9LWT!9PLLo`UkjjWV2DX^@heHy_q*0=>`6g*^8j#BXvEo3h_`wcp9u-RY1;Z2mjOSG)vGA09LYq;>zY~SD^ zVPtaiTg!>he5S-zx`Hmkml`Dhy|NGkEr=99NcTsd&S;yTmqSo~Aj9zUISYK=E9RoYKn#=jk#RYID4gdROixIxs_56Pb&fH*ac^+?ssQ+Zas!?1G-up|AI} z%)3!c>YOFVn}SzAiq`t$AM=PjGHoAvu5+8vfh|u8veU9V6k&9bbc!0jId^fa3(j#_ zhj^w+wn`f-b5i*T91vNZkQi8gx5U{nK=}@Ztv<|FFAy;m)1OoNCz^eyx}0-Z$8X#l z%sfLC(ieVkpJyLi=c=#&0HNiB!1F#8XFR+4%O?i`ITw}r{Od(aOjozQ zIz?w7I*BV1!>@~-%!g^C9`%b*f;7P!tzYK$2E`$z*%EAJ0iwJ6KBCNU*_~a_VTj!i zzR!3*>r>Md(p)cPVJ;>WSy9MVPykjXR?qvWJJ10>EiyB5oGZ>|b`)?yXD_k+Etq#D zDvw26{6ug?&v%11;vud0c_b3^C5L*~mt?;Anl7zgk^%AfKK;740w*&km1*Y@^;kOs zxXAk1fx5c-6M6$Oo@(70$ndMoJa z^m%;#X5F-AB@&sCE{p zhs*eXLehgcRG);hXDm->Qb>A|sne0+8Zog8@u)@EhK{u%p8#XNEN1%dlH2KrNQxrN zoPTpJN zKLD1fF%^`~;;CKxn-4~7(=vNWS|xkl93g!sdx;aB^sCp#jgApn$Ie$cvxe+udIKWN zL7S4!WoQeBpH%*%$z{xa;a5)PAAE0^!-1b3EN2q9|8ETcp)`werZ~R9eL`1-^RDQD z?hRi0q6b#N@8OrJjD9zaBaKq2=nG90JKk?mf94H#j10LDajPfkr14^4!VA_|${#>9 zNdbHE#k=pwHH0S2arSv%pne~()ywMjJ6XSi4lYZPDRoL-uwH)t!3!>qsYB1OGL$;M zX4?wAQ~_sV@xRC*k~PlumzXZLIzh?aS6#vX2(~1ZS9H2W=s9NuX_gQbN-=Lu`+-B+ zi;rrRFD7jSYqg@*fA-$@89PFbd)vMM%Ph&zGSW_-8?T?g*x#YCjzQ+$^C-23ue|CK ze?mm*jqXkn`_b0DI{&jby=2NI96GdaGP~ug)DJ&)2H&L13uidIZn1AP7j$kDe7o= z!~Ky(n{|%;qy|3U12z*WpdQ(bp&SO5gHcEiW$0fiX5!f}@^-^hk8szz$`~1?jLGto zyk8hLW;#2?sET%8{cbxA9jWmi@50lUMbc09*?vrnfD|8!Fzx^GKh;Xs#>U(c$d9qM z_^hE>UssN#KzGl0MliA@@tOGcbIehDqgVn-YIe&0nA5QA;<_6p0gTF2r5aw!hgP&* zyy9@5BXxMDt`%h67tGUsw%>8KuX(TU;BdX|wp!YBLVOcTWRYMwyv6Y|(=CC?{^X01 z+PYUV&a&86^=_T`DN84PD`oh5r1{Jbo{DoLQF9e^Zg#zVfPAojw@pOhsa)ZwWRM+g zDmNIuq)#YK=on8>hieF-e2j0eR}yC|&*Q8i<-~QiyB}B#l4Op#GEA86Sq}dCwbt9> zv<>QJGMhl#!+%MCi@qI|&B|FI(&| zQi)Q5$yC@&G%%fA9#ButZq!HaeX(#|h4P*fhlPuuirR^#A3syS{EVs^_mky0#?3X2 zYV>8{_{C06$3Q%eUx6{byGJg|i7uLp7)%8p=>{72oT8~$6AW@45~LJwa6t)eG|_~g zl9f;-`umKM@R{Eq5Itkwe)fapeF22y?(e=U{<7&58K3ziZvJb%4OLMeE(0@nrcA2= zG8o#I=}1px9jIN}j8j^=t-uxz+$XoaSWy1iIjqa)+3BHwdNhCU_jtV{8uLtQ4GE)c%46lcR1YGq#zUBQD-@8B~(+%Vp*9p26m@1i4mjabQ?{B72Y@Yr@{t`>L^ucxa!IK5biXmEJEl$d65dSR7M_8>df#Gp|#PkqHmDgzHfbw+hL(p13!;d)!KsORxGA3U3TNf6r# z-M$`|j6%WAJ_0+G?79HxXEj*Qz1IR(CuB!mm-j`Srs^SdHV!{IKP34E^ZT^pA&tJ0 zw~_w&O@v3zrJ4e$9nI0XOK!|^fa0Qs6Dh7Yjp*SxV?S}S$KQB^A zt^Gj}fg`6F*z6w<_O#+;04qO)`aP>U94c9SF*m(SaUsR_2#%~(VgnyD(_CCrV@ece zI=e6QW7}%aCqvN)m(JNqN^+1wLSDP<=#-YQz95|Z5c=6*H?rtSI2fm7MF%`Fq9lL! z!gK%+Ikjao^^YG@u~y&a5L1Ou%ga0`SEK)_Qivtl#}a9X+|2joh%dwvDIpLHSu+g6d~0R zS?jY%fitbmHehaam7hV^riTIl=Ji{l-~ zViCyp$-g4&V|3u!?Lc<6=NgeLyzD9jEkj$ZniE_!l zzRf8i=l4EWVHDTZ;xhp*Y@utzBjswpe|!2IijIeV|E7vm=CHXr_B)Z}dEt?&3!)zz z>c4PFZ^~2Gm%4R|^F(lgt!Ip_{H10xi6_re|^>&p!)`{a5CXt?RPTD%9Er50(@B%*I%b= zogE$U0SB6=n+{=FeQi~n6cJ?*?$*U<^|RZ8*RpC6Rb-!pn#(L8#W|+7s3Mkz*->Mf@l&|#$bxzF z7XW|TkXM8zr|38gYB^@ZJx{*JaSbwX!^^!>-lpLw)TrrfMuw#r*u>UK$!)n8vUb>l z{hhxXsgQ{_CZyq6T{jpKxV!uXhM*1YEzrnx|m*1Nmo_17~+f$_1 zc~;SkE*(ER3w8)ZuBY3%*l9%%wfwN~{4D`uTU>IS*@bXF+H;H9`SS^BYLEj)i96Be zvy>Qb)pIXRL1jn{!U^bPHpl!xm*I^itC42i+q3Q%{Hotr^iw~riQL@?1RysHu49{D zFK;!>1YWsfI`5XJF4;zr>(0`2h(;E4@$7pzQJR^}T5CqjHHr+*Su^RejIK`m?j@tq z*q3Fl=AMen!M(e&n^DWVSx@!gAM`ahb^=146_dj5D630uHo4{x<&CDl9}ylH%U1+U ze6k@0KH=}@6+D^uE4=qx#w$6vk>&lsqKo>+Sm_fE{WatH_bUV*)he=oNGKvu^@)~@ zefS!SNUv7Ha&IDvnw7kbXaFz0x>P$9S3F|y``A&UrIRi*`(^1_*UTjGS%0SflGLmh z1iF>&^n%fc*V8`V!7bmfwiR`;_y(w$3xD`3MnrdqKwiN*08Jm_CKi`T&U)_$KYSsN zk%tz<4i#Rt_VQw&(2*lv@#zVW6mHb2Mbr2TkBZs2L_2{l^en5%kJ(u6s*crbl1=xg zs-eNV<0r@6#HCebFJ+dtK(mTwI2F=DgVr4u05Fketj+^#T^H=5^@e7Cg6Yr`3pMk7 z)UoaJekE-2E?F)i1+=?$dG%88rAu~r2nuwp$PS~cH$B8nR4dtVLfwZmAy=zwo&A!$ z%#Ytus@J=vjZHBo_ZzK#R~V(Lhr3zh{KGzKUs4mNmhtAR5-WJoz(~}^dYc9j(T?I2 zVJ?CW8Jr<7wTHtfnK5@pW?_wu=ZPbg?#Pg0USj5)n5L+EcklPc*O z@ZKlHNw9Xq9_2$sBR4`bCq|!Z%VlnWGf!1bAn` zrEq#Rg1`<{I;QY}UX2WuT$6y6#z&m;&uW;y!K4R;b#~47vD2k)$Y!ke!%;VVi_Y6; z_)S7Clt95sfxgC6GBx{P?Y9T%@g@iy1=n<1Gb^OrG~7bc!n}fAg7qjh8LryT!u8#MZC;bt0Q`(Q~+~OQG2@A~7loIooigyxp@s7L` zI9Ta_L1JX12iNh`*+!NquTUGBuWyNr)Z55Gvb5`MN&z!EY4_UU%g`@d$kn)*MJ=6e zr*D%CD~#|@q!FBTOvOCaw5gKQ<(gPS-?8R~iVgRa1Ep4}aL~~dfov<9;4ys7$Q_J( zo>b8slk*jeZ?6wDxzh{jBvt}g0@%LbmC2l}&8&?pvrS=sjm*jX?TV>&8~RQmhk~~p zsXaX|IfL3|f~-4Cr+Q~`{zoh zEJk!uDMXdsM;4jF9o0t)6X>k{*Pid7I9~|mmgyqFmvZ)fH-8RwiB6kaO&L9g{e^q{ z9K&6<31??N`EVNw)?+K~x%>FCkfnU1Ph_FYR?EcH6v3DCW;jyzS55aTgpf#k2`Hr0 zqj+FvgW=smUpyof0?jy(g_Sz~<(@@Q5@k%Jh^{A#tPDG!@|eWWm}Y_gyPqmE$K&W9 z&64;C*|`7tjGTaXAD&UB*F3Du@T=w)kvAx3#EGn5bQ7h!z-5vuxmi6)mYX7iJDd*A zUc<8X60&?#)EZi~76Y1xNAEk4jyk;XBg9-Ri>8f@7z4QKTC#P6UbYwp`(S+*RBA zrA#OF>p6-3TFTpnzF6c8e){ViHB_a}!3AE52`<4dwiUj*S%Yd< zY1|F(N2UcznoR^)XA#mCui6i=9l46=qecl8B>zjz4KRaJ7=GUdTk9IXc^Sl-2j+c8 zfWD;1ldmWlxx6vT+DeG;HgtiJVktuvTeZ6wFTD_0jj7s?zrHP7uG-mnbswsVr;}6` z?~_2#=w~617`a+h1WC2QWmEovZWpA82`0*5-h~@eF`T$^c~8BDU`usg+q5>=tL4G!XWX`0)}KXV zMie>e=3B8%Hx!xpCq)*gGko==se}pkNet-QwM%>%ed$EDd4xxRrRv!4HYn=|6EP0_ z|Z9 zZ@p$FMgRgSoo;pU;>UH%L)-|6=~MVi933fOLZF`Ypqx8h_RD~f(8|+6g)@2Clk(1| zfW(o>hlV4wgi#u`JJY;}UaV}kpkbc84-I22adbWPPhXn4xDLd(elMsg&eYd~m|)>y zsQHMcCKVCIt3&FZID&JeRI^aK(ZpnggJrdNXiN=!76P_9ao#gYVj14g3H&O%+4?$MLq6M3sw5Op?#CjkM(NIs)C5#N^F0R>|x*k ztec=4KEJO9Hw9)dR35(YYYNDDC=wK9>l$;Z7YHwLy1U{zutvqrxR{Dyd@uvlm)H)rb$5cmx~-}fnB`#?SAML^ni-M(+aM# zXyoGKUa$JlD5+FYjlNk7B}W~0#f^^r%H`IEz?hCX1NgZ*^Lw#V9pVwR>_FTG`QNE~ zLp{&s#P_LbzbBPK?mF4q+!3Adfn}46SXvv=L0eomwy_IeV!O99#^-vAA)>iPc{klG z4N!#S68?PWR_Pr<;ctHQ^>`Sn;3h`XrRJ{AB7SfkBWUH%vtf3!zv#ovgUu(;qM`oy z!2sgK63EfKXY|yP8-LlBjea?lB$32mURMxy=7by5-kAhLETrEab@X9YKD_F2&zs(e zSTT=v_f=mpcq^+BN}*7bg6@vIZKR($>JjPtvL_AQ2UU=)RQ$4egnKrp)Nz}A($i_P ztO{1K1S8=kb82d^8gnmDz=S5(fX^lFsegJ2HkBh++^ z;a9A4f#Ao|JNM(;QyQ-yq_DKI&&`3mFd<}#qczUfz8(an%A|-_nx7a|R3xi>1K%g# za`De7VAvnSAq`LafEoU?{=15D>#=9QlgjU~T92JVRN}8+)3g!H(A2CZ5*0aVl+^$2}j;leGo-lK7BA^^2MXB^HvuH8V+K`Uzs9T$Bolw{B*; zcS{}w3kTbdC}4_TNui*6rzgbm0P#F2D|a>W*4)&%^zZ+ki|tx3O`w{pe*yut8Hc_u zBO)V)dh_5qtd5}|Ud^x4IMj$$VwXQ(PjG`gDcjHgmZV*A zv|b@=pz&*otB>7bkKU7>D#|89c>RaxrXBY|aERg?GmOsDjCBgOn$R$KeGr_%?U(1@FsY8guPDx@=!$SUjf4hg{I52Cr(5YIkZn=JmCHZ0D z{21Y+r$k(@{MTs$-RI$2>~91Q5QMm&ld{;Rfg1(YBdYJSf4!<$+L$vqC6~-mpdP?l2MVOi}NF_ul^ z7Zi7EXb7piC^tMV{2@W3`}f`T$>xoE)9LOFP7DY+Jm2B|F?yVQ)DZ{qkRVkzop)87 zw0yg^)V<;3j@0^>Xi0))A^1rgSC89snNcK6T0+?5XAdc&WW>|h;Ju`Xx$qL%mDEcb z$EFvZdv=U-D;b8wS7C!F7V^GUGfhj4_^xR$_#2vS6|S_7r0i}SpE#G94u~jBcHY!H z&lOB%7)?5>ep{j-{AHZx(Z%&iJbyHTaXaVfVw7k_Jxm<8r8e*ZHDKi}@XrK!5C~B) z@qG+^Gp@FE-$$*)#DM4Ma8V{D22>pfFdd-36L$MOT=?VFQ{(+^E$Uy4+4$#@_OHNL z4_XW;40e>LPNVOyn_<=bl0>y)=||Wo}HDcl7JP7s%*lj7Q zC=WwLp1|gSX+C?~!_$Cu@j2KOr^t+_%}KqcT}#SL2BxlG|JW-T=q)#NQh;cVSU2vO zSgoTsJqQnxbctm&Vu`~kBFT>ZNjzcn`(}HW_<`e0oOOSWMzJaD(&>Etn_Pp-%WQti zEB(%3qP}XuLoHgq@3(eOoG~m1@)UDBq{cTBN$0$`y|t)X!Rb0JX%U|5mjN{v0~q<* z`3xERfgUUBf!9x-`ljY0Vi4uz{EN5G%!`X{N>@Vw~7q@;vM@#{9;gJ2!< zio&1Ni^1|DE#1d6wc9$Y8iYRD&r83mpRUA@4rO{aS;ybp3`8^WYjv)rysmv>OJ*C8;aV3yyy?On;R>B#d3UV{;iV z-T$u0u~u|LFxL-p>ANnqm@Q&yJ%eLF-be_r$F2;d-%&?HdhU|OBw74Tf8ZrI2Xa*s z#N`_z+c>NYzl{}8==gbcy;cG|Y_*4@l78;LR7VchM;=h_ie9W}UihhK!#h55=~uIO z8ly*GFn8}}tRl}aGrb*};mF=jGu82u%UYf%`dQ9X#%^@?0e6Uu>WWb$H#xgV0T(&h zKiQ@UMdHa5?0Eu+lAjd~_&bJxcbi`m=O?%AixrS(Gb0Z5e`nxEL23(2xz@S{EA2yMVxW0hmn4>I#|=Jvig+zaE)T$vP_*{3y#_ss zfLjnsRgm;9NVw~dl=E?YRdVyS8)Z9-B!1vLX#0YTm~Cp-R++dEc}9`PwSON!XM_cRPM3os?hPMCzNg)jx+pFYye*Bp zxjk##kWa5=i4w2e$3*-Cyth5WL`{hEj-esaCK3T9Qcf5U0LsR3Ra=-TAzg*3)@(?^etQ z)It|Mbm!T*AL9$SAsU$eCqmV8l-zPmmlqY$de;xH4}w!@N(6kXQ1++|R>jY3=ciuE zyJK?R{fJQXBlXw&d%{*PM2eo5w_R3)AqC5>m}zG-(m&_BiV#4q{HUR zS%!*F%lt8~r5RDAYedDY7%8`1#KzP5uCr2bYF`J9$bfb))r7igk0_F|U-)rYhT3AG z%C)Aq1bo}^HPj5LpGp)A`*WJ~~F^5pgOFqyc2H>kN_vH#Bm^)46w5QK{; z{>B}X>*4+{gWjRHC_+f6R)SPVKDp7&&kP5)pD;DYJDZk_-)3*pqA6+F76e}BDE|{J6`-U)d1s1KTGSg_>wO=( zdbN9WThXMlk!uHW6Rx}++g%qYg zyUB~N;CUJ9`?O(ij}hPq|`E)UsD+v>tU1H4kBY%lMJ3I)b_ zU+&AkU%Xw%Yv`u9+6+-JR(W=wqB?F_tAu?|>wyI8OxcHMjedwfkpJoO+oTJsbtb!i z`@J*swUD2ulu+R;3I}p08%AWo$K=R@^i5fov@HLq%%){Hk|GavOih(j;19B)Uu|8? zvwL&mqm=6YzE9zx_!k{>10{xSYi2p@lMZ=-(EW)Bu5UffTwQ|yt*IV@R%#lz?V4|o zZ5mHLvxczRlufTa%92jN$ zBAi{{b!1NU5Y{80bP(eqr|V=<7rPzFkDAjpDk?62C&13>QA)y-1`MzLxJCu!M7o-f zdk{83)69_(l_UCH+ZVwK`pf8!PW8EDg5-|o9E2$ShcZ{KbKZN53+>iYy$5zO0p_|Bmq=Gh+Q3jrEyQ%#?w6=GLb+fw|6}!)Gy*_6bwXeVGMs%^cDT zmWr4X<*&mxHCnnLS3YY(+7IA8dP1vFG`-H>_P`NO5p?jnoFg*{e%g zNon~Rb_jcWj<4kkPWa2loY$jg(X>$sLT^4O?geRR;sOY#{I&;`RN-VF56Qb}9#ZtZ zSbjEC*+|^zza?rf{#s4{*1)7q@ATT#rjslpl^U_zcToExnx$I4w7nxD6n}mp;KSx| zjrx&^sq{LsZYXD^V7v6_EUSyf1pn%xv-c{WsivyO5@F3F%qJ2k{aaoj`dj$yV~`7< zKlzk{f)-;G=tkv}(p$k-Nxi01v5O2!j=ALkM5>UP7))wg&6+P=||T};c@y6%!~K08~B70PO- zB3o~3DQOw7of>hmr0PM)8%CMq*J|Z!Eye9}?BFaj#Z10H4EW;3|0vC#4syvJJaa=NZI91%saGBP3DPw-GX9Ha z7t|oh>a5+sf%*(uOcb0dP>nmS*`LXq{`w_|P)xm+j=h~$QV(UFe?$>F`CdWS^^s`B zUt>K4aR`Dr)$`$`0I|f&To6ENd0V3cf#orO@b)S>6R-4pezcwY=$daTb2+~8UCxkc z+L6**BxA|x5r0&rs6`yYci4~_XBUZTqxCVOO87zg{y5k0bc?gUhTX7N6~S!=;wIyn zd0w~j-B(7(z=eRN`V>F$0hcnBL)zt-Qrc+iQRiz|mhF;KX69acV`p&)LBvfO{I~p<6 zfN=3?gjQKVpuP_gD%OASb?psWZ0a5dAqn~1g+$iq^?cVv z0dB3HG6pC#<4Qrjs>wV6~2zh7^6jL`I;&y++bKk zgrnNbVUp)?5M*!u{DHvUbIEJe@&$7)NxaVc(R&}x(jz62@;wC5F!*Jg&w5bS-CE9; z>?7IG{POb=!s%czb8dnX62((3r(qfj`KbziGr4V1(Yn4JQmQ?I55N%9=<54*^_S>3 z6H$)~my7@g!)=ZSg8yOuskHl|eQzg>m)AM7Kyb0W?7U|D+W?Ee#KKFXk*)i;Z5-}@ zlv8-w+jAeTOHF)g9)%F*2dI&6pBEi|F>xqW7Yh9W;1(fEwdd+`fb*t3Asgim5Ev|Z z_PsUm=><_8dz+c^Huy(J&hQTg1S%I%0`wK$*V^vmPl^6%8`PMqzY`6;w9Py}9EQ|d z&84lL9R2glG4{DcSR{&PD}%9!w?yV+HLIt?DS8w?${3(z?>WE=Xk-{%4DwMU@|)0M zGVc%8=AUO3m!3M!Ej;KKr*U(s@95^R+_dbb*7xJMgqo2N3e}?X9tpia|1g=dn-gOD z)Y$mCKW#QJXn*3qAiLR($Q;nM`9}2XZLKW;=Nt*+599*`(kc++Uhy1!+6$ZvqL5$$ z(wap%iK%a1(-<$iK0~eS9UWvGXNqdKw~-O*HI3K9q=Bbj7wzkqY<`ZD(~Q^%2w$3` zY;I@A?cB4$?Pc*-oXb+7`Aow9+Ipp|tkL{-2oGpw%CMI+BAD+{l+pqWzD-!T=&VX? zSfxys(0fT{v~d$tY&^GRPl^m+ytn^%%zGLmzBKNvGKS&zbfL zQuU;vckw3edrna#1FASHduYJaG&TeRsGx@u ziz%VQRQ_uV_%~RxL5715WPF+ZfEc{6=$}razN_DVjX8_7eP^Gx9>`zgT>e?`%@C{0 z0nRwSc=)TMyO>$dKY(P!W;^W0#_ngH5M{t(_H#)$f1Z*ZQ-V-)|QIc`|cYcOI5ZtSZ(~?7Lk{A_aaY z^Z4*(O7}u+@4yX#kWgF8RsHys{m-0WQeh~RQpwq%YvcBv__Hm|gT}Aa=_)NHEQCob?*yyw9_lx32|q#hm+;r^vB6*w*r^ zWsfBr9~#EL&9I}%o3?zm&TU%Cb@(aD66-+iZ7sWIPjR=3Se!1M?^Kb1e%Y4lk6o$s z+<8n|2^o6lPM%8aYme>a?So(Enw#2>-)H`Q|=d4C53+{PhOO( zS4y^u)O|ErRHVPRy-pUGoF(vj%5d#|C!hE_`G?R&S9|{PWpyZxvdXK2CR0}UT^n`( zmpoj?;f5}BTx=_)&CYc_V}5f zb7H@0WChWVIfxz1i%6zx_0X_kU~ac~v7~uma~_kvUzE5pe%ZsY-o}Rxj4=Z25MbhW zH3cbA*_WcG-_Gb#<_Sb2!0_*{B^#!gv?*-n5>zDQ)&f)_4S#laJy3<1{-IPcsBHN? zpPW)BWjFcdb3$Oa@%(dxA1XFx3|zT6uQrPkU2I>O1JFT$9uHww_iVdS+eDRpxqYy4 z^~@!Mwd;ttYYtSvNT<=*Z&P^cf5S6ZpR0Be#u%XFk!*jRvFd(uaTjXEPst(oH*l>> zbg^FhoDH#m<9IED%AP@dUtivB`lv)7{yVs2WEvnAkk|PE%cr)m#?_%CLt2niG}@X-Gg$k!ghh z*_2hhWI!nMX!QHfZr=h<91Lzl{hlsC23I* zEh+VLxg&G{iE^}g(p-$_16Lx|#30c`J~L^8Ab&VUcukzRw3FV1x{YQXCQLe3#WKnQ z;@M-Gx%V}n7y1Lqp_qy3ofPc2@cnaWFDcwxx>zd+v*^nyh42)YtYtr0@hfR`pi!SN z$HR`v^O&rIk1Z6ds58s_tQSfim>&s1vSqAljGQ)H`1}W0Fx$vr)PCB(Y7|Tht>* zR$_v|Fsy%Cb-_>$J(5qS4YcW~!)|nw-x>@GiDY%xTpk`@9@J<(N*-!EhXo9 zNl?Msk2pFn!BV6xL&g{!K4c-T-d;$&qR)rfN(hyI4qcR^C;AE0;&SKo>eGTlIfb?N(^9rcGoFW}K=5-OkV742}40$1l)Gox0p~dy%XqA5CpPc256JbKGWK00aefC{ty^73kDLo zGqmXk8G>=sm)-`y_~UQ-bN!v&pxQ`{KbXK^-RlYO*#I7Hb7}T_zyyKx_ri$o0h~ZbXB0JoN$XCvI+Uln(3f6YTxznLz^b$oYiheXFy}Jcnd# zAuwn<5nw<)<+Kn`0y#8t(zfoXB)qbKqumglJS6dkSXprF(EKvWDGTvIak1dS{by1^ zAP@lnbQez)A||&j`Q}M*f+ju`SGNRBht6K#4_q@ zHTt{tiHi>#y*i9aO~UVS1z23#o&fokzm2YYE&U63>?*;ng*lUxIbth+mvN+YB;|$h z3nugQvMDoY({Y#mS8rnpQILCg($zWL4UYYK-`mpI`Ngf zy1yKAc1^hX#X0nB_9imaN!n+B>3z`4^9IqUXgjGc6H1aQin7&?Lwh%!524ZrPBA-@jdetcPc&m`nROXz3m$*y)o;%o|Z)WB*&(W!iMT2sKR`nA{B4AL*f_5Aw?MI^c&xZy}`0;9@IAjFi3~uq!O`cPLYeknsA@&;#sw)U~Z>)vZgN zhL1TyD%ioV5Lvd6S)BKI7kMZo$+1yp+5RFC_1U0ELufAc2|Zo;8$} zL_;*7Bd|Em{2(^|`DP4bAl%YH1m218PZE^1v08ywe_Q%*BDUcFt9Jd*@8j9OoV63{ z!r>;zH_lZL!IRU3Hy;K8j$qY>h%gx;y=8=j$uLDZdqob|S z=rHHYJITM9yP++3>{9ILOgs2znFfV$3;n-@K&1f5|z|iAo#y`Bj(Q_ z=-1slUymiM@S?Z-CA$bn@)xp1!AkvH8L&tm0D?HM=G~ByvJ$(Z%(#jf%2(-X-gR6h z=SXHw_mnLGbIHMoS#LUDa4)l&C6$x7NeXI!R=d9#j|g&@?ise`KbWzCLZPha!rXgW zMa$oCp**(@!S<3`Ph|pPgqL$~m_|qeFc{oVN{I}9J$xLl);rk3C;X&c5kwpHqP)CE z)EG1PfBF$lKQBI>tl|^>o))=+K6$a)aH`#YeGvx;k>bM?-$S^0xe-S~?LN8+TU^y^ zFRkKq*Dpe><3#zoPtbm@t>qC{+*o4GAWi;)C&Zo&qD?TmwXt{+8C)&L+C31JZ>eVS zB)Uv;g!9aYU=N3bg7v>kP*4}B5{S_zovKjWh*e>%h%9WjpoBo0Mz{8SnW=Q6Kce(@ zxiqnUpSq?o5l1nS^#av2+p71fv5!}UP|3c>-_pP`rcyb#3W1J^(na{AgT6=_5Vlm{eGf3BxT3;Aq- zv=Bj+5^sqK`%mm>n{=7mj@esGwpC_%d~`qqE@mh`!x4J~A`=jCa6|SuoL7objUp-C z5|D8}&ua`ZXawfw4FE2jY=+9X*;X~?|5H&g#K*g(c#MuKMy|0^&rtQ6^XC zPJ27xIXrLM-#eBu3vcH)4_@)^~de^8Vw5gb)|e2#2olf2J&#k z2z3x|x%`M8!ZT7B`<^L<-=xkwY<@3K6AV4F?LKI;Ae=WG%I$C~o aH+6LR-^<8R@ya2}0Lt=j<-W;4L;epW>FkjJ literal 2210 zcmV;T2wnGyP)Px-TuDShRCwCuoM((xMHI)kFRQVFyO!06Xxv~#jjq8Gv3@YI5ercX#E1nuilVV& z?1?QF;#vq13pUiKhzcSoD(EV@DkZ3hB1l`dvA%ut^TRt=XXnlB_rAB{B>(Jt@6Mb# z_kYivIdf+2mX!370+a(4KqXLK@_#Hs!U4cNKr^rr=)t}80GoiXrOkmr*_KAiw!ke4 z{Yu%|1vSB1FMNutW0%l#3L4V$$!GKfKp&QkO^ZBAVZA03R{8^(A7q0hU@6%>cgvUjPe%RXz?mNO@iQoFAZW8?aBY$vFn- z5X2@zHU56JXiZNySKDxCI(AZ8~~&h!`Ez+&J|V6PDJ&ImY>4F&cS zQbs$@SjcM%FdJlnebXjquMpEx7We>Y2q5V_B{& z2i^s)jG;$aQpA)>RD5kh1UdLlZnV_s?+M@!@pILdiD8|P7q|cMCizhb`X$d|lMRkn zSV+3ZoE^m(uT3~A-yF-5fJqdltnizLfge)pdtOv>c9-Zk4wPnbJu*fA2z(FxY+#Cq zE=^ic`Mb1VCKhEz=U;|J29AqDP#v(dhTVXA7wjT+>LgA&TwUy6HUN=8*pIX>wV~tUNI#pF4pivaV||+8q}B87qJ#L6oTviNVst z5f)kffKjp_?FK#v&KE~JB!VxhHBhJd%0q#v($C|L-;;;3n^w2ZLr$%q62pN{1q*!e zspMs{zzK#AxWGuac1m7oo;dDvV-BBJfsb4;N1wuloD&1w&jJ(+fCs!f?u;<3E|RuG zfo}rTzuKe!6UEwUfE|F59(A7!q2q5M@2T8vr5?7-0H%b<6i)MSs9jFbD8D@{-%0|q~-`)XKzN88?bV#%S}FQ)H_FhUvGpBE+nbB$#0yn(k)tjDkWHxRpK)~ z1Ktu#agy?7^0^6^EVp4LN$M+E+%_Zy+iWur_{uf@LO$LTmpA%d8bzS+W~Yam(Mw<4y{eAmdpMb*iY|ZOv;PV`hdP; zlw3d0L)H=tK{YAp{Jh@5ocKf6H6OCxxS63IV*B+DR$cwt8y1o_h4G02-0PpZ@LR=9 zV;rsSia)t$KbqdCAV1G9mj31y`GlYwLkEvSs5O z9Jn56)OK3ktl}&qqfnrt@UhU*CBUAs#CiLsR|76&chv}bIT`my$({R|7(-@Ks4)rh%MgA|@9d(EMIp0| zEudOtwSTNZ&|7lw;UD?Rz27u3z>KI@6={ey8hX5vjMI%Jp~tr57?+$*p_Dt&&|_+m zmKS=N>9%ja!B}5y2!V}(+NxgP0S>Zk1E~OQeV{gk)Zf86V4&C0kt!clSWp!KmEw=g zA@(TnNesEM;kB|KT7>EJI75d!3Okze%1wSbmR42RVQ)MjY6Tepjk`Hso z8U623M1pP)bIPorpgJ{VxdG$wrd(6fcNI&iUh2|*X?z`m`5p^FgC#?lHadatE&V&M zHRVCMeD^z+`-AU5(u`X0Duak->V$!iVhW|-WuTeq+V#Tqa@(Aiv4$IlW>61-#~}BsM|QP zwt6BEG(Ge<3g-xpvOJKq%c7(=0;i|sg8(L4`dby-CA(i*M;h<2x@G%RV9i`L{?gLd zZGm|SXRsZ_cy}ZSNpH}5msCIX9t8lKT@H=|DCOR^#|7EEr=jQo?xRp|KPO1|cD9*J zuC)PUW6Ccp){Qk>idMNV`4>`875*W#r@PEyKeaM}MZc`Cf*5uAzuLnLR_s^WFO19J@i_jtD{uRY+ kawlNdkb6hs)V`$a-=DRfGw8>|X#fBK07*qoM6N<$g1WRQ$N&HU diff --git a/tools/VectorDrawable2Svg.py b/tools/VectorDrawable2Svg.py new file mode 100644 index 0000000000..20f168e1aa --- /dev/null +++ b/tools/VectorDrawable2Svg.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python2 +""" +VectorDrawable2Svg +This script convert your VectorDrawable to a Svg +Author: Alessandro Lucchet + +Usage: drop one or more vector drawable onto this script to convert them to svg format +""" + +from xml.dom.minidom import * +import sys + +# extracts all paths inside vdContainer and add them into svgContainer +def convertPaths(vdContainer,svgContainer,svgXml): + vdPaths = vdContainer.getElementsByTagName('path') + for vdPath in vdPaths: + # only iterate in the first level + if vdPath.parentNode == vdContainer: + svgPath = svgXml.createElement('path') + svgPath.attributes['d'] = vdPath.attributes['android:pathData'].value + if vdPath.hasAttribute('android:fillColor'): + svgPath.attributes['fill'] = vdPath.attributes['android:fillColor'].value + else: + svgPath.attributes['fill'] = 'none' + if vdPath.hasAttribute('android:strokeLineJoin'): + svgPath.attributes['stroke-linejoin'] = vdPath.attributes['android:strokeLineJoin'].value + if vdPath.hasAttribute('android:strokeLineCap'): + svgPath.attributes['stroke-linecap'] = vdPath.attributes['android:strokeLineCap'].value + if vdPath.hasAttribute('android:strokeMiterLimit'): + svgPath.attributes['stroke-miterlimit'] = vdPath.attributes['android:strokeMiterLimit'].value + if vdPath.hasAttribute('android:strokeWidth'): + svgPath.attributes['stroke-width'] = vdPath.attributes['android:strokeWidth'].value + if vdPath.hasAttribute('android:strokeColor'): + svgPath.attributes['stroke'] = vdPath.attributes['android:strokeColor'].value + svgContainer.appendChild(svgPath); + +# define the function which converts a vector drawable to a svg +def convertVd(vdFilePath): + + # create svg xml + svgXml = Document() + svgNode = svgXml.createElement('svg') + svgXml.appendChild(svgNode); + + # open vector drawable + vdXml = parse(vdFilePath) + vdNode = vdXml.getElementsByTagName('vector')[0] + + # setup basic svg info + svgNode.attributes['xmlns'] = 'http://www.w3.org/2000/svg' + svgNode.attributes['width'] = vdNode.attributes['android:viewportWidth'].value + svgNode.attributes['height'] = vdNode.attributes['android:viewportHeight'].value + svgNode.attributes['viewBox'] = '0 0 {} {}'.format(vdNode.attributes['android:viewportWidth'].value, vdNode.attributes['android:viewportHeight'].value) + + # iterate through all groups + vdGroups = vdXml.getElementsByTagName('group') + for vdGroup in vdGroups: + + # create the group + svgGroup = svgXml.createElement('g') + + # setup attributes of the group + if vdGroup.hasAttribute('android:translateX'): + svgGroup.attributes['transform'] = 'translate({},{})'.format(vdGroup.attributes['android:translateX'].value,vdGroup.attributes['android:translateY'].value) + + # iterate through all paths inside the group + convertPaths(vdGroup,svgGroup,svgXml) + + # append the group to the svg node + svgNode.appendChild(svgGroup); + + # iterate through all svg-level paths + convertPaths(vdNode,svgNode,svgXml) + + # write xml to file + svgXml.writexml(open(vdFilePath + '.svg', 'w'),indent="",addindent=" ",newl='\n') + +# script begin +if len(sys.argv)>1: + iterArgs = iter(sys.argv) + next(iterArgs) #skip the first entry (it's the name of the script) + for arg in iterArgs: + convertVd(arg) +else: + print("You have to pass me something") + sys.exit() diff --git a/tools/generate-legacy-icons.sh b/tools/generate-legacy-icons.sh new file mode 100755 index 0000000000..9bf14e8093 --- /dev/null +++ b/tools/generate-legacy-icons.sh @@ -0,0 +1,26 @@ +#!/bin/sh -e + +# Generate SDK <26 icons for android +# requires imagemagick, inkscape + +ROOTDIR=$PWD + +cd src/android/app/src/main + +pushd res/drawable +# convert vector to svg--needed to generate launcher png +cp ic_yuzu_icon.xml tmp + +python3 $ROOTDIR/tools/VectorDrawable2Svg.py tmp + +inkscape -w 768 -h 768 tmp.svg -o ic_tmp.png +magick ic_icon_bg_orig.png -resize 512x512 bg_tmp.png + +magick bg_tmp.png -strip -type TrueColor -depth 8 -colorspace sRGB -color-matrix "1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0" bg_tmp_rgb.png +magick -verbose bg_tmp_rgb.png ic_tmp.png -gravity center -composite -colorspace sRGB ic_launcher.png +echo + +rm *tmp* +popd + +# Add legacy here when legacy gets merged