From bc34024e322a21cdb0c85d000060e5db6e3030f7 Mon Sep 17 00:00:00 2001 From: flyinghead Date: Sat, 20 Nov 2021 16:18:27 +0100 Subject: [PATCH] uwp: fix crash when opening menu/canceling load. CI job --- .github/workflows/uwp.yml | 48 +++++++++++++++++++++ CMakeLists.txt | 1 + core/deps/ggpo/lib/ggpo/ggpo_types.h | 2 +- core/deps/miniupnpc/CMakeLists.txt | 6 ++- core/deps/patches/libchdr.patch | 38 +++++++++++++++- core/deps/picotcp/include/arch/pico_msvc.h | 2 + core/network/net_platform.h | 2 + core/rend/gui.cpp | 29 ++++++++++--- core/rend/gui_util.h | 20 +++++++++ shell/uwp/package.appxManifest | 7 +-- shell/uwp/splash.png | Bin 0 -> 25233 bytes vcpkg.json | 9 ++++ 12 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/uwp.yml create mode 100644 shell/uwp/splash.png create mode 100644 vcpkg.json diff --git a/.github/workflows/uwp.yml b/.github/workflows/uwp.yml new file mode 100644 index 000000000..be76356ff --- /dev/null +++ b/.github/workflows/uwp.yml @@ -0,0 +1,48 @@ +name: Windows UWP CI + +on: [push, pull_request] + +jobs: + build: + runs-on: windows-latest + + env: + VCPKG_ROOT: ${{ github.workspace }}/vcpkg + + steps: + - uses: actions/cache@v2 + id: cache + with: + path: $HOME/ccache + key: ccache-${{ github.sha }} + restore-keys: ccache- + + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + submodules: true + + - name: bootstrap vcpkg + run: | + git clone https://github.com/microsoft/vcpkg + vcpkg/bootstrap-vcpkg.bat + + - name: CMake + run: | + cmake -B build -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0" -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_CROSSCOMPILING=OFF -DUSE_VULKAN=OFF -DUSE_GLES=ON -DCMAKE_TOOLCHAIN_FILE=%VCPKG_DIR%\scripts\buildsystems\vcpkg.cmake + cmake --build build --config Release --parallel 2 + shell: cmd + + - name: Package app + run: | + mkdir build\artifact + cd build\AppPackages\flycast\flycast_1.0.0.0_x64_Test + mkdir tmp + makeappx.exe unpack /v /p .\flycast_1.0.0.0_x64.msix /d tmp + copy ..\..\..\Release\*.dll tmp + makeappx pack /d tmp /p ..\..\..\artifact\flycast.appx + + - uses: actions/upload-artifact@v2 + with: + name: flycast-uwp + path: build/artifact diff --git a/CMakeLists.txt b/CMakeLists.txt index a80221778..d85a7ec4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1359,6 +1359,7 @@ if(NOT LIBRETRO) shell/uwp/flycast150.png shell/uwp/flycast50.png shell/uwp/flycast44.png + shell/uwp/splash.png shell/uwp/flycast44.targetsize-48_altform-unplated.png shell/uwp/flycast44.targetsize-48_altform-lightunplated.png core/deps/SDL/src/main/winrt/SDL2-WinRTResource_BlankCursor.cur diff --git a/core/deps/ggpo/lib/ggpo/ggpo_types.h b/core/deps/ggpo/lib/ggpo/ggpo_types.h index 530883554..54abecdf5 100644 --- a/core/deps/ggpo/lib/ggpo/ggpo_types.h +++ b/core/deps/ggpo/lib/ggpo/ggpo_types.h @@ -25,7 +25,7 @@ #endif #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) -#define TARGET_UWP 1 +#define TARGET_UWP #endif /* diff --git a/core/deps/miniupnpc/CMakeLists.txt b/core/deps/miniupnpc/CMakeLists.txt index 12747b33a..4c42d3db9 100644 --- a/core/deps/miniupnpc/CMakeLists.txt +++ b/core/deps/miniupnpc/CMakeLists.txt @@ -35,7 +35,11 @@ if (NOT WIN32) target_compile_definitions(miniupnpc-private INTERFACE _XOPEN_SOURCE=600) endif () else () - target_compile_definitions(miniupnpc-private INTERFACE _WIN32_WINNT=0x0501) # XP or higher for getnameinfo and friends + if (WINDOWS_STORE) + target_compile_definitions(miniupnpc-private INTERFACE _WIN32_WINNT=0x0A00 _WINSOCK_DEPRECATED_NO_WARNINGS) + else () + target_compile_definitions(miniupnpc-private INTERFACE _WIN32_WINNT=0x0501) # XP or higher for getnameinfo and friends + endif () endif () if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") diff --git a/core/deps/patches/libchdr.patch b/core/deps/patches/libchdr.patch index 100f0732f..4aa215c78 100644 --- a/core/deps/patches/libchdr.patch +++ b/core/deps/patches/libchdr.patch @@ -1,10 +1,10 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9842447..f1b3c43 100644 +index 06bc77c..9ac12fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,8 @@ option(INSTALL_STATIC_LIBS "Install static libraries" OFF) option(WITH_SYSTEM_ZLIB "Use system provided zlib library" OFF) - + if(CMAKE_C_COMPILER_ID MATCHES "GNU") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fPIC -O3 -flto") - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) @@ -13,3 +13,37 @@ index 9842447..f1b3c43 100644 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF) +@@ -34,7 +34,11 @@ add_subdirectory(deps/lzma-19.00 EXCLUDE_FROM_ALL) + + # zlib + if (WITH_SYSTEM_ZLIB) +- pkg_check_modules(ZLIB REQUIRED zlib) ++ if (WINDOWS_STORE) ++ find_package(ZLIB REQUIRED) ++ else() ++ pkg_check_modules(ZLIB REQUIRED zlib) ++ endif() + list(APPEND PLATFORM_INCLUDES ${ZLIB_INCLUDE_DIRS}) + list(APPEND PLATFORM_LIBS ${ZLIB_LIBRARIES}) + else() +@@ -68,6 +72,10 @@ if (INSTALL_STATIC_LIBS) + ) + endif() + ++if(MSVC) ++ target_compile_definitions(chdr-static PRIVATE _CRT_SECURE_NO_WARNINGS) ++endif() ++ + if (BUILD_SHARED_LIBS) + set(CMAKE_CXX_VISIBILITY_PRESET hidden) + set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) +@@ -79,7 +87,7 @@ if (BUILD_SHARED_LIBS) + + if(MSVC) + target_compile_definitions(chdr PUBLIC "CHD_DLL") +- target_compile_definitions(chdr PRIVATE "CHD_DLL_EXPORTS") ++ target_compile_definitions(chdr PRIVATE "CHD_DLL_EXPORTS" _CRT_SECURE_NO_WARNINGS) + elseif(APPLE) + target_link_options(chdr PRIVATE -Wl,-dead_strip -Wl,-exported_symbol,_chd_*) + else() + diff --git a/core/deps/picotcp/include/arch/pico_msvc.h b/core/deps/picotcp/include/arch/pico_msvc.h index 226cd7c4d..fddd4b96c 100644 --- a/core/deps/picotcp/include/arch/pico_msvc.h +++ b/core/deps/picotcp/include/arch/pico_msvc.h @@ -1,9 +1,11 @@ #ifndef PICO_SUPPORT_MSVC #define PICO_SUPPORT_MSVC +#pragma pack(push, 8) #include #include #include +#pragma pack(pop) #if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 diff --git a/core/network/net_platform.h b/core/network/net_platform.h index e50222e06..9b2b8f67f 100644 --- a/core/network/net_platform.h +++ b/core/network/net_platform.h @@ -62,6 +62,8 @@ typedef SOCKET sock_t; #define L_EAGAIN WSAEWOULDBLOCK #define get_last_error() (WSAGetLastError()) #define perror(s) do { INFO_LOG(MODEM, "%s: Winsock error: %d\n", (s) != NULL ? (s) : "", WSAGetLastError()); } while (false) +#define SHUT_WR SD_SEND +#define SHUT_RD SD_RECEIVE #endif bool is_local_address(u32 addr); diff --git a/core/rend/gui.cpp b/core/rend/gui.cpp index 05682f622..7fa9350da 100644 --- a/core/rend/gui.cpp +++ b/core/rend/gui.cpp @@ -401,7 +401,17 @@ void gui_open_settings() { gui_state = GuiState::Commands; HideOSD(); - emu.stop(); +#ifdef TARGET_UWP + if (config::ThreadedRendering) + { + static std::future f; + f = std::async(std::launch::async, [] { + emu.stop(); + }); + } + else +#endif + emu.stop(); } else chat.toggle(); @@ -413,7 +423,6 @@ void gui_open_settings() else if (gui_state == GuiState::Loading) { gameLoader.cancel(); - gui_state = GuiState::Main; } else if (gui_state == GuiState::Commands) { @@ -2258,12 +2267,25 @@ static void gui_network_start() if (ImGui::Button("Cancel", ImVec2(100.f * scaling, 0.f))) { NetworkHandshake::instance->stop(); +#ifdef TARGET_UWP + static std::future f; + f = std::async(std::launch::async, [] { + try { + networkStatus.get(); + } + catch (const FlycastException& e) { + } + emu.unloadGame(); + gui_state = GuiState::Main; + }); +#else try { networkStatus.get(); } catch (const FlycastException& e) { } gui_state = GuiState::Main; emu.unloadGame(); +#endif } ImGui::PopStyleVar(); @@ -2311,10 +2333,7 @@ static void gui_display_loadscreen() ImGui::SetCursorPosX((currentwidth - 100.f * scaling) / 2.f + ImGui::GetStyle().WindowPadding.x); ImGui::SetCursorPosY(126.f * scaling); if (ImGui::Button("Cancel", ImVec2(100.f * scaling, 0.f))) - { gameLoader.cancel(); - gui_state = GuiState::Main; - } } } catch (const FlycastException& ex) { ERROR_LOG(BOOT, "%s", ex.what()); diff --git a/core/rend/gui_util.h b/core/rend/gui_util.h index 32dcc7fb1..0135badfe 100644 --- a/core/rend/gui_util.h +++ b/core/rend/gui_util.h @@ -80,12 +80,32 @@ public: void cancel() { progress.cancelled = true; +#ifdef TARGET_UWP + if (future.valid()) + { + if (progress.cancelled) + return; + static std::future f; + f = std::async(std::launch::async, [this] { + try { + future.get(); + } + catch (const FlycastException& e) { + } + emu.unloadGame(); + gui_state = GuiState::Main; + }); + return + } +#else if (future.valid()) try { future.get(); } catch (const FlycastException& e) { } +#endif emu.unloadGame(); + gui_state = GuiState::Main; } bool ready() diff --git a/shell/uwp/package.appxManifest b/shell/uwp/package.appxManifest index 3da60db04..c4cc060dd 100644 --- a/shell/uwp/package.appxManifest +++ b/shell/uwp/package.appxManifest @@ -1,10 +1,10 @@ - + - + Flycast @@ -25,11 +25,12 @@ BackgroundColor="transparent" Square150x150Logo="flycast150.png" Square44x44Logo="flycast44.png"> - + + diff --git a/shell/uwp/splash.png b/shell/uwp/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..69bc5a340747e9677707991fcbe49311d04d978a GIT binary patch literal 25233 zcmdRVRa+Ze6Kz|dxLa|TqQxDGdvJGmcQ5Yl{^IUd+@ZL;7lOM4Cnx>R`4i_N$&*|p zd+%AZX3eafNJW4oG6Furr%#`drKQA_KYjXQ`{~nX2DmSfPi`bVgCQ@UU6dt7KGjYW zop zM@)_oVXCQ#vpQ5d#^W|!QMnCP^SJo2!M32Hwt(sW_;}NPUv*h~dYM__0H*8u5`rcI zNA~~WQ|?y8i$TcjJjGAAz17|XaC$=~9U*nypsp1TAOm9_8P-M+9Kg7_rF+#hVvvdJ2ZY4EiRux9z zWp3U|Lc1jpM=Hp?b8L|KKf(2cm~W_MBVWb>e;QlT%@N30AZ7(s4|CMzGV_<+e16v1QuLZ5n{- zphD8XOW9N~cia$pJjMi0*8317zff07S%{ypFDR$b@@KuhSw)If$iUk`&BBOW?tR*?vcFBpa0wq&_rp%g;7d%$?O2dPHiSXLX~CyOWR=>8-j>-_ylVhW3jTEb#V<6vFtVs=4||)f zxUg*f-V;Q9pDJGXslF&B^&~;ZQ<70~W?5C$GV+kyA7XP}Q53$Z-4|*$Ld{LjvFBmD z*i#fVC9grR0Rexj-usUhjOB8pX1!2Fv2x?_x3cT>U-ty;uIdr&-7w~Vsg(%yTaaA7 zq*LtorXS?+Vi(+f3!~-jt$*sWzJO)6^XuGFtpJGdHdMO)xF3L`0pC0w3}Ot^iXU+x zDY^DI>YO=jUaxK0T{&lTpHeo%CFKwykaV5R(tH(V{%a(8+!YGhh~F2Bp2qz+0@JP9hl|}lRi+9QC+4xDc7#`#1-JNCsgKudpT}!CnpfxbiJ8MJ-#Mt z^7wK2v=cW9C{IS?%|8J1qVr0k57bn3yn%9s%H7~MNdXkl7IaA5nT51Ju6d{hRoF;0-PfTOb4H~kysmDT1=+4K2@5~x3PGaC6G1Uhd&t%6^~!a-;gC*D#(=*N>B^6#5VAk_Gi3{n z3Ya33mLN0X(5r`mWtxD9ZquTvr^Zya0=(zeV$+g;hGnq%uQBuiHXpo{sPG8$xF4tN zD)?{N_~|8}sf}KLrwN^O*IB`|Xa?@#>WrweH;SHFG1~0$@%hv8KDc_`rNd@5E)Abk zIz~=JheNG2<_+qd>J)GLYl}xBaJJ@189?Ni@LxEIsy}V1`b=#wzuC7G>E)`rpEFB@ z*-{hWqkg3cx>00E9sAWT{ew-?IhK)63DHbu%c!H2tUh?5Z`ehvF~7n!tD^>8;H1Qi(r{P(Hu(H?HRE9Ej$SNnd*w!hSM1Bq~b9b~s2 z%!HuR_qo&3ZybG{4avE&u@-pJ1n}cvv`bRfu_6rji0m!4vc7txP8e(SxG-4#Co#X@ z%Xb4j3j3g^DOr?;%cX||NULtJ^HreJU-#%-^%Y1l(dh7pYfdOJX2^^#zk7{`BzgFt z)_KK^-P4-?w77&!<>YB`u-Ee>PSIL5H)NLQGbH`CT9Vm*TzOqC%`DJm%BSqBtZJ(4D;he9RMXPSf5ev31i0O^!Ae{XxERjzKtaBw`w#M& zkl(~|UFzeC=D4)U76ru?#ds!#tZk1c6ED3h4^MY(3vP8&hb>_nrHP7S0&4u$;~>=4 zfPCli<}XP2WC-^h*6)EU_AkEe*7zb3a=^r73e4`JHMuml9tVy9#t*9j{EtA2g040lPG{G}76WKeI+`Nd*^qxWpqwTh^I^0MBa;EiIl=HVUN}5Xn$tJLLBk-x zkP$1aw3%24D|+Af{35_wclJ*f)M>7wO*lS*r`A1=zO%^!Gm*ZIPDmrAY4S-!q}S218xPj{)CpyMYN&&}_BRkkeITn}{Fi}m3!SDM zhy0TKS@x8AbmIW+&ZTl%(P-Jn(_OkCnsj^>gvT}vBMO@$#T~o$2d)g(Z{r$~zNgDu zgexG)BP#?J+YT-UnJHtGO6)y5d6FSPvG7s{vv%!N4t#b9rsJ}z`~{Nu{TrXNUJmAm zpg*Q8pDOGD0pmbB}RJgMHhONy^ z>hdw4vJSJtTI4|pe2hCi^D*CgAD?jZPG3DDYdah$;ZpydCCV2I|NZ5F4)d+tXW1~k z(Z4E_k$&Mm5VCno8&eMW0{xp|Xk@Ph^M1wXc;=^S_x}0Nd`fEZQoR#VJBvY{dZXrI zb}3d$VtgfjWj0rfwk?j^Y2lcvx6^%ICrSW+CUPa@@Cg1LUXU~A1OaD&U1D!N;i$Op z-gfZTm}cYse}2{XDWq;0AHHbB@dL*^ttE+{8idstZM7uzHxPWN%v@Thr}nX+t14Ps zTFp!dn6H7nb*|jL*L*YESn~Vg(sNq>(hSC(qZ=698IY)>o1l~#_ZS1pKR-H9?gjC~ zv1D+gcs$OAJEPIRDpgd;_+MGM!M58oc8x$?V2SBnX;jF-7)`atogQlI?~Y@XWa|C} z3p|D~f%mOR3YH)epvL{Ik_o)JErej&fV(XCeBN-aDs?d#Om*!4UrJ1JB84Mn1I*i_2XL_#<$gt z?3%ObYl0TcE9>DPY7H0}`N;tXE>ssFQ|3IUNsS>BE4g4|#gd0%a-z$glow&)R}HPo z$xRPt;vDQMcA?)~Mp|f|)LshP`DeiIc zBFdA;$IYD`s=XdsUkJDsb@v-Mm|qR>UlIDzMS{oXl2zi}VDrwA`5^>wOi~=QI5>TA zK=k04SX+pYwMUZdiPp;?fQH&Ix$L~9 z_uto72Rx+SauB*U2c*JQ?z3wIoJNhF<`BeQE)@wdyFE*kYVuS8G6Fvdp!5og1mwY7 z1Ou&&|JvzTJN&laD%0l2h09UP?dYHlXEOs%szQY4lSBR~SeSvWq?@xP$b!Dh4yrxV z4^fH6s_%5~g#)=Jdt(jREs3l`_g=`r^X$8sYo9ofMFa@ZHR`w`zq#z5UpUSL?Vk`B z1(P(> zjW=)6+e#Lw!soms%dZV_TYn^PT6OW+BHG})ARaZI4jhxN$nUz(6Ey)>L3RxT+4X5- z!{K`T`E&Q)gqM4-#okVRPHA##&b6@NaE-IWC84m zV-Sf}JuHGo*G6hG1P^UXLQ=kunhz)EUGk+gjK-X*oHeP>=q366x`yz06lBg^;HhAYv(Q1VLQz+gfRzZKYpJ1IPJwWZ=zq z;u_HKD|!3^cmXPacAr`|y#3{Ypx5_xnnZm)Yf0LI2eg;rdA45J%~cC#n9+J0>ru52 z3{F!)I}duT9#VlhTaw17B#*o{EiW7~VI|nStU0ipdZ_j$j_WezjzOoxMN(?kUgTcx zu{fGpj3W*~+qqtxZ3rxE(t>j|I`+x%r~9OLS}bm2bN#?k_tH1);ZPAEzozi0>y$Fi zn#$LeuDAZegz1nSk@rUi{-LM+4{6-M2OOSln5@?vV8Az+@j1C+)NQTFf;Wo*$Q20;}>Cx*FM2L7(tKB=i3> zFosFyb(hjd?l>4zo1Pt=YYy&y<>j{$*Bu(Z?bEx{#%zT}E7)f?$A1 z+VraGM4%(w$DQ~~_Z#;uaPD9mbkzCbBe_q&-MBgjHH}bB*^)&EQLOHIOWPG<3bY)B z+browA+WnF1gh$Zv00qiM=op!h$@jCHgrgbv^2K0o&EX8MA1FfkQlE)Vw`G$b562$ zr_;1ufDI?bbMy3(-c&Ie~gXu}H9RW-ITz}Q`3_`^ou`ap1Ctdx5qIKOD ze@izum&5vJ12II|r4opOp~#D^$2beCHQ9ZiQbvO2v2Q*u}#3Go~U7X(y5}^2!Xp`ZPhBRqB3I&ddv(szK`ptr`>p8=UOSDM0Bs z7y*?j{mtI+B(W#JXLnI!!B{ny7xpiejRA~7i>Uku2XlWcuJK>X}XniB&|^zO^z zwj_bx#^T3(g7|klg%`=P0hK*lx~A0wiXl^s&6d2ZQf-Zr=xZ77DvwlTc*>WaPH^eG zj$+Mjd*s{f7vh#)G46x)L_vVdRJi-j#%cTSbBcXhvcz71r{N+lq6B6lH$D5> z4p|^;YUjAS0nYH^P`0hTk9bR2WyQ#z(|3zH279b0tMd}`p;bLe!Q1&&0jjX=mS3;< zxA7eH()+aFbD-B*)v`h3+VvS>Eb#}ZiHo|)jE|V00A^26so5BAuU6M(G;T!azLtH| zM^ft~ZKvapq7b29h(8mebtzNc#`<-`1hKX2l_ExkoThtYTV`AdgkF6NPVp~@jp4K8 zE!M=`HORCkf~Ta{_$M29j^@`aNm*HbT$0?3HQKUfdp0S?Q7PrIUDq>rMSFTKRGSrj21mQLQXP-=_u_Yt)tbY>oTW7`X z1z(Q?aLd{N@k@nfBiNEFbs1e8+p+Q7%C(_ z-Fi{;m6Qj05}m4w^tFJTkk-f^7DLe8VCR*=etWa733L>Xle1w^$%iLclR8($-HT4# zqT6JQiQozk-#ABo-P_WFK#HTcC=aFbkfQMHffkl;eC*M zR*KDQN{FIc{qH0e4Ff(*-n^-4{?C%>T3a&b%y7{hg-Rr35+))W`EEzn{AIFhe_Ei| z;qF}h6~CU9iW~jdf6ucZJ9voXWOVR{;xQAk|HYUW%u`G}x zZ?RNSM@p!J564isfM#m&Wu84J?1zsehN+m8bb?u3U??Lj^)fWhr6G2oISi^S1-)t` z^{-5`Z!qdf^gchA@Xm}Hw9a_(ZL(}&n!H}n7)_MhX9K#f54ZaktOIaBFCK|}e0y&A zLOR<+9{SCZOGVyX54g}tP~g_9EXNMpQ7Z~|5=fO{T~@vPxZkFs6sVF?=O^0mpu|>_ za48|ZECRECipROs=1=?2Ve8{vpyo>N?UKE98&x4J3;;6wTWu`3uMqQTl$G_fiOKa} zN&&3UIYLS;$3qpiHboo^!Tbt-O*zAsUmK#ll}1gt%WDNANC5ZrMn{3babnvB9Rj{A zo2)bLK&~`RFG?D!E8g2Z+);m?9dk$GN!(<(7%@oRuwEzadLZayD%Ne{|4f z+~(AmT#iVY+p;^0<+@XY{?hFJ7v1b>Sksv5L6$^YYAo$wB0m3M{ z@Jb-l4E3KSEjMY5J7^JF7dE7_w-xWBYrVFqyeQ24s5?mowvvXeUhdsjg`Jv(<$fk` zA=E)MsD!d&#%$&#x>Jj=qx!`=Uc@~DFp~3V^B+sX1X(JT8x@~&2!Bb&4KlwUn87=9 zmYXhF?|ps_I2vvg%AS51rPew*zvh;wPHu=wQM=nX)z4RDQU?9a0aCvv#`dvc7nfkH z<5o+qS!4i8E5rmi@wJ^*H2?Fd1Q$qmI0mh*q>*EFRo0n2tO7s!eC$G%jguU}Y@ z6xtH2s`~`5L!DC+JSh)vy&2rA0#_)mTRBoYA5p>odKGAhmT}&XaNGc0c~S;%wG zdmN`^U{n1$F9QET;CqM@HyK{gX$|nOTheD_VI$E>@kVifmY_BtvA{8A?rY000HcLB zIH%`j{UI$Ookf0pObXXb^Z9QJi2)ziGdo2YysFBZ=K+Jw1uewj7(7(c!OwunsiUjc1zXJ~QQ0@WoQcE?u} zMt&VA>ZTwhgS!61@>{msWKQ!?Z}Y8H!{ei6ol6X(L}i8~8fM_!?T`iyC-eQfO!C;` z%~52mF*Pmp35(Du)GADj{=eaB+kHmtlJnSN|fHboF_kqL>?0xluU{ zVFRAcmGSOt zpDVU|UGsv!^;6V=Y0RWw!~FWs^v$BFZ{?(XWtsl;8=^%X%9@Fi%RlfM!qD zjK6GnNC#|uBw$ZK9}$~Uz@Ys#{_*RG@A=oy_Rx9$N&esA1V#?kwFOzdaG=!t)%K5V z9Ubf(?P?q9YU(+)pu@#n#>1S94ck*-R?+x{BUOzDcAqwi?)Rbt+uH^u4S!NAQ|PLC-?6?HC*Oo@UDWg1o>B^QwYGjX+qg|wmn@e< z@<*2Zlfma9)HU7d(QhJ#xa!S@9!a$II8Sj~=6Br)IZt=ap66WLx5ZTlAs@AVCxe*+ zm2>%PLtZKH9rvc%$gljv#zl8^y{+?}`VwQw8k689)&6-^y!Ma#{2DnkcltyE5+ovC zY)@D2w|UEZxag&UZu|!3&m8qYgj*_l)wB<1iVS%I<~3svzK7+YbB-&Lj}zv2f76~K zpVd)Myk}i{-Im=p`p$)(=Uc>-nV-G;DySb%C2ce5KsdZ$vZ%E9$R@vcj?V)0hODk# z0pLD`$9|zo%<({)Qf7UZ#)0|&KyETL3p9BGyRS60yDloYfRvv4;Xg?C_W{>IEi7!M zQ$E!Z;zvA>zVveJd^V%5H<0bQ3`H)X*8|<+ue7$>+Oj!5IDI<$%l3! z#ne}u&Ru``R#082;yqMRi}>WskM_Od_R_Me{Djdb3#^+3ww^CRCcFTMt4MzfNbqMs zdOuwhHvww5_+4bT`ko!i8|*ASai+JYQFPS3e@BzGSgHcGZp|rqc`#W`GewTZsLmYWN%=Q4R;80M3J;Fs|CVcJ&LZ1ZkS9i;s!hG;j0%k0ZVS ztG`6n24%Y;0o4|kA?H3JA8uboP8Wyw;Cfq6$91^g?`m{DO14|ph6o6qyMIwZXB(w< z`zhS{Krm%SH#g-hE2}o1#|bjo>t?pQ zcw6L5>DJ^@`3UTF&bpl`y?^B0(F?aHz#%o#+EJ$?8s^qfnvvlkN_4q(NTNGuRBood znDhwEdT~Ng8bM6sPi)it*e5_ZByE2%;pY|G5+9AIgz zK@)r^*&N5S$YE%LHk?1-|u35X0!DH z%%P#%hYm$R(?T|6W7F9TbdSr>OtEff*TnEGx|S1IvkF9Tn`da(Wg?FAI<4f+Tlw%4 z`?`L-jUxw&mq4vbHa8kB53jEH)ryg*K*f_i=1pLY?2BDl&*=tBj9R8~)!ub{4l(f4 zA}4fx-aBT#3zs67+>-e8;LkL^RM?*8Wb1D{bB)x3sLa`V`S15sZvC`R+hI65T6;}K zWhw{c8GJ3=cl<9jqHpiw5>Ztu<~RL&oX$1vLsAkUrpi`jqjoJi55#nn=y^wS%nDluY55c) z9g<|ie=;~{sJimJ>2vVpEj71nMwee1n(u3FEIf^$Hp-mMH19A5^j5D+QT1-a-wdTC zTImSHSJW@xSMwyfmKf?68c4sI#Lvxy{}(>lltwy^t?x%65bVtr+l283Li8VTxwDUv z7e2;&!G>?N4gj#mJRnabC0>c*F7}RDE&l)sh~PuUvu5-9UYWIpWEq4~z(eB0k#B)* z4z+%{fj9ODc_hz~-ZoD5=Wp|Tt>9IA?ZwoU7$d6RTdEIvhyh+!cNeF{NfRx9MH zehpd|wseBXE>^3`-#<05zX9S?9=o3KN7s2rsZB~uJ+7q#oEt2f976&I4+H$wUTIPT zzi7nuWjbttg1hZVR9~qY2>mkrWq7tN1X*2)_!GxWUHz*M>^8t#X0>WQP4xz;_P?2h z21dH@zE8LwEdH`RhV5v%gj`|ybJGon{ZF&>lXGvS@wT=utgdFU{Fqr1LhAf|;;zn% z%_wE^dU2z01hyfhKh$sAy8^Xt3&RPyOw%uv`%WA>^i=MvP?1|}W0XRec>4ACTgmv> zI9JR#dj0XY*u4l~3&BU6U&Eir!-U`i{}*O*oezFZKb`+t{67-2idY&cH1+e4Kr zx-5o#E^O#(yre?XEoU(j1yNde#jXj|n*aO(frIv`^s0yR@E}u} zG^i>um}%CgU$k44bR(?Er^yrjHa2Z=mxU#kwxfQiLL#OE!3)@q^sq;mTEH~NZMK8qxs;MuL`3u~Uteh`a z*Pd`%nqD+RqdYF3oMQcI)|o@|esxM3?fCX%f?z~dKDQLDJ)HFzV)9#CFbQ(=ehSEP zSfD4P#78RIcR{7nTrbTcuq*X~P5CK>2$5EVUCSKft#VWHNsWzjpZ^~H{LT4DHSQ*4 z&S=@siO!dpta9pmj~Vfh#gYGgqE<1^Q5g^gL!Jy}5uZD{cW`h|^35 zR}iT9s;^d6-S+?Xq8+fd?1;I?-*%^5y;>XV|L62u8B89R}Ppd1_1bUs$yx$z4R z>-^fdMu-@m=`y=~T*4U80O18j*lNJQ9;PEI>_BxUt(~(eJ57{0rYxtnmED%Q^Epf@ ztbcx3gmNd2ke-z?;64_h{9g7$ZDVDHudRIIr<4$6l?SWdYj*a3>fW1`F;qtfad#Uy zfv7g~@+oX#l5`eV-iTfnW_B%sWNxL>?VA<2aVWXRV`fdyuJqN(yD!tKgB4SR{{iEMohBde;SJ&ck^=_ji`lz}j()jWqkYetql&qU4e!)1m;5$Tr zW=K=t39IvOV8qgtLL|5POHT3^^!b^E0P~wNkj3t=YdHj@1b_eSF+Jg7v9PwQDR^N%70^RHF`sYu1Z(u6bb^QH9DW=?n?Izh zNhQGZqfoW4$y~ofO?yLovvaYXv=|e@%g%&*+;RC14$C>QN0Vm!feO19;&&^n^U7UA z*qt)obD(XG$yB7Xo&;0bk>^C16aTlhw@|Ep|ktRvM5B`zeHFoI3 zNhOef(Vio3NzC7>s!XrZw5*ls^r`<{h)Byxir_{4b-<%?QYglU0!{C5o%EfD<@*>F z^B<0Q31|4%6;l=vjugW;y!>;#FdB&2=pEtzB>b`$enLZB769?);N4$^Ukb{O!9+o$ z3;)@kFg9FTv}5F4KM?Yko+~d+PHxz5-7_+-z*~F{_~mai{lc9p7v`47MyGP}x74F5 z*UOa5Ddq!LXl6-oNRH_cwSq`sS;L_2%=rdR{(q38F;`crAhP2&ZcIHfHiGs<{H7~( z7^5#yid<_}l4^+IN(4~*Dcsfj>Vi7%ab9FV6l!7eBP;kM5t_D>C^%8c)1Ksg9qRu5 zb(ch9w;e;rTPu!wpy7j}Y^XX8({P>s@v7H& z%d3|f*Vi+|PgB_#3PW9rb&y)G<;`Y%~;CE-stRE9-X%xYEgd$}3JV65r0 zdPk_o@!Xia;S6g&1FPZVj-t)WOOV4*2qWJW@NtOiza!p|y{tCfSE0_Mq6`#;PIb8) zs`C>P@y`|c{e}lU8*F@dMenNS3kl(g;T*Zx>j1=z+f`dFr%MPVpSKuE6!V2pL1Re$ znB%DKIBCEeDTZ9B?~hXu?2c?-Ew5)IvI$H5GZYEUYg%wDZA;D@(#lwOHPgm8^(-m? zT#?xRFKRytV9nDs#9bEVS9OH;0uoN~a)g6)zrExa8Gte04=4$Zg_8_ioe<@pC11m$ za5M_l)_9riUJ%{zsKgB;#63T>EEtrM#K2F*wX($xBnxVGBy4vjgW2v2uWMXkg~Qlc z4AOzpBx-^oe<6T9>t4ArTMzyw4>t-_J@41EV;E<^?q2IbM5;Gzzo9{SFW=Y&hDG(1fXr&^xh zq__Fbnq@wAtg+2v-rE~3!|1OPmWD|@fk4 zwN0v-rtEprr#;+RYL0DcwBf;I#fbl?At@)d{C*sV%Wlf7_GoNVqi!+ulR}eNsoV`Y zjxB#fxy#%j^f(?zOvaQ_Ce~DwYqBW|BR)Ud1N&((X8gho;`pwhg(3=T)DU@cU}0#Q z<%Z3U<%(knuFoFLi9pk+uOY6l6J-ph+M&5I)r*}KmRqbhBAFdTNX-{H%c#aN8TA)d zrCN!phy+raIJJr}W`TpI$hnCQL+h-SLqaV-PE<>q(YD!++6`?Ub*F8aA?FtN z@^?=t*quLw1Q+NsX*6#>2wj_& z{OSakHwpHg(ImGyAO1>R#{HfiVsm%S=`O{|>i{v#sYcbUjj4ssb#FTC16x~fPoDuM zv(cfn(anX=%&U_*TPAaU364oUteblLgp657K{ea$Zg#-b(>vT~P`@bKSAOLN1RnIc zn*sO59_b0%7_0*$NYV&H++@1+DQpP9+3w<~S71)>j<}>qk_|7l^WTTq##HBQac$k= zrfla<8PMiGL0|&=-R9tTp7kp)ro#bcGTV0!3F_3+mw0v~H9(O|_Vzp_{3#C|q2rjP zE)RnyYF>uD<|EL#W?W^LAh65=wKD@wyydE_8ICEoo%mPsce7tlY!R8doHah@Wynih zm2HQk)&?Ym>U`p~A$}e4R>mZYVW$L(DF5qqfoQTb0;^V5C@N|tEqWIW2vd~G#>;;i z#0e@52Ay62K7W3izWhoz1u5d>^$OUy(a(1XSbdhKLt56lgc1a~H1($t4}C z1};H_8LZs@$j30~C6?mMk*904zxI;^Ngi$L_HXO4_u^^QMHB24ZHq`j{UdXcio~~` zDqpqo_DoNU8t0U$LPbT17;GvQ^mu~bKeUQoMY@krWJpJh3LUdUJ$Q5HJ9Se0)YIFx z+good-}rIpKko~B%UtB7$xw?)k5bJ;rWh@{7{B}$_Z@#;OeRE(Jov-m6ev$%ulYLq z_Q=CTTFR+&{>7bXceQb}UvSoP4ng>*@FUDe-RdS&ibSPshN+?jXM@K{8#6=7-kuk( zW;BO_Vig+;PQBd#+H;=>={JqVEe%aYDxS@!+FhF*r@8E3^tHn5FvuX@QIw!W=J<)H zOeVL@oC{~TqMDsfm0)`@EzwvX9u=uh6zk@0wO5)wXHVgDLCn5^b`YTSu)WlZGkMDV zHXGV}s!Octx)%TS(V<=|#diW?$E>;w{R5kVN-F9aR6V8q2-_Ds|Uix|zivO}a*dxR3tqW+B z=O!tm{V}LKj~Omek?wvCTf?v+B49^y7w+5*xa0Gi(KPNEQ!@DZI>rwZa*aHFVGUal z3ZYS8p9njNq4?SF(Cn3Ed#&9pV#NPQqpEd3{{c3_PYu@1*g_<&ciVATL4K-1=uwk5 z?ZMsAS)ayXMFU5t`*znyHnphe(==9KAj8m11_#xNsr6w9%*J8XN>!82r(9(e5Rb`z z4W%p(Fl8-s0muFya0H)?UbtVQ6yHpN#2EK5_x`u%dyu00eMaK{f``?ZKU*5Nu9lsn zqg{Ky!^fUA0#8wfiEcsjN3q8Yp$&=)#3618ZMVWI8mxX}+%&i1<>0S;@0u)Zt+`yb zSr;msG)JfW6Y^i@@uwVHYL({d`I_nW63gss-;tBM)0zcS>G9G9??>qsUQVm_uRjq) zA{QjZX2js6k5JF)vMz#Zx^2t86}XW6ixfmSMAm}@9N9L)Dhb$YJC7)XQ`ExHln>Ez za+Kqwa$6!`Hjs%7ma$D3+F_6LOBEQ#ij@OdD10OkFK!Rxb?2Y92dZO?>S&Ps*n}iN z#+vm&Ng%WSrf+OF(Uk}kDb|o-vE@%evtC!uvd7ox1yvhu%T4mIpl>06DasH`wWiJ4 z*p4bnGQGlADo=9BLm-SF3^%5zC}5~oC$SO-Bl(M7I7~O`1)+`Y#FfGF0RKA&2-!Pa zffwfS07`~~gFQ)l+R2NRk(+#T@%dp`^#JSO8&XxS)wt2bsXU`*1ZTT@Wp2`{N9o@i zFzu9Cqjy@Vp;`H8Y7UK+BGt)L&oie?y-?5o2-=^Zl%O;ueks=G@?kLJOTGzQc zCXr7GIShrJF)sJ|R5L!4p=D(u$Uh_JRB2nPs{rNCddCO^)Ol(`jx)nS$2%RmR(g=$ zLklFu6Hs~{Q--0HHiYLVANzhx-(vUEJTq4fzVF7kwA;oL|$F*JPC9*>doJG1s`U6Zn#|-DDthxEZ}1FA?#=< zyZo*iojne&o3X(V*qBEp72%A_dbRmWymY5x;$CJCddNL(g>z;$n!eH{S zk#xzj<_0Wan>V5{BQOCAImh)i{ia5k`QFlWEc@aYn!y!PChW;9>_m?HU`VPN$mV$nu@P{ThXDT+8G8692S@%Fm zklFK+T|mXz0INSY?-vCCN$EryG5k|7X0lkocU{G+&C?%hRYZQ8Y9It0ES&6z7-@XX zP=q`N-#~kbAS|CwYntBk1*q$jBH$?t42zl1AR*sY(^|FjWf>skdiyqJBWBv^-vB?P zKqz_AbY8+;v4P{`Fe@9`04G+!4+%8m$$JwUH=`X=+Pdu{8lIO7rxofN@xI^4(eQ6}KiRuG`ECuIFd3*P&Ok>9MK?X9<#A9blHG zH)$mj_G~h`s-9|Ni>X`m=4NO}h8-f|&a0yEpPKQ^BG=Vbv?657V1H*wCsCRq*7&={ z$)7U*zqsHJV2nxl`kRer`14!zG~Ym3OZLJM@tY_TWCD+BvwMx*?SaLo>2X{ z-Qjx5+;4|$Td!6lZFy_BwC9!CbMo9q%D$>!AE08ZXHKd2SG&oc(6jgIf}XMbevgQx zn6-}3L?z_-Jv&L@In2+ZuAA7YIFPabn;glR{-HJ`PX<^l;I#r4Hhv|!rLL?(2akH! zi#UEF9@|kp9A3VOELV=fVHB4&sWWw$7_Dm7n=k$);E*8bj&P}-Ud#T6G8t+VaKNes zw4bsg_h-mrajvXFw&n(2>G^%OcQBjFX<^sGSqoU=Nn`i3S13SV=1vRsjyE+{SZd~$ z2(ksNp-*%*>H?pioxtYPDkk(RZgX?(|JRYyM-c60khzgs?Zcx+szSnX@ro6GaYRX4 zpx4M8-w*yODO7)bna$;^v%)QdRlI*6;JxRM5^}PV5HtD`M}+HA*yyGfT%Gb{va?f8 zB(N&dU9T_LtvdpI!2k9tlERi$Z8Zs?kj}W~qUWySd+|q=WR&>6TiD)LD zv_^>Vct+u${ql_O(+@Gx<`_s;89`h1PF6-$K#;%g;^G!770y$qHqJ zPALzwSy%LH?h!-)-olIavPz&(1>QuS2q<)9EvR<39OAgSzYH6hLQDs(>Uxn`A{SdF@z?j5+uz!VHsTlsJOhYh>E&T#WK5t|7;p zT4SYjcf2O8+W4^4m=-D)L9_h-Rw=!ph-1vaR#=eGKw%Q-sAFxC&6#7J!v8QO7 ztB;d8t`IhfxIc`JKm7!}fT#3;HpzO;7{8A|*WNUN6oytiMV{`53^HiwwxqZM z^1EQ|$p$pevA)98&CxxVIgx)7x={3*J33aCKP_rFg`>*9=28~d#Z&3a2<+b630X*n zEw2CzyX8U20mOsoHG21enKJo;RsRbwXf*HFOn8Ap?vNrr;#WZTwa853pdT}dfdBQH zkHO2t&Z}Tn8u=;Iy@}VdwEf;~`18SB)**Gt^t?jpU&8~u78MLxIeOJ8LZOK3oH1k0 z`b|ysSM2+gVs(eS{y*7f+ymK;E==10oNjf|`*#nYp&dx$yyGtzOE^3GMMK$)fPr4nEPUev14%M#|_c>W42$&QQ_Gi?E>Kw86ww1_ON_R$gp<7mGu zE<@*6m(}%EjFwz8$9T-hyhA={UV-`gbB$3}#cdjEL_9WH+W4RSH3sty)?Tcj&Nh+6 zAdUe)KuF;0s|uQoup@%LKT6LF<$DfET;p0*JX^?cAN4IK@p)+5*m(a7$bHbkh2Ni> z#)g-C5{W6faaQB&23s~G!&sF0Z$lGij!HJMwRmUmf`wQm`^l_;lQfHKA8g)$e+4Qv zSk(xsG-F~os2`7>muQMf)vlsrt*;<&A#9HY=ZNhn0YE+S`f`gcd-J!M9pz~vTd1|{ zghHFCO)De_D@0{xu1-)!=!5qCVBsFI=suGz9G<;AsM;>r=B_T`J>R>s@&aHXND|X5 znhaLSxCr7e&K2-~pu1{*Td}B~`?;kCdL^5wNG?A3tYyDi9bBQWc;*O(?%ok*+ zr@FK5i|YH{K7t^f0s=#KcXuN#UD87j-62SdbW1aI3@zOu-7rW>i*(0G{l?Gt5!`>? z58#~FK4-6U?X}mw*87lPmb_V*lIg6A4`S35g}rMus2)?W&ZWu3JK2xEG@sNj{2>(2 zdn?KiHrOpvPX0f=&4yrFJtQ`mmho|MCrNT&UK8<6#)&`84T%!@tqr^R>tjaRJ`;W^ z6k3A(Q^as{jO?`rrYn2^I?fq_C(S53}ww{rxZ-Aa1unf4r)y-#e~Ej0qx z(qSMvG_4x{bfJq>c+9_TIQvN&H33|k>7QJKC|67#&~=`ktfnf1J%c4?_$;VJuC6!i z0kt=l4)StYqe^Z~VgG46Ixh7*Qje~B93vgz+IAi#YOcE3%iFg`M^xda|7>UzVLb1E zMlQJ+d|LBZa2~TQAlMC@pLRaJe>1T2M5_5-M6ho)ZC=)(#sK0d;DU#Vl_IKExJ=9# zT**DLL|kOFWN6?I9(~Qysmq2BRkV|z*ILLw)(Rl~mOATiCJeG~cMC z+Ziw^xOxqjOgzt=)9H|g$mE8$0vDE^o78H%8-A*_CdY0a9mPX>>07F&mPh)IvLnLe z_azDe0oHqTQQHxR4&kW8i#-qP#%HT0L02>}HtedKod^!q>hf=9Xs z4nbRt4BLte$ZX-z0^Pbyag`G!)X>r2-bXKV)bt9W%Jh|Zqc~?=Z%n!N=D*uLW3;5c zvwW%akhY_M>m;z4noA*H*O^eEcJg=XP1>^_Xtno}SyE+(2lp3Fa6YBy7GaXPYiBKI zj|jVId5r>-1?Oe@jim2tddDI8YFsWt5i(Bc$!-vZ!MG_m>$6BRNYI!qW|?rzNKaWp z;9mD+)m?nXLf89C17j7yxy2ptJFjh3i9C<&3Qj!GEEu4fA8fH385238Jmw z#k{P4#Q+i~D0~1+sh@PxpLRr0N;9L=zyYLZ3!>G*9mB~4yW3h_H>Tn0Hcy_5_o!_asX zXdTEu7CEvcWB#MXG4MJf51!b_uocU6`7z`PGS|xXT-;0F5XoG@PXkyP5X0aGojUHt zS`)zJCR)}_JZRPNSD`nN1>lzQ^9!4Z5HPTuQ;5I9n@A1bXI8awod*i`y<2=RUdteD zeH;%IoAG-UNOyGJ$6Mmwrx@8SQ?d9Vz_)IpH}fY7Rl};IbubsQA6L7^ ziJi>lK6IjQDNP&5qGn0|l@Bh)tO}892x6&{4~btb{oQ@PxOxEIHJBsypVw8d$|zi8m};{>c=KCWbBXCRnz@{f@B3Syp-d*AhMtJ~@k%O>OF!;!9bBeA0d zYlQ`v18s=aZMx$vsj7hSg$@=weI$W!kBDRV@0QD*%7QCH{6MT-{N_vga25LPyhBn` zE_azPYUQdiTU$$?ntD(rgq-N}lnwIDGAd=dnWM&m^=Vi5lWcj0=Z$>p^PcZmp83w{n~KzEkDciPY+^^H zvPBjR$>Re{k9a90@3(goF2Ut!Z%jn}*dKVnx3=XVXZ~{){v@Hxxm}HAK{R*^^1rN5 z*^<=+Zw|&^tHqBS@1v{ZVCsf4;;?f|`kl#1hmR^`;@tSd z;dn3YHy^aAjdQ~&=xFNiol}j!Y!j$U&DBGW>q?!#mRP8&*HATQvR@PwI&4vSVCiMDDM2Le1C1b1Won$E~{A`ZaL9Z|q%U zSe&SLW?CZ;WWM`0ejAjN)x_ePUi*EVNfluC-pS^uSZWqcU=`lV>;(V&5ZTXZPenQ?-C$xM$4WLK3 zISoMfH+8`C%2ry*)6!0JS<#_5i5=?VR(gC8E?Ljy6poBK}O7B=1+=!79Wr zYz08DUEwIP)1xEP6#Xk&H9nDZ1sV(;0`C30A;7(9^o2VTpQ{_FS?RC@XL+5DLy8U?As zcTEb`4^L#)vwFDQ=6}o-)&YW&K6!+TNnA~+vy2u6iKh&N!T7J*nyI6p9X&^FjjY!N zD?ekAEXdpFDWzDlp`(yl93{GQ| zz7=|srxpSlQcxb-vi9_U^ye4xajxpBHn|vbzo!4YZtA}=!K+{Z+b1I-5%KEpUGYnM zkUc9)_M!)(3fXgFE%mV4h3`@J7)P?^*BmXfG~VxbInomctDX7yvYZcRA4E~v zU&H&V(BbaK=So^kwIQ0Mke9SLM}JcAT9xt3l$HJDbS0+s2t@=X`RA7joRzz=$+Z<$_abODdo$vN{Xaj z0IEG4BBB=~6bl`o;B8$7eVC|!?WLFF2C_ZrY>s!e>Fu56rXRHM#K-3ErDtQe=`QtU z17N%Xsb?%Z@OQrQKn4~sb*-Nrp*?*#InqZq7Trn@q_5oc?e;rCxpe_o{e1E6kz__$ zh*y8z%Ft^0H|^~=HX`;ShWg`Rw{67)>?gG?M}W+~XoH5?P%R+p@BOr-ON$Mttc;E8 z>V@2O|89K=*0xkS$&e*Q95}Z__FS^f!5UT8;?BT;4FNxV7deg`u#%VKrS-}8e=xr$ zX{x0huO8nVp9eB&fB3jl4a`qSIwR=wJku`P;JP(oz?jwZg_7v=A}7k#SAy%W#pW&V z>%l!i4!cL+3Y0kEWudQh77f@OESRAz<2)E;Un>vc5m@h3)#T#0{8DvULqtCk+t&zV zkIJ3~R3*@D&nop!V=z>$o2GLgWn^*sZU6jumaEzgxy5pmJ@WUR_mskmcQox#=OXD0 zJs5vByNi4&_P!>dwn7Xbbo%h%SD53`#+r8W+JkD0W9hv6NBW#ry{7KRCrPa3v! zORlxo`na2h=r(iAF_X?sBx1lHAbU$;!D2v()>Jj*Z7~7>qaRHWk}3R0IH0eAPG0u2 zFWrP&=nn@g?S%(D67=takAG@AHV8&BD^g-tP+e|%+xtNRt7BRIE|aXlc8=qNo}(u_ zWwxASYfaR4!H+)=KraLH zHEY2Da`jlBg4Fz|9PndU{k+2RN@HJ}70oBQ)Y(rU+v;R4esm4A&GX)s!1tBE`2xU} z0%T|~g4uGaZxd|F!oc3o(6GH>@Myj`*Lg;aBntF(P44;V!5MmIFMqQSDTnOv_8T14 z!2BS^4-b(eRO)@w*b@TfJfBmLK6kZxa%{(V)5D^}g$R}Iuod$CEG{J}NFKMxKbs-X zi_c4nhGQC(Y^2V@V$<;S`y@S_2y@ML^r8HMkOQVQpp=mKxf!EN++io(7n?z3_SLO0 z(>J{2SN2PP1 zxTZ@Z&W%kLB7{BxRjM{&8SBmHd8DgDH8YfS?Q~YO*3>-c8VcYIjO>YHjNSt|<^@|z z4l=C2J4uOj$^so>#Nj|PpB7Z=PD!urUwL<&zophPm$KJU&UkYv*fMn2)yQ)r6RN)2 z4Ceu!A0RoJ4>1hVkxw*0>Y-;sYG&DVXe-a8eUBK6j1hdNt@}j*T#I&_CDmrbuaaxP zWT3mD(>fiZ?3n$r{4hpLgAtw_1gMacW1o1_WRNo!-vFm;ch&oZv$?S zoBEe%^IHPtNJG_J)idn(Yr~S?Hak? z`IwaO{+vWSSaR)#h>%UVeZ_uI$BjXG+$kD0NL?qIV36jT1mv}_rN(s4tXa{T!9Ztk zh=SibC)u9DF}Sf?9hPb!RcT;bcPF)6N{kt*^r9nHm*WJn^tVrk z#q{ZjFYk`YBFc8S9HNW}mSTqHnc-7!K!V4{u~Z< zAJy4i7#Zjx`@4BDQ)?(u;gg|@VKUym_SQL@J-r#r7^5YQLuWR*Y?_=-4Do0eLd5S#sV96Smb#-nhPN{~GVaLd)A) z8xm}7hKjzPKGmNvK$ZCwE_^ein?dkC&qgfx=IVr{AgsCxV^xwQoe7lf{Vg_cHeZo8 zbIZ(U<5VSAlaY;9Pv_FSNm@<(xF(XFaK`zSMmILAi7-UT0-Y6XsLi4c4C8dsI@IZ} zM@W;)N`88Eu=M3|_pSK1u)*YX&*L91AuTQ;tJb*7RX2J+1)FQlRLvi>8G}Dc!JJrqd&>YLw4>Wzee?$(cJGHQtW_*C>JYHb^Hc9| z{1#!|>@s|L$wfB!Zt}`(Isv)dyhOulwY{=^NIs7;c?5QP_AnxKjn>rTZjd{fMZ#iG z&|WZ#R!vwpgce6sz6(vtw!^mMeitoe_Rimm>us0?p4NC9YZ5{*ec%8x=yxHg z*kK57)7YfL5tNNmm=N}8)n72#lr>R0tEbnuW#l}D> z6-^#7=2<&B`X3omqVh?f0@!3{h2dtNTs1i*d5gMN-X3MaUIZ73KP+3`b-CWD3iNf9 z9L6y-zf^oPg!V}qJ~e7b!f0)r)9)G95TAZNGl^`-v@!DwM@IdBs z;HR8~rTrN+7d8`*Z1?XK)s2PipDwZ|d9|*)f8Fiav;WEY4;|;!bQ(nqt%D*ShIk}1 z*=V7q7mcA}?k&yQ5U_}{n(goiCJg4MO^p}Dt!zTGH`gJjbO<+U#{#!IWoAIfI(WYB^tI%n=aH$S-LbVQE zS%;I-(YUXsu+jvpD_ScBAIq++IqeBd;8l%6*A8$=QDt*Iph;Zz>?k;xj<@_4SA-F+ zyp0A#mKJ~P!}N(Gp+Mm*WjQsQs`Ue--7g`wG#noD5lv@!LPv6!Gr}L0l89QJ83UDJ zV#0QI#{2BXq5XI-!Q>Y&h#HR4`|se`PH&ZdYfObB3u57*%nSn|^Li0B0b{T+2Y?&y zj&Z5|WGg1vH&)SLcHqzdCnUSM?~OICaGs09#-EGDbk-}xgPMnjQ-i{zY?}YzGKQSk zvW8z4`)d08+Qawk=*)fev)F+`2PI#k8@>FUkIP#*lF5~KANN&L-OY_~T0o(zz>)gt zYTyZxZA6&~+L*&#RFuS#3c3CRYVN-lhc+toCw%Kl3r7jr&sxHy=gYZ-rS3UmM&Sr< z-{2jv8w-akDd|PC$BC*?$M3l%s+&u%C{2-SOA_H}vGGq3uQ6nA<#;Ul{>#}ur|J`Y zxBNdKBns(g3X(z6r701%{iRf2x=mN+FfO)PQ=yEuiuo&2y|mInS2013S&09z;ScmQ z(JfBLEt*X`-H$3kj*Qb+z{f$vgVPP1!23rrHPl=j_&|k2;g(qrJS_+X`!Qun1ALd` zq~4;X&yFSITUPNYXzvIf$a~Sk$>jKZss0T-U4HOxyI^(GXKDtIg918gqdY_Y?ySIH^|4#V%&u55~ zsvD6n4y-P^yV!v?{7^D3na>b<(k zD&yz&YT^o)XMc^zb|pm(<8yxDQ`0}TGu@_}%=jibZyKO0?}eqPV4^kRB%g} z{ZHUOrX`TU^&})=0Um=2^68~FlSeF$hx&g6^KDAxg0GWOzyW1ioQxjbdtwDYhjc;T z*PE+u!#FhJMC|SB1igY^-Yf}5maL-1%^d!d6F0y&(XF@>SAt<0UBhZ^4c(xRN9~XH zT&xVV@}UR6r2bk5Utd)0CdIy;9F1(}WguZU{oFP+7rkwBKy z?E9h5qh~cHO>r{~{ct8}gh;EkXka2?DVv<3_@QS2+3MmI!Tl}iEHUbhRAOf zavWQf(9BZ<@7N!e{w<#n>)Y9@Z*IxGZb6`$s;)&ZSkE=kx9mFcY&ap|6D$WnfCm1@>PLmO6oO0b6W+gvs|-SP8gLZ?LG>tmqoKdY%CMDrk2FJ1LOM-2blci|ir zZlfodx!A>at-ni(HGrHrHvt}IFeMZ>bW_Z}3XvuH5Z&|=S36~*M(hmzWx20>M+p*_ z+1)MUI?I!>Gk&P>#j?c?pCM|KngZf%Fz_lvc}Vv8L*tJz(k;DDWCtvY6`pMO<8PuQ zzM_5ocR2c|b4XcB5^&oGR$j70#wl@U!&e&W7s!_7%7nfF8@jtYZ0!ELi+dqpU=o?O z_(CJciwlSt*5*2h#D3*u$w7{-4xE4A2xUNhS7KX$aItnz870v-rU@{ipoT-a-@Ywo zx=!dLKs3mm84F`hQI`wVZgX0(u19C6;z2lL5dnJwar@&2^Zd-ur|Jh^!67#Lf?|<~ zU|w7*Z#x4Vmzs!=Vg}ZU!g+9{&#!i(s>wdLH3!mc3s_x(d~xPJ!}DI<%djDd28z5A zyuEJ*fO_t1w}IeN9f@I(RH;fm=-{L4dt_kMaz#s#!x=0A;8rWemK5@}rCLwhD2Tz; zf8zmzoq_^rfM=scxtxI2Bo(UF!9 z-UbrRN8@Z~j8qE>b-YYsW{qGT5yJ!2phwLgUFu{{j$J6iwy)W0G|;w|AN<`eAK0Xe zmMy$kWbFQ7ybr7*D!qM!#Ep`y&HPyVG>emU^M1x;SViEb(VX2+ymvxvC#RP2LEOqF4+AYT%&W^^8>Xw7? z3G3et*p&V1bO*fCOHG%YKFsN~IXC;?*({G<8kW_IYSr#`}$5sV``b z_FsCrI5~FoVFBj-1}(#6Ip!4QC<6Nz&BNJWYfq5Bsw#Mx>i@Cc!IxHGTfMpOU8LR% z1I}a%4J$f&C?F>6g-rCVtXeX|n-MJ?bCRlJX3jbYeK;ckLsuPErAv_-oFk&RXKq0+ zy!^6+mD%toR%J)}AlytMy}$}mLQN&>?OjM4P9zHxl|yC6D+zzyhYsbh>q2jCE0{#r zEyI!1QcwOsS!OKZa24FcmhF)^BAxof8j)d}>)q$)*RkV?*&bCqGUflF^%>YSg}Kno zeWbL>O>~e&b7m&sD3$l=rOE|FKPnrj^`BUEhdtmsYn<^}rt4vIArx6QX?i7X+$$>< z3u~J1kbijo_lO2+o7SUaVG&J%r45~QW4DHhbR%^Osnp}nUlNI^4d0Cr|Nr