From 98e739c6ed27e4a91ac33100f588046c48cf7aaa Mon Sep 17 00:00:00 2001 From: lavakin Date: Mon, 30 Sep 2024 22:23:13 +0200 Subject: [PATCH] cran --- DESCRIPTION | 6 +- cleanup | 2 + configure | 190 ++++++++++++++++++++++++++++++++++++++++++++ src/.Rapp.history | 0 src/Makevars | 13 --- src/Makevars.in | 10 +++ src/Makevars.win | 6 ++ src/RcppExports.cpp | 0 src/code.cpp | 0 src/cpp11.cpp | 0 src/rcpp_funcs.cpp | 0 src/symbols.rds | Bin 0 -> 13127 bytes 12 files changed, 212 insertions(+), 15 deletions(-) create mode 100755 cleanup create mode 100755 configure mode change 100644 => 100755 src/.Rapp.history delete mode 100644 src/Makevars create mode 100755 src/Makevars.in create mode 100755 src/Makevars.win mode change 100644 => 100755 src/RcppExports.cpp mode change 100644 => 100755 src/code.cpp mode change 100644 => 100755 src/cpp11.cpp mode change 100644 => 100755 src/rcpp_funcs.cpp create mode 100644 src/symbols.rds diff --git a/DESCRIPTION b/DESCRIPTION index 77c63f09..7ac90214 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,10 @@ Package: myTAI Type: Package Title: Evolutionary Transcriptomics -Version: 1.0.2.9000 -Date: 2023-07-08 +Version: 2.0.0.0 +Date: 2024-09-30 +Maintainer: Jane Doe +Author: Jane Doe [aut], John Smith [aut] Authors@R: c(person("Hajk-Georg", "Drost", role = c("aut", "cre"), email = "hajk-georg.drost@tuebingen.mpg.de", diff --git a/cleanup b/cleanup new file mode 100755 index 00000000..3c020d38 --- /dev/null +++ b/cleanup @@ -0,0 +1,2 @@ +#!/bin/sh +rm -f src/Makevars diff --git a/configure b/configure new file mode 100755 index 00000000..8d0d7404 --- /dev/null +++ b/configure @@ -0,0 +1,190 @@ +#!/usr/bin/env sh + +# Find R compilers +CC=`${R_HOME}/bin/R CMD config CC` +CFLAGS=`${R_HOME}/bin/R CMD config CFLAGS` +# compiler and flags to 'cc' file +echo "CC=${CC}" > inst/cc +echo "CFLAGS=${CFLAGS}" >> inst/cc + +# gcc compiler info to output #3291 +case $CC in gcc*) + GCCV=`${CC} -dumpfullversion -dumpversion` + echo "$CC $GCCV" +esac + +# Let's keep this simple. If pkg-config is available, use it. Otherwise print +# the helpful message to aid user if compilation does fail. Note 25 of R-exts: +# "[pkg-config] is available on the machines used to produce the CRAN binary packages" +# This script should pass `checkbashisms` for portability; e.g. CRAN's Solaris 10, +# and R-exts note 24 now suggests 'checkbashisms' as we proposed. + +msg=0 +NOZLIB=1 # if pkg-config is not available then zlib will be disabled for higher chance of compilation success +pkg-config --version > config.log 2>&1 +if [ $? -ne 0 ]; then + echo "*** pkg-config is not installed." + msg=1 +else + pkg-config --exists zlib + if [ $? -ne 0 ]; then + echo "*** pkg-config is installed but 'pkg-config --exists zlib' did not return 0." + msg=1 + else + NOZLIB=0 + lib=`pkg-config --libs zlib` + cflag=`pkg-config --cflags zlib` + expr -- "$lib" : ".*-lz$" >> config.log # -- for FreeBSD, #4652 + if [ $? -ne 0 ]; then + expr -- "$lib" : ".*-lz " >> config.log + # would use \b in one expr but MacOS does not support \b + if [ $? -ne 0 ]; then + echo "*** pkg-config is installed and 'pkg-config --exists zlib' succeeds but" + echo "*** 'pkg-config --libs zlib' returns '${lib}' which does not include the standard -lz." + msg=1 + fi + fi + fi +fi + +if [ $msg -ne 0 ]; then + echo "*** Compilation will now be attempted and if it works you can ignore this message. In" + echo "*** particular, this should be the case on Mac where zlib is built in or pkg-config" + echo "*** is not installed. However, if compilation fails, try 'locate zlib.h zconf.h' and" + echo "*** ensure the zlib development library is installed :" + echo "*** deb: zlib1g-dev (Debian, Ubuntu, ...)" + echo "*** rpm: zlib-devel (Fedora, EPEL, ...)" + echo "*** There is a zlib in brew for OSX but the built in zlib should work." + echo "*** Note that zlib is required to compile R itself so you may find the advice in the R-admin" + echo "*** guide helpful regarding zlib. On Debian/Ubuntu, zlib1g-dev is a dependency of r-base as" + echo "*** shown by 'apt-cache showsrc r-base | grep ^Build-Depends | grep zlib', and therefore" + echo "*** 'sudo apt-get build-dep r-base' should be sufficient too." + echo "*** To silence this message, please ensure that :" + echo "*** 1) 'pkg-config --exists zlib' succeeds (i.e. \$? -eq 0)" + echo "*** 2) 'pkg-config --libs zlib' contains -lz" + echo "*** Compilation will now be attempted ..." +else + version=`pkg-config --modversion zlib` + echo "zlib ${version} is available ok" +fi + +# Test if we have a OPENMP compatible compiler +# Aside: ${SHLIB_OPENMP_CFLAGS} does not appear to be defined at this point according to Matt's testing on +# Linux, and R CMD config SHLIB_OPENMP_CFLAGS also returns 'no information for variable'. That's not +# inconsistent with R-exts$1.2.1.1, though, which states it's 'available for use in Makevars' (so not +# necessarily here in configure). Hence use -fopenmp directly for this detection step. +# printf not echo to pass checkbashisms w.r.t. to the \n + +cat < test-omp.c +#include +int main() { + return omp_get_num_threads(); +} +EOF + +detect_openmp () { + export PKG_CXXFLAGS="" + if [ "$(uname)" = "Linux" ]; then + + printf "%s" "* checking if R installation supports OpenMP without any extra hints... " + if "${R_HOME}/bin/R" CMD SHLIB test-omp.c >> config.log 2>&1; then + echo "yes" + export R_OPENMP_ENABLED=1 + return + else + echo "no" + fi + + + printf "%s" "* checking if R installation supports openmp with \"-fopenmp\" flag... " + if ${CC} ${CFLAGS} -fopenmp test-omp.c >> config.log 2>&1; then + echo "yes" + export PKG_CFLAGS="${PKG_CFLAGS} -fopenmp" + export R_OPENMP_ENABLED=1 + return + else + echo "no" + fi + fi # uname=Linux + + if [ "$(uname)" = "Darwin" ]; then + export openmapp="-fopenmp" + + # https://mac.r-project.org/openmp + printf "%s" "* checking if R installation supports OpenMP with \"-Xclang -fopenmp\" ... " + + echo "yes" + export PKG_CFLAGS="${PKG_CFLAGS} -Xclang -fopenmp" + export PKG_LIBS="${PKG_LIBS} -lomp" + export R_OPENMP_ENABLED=1 + export PKG_CXXFLAGS="-Xpreprocessor -fopenmp" + return + + printf "%s" "* checking if R installation supports OpenMP with \"-fopenmp\" ... " + + echo "yes" + export PKG_CFLAGS="${PKG_CFLAGS} -fopenmp" + export R_OPENMP_ENABLED=1 + export PKG_CXXFLAGS="-Xpreprocessor -fopenmp" + return + + if [ "$(uname -m)" = "arm64" ]; then + HOMEBREW_PREFIX=/usr/local + else + HOMEBREW_PREFIX=/usr/local + fi + + if [ -e "${HOMEBREW_PREFIX}/opt/libomp" ]; then + printf "%s" "* checking if libomp installation at ${HOMEBREW_PREFIX}/opt/libomp can be used... +" + LIBOMP_INCLUDE="-I${HOMEBREW_PREFIX}/opt/libomp/include -Xclang -fopenmp" + LIBOMP_LINK="-L${HOMEBREW_PREFIX}/opt/libomp/lib -lomp" + if ${CC} ${CFLAGS} ${LIBOMP_INCLUDE} ${LIBOMP_LINK} test-omp.c >> config.log 2>&1; then + echo "yes" + export PKG_CFLAGS="${PKG_CFLAGS} ${LIBOMP_INCLUDE}" + export PKG_LIBS="${PKG_LIBS} ${LIBOMP_LINK}" + export R_OPENMP_ENABLED=1 + return + else + echo "no" + fi + fi + + fi # uname=Darwin + + # No support for OpenMP available + export R_OPENMP_ENABLED=0 +} + +detect_openmp + +# Clean up. +rm -f test-omp.* a.out + +if [ "${R_OPENMP_ENABLED}" = "0" ]; then + echo "***" + echo "*** OpenMP not supported!" + echo "*** parallelize operations like sorting, grouping, file reading, etc." + echo "*** Continuing installation without OpenMP support..." + echo "***" + sed -e "s|@openmp_cflags@||" src/Makevars.in > src/Makevars +else + sed -e "s|@openmp_cflags@|\$(SHLIB_OPENMP_CFLAGS)|" src/Makevars.in > src/Makevars +fi + +# retain user supplied PKG_ env variables, #4664. See comments in Makevars.in too. +sed -e "s|@PKG_CFLAGS@|$PKG_CFLAGS|" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars +sed -e "s|@PKG_CXXFLAGS@|$PKG_CXXFLAGS|" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars +sed -e "s|@PKG_LIBS@|$PKG_LIBS|" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars + +# optional dependency on zlib +if [ "$NOZLIB" = "1" ]; then + echo "*** Compilation without compression support in fwrite" + sed -e "s|@zlib_cflags@|-DNOZLIB|" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars + sed -e "s|@zlib_libs@||" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars +else + sed -e "s|@zlib_cflags@|${cflag}|" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars + sed -e "s|@zlib_libs@|${lib}|" src/Makevars > src/Makevars.tmp && mv src/Makevars.tmp src/Makevars +fi + +exit 0 diff --git a/src/.Rapp.history b/src/.Rapp.history old mode 100644 new mode 100755 diff --git a/src/Makevars b/src/Makevars deleted file mode 100644 index 407931f3..00000000 --- a/src/Makevars +++ /dev/null @@ -1,13 +0,0 @@ -# Disable long types from C99 or CPP11 extensions -PKG_CPPFLAGS = -I../src -DRCPP_DEFAULT_INCLUDE_CALL=false -DCOMPILING_MYTAI -DBOOST_NO_INT64_T -DBOOST_NO_INTEGRAL_INT64_T -DBOOST_NO_LONG_LONG -DRCPP_USING_UTF8_ERROR_STRING -DRCPP_USE_UNWIND_PROTECT ${MYTAI_COMPILER_FLAGS} - -OPENMP_SUPPORTED := $(shell $(CC) -fopenmp -dM -E - < /dev/null 2>&1 | grep -c "openmp") -LIBOMP_SUPPORTED := $(shell [ -d /usr/local/opt/libomp/include ] && echo 1) -ifeq ($(OPENMP_SUPPORTED),1) - ifeq ($(LIBOMP_SUPPORTED),1) - PKG_CPPFLAGS += -I/usr/local/opt/libomp/include - LDFLAGS=-L/usr/local/opt/libomp/lib - PKG_CXXFLAGS += -Xpreprocessor -fopenmp - PKG_LIBS += -lomp - endif -endif \ No newline at end of file diff --git a/src/Makevars.in b/src/Makevars.in new file mode 100755 index 00000000..b3fd95f4 --- /dev/null +++ b/src/Makevars.in @@ -0,0 +1,10 @@ +PKG_CPPFLAGS = -I/usr/local/opt/libomp/include +PKG_CXXFLAGS = @PKG_CXXFLAGS@ +#PKG_CFLAGS = @PKG_CFLAGS@ @openmp_cflags@ @zlib_cflags@ +PKG_LIBS = @PKG_LIBS@ @openmp_cflags@ @zlib_libs@ +all: $(SHLIB) +# @echo PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS) +# @echo PKG_LIBS = $(PKG_LIBS) + if [ "$(SHLIB)" != "myTAI$(SHLIB_EXT)" ]; then mv $(SHLIB) myTAI$(SHLIB_EXT); fi + if [ "$(OS)" != "Windows_NT" ] && [ `uname -s` = 'Darwin' ]; then install_name_tool -id myTAI$(SHLIB_EXT) myTAI$(SHLIB_EXT); fi + diff --git a/src/Makevars.win b/src/Makevars.win new file mode 100755 index 00000000..045cd086 --- /dev/null +++ b/src/Makevars.win @@ -0,0 +1,6 @@ +#PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS) +#PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) -lz + + +#all: $(SHLIB) +# mv $(SHLIB) myTAI$(SHLIB_EXT) diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp old mode 100644 new mode 100755 diff --git a/src/code.cpp b/src/code.cpp old mode 100644 new mode 100755 diff --git a/src/cpp11.cpp b/src/cpp11.cpp old mode 100644 new mode 100755 diff --git a/src/rcpp_funcs.cpp b/src/rcpp_funcs.cpp old mode 100644 new mode 100755 diff --git a/src/symbols.rds b/src/symbols.rds new file mode 100644 index 0000000000000000000000000000000000000000..7eeaf82f0c9befc02cf8872716af3e4ffb64b7a9 GIT binary patch literal 13127 zcmZ{qLy#s~ux`t?ZQHhO+qP}nUAAp^*;bcr<1hQ3d&lo(#Evf_2YZy0Tq_AGS+q(QodvU8W_&r8@%RyX5Kg$+L}YQ*){t_ zyaEfJifXA<As}?``-Q0^HO3AsZv>D z%ag2|Q=r{0N6T5m!ZLAhSKwoQR^K}des;?Qe2O&!ODUl)Gizw<(`@Yh>3IeBcmF6M zKW&1f<`3D^QitJ@<1mqPDEFuK{Rn(6+mZPMm&Z5Aea-!C24~_tFew6mgu$N0QNfHWn5{G<9jXDj^?}Wny;0&YXnuU1f9hqxG$6U$aUP% z6$z=_{_OnDu^$rGHOs6Id~?K%X<BGY*Z?3!gAg7n#B+lCD`B7(o7$ zudgNLugVi%yqyhsQKR`rn*^``$)%J*RK0{aqjO2cI_ehA4HD8q;_MTg-|HpYi;Dv( z>Qt&`eDusm&rKf1#3{dO+Na|lcl;W!oM4>h1fK$-k(#rwD6D1*vOqpCL9^AWBr;G6 z_R7+m&9tB`KRn^1Du#{u1MVygAKv~(gP&!}gCm;rSAMqVXy_{Pbn$Hv>FEs_f8{wr-fksC4Zk;}A5(cc0*$QtfIUNZX#XdnLZCo08bRZa4KlgCtD z?Qo=sE@sFIl%@fe#%SJ1$yuaG-aD%%>z*!@H8ae(+1DOUaXSrlmOH%97d{sT95CoB zvW1Ap=`33Rrd+Hl6UEVFvIb!efM99t+JxdX&lbaIy$rT@QGW^dZR+$m2)EAnkUXWV z5Ph^-skl#d`N(v=1b_eo6KX#H#+V1q6y)a=5yFH1}NsSq+G-ELnmo3+r}Svj4{8|6K`haDuIvU9V<0a+fA zkNmHslLHz@%_t}cCaEhNoedpq67!5du*{1cwG(uzI6TNm=NBq%??gMBR(rVDG8BF|&eq`qx%L}n@QBgr$ak~949g5I-+<&wMA%%HN( zGUnN(r>enN1)CJZm7g7;y`iBOz5^1Bs#%M>f}yQkh@-oZ zpJCORY$*r}HPUPg;_Aq8!oZQ3@If`}2%3_qtWvnk)Vs_^(OBmW)Q;g+ygtHqw4rW! z)UnudNpT+e_zHu#n(nZG4{@Zv_w9`%1TqAjb}Ruag(wTOm?trI{7-ww0BC9L1 zn@xRpbMjnbktgkgv14UD-qQiu=!&y^B->wUd5=TP2zn)Qi7GdEBfBFCbcKF$ru}0~ zjWs!F11rADfM%^hwN$BO_E#iXq$r?jpp~ffVOs!`)mU;w59O)O8l%R`s^{ndmz^(3 z!bVsMUP^@iGB&e60|rD{O+ba{18-g}yP^Yd|MV2np^RoRmP{?IRIw;jq(v zV4QYSX^vTSu|dQMa;WuvBD#7|RHnKIxXP6N&+(~?8{6FKY?(_dF6yQfjH#vy)|S-b zMmk!aed+m~OiX}w%$|P2c6gLen|+Fe7}BetcogY<;C?PcgM#RMTLVlKJ8I;@8t@X! zygswiKBFz)Yotu>?G6){FWal71qVOq&Vor-GVf)NAAEGgV_1YL5A<0us_U!D3&Vj; zDLJ@~Z(8rf%hvP;$$UGEN>_&@cj;;hE!krj{fhD6*X3n0mbjZOTc>n4S`16rrpV%U zLwz!-Bz|7cj4OoA=@?z~eHF@J%vGe5Eh6uj+hT2i;F-~gG?%W$UL6fX9nWV#gOrxm z*=R`KR}CJ-R}4B-e6=*CC{--NzOoYL$;y)VGxmJyZoR@y`FRngXgH8@;7@B6 zFTNj&+HF^(TLGp$hra$wzY0*$Oe$E6CDH~E>) z49l6!7Y}Xaz;7)~fBgf>PK@a*U11TFmy_w={TnrPs0){2{#d%i`M=}Q=wzYMShD6c zzw_}}o_1J0WN|9v@x<#b^N>-0Fth|*S&AG`vR~N!y2ZZGA0JpSh}iO+7b>+@Dl<|` zm*a|y1{hP?7CF;a_@3h6kN-}4S6e@+8_>8(+W7~K*&56ZLE-EOF@T>-7L98fY4n#F-_FI|{S4jj4%Ua|qQo9(1@o z8E{Z1s{Im7%~GIaLjFE8)to1>pQAx;O=(h{?WX*VwI7Xs;`5r-thh48`IkwkVJu-H zJA_YQO>d*t5JcHqlhcx`UXlIpPOZ?UW#V~f(q#-(;NVT+Awo{q)2W=R=D#Fr9f|K{2)P=3UF%>ETzsvo zSl3It;Y!UxDadtLh}_d{9xJvyNDpU!+>imZy{dt`N{CmoW(ySs8r|NO#?4)^)$-nL zdM|iduZP7U6Ty%?=;FQDkslTqk0BDLS}GV1TPjAmzbg>?Yr~Bmj`Qx!dMqPWGfZ@> zEAZx6Of1~A*^)>wpxpeD}<;!M#j{)FYMBJKSJ0AfpceX_Y&G-uldezk&=y)XdyF-nh2 zmn{~ocQACL06iuH$$I+b){DeZ4e+QhRT@NDwR*ojnaz+1p#$!Xsh%-T|7C&4Ovahb zG~9qn=4}4V2j=oj8`-Mg0}}U2>%u-NQ&5hbML9XJiN)*EdbE`J1Q};l<+Z~N?6`ue z`C?WGMGDt@m&BRITfZWb+78!4%*fI_++;Q>ibj z*c_^eAbdgUW`PzPwIX|r&cs|Ciuz5>rX^1!eVfoVaHS&Dxy_yKUOe1tV6GEhjEmDK zWct+;y&yq}>aS(AAd)SB-;x<_v{{3F!k9h&S0cOYY$oS{I7_AO+M80eky6jdz%UV} zhMiYy3yfz8!aKMTV{`kR-bS`oUlppQlQ;_gbHx+1j}UImD9gnS z0$s3N>(}v2kM?!XU)J2RF0$2cf&0ntmawTeY_BSav^a_Rt`&<@UnLig0mRm2826hL zBi#8GB2Ww18mbvp09b_n9K?KbX=)#Fp&tJPLnApVHJz-_fTE~{w!Hdwm?g-F7}~S6 z%sD2!Y#GE)7lV)T-GP2W-2b0c3y7;zkdnm3H%up&@q)exf3~PPeIAQZ_nZ8(M^XfD zFLkF$0A^EFV-Q?VZBPeou&a)vx`ie9?_-SKqFR`@CP&sBg*-(I^rEp`spr8Sz4IFN z>@n7i7+bkyB1Kk{p9ZCVNknhR!z|2LzwRVfwWgiC_@Z!A0d03Ed(?!3J9cu+C2bua zhD+UINN%w#dMsfWhw;(gY+fe|vv~m3z=wi(JG)Fz?P5q*Knkem(Yu(KN#X!vH*i=p zN6CR419Hf*c9`6TrR!rr)9>i>dder-!$^5tShU9s=#kxbGZIpTa?^%%Uc;Zj9XCj1 zs{+8A4#POCLo+x7;Vo^pSN^HlMSgGldg>qB6`lBGhc=yd&^DJ2+P#s*ig15HO7u_7 zILb2(6}Tew%*{d-Fkix8db=_zkRMdA&P5mJ*X*`>av^SE`H?&TRH^yp^LQ0Mp-%A+3ytUPfsM@ zt`t=?Mzwd^mC~+<+mVkxlbW$voTlLobb`s)M28sOe;COzqwnQl)NT~~ed)=YO`CI6 zFHZ$_kHAr@#cbS(LzEYqr2y8(#2(DjWt%phwIOPD7UpENQ#VUng`23rPTS1@nTOp~ zw4NbINjUdpaOSN{s=b*m3VnPgjO>!q^#dh>t9et23M0YdSR3V8cb4Ivp@oa3sP(t@ zMN1*S4R;~|4XrH_2TiDbG-+Pl6xZ0}ZHVK(;ECsLrielH86HbIU=!{ns1gZiVgoM- z9@Nqd#|HcM!Q(6SCw4QjbP&27-z~ZSrs%vR^YN~9184OFS$R_}rB4-HM;wOp7QK{- zisYF-tD%h|L$r>nx!!7^`9nYl6=Cs{5k=uVRfzz3xRN~%Wl^siUX{Fm->5P~F%IEWS@lyK!q?dCm1B%VRH(mobzLg>_aEeh3-f#3YvBYSR zp7OTJwIt0Nx?o(ah?8qDu_~b+92ixVE>VgOy7ZC?wMqHoaxyM2?Pdb;a}rY{bAxM5 zCnW=JJ!T~XQYXzmz7x@qjeN;A`fQ@=54@hqYSg2h~(6w^N;KKrKzz=1DUD1_yH*CTj&ewND>D(@#ic()*QqJXRI9Iw^f zcw3sRTTW^F>tjk^gs^YMnjzlYC6s#u*?xu6-!NH^Jwbg@ja=m!Ek?uz8Rd!E=r9e| zX2Yn1&7xq|d!ldYvJ0QlLo{p9vux1v;8;)yuE(zyr9~?DCS{enKYfe0mR!Z0BrDE?2f zeMOhj8FkoX{1?X0(nSIP=%MEzka26ExyIC7Y%a_*1&R!WQ{@nY@~J`v6tpMx1NX@y zgyDq`$Sg7UpDxVHBkHs4H$u(ME5ZzK^%;p5*CzCE$PJjAL=FmOK5dZ_6O5K@35@1% zS#i)_$XD*MoG7hCUkFSS z6|AgSgVs)hmLSI0>0Aa->n(zo6|KSsp(QV1peqPqzhJA&$LFT-2DVkQAd;K2X(xEIa@{Gm%-Qm~JPZSSS8#_o~b&e?Ab<6d!=GRhw=XAU?9Pl(i1{PNod8%o&di9n;UsV?fz!kto-jw5F!#7F z92oQ;eK>W;T0~8ptKpNe4}l16>u|)Yy8DC6%X%PT@&MT2H2KSnnH`r{$-!2F+ojg9 zN59UQ7J=G_+OMt92k}^lY++6R@V_`2wa~IS3-keb-=uIo2RciqY%#nDtK1*2qF^0! zgZ;hw^nx#c8jSSji~9W*k_(7a173T_lKa7m*m>?>MZ-H+o%{FdLJU3D?_z`Yz1|0I zWbd)~Cd;Y!k`$RXr9Q016kE2Scgu$uAuSI@owLVZY%bw)o5fZ2S-P>bdQ*VOdf6_f z`}6v88(I4b@&gZwB9KTT6}b;y9n0@3OayF#B_(d{9K@0C#HEd2^-c6@43zG(D zM4^&Sdu6Hu+55N)+xcd7-_4$N^aTsUl)B#WVX7n4EDqkjX*Ms1fdB1OZfo;zeJz2b zS4_=J)N{r6p;$fez1tLqiymOgQU}p!`HRcZK|7{uiu^C$j@c*dqYu z$8v6#AQRz%osCh+bKvFiv%q%6Yt+#Zubx_RCfT5At??cOI^*vDdY>Z#4{505^AT8| zBLJ}y1y|N5a{g-`H;*|t)=W!|hZ&s7da`X5+?;=(=NnSjQ&RcghkkuL+cOA>o@rhd z`pc|`y7?l-ZU220K2l`dmT|J_;eQ)!PcD|7-?2aX13ES7l~iKgd@y^|7=iDiQsFe##~o6vQQ2YFaVMQf<+TC zBuFNfUc583t`D{%oaP2kD+%mQ5haR9D_;gLI*4me=7njCp((Dp@oS8kCA1}M9Z{_> z+Ez@96AO}wh7h(Ga00b9?ujsv-Y5@d+3cjVKVB~f*TL8OB4}rd7)W{qGWm~0 zN5IDAWf~iqtWO&8a&${E)k>>X4D1eW-WB7)Yd44Dw*lOE)XJPLsis27z?NHL}r>Us!H7yq}S ziokDlc3(@RF-^Kijq?XJL9nzU!%r5raiksu)s5HAa+LhWks-KWw?jFobTU%-n@wV{ z;BB`Q>hP{KtqH9QVdTjAYF`^vIc!_C#qfZTN9LUrFoul%f+KmK;Q()@xTSU!*cTkP#q)1sRHE`L!PH5ab+TU zbfhM<+xq?;gcMBu8qDUwm}=@i4?c)=Amo24KObyd42`dnXDX-)Ca}W~wzhv-5SD|l z#k^0kO|OrK@JGeJ>W#Ji8%kRk>e|g!5nHo7VALG}E$0J&xepXxP|e9hMAfyDXa}8cewPRuoD&!2=$&aPa8X4QaKoBz#*P8PY?5WAv(Yy&%pk-Vy4yHX3Y> zC|S;r7W$g&-reSJQm{_>68-;-iUP0Od+>ZILp-i}#6W}K-}{gEU*JGQOd$ghq<|fF zxQjLNZP!5fUqjSJl+z?oGwUCG&+I&kG1&0DtxQQEDKyd=$+Rt)3c=Oz6zqTbF5Ok9BhM?7u zLrI@PiSB%A#VtEJeyJ(7r|N=|t_H5$6WpnXNtd=j@eo)-oyI)W>ZQ?p@QlrtJTw;xgOWSA7^AOXsO@S zX&plL%K@3P-t(RxAM8Jy2-;>XL%vNZhclM>wl&KvqtmPz+j2xx1yot(Uza&zb)CI* z2BW0TLDnC)v|suMX^szLfqr12cycxv;m}ec+GDVEqp}8!*>y>y)80yAm}rc!cGJ_s zq^@$3M+f^q_BOltm@>!dl|gMm_&ZOM;uk+ z(R>B0WuJzi(4!c3(HvK{(Ht`>k3r|)EAOY7qLlGu?^JNBSJ=)_MA9o!F}sm+(+RbnC@P(h>Tuglip=(Th&*9Q?-y*73&;FGH(d zQU~C?KhGB+Yf)mpw2by%Fze88ys0SCNHmH{T<|AJ75ENHs-=B+p~eU9 z?}~ZQ7H>Xri&t-4LGOU`8r`ezOdr*MuVMg$VSt+?OIReFaDIh9OHeBulTzc7)%IHaX6ST!TWXT)C9syVr0_BI@@_64ILw3_0$BAxM9?z^ZI5j;j3}O`$ zE$8+E@tqwR8V1L@bIZ4Bz)2!L50a<%W1wlbmbKs{cZWSA+|-MTrdA<4pR#9djfM^b zBa65CtSu9<{#wBUuJi_ZV!ii`^TX!D*GveP0!on8I<}t)x93GgH)j6imcO|rk!alv z_j7imz>>`Aw=ev|XuYhNCv{eTEs3h7YN=^xzbsZ+0`C0VDzvg-^HlU0r7%8@0s(MQ zFqYgDg@V|HaS*Ivu_CJJK0{*HoY67eolSe8X2FC$tDgM5;fN7g&7!6Ke0{kQ05)2u zS$$n2ccM6_dUFN5!3VsYV3Pg@vyx`e2!r-}PrdM^4lBNq+TGhu4cE&`{YH%zG0~f@ zQsSyIqoxM_Ci0`EIW8MQKB5E9`CDtyr!Xd9?E{@6c8owHo)L+Tb& z7Cl4DGHd;}lCIrhhGfkX^);j{1(rBGf*M{#dH$a`moqV&c$?s{4uLC5wCk~Z22Pm)y1O(g9oI`t}KJNjUzb;pX zXp{NvPj3Oe9Ooo9`9-XRch7A@WUhi%7XH2TzNtK;AupFO*k%O*oB|;f;uCW}M!x2E zHMW}=EBX6gJB4>?bWI~~g+^Lu2B+EF*HV~+snd|}sQI#!38>etlHaMKmY8XgYgMpY zHG&_vW(JbA+~eviCNIigSmIDt%z)gNaif+8IxrZ@Vp?7G2=?PIP8kKY?VN?0eDDQv za`k2nTiQQpd~{z@yCz1q&^Bzj@OYAaBw|pcH*tnon6scz0d54m_fSwgRCpltQ<8J* zW)g(MppQZ2lu{lP1YSl0p3?qJWGqg6)E2br7y2EbzwoI&(g!s5io0+AK8Ha$;Hn;c z=JNsQmfvyjeVt%=K4%X?&8ut&A=dFg*rxI^A(;g{A^awn^+q`C#x}Ks_rDs<*Ji92 z3pmu43_kir=JFFPd630{a^e@D97p=ey#Z{Wtg`S!t}NVuuRkz(z6Ua=Q>?T9{M+jO31g# z6@vrRSb7fENXaTxzrHE4wuDa1mU=H+9{XZKe&-@hCs5jMAEIZG?xxDyUJ6xWMHO4% zC4L&)&IrZS6*v?5tNX4}>NXp_dF-SJEi+V7kr3zS#xzOg5F&!_kka4voZtR_6 zix{+(YOa>-L#NYsM?w96t279$rB5|&Doo>f3fd!YH0VoC!pZV(T2`+5n^LOj{G-p- zm)4a+*{2^kZ!NaVLew54@ztk$8qn?H6?9*SBTz_~-bSgr)Fa|^N?1<1*P2U@^~zE1 zG@y-J3zqri$-_jM5ul8StiSI(C{x0mDNg3Oq$NBXz`V_uE$5W9TGND01* zbb*p#VsbN@QI5Kj(2I}C%z5M+Kg{;*_<0T9kF0R#B~Ha^X0>B>XPJJg27dWR9vVj; zq!f3p8ivQ{7=nLHEJF|C_B=IA==``eKs4G+W=@q-Ag6C`Uo)1^DHhT5!dui&KW|RV zl9HiC1+^{3_q<#j$i?;Z>GbRDV*gFy4gaSq>WLY2m+CU1P^Tx6Qq63&?_ed;VFgB6 zX3z?A$2o49X_Fok-`8z7R$ewAA1UG}QcZ>prabwZ!HfHgqN=THO}r^V%yRNXzqV92 zx{oQ8yCffuZo&H#%l=Jr?`&kN@`jY(WwslNH^o!02I%QgRD((|96?5z_z;N(B0P+s zN#qTI72&$&)r#vIo!c>2_Jv1l7vm((n!+CxuC1K~)*jA5IzA43+s$b5ev=6I19v$Rxx5=g<6Er@(Lwr9f>+zF`{|N&%83lH1_yxCa)alC_^H4* znh_e;RNLs3br1UP1@%S1`iiMJr&Haj1s5BzQKHWo7jmTABGO73FO2@HR{?Srd;22Q zSJFqeAV;l351E_2;xawu{m2ulVH)r?Hk1|uTuhzi%VxgQS>yJ?y~ zWr7PK8cqJ&RVsu*4aFoJ#CX_ljS!0WfY-K8YuSfhJ#5GHi--F8N10|M8szN1c1z6H!R}1^3 zU2U?mUn9LZ)<;w}i$B&qI%x&{8*Il2>B6K`R1raBq>X8a#&D;qcwFmlZuU%w#7LTWXWX4+yiy9>D*9~~ylJhi zYLUM{q`IaDWF@M?wfSBqBC{g-j*Tw`iw=8(2uHe@utOpMI=-10b8y_^E;1d%2;I-A z6Q?Bje^^H#Y^sfJ{K-WBB%ZcZu}^7IC>Q(%Y4n-d8$K~Sy~~Ig98G*-Sz;1%)gvAV zNAL0jlF<>)>|CY|*cCR-Wm4j0{(YsvYpP{MMA5ueZkjJ)f{MnV+;?fHoL&1GXd1sy0pz*fw z5dP&mydty$b04UqyxX3Mu#Z+)akLl6U>U6zvJo>s-ued9dVI!X!?~b*!23ZCz_Fdk zRQX6{r-J9uu9~(vGwH$_bsV|`7ru!lnh+>sW+OA8pYf5qL9$Dc6h#hWSeP5#8ik(J z5j%$1V+<*83OoN8rSU+%@34h9?DP0i&r~J`3 zfw(3yT43_Bnvyl&fZp4H9i-bcYhJR3wbjA`GW+SK{dVWze)we)Z6xd~l`6u2@P7q_ z675>>En^5sE&F2(643|k??-b97KBV~2f^2m;LPe9QsR73+$2clcs4}svbZf>zUtlt z^h<8?=ba~2JQFvF#u*e~gWC1yb`x;9p=L4sjl!sEb?ZTzs4zaG;{=!{GLVAQy(suVC->S#!3$ly@abl-_*v) z{8j9#cw2))l(?~((#<`r$~QgeU(X4taMh~0HEH{CKLT0c#q+W`%P~KtHXs_UY`@gjq zzMt%BLpx49zcHmqU6?VyjP=oiaerH~o$I5;)9>D#$s5dRht$;;)GP$(77n5vp+SFn zf{juW#ou_MU_sfkBe>)f#u`AZw~#U`gPje7Yx(&5Z6jN1stP6&8B{=U3Hl3o2Ku!6 zjyFXfsmgkfT=GA9WoW&2ltsFiRLQFo2N@DT(~3vC>#X-Mp?ZH+zIP8zYzMz>Pochk5WQjnO26%YjzCG?lC|v{wVDH1|7;m5y4GubBJN} z5~FuaUOYW^-R$dv9|Kx}cE>9At04%nk8{*^3zW7sl&40D__K>nv;O6vs1$zrMD)5d zTF~uo5nVg4Y!i68{TuehvdQ9i@W&s~g(@8*ki6PF>VR2z_GrrKA%{RQ`{b^O+s^|T zv>$5&Z+K};M)yxDs>Ee|yN$`dV!_#Kcu)oh0aL^LQSC}T;)iRSsqN@%JE8|u;keRe z@tnrq3)v9VvwsN%*{+9sIbeX-=-iB){<O(l-y?*Fi$3Gm9V7SMUCPWFm_gwR+EkXU_$U*=GG)KAi9DH z>2s%c&p@_=4Y8fI-xfq}!L|Blusv^@he7bqo!>BId;svUoO)e#OH)d9nr%A8 zku&=Y`BHwiSN2irT}hc23iYf$in&TLMqAUJ9K$jQdAeWTO+bCyK7l~(Q;6(diG zaIT#+>~)~+Fe8uvI7oiK1Qh;xBlX1L;T8%T7ic2t5=3NwvZ?I;9E*VLH5@-~oe zX&BNn>`R4YIpIkCn~=pht6lj=nh$i3-TkI_K)DbG&SB@p@(tPNUhlz=IM{Pd!CVgDtswcQI2k2hdvF!m zy`@%SyCCG-ZUfI__sN6&AcK>HqdUSm4;SYTS-s*4z4`7x^OUtUh(yo4^%;!<_Q>|f z5etmI8jmJ~nKS?BO?OHJt$@!X<9TIF{^}l7#LtMjrAv^B;r57KU9LJQopX(aJ|BK{ z%%EMO5h29v?pZ*R+hd%le@u`MY6QWDkK%tMoU0<-8Sjf}kc+EAlc>(zC=yi`npIdt z!A{*JqIE3EBrDViE2K%uC*)ig3-jTUiYJvphV&ncd+JqDxq}V=ijP#56hs~|Po=~p z+78qw+g&s`wHh>(D7jF(WH}YTu(cYls=MRGff}?^Xls&AIeoYhH7+lilzwT$l7Fd( z3Gt^5vfgWT=hd!{uN0mcki8l;gpVSVr2d7pWJU$4nSY4U=ICis4hM76kh_{gxRX^O z3=7;bSdv3wS2Y_-aqQEMb(I@pR(sL)X=6N1YrK)qgc`kAMPgiOe6~eJ#Xfv#VM6`x zRszi@7<(-A;T4eq$5M1%_C!(q8;cn!LbW>Xq!B5pr&5<4S?JD~11P&8S${$f7t5PK zN=u^G#d*7ty1pz=lqhajU<5UBg+)oWXRgGW3Sp&;3SVA8S1_9l-sVL3rvJ*D`?l4y zeFK!hxq~<4>$04XH}3?_=X~}#WP8e-b(<;JFJ8b^M}P!V-TS5SwrJ(jy#cYH75Qggx(cMjd+#awltNCl_VnhA~E)l1KL z@G~+N!cDgZB>y_ZP}X^7c09of{>A-%qYpRtb!&&ZvSSj0@S^2bv)j|czlGruVMKmh z{#MHKLF*bwO2f$`?%LR=5ZGo-mV9BPz#y0RWRdS?Z7AJjVZz+2D}k^LzvO`ex_r1^M;DoE9u#n79%jtFL2l$