From 5c64652c7409448dcd32fe35144edb641596bcb2 Mon Sep 17 00:00:00 2001 From: baydam Date: Mon, 13 Jun 2016 18:13:58 +0100 Subject: [PATCH] Changes for Windows packaging --- INSTALL | 30 ++++++++++++++++++++++++++++++ MainApplication.cpp | 9 +++++++++ VideoImpl.cpp | 8 ++++---- mapmap.pro | 11 ++++++++--- mapmap_resource.rc | 8 +++++--- resources/images/logo/mapmap.ico | Bin 0 -> 148718 bytes 6 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 resources/images/logo/mapmap.ico diff --git a/INSTALL b/INSTALL index a96b8c6..18f6c66 100644 --- a/INSTALL +++ b/INSTALL @@ -104,3 +104,33 @@ MapMap should then work. If the appearance of the window of the OSC port number in the preferences seem corrupted, you might want to reset MapMap's preferences:: rm -f ~/Library/Preferences/info.mapmap.MapMap.plist + +Build for release on Windows +---------------------------- +- Download gstreamer-x86 runtime& devel +https://gstreamer.freedesktop.org/data/pkg/windows/1.7.91/gstreamer-1.0-x86-1.7.91.msi https://gstreamer.freedesktop.org/data/pkg/windows/1.7.91/gstreamer-1.0-devel-x86-1.7.91.msi + + +- Choose complete option during installation process wizard +- Build Mapmap with Qt Creator (qmake, build release) +- Add the bin directory of your Qt installation (e.g. e.g. C:\Qt\Qt5.6.0\5.6\mingw49_32\bin) to the PATH variable +- Open Windows console then run the following command: + windeployqt --release --no-translations --no-system-d3d-compiler + +- Copy the followings DLL into the target folder together with Mapmap.exe + libffi-6.dll libgobject-2.0-0.dll libgstbase-1.0-0.dll libgsttag-1.0-0.dll liborc-0.4-0.dll + libglib-2.0-0.dll libgstapp-1.0-0.dll libgstpbutils-1.0-0.dll libgstvideo-1.0-0.dll libz.dll + libgmodule-2.0-0.dll libgstaudio-1.0-0.dll libgstreamer-1.0-0.dll libintl-8.dll +- Copy all DLL files of the Gstreamer's bin folder (e.g. C:) into a new folder named 'lib' in the target folder together with mapmap.exe + +- Copy all DLL files of the Gstreamer's plugin folder into a new folder named 'plugins' in parallel of lib folder + + +- Remove lib\libopenh264.dll, lib\libSoundTouch-0.dll, lib\libtag.dll + +- Run Mapamp.exe + + + + + diff --git a/MainApplication.cpp b/MainApplication.cpp index 4da3e29..93af2a1 100644 --- a/MainApplication.cpp +++ b/MainApplication.cpp @@ -25,6 +25,15 @@ MM_BEGIN_NAMESPACE MainApplication::MainApplication(int &argc, char *argv[]) : QApplication(argc, argv) { +#ifdef Q_OS_WIN + // Set GStreamer plugins path on Windows + QString pluginPath = QCoreApplication::applicationDirPath() + "/plugins"; + QString libPath = QCoreApplication::applicationDirPath() + "/lib"; + + _putenv_s("GST_PLUGIN_PATH", pluginPath.toLocal8Bit()); + _putenv_s("PATH", libPath.toLocal8Bit()); +#endif + // Initialize GStreamer. gst_init (NULL, NULL); diff --git a/VideoImpl.cpp b/VideoImpl.cpp index 9483166..9125883 100644 --- a/VideoImpl.cpp +++ b/VideoImpl.cpp @@ -27,7 +27,7 @@ MM_BEGIN_NAMESPACE -// #define VIDEO_IMPL_VERBOSE +#define VIDEO_IMPL_VERBOSE // -------- private implementation of VideoImpl ------- @@ -391,7 +391,7 @@ bool VideoImpl::loadMovie(const QString& filename) !_appsink0 || !_audioqueue0 || !_audioconvert0 || !_audioresample0 || !_audiovolume0 || !_audiosink0) { - g_printerr ("Not all elements could be created.\n"); + g_printerr ("1:Not all elements could be created.\n"); if (! _pipeline) g_printerr("_pipeline"); if (! _queue0) g_printerr("_queue0"); @@ -413,7 +413,7 @@ bool VideoImpl::loadMovie(const QString& filename) { if (! _shmsrc0 || ! _gdpdepay0) { - g_printerr ("Not all elements could be created.\n"); + g_printerr ("2:Not all elements could be created.\n"); if (! _shmsrc0) g_printerr("_shmsrc0"); if (! _gdpdepay0) g_printerr("_gdpdepay0"); unloadMovie(); @@ -424,7 +424,7 @@ bool VideoImpl::loadMovie(const QString& filename) { if (! _uridecodebin0) { - g_printerr ("Not all elements could be created.\n"); + g_printerr ("3:Not all elements could be created.\n"); if (! _uridecodebin0) g_printerr("_uridecodebin0"); unloadMovie(); return -1; diff --git a/mapmap.pro b/mapmap.pro index 679f937..d185522 100644 --- a/mapmap.pro +++ b/mapmap.pro @@ -180,10 +180,14 @@ mac { win32 { DEFINES += WIN32 TARGET = Mapmap - GST_HOME = $$quote(C:\gstreamer\1.0\x86) + GST_HOME = $$quote($$(GSTREAMER_1_0_ROOT_X86)) isEmpty(GST_HOME) { - message(\"C:\gstreamer\1.0\x86\" not detected ...) + message(\"GSTREAMER_1_0_ROOT_X86\" not detected ...) } + else { + message(\"GSTREAMER_1_0_ROOT_X86\" detected in \"$${GST_HOME}\") + } +# DESTDIR = ../../Mapmap # Just for packaging INCLUDEPATH += $${GST_HOME}/lib/gstreamer-1.0/include \ $${GST_HOME}/include/glib-2.0 \ @@ -198,8 +202,9 @@ win32 { $${GST_HOME}/lib/glib-2.0.lib \ -lopengl32 - RC_FILE = mapmap_resource.rc + CONFIG += release + RC_FILE = mapmap_resource.rc QMAKE_CXXFLAGS += -D_USE_MATH_DEFINES } diff --git a/mapmap_resource.rc b/mapmap_resource.rc index e8e1d8d..27018c6 100644 --- a/mapmap_resource.rc +++ b/mapmap_resource.rc @@ -21,12 +21,12 @@ VS_VERSION_INFO VERSIONINFO BEGIN BLOCK "040904b0" BEGIN - VALUE "CompanyName", "\0" - VALUE "FileDescription", "\0" + VALUE "CompanyName", "Mapmap Team\0" + VALUE "FileDescription", "MapMap\0" VALUE "FileVersion", "0.4.0.0\0" VALUE "LegalCopyright", "\0" VALUE "OriginalFilename", "Mapmap.exe\0" - VALUE "ProductName", "Mapmap\0" + VALUE "ProductName", "MapMap\0" VALUE "ProductVersion", "0.4.0.0\0" END END @@ -37,3 +37,5 @@ VS_VERSION_INFO VERSIONINFO END /* End of Version info */ +IDI_ICON1 ICON DISCARDABLE "resources/images/logo/mapmap.ico" + diff --git a/resources/images/logo/mapmap.ico b/resources/images/logo/mapmap.ico new file mode 100644 index 0000000000000000000000000000000000000000..af8e402129fe8dd872b35a4c10eda9410c97152e GIT binary patch literal 148718 zcmeHQ2fP)<)xSs#@k_zvGe#4Wr^y#%OiYZuKZ=M{1wlbnPytaahz(SD4^U845Cj_v zD1r^8s31~BsUk&`jy#HhfPjE>-S7Y3yK|YlcXoHS-izVtlYUk%^>iwgYSt`mf2~g{H34pwDp~$jQmK|NmP?&_s^$OJRI0~{a;cL} zO50ogK9xG_@WWEaA8+{|nM(C9IxKa}F=_iFN2F4hoO)R5sH4*M_kWs7%|7?A)R73s z^jrNTmFimQuoTFpN`Y`R-TBJ5d&{RxOxq7V^C1DlFe(C}xxxVOQVqD-1=qoExeLyP z-z*253HPxs_zwKuu;G)iA6^*JiJlAOZ4J;1zDEEzozQPJ&`mE(;qRmu)1A3PnCien zgTY|vu;`_qe~QT0szMRArTb$)@T%wI2}U#%Q&WKWfO!Lf;aIDZ)Xb zf98HautEN`7G287#}~{{A%La-T7|%i1`m4>rh0Um$PXpt;WLfACKANbf9*sPizbop zK<2#sXfB#m!T+3SL=m2fAN@DHw7PN8zfTE_mHzW@W8A1w;h8p!O(1e|G}=g>3V8q2 zO$a~y@Izo33;nda{Z_XmGJcl+>tq~UUc&01yj3~$0(hS8mg670{#gbtIr~gw z-lwk3pqq$fKlY`5ldJ~Ar3QYd$QiJ|=RyCM*?CaeqpJVn8&%`{bB#q`e6C8$uiG?4 z_(eFaBo`aJPIk*+9`t{?8$ZG?YW=eu)G5Bu_;MMW@zB6I#tO-4F?dSg)3pQi-=u$* zfy=5?GFGlw5xM|?z}rBqa42j5kK^4kn+N^ZbK^(&#Zmvox1d4wYR3AtUx}o`m;(?Q zt6mBhz#rQxNBD2lKg+?@b!r)#Hg0f~iw}=(g{ysYy~Sv^yyQXu_1*XpesR`+(GE0g zP~Z4=%NCJj81vpjEd$8Zdu|y^Q2#$rM&RWNH-3a)68dL3xbdon#`bO7M6y9m&Kb5S z#4-TBxaQ3f@}U0)j?73NN$H7Qkw?M*F>y?Z$27YazAMj@2}@bi{ijuO=WeoOxi-S`oHN!EYSA9$e69mf9stj3{$ zbA}fbN*MqzZ@T3sLH+Nu^naxrKf*5``e!+K=>GP`_uq3lbST)0*w}TEe*hn^x#i@L z{&VM;yLIefP%a_iYs5b>-z5M%3~|dxg8JV}S%8yNOTNZw3P9WzG=kx@I5``fscwv_h!=)PM1*|1yTZ{<;p!UST*7llYt=((LEP zSc3ZBW!3+y-S`oHg`$5^2Ht(!^*36u?PU%_0PLDh4v^k+ZcHVp|D6Y`{#gdNo^-;P z_uWLP>-Q1@CN^h?v|KwedC-3o9YGaR{iptkTuV50@`pO?dxhzhR0{w`o^oR*LH&Pc z)&FbU_z`|#_0R9N&|8!y*AmW|^@(6JjM+YkG5`j9xiOib{&ys)|EBdXH=cO7OFU)Z zoU@G2=FD~ztFGT2ahCxw(!-6J1ogk&(*Lz?{0P6W^}p#A^~^E6?wv|vDFZbxIL}zT zV1ZyasL6rmMsbz_(0|O0xjg9qIyZiVUljT$Eso`Py6>J?%0S&p7a3(=a)>V!>_zOF zag_nke$TO$1g$GBx!72{M(2nfH!T=D;d@~mWdL-$ zx}}_;{=c>K-_(sC;TKi?7xeb--D}*_`sP^5K%?3ZuO;N1;b~Eq0nmI%$UtQ# zsQ;~&{+p@zu)9UAf70KzYnO4`4b5UH15N7IHa2hKR?$$vLiD#N%K+$ga^vW~N&l3? zjvd>LmRC29r3~EAuz|7d+i%^(t>ee@y8aYZ833&kw?q@v{}!wMU+>0`@Qb7V3))=o z*}Tz}v6O*U*ETVBe#a$1pX>p^mXZLQAm7pf~ZT~WC832v;ZVV)-|8ELO|CGtbufH}L)v6Io8MyoAo1$1x zIst6{EKC_d{QHB8!jD~)8A`J{4H*T6V(6LR{bw%{Zm%6rcXC6KI@EF%D`(cxh}_bQPeJ&pbWyGQf2yBZs{SL3#&x{ykp8J@XBhL&NOSF{ z{og*UJ)*NIIoWW!TN!|VQ|H_n<{Fu>dC@%obFEeXZ+7EH_!UC^7reYT>}_)&Kv+51 z<41HhM`a6ReVS+hj8gPOdX z>3CHcfV=B{i$nU?7x}>Fo{gmp)HpAavniJ%C%?0o0l2yDw@pz0YpnX;T1VoAR{sUh z&-d;XOBsmhY|44y^Vf12fZg@HjRf_-+S0%4c$AQHq3WOfJ>BDpSjxan6f7khFQC17R{>L>g zD0DB(h|Z=IV$CrV)c*>r{s_`-bT(y98A!1HFSqo6XATnzheE9X3+B%^EdPKooq3NIZ#>BNg(5`1Udqihb3Na@+|98;p-&`YJ{gS-ZdwY54^=Kq# zQ<`NU!TP_{s{eOo3ZKhMq16A)-+W_Sb6K5&(Y+`O5uHt$Wc^=a>ECrff+!M&p#L4) zx10Av2$>g}8O7O@3D*C`2b2D}SG;wz>k6*k%VjW%vnlhS|9eCocQf-@|KmI>Le^gt z?<@mh&ZbOI|BI~pf3KU~g&>6`r){-LUg{&1ogkL z(DhGQbnjFei|%_ooIZx-lW9|9SyvwPY{~@nzrfPJ>waWWc=J*JpXu2n7Tw#&Z6;3` zZ{AHGMf)$)VB0e16CN9&4|&jkJ00$l*8iY>{bJF*)41)#4?c)x4&f4>O*vctY{~@n z|Akfm3r_#T-*`P1-Fw|BHhScUSoRk1u5;b9DHGKH=a&9m&m$3SLsIph{U+|mk=xNI z-gW0~*>{iQtYY1>Df6KJ`-P6(%p~+5S6|HUx{Wtp85DW>V;Qbrt*YnQlnLs8zE%GV zLjPaPn`iJ_8AV-}Y4F^UAa@E6z+FQ!ov7Zu&ZbOI|DRdo()sTi|v!WrF&jXX)SdJi55`zh>1+b2RMRt+p+B};MtU_^`!qz`saCX zSJtQ=x$fE5TKVOdqUeS)sgJn!7O2jqOi=%Gt@__VM?g`x|68|giDj)e?*Uk{aG_3? zw8L-=nqx*$^#No$_OmGy)c+hy{~dJ%5vBgW+p)uF(YR6M@-)X=R^OT%VU0{lAWLvWUMtu$sP{oy#=?$b8mq-oASr3f7YQ6cikDe z?s;}chJ*hHBQYHFVU@u^k+OLa0Iw*BY6tT?`*94qA5eL(1s zcozeA`H8=4=g!#HqVR0Wpn4baH1$6#N&Uw$rb?QlMhy3(Iyvksu$X7K!n_3N>ws|H zTX0j8ci-i<|E~8@2!VyI|3UNO7Vq_!UlQ#3HAf&q))~&Qb6@^GKZN4E zx43_X$T`XgnPIcVPT~q(lnRn#jpwa(B52XK(WVvg;^ZuTkv$#~c7j6iz^Q`v1V4ZGzt2u@cz{bblA(`QF&Is;n%Q`7FDR-RzqB zpJvtnhZXA1amuIuz1D5zFnhpZ4PO5&>a<@IamxXDW{WRawsLP0!-^<=*~w}%G}mVtf>`mRo#gW_D2o1WtG)71YIOaEP6Gh%t>qyBSz zg>yv#!1EktyPniVF*b2R?fOJs}GH z_j{_hXF3i6X2AWILG_W3c;L4h(ATo*%MgCLO)!GqyZmT`hQX*Y`%glMZ(91)k8kxgZ~CV z&P@~=2>tgeG{!7`R>M3#pSp`GZRDdF(ASz`O9pWoW0*fAP>A~f8ho7;mHZ2V4)Swb zoXQM9`+ZCQfjeaZ($tBv1%duk2s(?J2jr`*jsOx0GuqPsQwgP~lMMfv&W~E|g+vee z(^_wx=`sO?_5{@ zdY%fvyOaykz5v)VPZ--;-9pv5oiE6pYl>e4j!hUJvh#Atena7Y4&B=F;v0RA@waNnd+imY;A3b32Grky{CuJ#g}f3eM8WV2Va*(=!W{3Djr zPcw9YpEN^~y(Bw)s@P^Pve``rr1&NSlHFv$#cnbr`I`*M_7Ws0+ly`XBAcBI$>GV6 zY$rpqoeao!GLU62vDu4l_972E7|NmthO+EnD9a9pvg}|e+g@U`7u)PbHhV>zy@JhN z-exanv!}f5CE5I?if#5Ho4umVUcqKBZ?l)P*;96VJ65eyKGJXwjnecxpU3b~%10W^ z^Xf{4%`y+!vjuXn%A=B%4Z(j|w!PfeYf5jiN?L|hmz1U_iF&ln_ zDNTnnj7jO2v>mm(Otz!;TMVWBMe88qqxG;DO8cX=u^39*(HdC{r0pfJr{B^~SSqP@hj^WA!l&ENu?X240na;f9- z1U#8a-CI75X$O;!pMZ%Ifn3*Y$8+GuHSaQ>1^ej=JPmIDR^UJ3cCv+khxxxik$gd# z;P2PKi-DDam26lHJIB@SvZDQ5pe!r-T_rQRF|GbU&XL=3E8I5Qa1-onf!vcO<7(KK zD{v9qKDTflOzsIdx*!E_F$Ml8$8Uiu;JgygbGFNh_H97BylCgX9a&cL`)}Yk2$&Rb z9ZZh`mp|+MmV^XC`R8M(wE~=5JiLEmQtOauTu}g4~PM z;jXp@&&>7#?9;KITFEYpeAvMU<KMzHF3F)IIYcgh?!mw3mYajz zlgM*b+4son`3p$@G$8+Hav%ozAB99-%}K~|2vYvJ$De0l+~4L7gLfhN1n!6B|4+Gm zlzpa&wEqKK3Cw|mMgBquPdwbk;9V|0U?0Lx0_JUx64E{u$Zt{(#3cXMauTu}f|h@A z&P8S1-^R23H{d>4pTMz-|# z|2b&|AkBXPm#KI=80AkLRD})(pl`}O;68u~Or!4;j~m;*bsAa(Cu(5(cw|!b0BKSFi&d-~%<`uWYMg(r@dD09<9Qf9 zfaRnc@Ha{50O@efVj(aGB9=de!1Dh_PC}MLl;vO4g-g#n$9U(hp$5+;@&T+g4*+97 zrw3{L1Na3n2O^d~$6gYbKlM=S!t;&SUw+x(eWN~rACHHCv5pmiKIiM^19Kn-`5%o$ z-ponJa)_h+i+XT*)yl@O*B!gQPAu`8+#LARxY{Dn<~-?Vz#NEJ{`}X;oBXMVx|J?6 zrce1eC!Zb;tKi=lh}rDu0d!9S&IRT`#Pa9fSjwOMY$e25{zX0Dy=LP^jWT%uwGZG} zQ8QrV;}oFzH{fhw4*VG9PdzlLTgUit+}ND_dN^>5xEe509f016z*)c?h*2?Y_kn*8qXWeMGf>$n zj#&QRA)RA@!+=T%QvOMZV+%8yDh1a8=5N}xXzur}MvklW0agrB4-k*@K9hhs z5R?3e=Okn~1TFu99>+N+jU8(=s#PPf4p<-VyS25suEocg9e?Kf0e#(#O?@E_fnt*gA9&6i}u~GdGT3i7+u=m=l9=$I=BOlC{*AjEB zqG((Enzb&xz!);1zwzC7{LE?t$Lnf3)dToBmdS|a{|(a0oBS!Q?{@6K{Xiw5?hUPj zIkXXPI4&VzGAdXM$G@m_0C&n?*(Zrf{>r*WrsFLCq)%Wy=<`^2_fnb zz|0*`ct0BWCNKwLkU#rc@8u+9IV4s7Mf#gIZZICYzrDF;*YCGjgl9W8bLtdh-#&^~ z8z=*g`|ucq-vX5%l!)cO0qGQ!{K1d$)#_ED@9N?l9Or>J?x6|05$+`*+k>Nk%7sZ0 z%b$z#DgRMGB_v(`1rzJntuTxX2DQ4jN#OD?z6CT}UDL$) zV%|JI>wR}Y7#thOfr#b54ha;T{JD4a!8_YTB74f8^O(2aaD9;dm~qRW>&Ga64pCs=nWqFn57Ug^UJ8n11 zzWg$<0)DLW--+?izK=g1tL&*qj(K;y=dK|8F-@ICEPqzUKLW=%6^JC-AMVk9vRl_s z|6G3S$lbTJ@;aA6DUyig&pq~el|TQFo_(^X!8t9zG7KC3@h+W>jT`t2st*y%pZgdn z{|}rvh_n22Z3_3lgc9P=p)7z z)q=0FlOA z^g=(+{g^Syf1H^S#Usk{&+*{N>%RKRxVGM9fyWiN_OLg;wO;2r?ZABgK%Datv<@&Hze}S=3|G$I zL@fX1kbebSV3Waefoq7C*o>75uLYv);Eh))sN?y!@?+ zN&XX@@)oB2bB!BiA9Os8{h5+`?l#zV1p&5IJsu9Xrh@y}rhfQgX6_(j`7cGjihz;J zpJVvOh$G(67#r2HNC z+AvRk+n+0IR5zY@s7t6Zoi@#HG?p(RYg#ZEq22?2?-qK)*XxZAcef2Jf6AQul36Yy zlt0%%QvQ>ic=s!RmR&#m*~4=E)tXft7V!jrke>x|z0U7}Trc8U5BBWYZM47RwovQd z?fiP#J<9(g@Eoc9z4&qSZ{FxigZ(89U`O;t;IU%eAl{3BEJv<7_-gfP9&?Vl?M*ETLH-ND=n23N zof!7p{sbvEEw65jbyD-3SdiWK!ZI58KUsp8Ebu!S=s2DNKNC3DeCzd11NV(}^XXCk z7l4_(%Af0H*{{$5F6QJqy}wD~R=y(4sX*oVVQ|mDvc-#xJ6kpn{BNkE0}uIs0cI$F zx7x_1? zUCa1r!UUalf$UfEY#H<3L}h_jI3j!scs|gxa`9|xo)r?d@21j)hy3S*Kc4mB_|1x= z{PT>UNgs?czV}|6%)Sgi%I7LX?CFGf<$#reoac50o;TFu>PC_4pwQ&c@vt`szmhYq z=pY>apHu<<#8cP~0T7ouxC+R%HjcnKg->V9FeoooIS%UPA%A|OSpM0zDj~}9e;MX% zM-F|{*r#{SVHp@Y)j_PjoI&R>U|pc+PxbO8iw&M36;$5#c!eT=t~+D7-;KFi4Pd#i z=S#>QfkCf4@CqRJe7XYHyKjDC94Mzb+ z-~sxF18)Fw?YAq;`Q(#OXGc*7`IJBVbDV?HJST&D5wy<72&)F9a|EyzFui~UFHZ2@ zuwh2S>X!s=i#+5%2kEl>PjyN^O!@D0-@RIEnvgczgL{Em=fi}RKjR~<3c$`l*G7?T zCf7)Et(|C7{Fol{pN;e*mp|7kJl46Bxt|yGy90M*GA6%KrmSb4ol&`RBYL_b+O|w+Pb>7`T7$C1Wptq+Jo%0k|LN2pl(k zb>Kj(@A9{9&!hbF-`rLHTrHf4XC$@py0?xhwDpT^Yq44!j%*><(mmm=xqg{(F$Q zmw<(M@A5I=t4~tGM>;csNtS=Mv9AM*;x5lY>4UeUfWv`F0LK>p3Zxk~ux%X(O!O|b zAbJ3g#{vfdUHhi+4+}}jpX11*fxgD@gUBwbIN+82@;88S0>8T~|7?fi0?K|O@Ly5M zCJ8#=m;Y#g0(#EhAWTqTzyEmPP$0(~79Ks5hhjQ@LnXjb5PNunUdd`fNIzW z$jyQG66w8IdM|Q#uPC`!klxEn@8zWTl>A_ zAip0YxgUDfmB1t^VA+B9@>>tQ%NnY%|A2du^j`eK0rz5Q{W6w13J(<3Nz!|nct_FB zBqkSmyk`XJ#I1n;F5A-swNSOpC$0kiH~39wIY>`sSg^%V&eN$Xx zb%BxImnnEunMmtGU?*USgb(0dfR^CeooUqX3Q*MGd#v`Hk8RhFLG8fD@x2Vx#dr?AJz}XPF-8bDc*Nkdyy6UK!*% zAI|kJ8utQlF0QuBbCmC(&9*BGyyo!7jpjCo9Qd2v#Vh|zhce)~{2st{IK@%sThIdC z8|`Ta%s zS;!u+5dOannrAs4=rp#c<&TmG-Kry}y{ zWGeE{@AN z0;gmVfhDZ|Mf%rZufvwj-`L69?S0{3&z`3pacbKMiFBPzMgG}G{g<6iRQV?#H(u3H zXRUH)&kWlFfae-^zMb+d+@s1r&sgmH#ABZQEs-wo8_+oC=}ub~U9HIbB@yI*4`}?` zPRC3C%s=6YhdOJ^piPS#9nZcqiKWkXXzH42$rEudw&GM|GrAZg=1k>?)R(|59S|E>q{ z$NEUQ9KfDaZk^~0cSZiUgHGi6XI?hrtUBGjz8p*BIny5S5&SdfYZV(uS?ne*S~lyBj#pwIlDC5Q_%s{E54?*(d5 zy_!~C;MrXtO`IUua5A}em~*N*<2E9nPNpLN--1r8`DZ3ptyp33j07jXWOtqu{mHbc zjOGTilz`E894k7q54olgu-W{D2qDeB^)Zd+!ClKcG(WMaGKd%d|xhApe^|Jf|NS zmHwwqo*eo-!pm|0#p;!uI`D=7`RCx&d3MTC8gA*sawZ$|E(&X?B#N%k{|QN^O|{{j|{3j%We+&zeuLRcR%^(IUc-&RZhq0y{bmv zmiJ3I#kafP-{y8>KgQk!*!}HxMgG?#Zs7cL+>c|r_H4nKZ z&n9!3-}?w@WyWyje2aJZvpwi#=ZSXCq2G+TbU9Cc-WB;@1+tOlpLamW{SjLp*y+<+ z_l0offcLst=syJo6nS-`0s6lME(pP+9F>y`IqL}J06yM15OKK^-%+|Foj(BeCq|qzu@qiW z2|FIq_N1R(owVSxFs8HNDjvZH^K7r$}%Bi+9N9UEczdBG9{;QEh|A+U8E zdDEo{zPS#96Qyj+{Ngy>bPk0(B!M5N1S(pG5C{|9ZS&NF@|KBT(ex<@!Yr}u#gJj>w`|5zZ`Et+uqjq17A7y7aqWPuj{97kXt zT=ubY?A~<@SLWCLj=0AFIX+;55B{$cacDZpUyOtBZg1+=0bYfBp#7(a_d6ihjhWzs z|E5+H)9~V-`Dl#sy|U%Y_WgxJoTGu8fF{JrKl8wQ?l*4WG7BZ}8zG%W zWG^kbc7!MY99uI%lYjoBHM63ahK~G2S>n1QhxKQq+a8#i$IIn7+XZ1cevuJ~CjZp; z^}r1H;h*`q`MPVI?tSN&%`L!eMjdPjcNB0P&;(8X_aks9{+S1^`*GMuxd-$c03EnK z;EXW;3*@}72|oD0LByfyB!AvZCCZJ;ysOnsPWxf`O|5%?Q}r9du>Z3fXo4pH`w;j> zD~f42@y|JHuREN1&$fde*sfGkbDnmEKgTdL<2IW7bD@(K|J+N%HG;g;UL}9JaZN_2 zc9^GB-_yyqq(Or#bYkqek11rcFtog6=5~`=l?=W5r?LZ{6+ZH zE6Y6R3b_x@p+0;JI!B2-;Qg1t#e%jb|2q->CJ~3GAO0Dh{n0Bgb)M_v-k~=Jz3jC1 z;2n@K``s{q0bB?)Au0Zu*ph_{joKGo;8>QpKJuNRL(`09KiSWC9f+TPJpB(9`692g2Vh;?NArKjZQqQm)5z zs?*$mG;!<)3~C4V!}w$6SN@Ul&wbXN+ui5LyT}vQSWo|$RW}EihfIU3DgW(=!#-jL zg2&-yb>BJR{GEFVf*y6W7eW_R>qP`^C7wVpUnD z>uIv1$^Vuh{Ii{8Tj<0)_cqJpb?iTQ?P1`*^oFl9zrThi{~T|*-ORA{@RI+`sZ$Kz z3Gc)^%LDi2s(^bC-0DiRE9x8UpA&rWe}|lwBmdY3vta&w*M34h>z8C1$><%oq2zJn?WBNBvQ+ZLub}`Bmz*khby9 zO(5BZbOkuc->JONopoXM%o&1&F!??01;j**dHm=XVPEy)f$8QCG0%V z{=s|iGKc`iyH{9znvDCmz>G@~LFb>q%-F3DKFGs;KEjKj)Y~}{3!z^@?`$CH`hhhF z?3aJ`S&Kt6tRMio=L7jqs|%|Uuo&3Y2Z~iS3J$_MfsabSSAat_@Tu@A9-qAw7Wh|l(07yP#Kr28uHXMvbQ zB*a}wBAU=ngc~wofVuyPd!Ph1Yf#_#a@kT5L^hv;MSGosoEOAfK|*4`l}L*w_dwa! zMr8PVzIQKWACuz)?EBb&|Dr69zVDDioMog%nxg+IOy13~b`3v&8E7xwocLp0uD#*> zr49J6e?QO{j|jh*bTs)ReG}aHBab{|a-%esW<}cv^A?~sj|jVvaiivsJhr-~NoK5! zX;{Gd*lU1tF>`!JxX&3+gFlv`2N;&%B|lL{Zo8qGYE1^`%xXC@C3zs6`H!fd0?Dg1Pd?@jK473fakK``d3bI9_A}jvc!0 z1%&@B#?g=;`Rl;21eN^A1J4rTf2hoxc<0>N9-LWY1OC&TtP~y`;Wv}vHTYxQ>&UPK zC;sSX&c`Tt9)t`WUGU;jPm;9A7EWwLEh9Qp} z4^hdHWs>DUF}^kyQGYJvi1$gPrNJKywlDrjm-7W2rxtZYHd&9}7&J)5Bl~#f8d{j+ zNk@Y}HV&N_mY^fQbjb94fYUki9H$)l=9_jN`7P)N{3-AQ($U~=CxUfmSb`t^7@p^U zJDmr`b6r1pH)~9XQOM)tz(n}txp7(jE^Rmsw8g$_|4+CP)B|Y*M(sT ze&n}%_bzYK}{TKYq`B z@wX52WZgTJDBBm#n>4OnQ^_~i_3LbS`ApKn}Sebxrgwq9+`$!qZUtuB8< zhYVKgl)Mdkpop+S$G5C#R9L2na zNpi)qWk!Qb)MtTTSMM@o-lw1DlvUgR8~Niuq6sSgSY{YURY!Ywf5bj7!5>4;3$xuf zf$Lm&zl|z>L&(wYZsTtYh`91+k1yaT? z|ChYiK?44hvRrA8w~%jyKOFcB&;)*KMvoYgl@`;!`{tW)?(+r_j4#ZWE|52tCtth? zxgs8U901J75$|rmbp}1$0!V%=xV~ zIRZEW$o`2NE`vYw^Ggl%wQo-5NA-^Meg^!V2l_h0O_fgUZWYqI;8W!-vz%q7gjr(l zl24_IEwjin#rAt)RHw+d$3(-6z8PF%gg7u!+D4K&HX}W2Ql58pPf}9k}05+6)V#qcjMc>2pqGz%x&0 z;l>S__F9m+*$)qh#5phgL(a^iJ7Ek(oq?zL#ygkg?=9c2MPJ(X{bXC)SeFNc9ZuT) zkuRBchr6hsBVOVzE z(&zWEFT*(HU&t+eE@r0d&M54k^2iNGfWP@YbCEyOe;VkSKKU^3ox~WQ1pE%3=)?g0 zhA^y4`Ycb%^f?x%`p4rxgl)XI3^bHyQowx>&@FxTYo1{kyZm{+{;IMS#^qHiXO&&b zfn%KFpPq363xJuuZ9*P!dx@Sd`KK_SWf)cZbYH%7iBVhekM?A@%LsriVq6Ye}VB`(q~5S-TBk1Ix;W$sseLQmdeCK%5xY7KqW&!*0Zu;K^ zZ?lZ(q|g1>PGfxJf%AzUPnyUiv%n?)I}uPTeXjlX+DAx|6-0i_q%;IXLg1Mm;5t*vyE^{pYu+tHSevkr~Es}guwAnJ8$OQ zEDP8yy6T_f7>?<)jpZG;cG~=}=NfPs`aRVV}dGty{c7kw?_LcI#U0K=?`RNd;0ctY3Di_+Zvgkh^j z>2E_ct@N3XHLLimn*r7vb36cM5pX5Y$IAvk&z$<2a?ya=Zv8u zn?CP7<5;!?S>IQYu52RgX}~Rv<8bf4+jgIlNv}1vJ}to)tpebzlt?zmt``58CC(~y-TyG}jgZ;t3 zJEZ}?&ZNQboZ!)mKErYDMw(Yz0TM;3G~iwWRMGzd&gNK!oqxec>Am;J^O5Y>dI;ps@9ea=SG`Va13me+&u zyqS+CuqdU$fxgLvo&T*{wiw(8FZkvE(~Kz}n`@@!^O88fChoIV(C2@o`SU5$XZV|% z960-m^LCTRj}vSfyz@eyi|3dR>x_av`w=SE#0lg{#a&> zE#6tD1_RA8pjsE^o;hUE=l4lTzyH&H`BOj=><{LwF^1buf#$b^=bPBiTCnId?gv2J z+jNb2KPbKGBaavG=vSPU!zRs>c6mIsytridEA z&K5_`*|ozI6Q`Gu7jsV%2T(b0B>G{M(A`t?!&v6$1Lpzf0NIyfALgCbw}vwTQ=aH!R4a zM}LlkO6M6dPdWc5aBJ;AZ@kQ(NRMl5c$TsS?3-rYF$Q}p1wB^m2{JvN2O_?4{BK{j zWU)oktQ&G)qosl#`!QMcc-Ic+#RQ-Ac-~6c3PE!uUieeMGIXPY-hQ}Gl=&k)wi)~f z6*Tz`;JP*o_|a$E+RTC8Bs)FEBTbIU3!1j`YM(-orV4uO_bBO+CfDxE-x%)6;`h>m z*$R5>hkU5y4`U*{Pf+kDO!h%ZhoGRxwr{eX9`pKik0&y;*q+LLz}v2GX7;Ca>2V#R z;HOconpn%Z-rQSp_bsh5?!32=ca@27R{dbV=oz46viEzTS=&|3BLyvuc#p$t8md~c5 z(Zc(2z-1iUwBG|Q(VHUk$G(I$*2}thtDq%JxcwQpiu1TluQ+hlxJBKey{kGc05pg zw@6Fz-QxfEQs81B+wAE;r*FaK@LK^~4is@_ygG1zxvq=#nB$88(#ko51a6JF{*>#! zy5jC%3uemo-<(H9n*f*%w72zFa?JqCGV8VlS@G$|wWe18i+vh%4+q4+wzz>UKFiZ5 zBK;`ogSji_d!cshqwD+#CCsM4cZxn8};)ku5%zHQOGa{ayZZi1=)`-W$eZ zl3uexcT4_k*R$gD98F)ErVh)A# zXxtAa#bg^Qo;4r{`&FQ^pS&_G@45vrKKslvaJ)xZ>*3BwEVBaG qj{g;Sii8zd)|~+1{s}zW!ZXX4p?v_Rh|Pe<1Kpq$;U^s!y8M6aCO8}b literal 0 HcmV?d00001