From de09cf25b8b1ed932f38fba635a23420b51b48b6 Mon Sep 17 00:00:00 2001 From: MeowLynxSea Date: Thu, 3 Jul 2025 09:17:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=A8=E9=83=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle.kts | 19 +- android/app/src/main/AndroidManifest.xml | 3 +- .../reports/problems/problems-report.html | 2 +- assets/images/logo.png | Bin 0 -> 89257 bytes lib/pages/home_page.dart | 4 +- lib/pages/player_page.dart | 220 +++----- lib/pages/square_joystick.dart | 478 ++++++++++++++++++ pubspec.lock | 40 ++ pubspec.yaml | 6 +- test/widget_test.dart | 30 -- 10 files changed, 614 insertions(+), 188 deletions(-) create mode 100644 assets/images/logo.png create mode 100644 lib/pages/square_joystick.dart delete mode 100644 test/widget_test.dart diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 749fe70..8fa1f0e 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,3 +1,6 @@ +import java.util.Properties +import java.io.FileInputStream + plugins { id("com.android.application") id("kotlin-android") @@ -5,6 +8,12 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { namespace = "com.example.marscar_controller" compileSdk = flutter.compileSdkVersion @@ -21,7 +30,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.marscar_controller" + applicationId = "cn.meowdream.marscar_controller" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion @@ -30,6 +39,14 @@ android { versionName = flutter.versionName } + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = keystoreProperties["storeFile"]?.let { file(it) } + storePassword = keystoreProperties["storePassword"] as String + } + } buildTypes { release { // TODO: Add your own signing config for the release build. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 71d2a1d..6a928d0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html index f888738..023a344 100644 --- a/android/build/reports/problems/problems-report.html +++ b/android/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bba84510e0aa606e5dccc73a163a2feee571f972 GIT binary patch literal 89257 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,vUU(I(8B)|AjwO%}){;d71nfERS+y)%6d}#oN2@ zs|%zqdFowJ=(V>W)Q{nPJx+&_+tF;)v}W(zW}M|BLVDkv8J7x&dh)n^-o<5A)fs$; zBBj2{OOo6`HXIY7TF}Awr}Nw&qsq9lLC?Fm<_lwmiHOCD9<;t=_ zCMP9_YW!EsD&L=Uqe9Y8?MS42Y+SMOOsAwN5*+Ir+H4#SRQ{ixz1WeijLDwtZKxy}5iC_Dlx%Uhz63b=F852CIdG%W%2uOl(Ijl94VLZor$2=hH zPY%yXskS!mk-S`qmbspN5}%fMs$A!#{J&E#P{NSi82;bsLd=w&-d!eR)${&=m0nlt z?y2dJ2HqS;0DSo92Knpt=j+{2lYTBus~t~5kvRiFJPG8F{tvF-!e%UlF1&WNx-6CK zW!+bw^@KJUu=0|(9l>sWnTn5Sr(y}=s&EJ#mUkt@q&Y4!GPApB4z(# z2GxBb%Oz^5Z<&zY*_O<&Jp9_V8&Iq0)=4{2N^qwb9#~7{;@owR8~t_LIaDJ7R#fj# zSO+oKu}HY})!**MA4QBDN{0;@C@niY&O^^aO7O$Q(9z(hzbl5T5vF6bBZ_J7L~ zIXGes&!vcJ`{XAuF+3Yv@k%H*%EuJX2PC>P)75WsNB@teYYdOG>$+hZ+iEbe z8r!yw#)DGr(M0N_}20>1_#^`G`ys#)m{LIUY*g+fvXOxSvP-C+YAu>eg!` zXOV?VEc9gDZa9ALiaY{G43k6A@{>?nU)`}+5IOjqKFLar#=t!i#awnPfY_!GBX!@S;Veqs6y*0$xQ(QVtvSx|uI-0;rB z0-o2l=P!*AY3gCDNHr^23Nv;tCaIVQ`_Z)IKV+Hj#Nqau)E11yRE%MC1^1XtseS`qljd#G*W;(s~{o8;jU_j(whj7l9S~ zw}?JFo%q-#mz*D1?xIT9*kE%JwNg@%QNXiBk1>ctZ#bD%?y9)z{V$L-diVgb2zz@f z-H$M_XBXg8o_!Prpsi!jG=-Ap#v&r&L-cSLH2bk;kY)zf?8Ju|i`i3_oW$n#s4Os2 z=-vJPLA)}Yx}w-v?9KLc-qMH&;*bY#`AhQ?UpRD>ebFg4sG;R{Cy$XOO~nmYy5u%= zlwvENYLKmo`Gv1(r$7jx>-uku7BjQAe~W20!6CcIB|D{p0RedR+RADy58%{s49;Es4I*`1^w4#YgJ$BFk=3~{T|S6}blL0oG}BuPQt#$E zxfDLpowK_Zbtl9``PHzOu%tONfa6h$wW)yY3B0q|vX>NQJTtbVT+%3+|A~*TJ)i%d zIFsp08i{VL2mD9Lnd6d;DEpiO(x$6!m)`9LU31QJ>}ulzBzWGvYCxfn8&~hD2!G!P zSKt<%2tGk=BjLV>*7MP#oWlcH;@Wiqi;jy*KU|+*QYOy@7TclG|6&VqQZs4NY1(#JbI<~6NXDw(Jjw^a{D;ZnYh-D&G?;+K zq~*!WHbzasK+JP}ywRBDn0SgbL1utM#NP<_=E4^&hy;{ctu9~VP7C4ZKPHpI782uG z?lN|-N&Y>wJs{l%f;r5`6+J5y+SJqodn5xL^j|a-U%q%tx}9`j#MReAo@BzE1k5^E ze^IrWQ7N2$EJG|yXz>a-F}S9+ZxFgPW!b%(7qnApoMF@~df$*2Cd(mtyFFMR$U7m% zXA>%yge_+R^3U1DwQ5AJR{wtWuh@3)EZ0eK3Jmy(?WZVI-YY%rBmP{t!<}?08{8Xp z+|_0`@15%07LvCvd4Lh^Y$wkIM-i?V$YNek(SdZtWRwg8aF@cE*6u1rFUb8RYsY09 zkpd2S)eAJB@g^;8k67tY7Ra>=IK&ND>%Dyae7&s1zW@0K3Y^7(e5U$WHnQw6d%T># zszp)n_|WZjpPf-(-?5`%*yA@n4a(<*^)E{rqvYgFJ~{|+zZPbNHu<#&by9898(@Ku zUKK=?Qk-w6o6dw80S+}OtYMW11JN~Z+iBM#;+|UO=DC}f8XNU6yJcgx9a%nX2Qd3JdC9Fl%C^u`0pt46kkSi$lHwpKb={O*;cp3>XhN^r; zA0$Ax>fWwTd{YR0@=+yxzjWp&dg|kD%QDSZd0{RME6Orww_pE>sxd)ImvykMPHjB< z|82}cX@ic2r9Bortb~-8MeFoWD!rp}**cysm+SVnfy8vrVIe*6~fr zWw;CHs9==+5!7Q_n_a+5%9bWZIXB6u?x8u7v&)?9XjIk-H=!d+A5qjD`#h`+-F)jA&%cj3VEj`BG+TtbNXX4IEr};Hk`6A zzob)(&C1Bv1d>Jy7h*qmb_Zf4VY4{gBn*y70T?%2{e>dW5l zEE`*pnVYt_5EJS=v>R-gmH=a*@fZ<_(w*xsNb6XEW10$EKvu zNukXdY(*k7K1uddq3-{6+hNTfx%)Kixc>Ma{kb1%s2zBp5im8k`7_?JI$=`3waW~~Vg0hrF(z!Lp(ai`mQUbXefwa9Y< z_idy;AOWi>ab2S*)IOz13N!+{{4&PCkzjE3^}*|QS1>NF=W*}YnJrg}0n3^-GF=mp zuvM*)ZllUk@W`@wc1c-Nhe~;z0e2P@KRd){=bvispkBR?zuuqoy=6js6ixPz(K%Q0 zv_#mn&$LgMF&>7u#@P83FZGSGHY!2x3J?36^0^HDJ7M2bEoy7Yn^fQ_b#2EYk|dYI z<4i1gkYKQLwO&p9d0Afn^w9R>>dZ2u+wVF%gW1pp+=I_2Z5x3rd(ve+#6}nWOq(es)o<7nmA@xbDozO7-OUSL-^5)ncM?{f^9nWDa_A8KcmDk1 z|G@x-up^3H(UybiT*3(;(XDiqyR|CdVScz(O1Js9w6$jii5pK_rlYRD7Wdcf;lK<= zDO%D~oMteI{X_xh(zU832mh=5(EJ~q_Pf;OF1W;6Bae32)5l_IW%cf4RmkzF3Bht4 z9jJn=qxk^N$2u0@CqMM^n56Bjk%?*#874B8hxyyv%rhH3z*UjPZir|xnW}Ruk7*A+ znzLqU16`q14bR^P2zl5&@#4(V=Do&%sO!go=kl5?XO0M#XHakBrczwj2$&1jGkbRX zJ;&hw1UHM5?3{B#Fv1JKeF~aZ{tj7QRF@fUB~`TO9u?#Ke7BYC;dDOdjmgv2tVDn- z_qFshF#mRT%*%a_h-loHC&%3w3^8b;g|5VQyQGiH0na32 z+fa>_5hco;<8*crVM>F&2syyalk}42O#5lX?qF8q{Q0Bix}=m%hO`s88H@s&9>cgC zISoE}e&ZBe%!3UAlLYS}fx|LmfAjYr@q}y}y&*lL!P0Dc{Q}8oha9%HkR;a)d%Ep@ zqefaCsBt=Th$1^jDAw0<5x!la6bMzv#`a@Dv=zq}zY57p_7c$F*DPXGRD5jTC;fm@ z@E?dWfzct<`tJkk9P~9&0R7NYFFLwDWjOYY^-u(!Qxs;*Y{^9anIDm8?vHTuR>oa~ zpGUYKx$m*NpT^DSA3MySz-0^hT9%cGX?v@>3y(AY(Ty7n4)GVh0xVT;gzn{zTgqTxMj^h zM4>n)Z7;|Av&6G6yJ~6Q5-i8>i7CC0ysjI&nk(wplYPsy1~z$|PTBiiIZI)0c3DjNYXMxy$qMSU~>SI%^yd4Rp!mk4;jit;RlIM$;&v znI5&$bG1Si4duDc_LG9a?Zv!C{ajJnSc}`fNY|x*ZM-?SNzd7g)&e7fZP3%*q8t;m z<6z67%`E5w$2Q`X;T!jl%}BG#fIof=`hW0;yRW`2hA79!KfUpH^3Pu1&IqJs-hcZE z5xpyemw*b-DYkFdVq(CG3pNM18#m1y)w~f3-Ej4mWByMeBH|ZIUHqZ11g(QzrWtvk}_HYoui`az$${$?mB&U>S}cwZb~mHz(HzgsIhb*2f`brZRx^AJdwP$+y2Ej`99VW--&HTO zE?MF67PvXWVU2XnQRlwVR7le0e*FFGps@0-ba0G-=)xU;4ID#s-){r=cjLJU`8-9( zku~s2>LO;U|sZK984o0{#aEXas@B_3%!losPiZUu9=?fAX)7LnR3!5?xRdJk! zp=|Nc_BLxv)v4l*oY*xFbTbf+@+%d!jEGfiZDS$S zf277Iu6#l5rrG1UPet(?S6?W;F7)^gZEU44nvYm{SgpcluvnyfTCn~WJ)B&{s%Hre z^eJtfB04?fZ3HEKh2)r6deC;aI7j5Uxs94Vz1qPZ5TB!HGMAX+-&=%{`CdOqP{&f- zO>Ht)JnlTaeSEVJ{XqPA~0Y&)Xl(5l!DbW)r523sBUqKq8gOZ z-&)XUhQ0{OMm0Q8eBz7CQr{VN$zOx3&8gI>SdVl5_REbq!D{93r5fKw~sVoBF}8poH8jKLKEt7Og+ zbCD=iiFR*A_i8H!rstIhDIMR-=OGjV4_o zd~#do)^Y!-rSBHEwnfr5zB-54K6ecSMqb;le2U#Z?$guD$XZ=`4jyTafiC0s%L$W{ zwj=K-Dy51n6KL~mcG09a+~HEMCnknm`a`SkWn}*AQLY%oHNbHFkgpvR(TOuN?Oq-O zQnSo!`L*1;x!3jY9eoc#(!~Fi%TX%=_M~SM`EeD5N~98gRb7;%X__dmxR6Qy44{*f zQ?PnPZx>>{P|VydQsJ5Y3zA!wGj}RS=7Y3*QrxN)b_drK)Vj@b`jM9Hu-%TeO>>k% z28;t+`w3hS+h`B^UM}en-#^2y<>B3IFQ~ghvPLTE=-VUMV>hzTl-L;GSdWGwRxu3A zhX!4`bNpf7lnC_}EwrCPC>lre*O?}|83>?@!`E5Gj*2R;ukHfrSvUNX*~!zjsvKk( z4m8Gr*#|vBtk4_`cmAadWka(XqH`C$P-bo|FN#lj{OIV+3A2$#{d_ZZLNnxlqN~qYD$rjFMp>mpA|#Yk%hGK>V1r2jGFxZPK1q1wKi z)xfb7x+>$=e+y%@C%oCzTNp>tNBED?YI4Pt-LWZcF}?;gq)lT}1<|>{T*OM4pLHHU zTZh3vip_ecdzmLJi0qFjThWAdEuGECh2gzbWfYrva4MzCXEU>JFr92#Ng`+51)9OI z?@vt5TUI@&{9fFmLGOqaNG!8Nr!jhbs((M`NxsFn)eSMQcuH}M`ItY{T|S9iPBpNy z`tqNp126MJkDn~w`%DQG`l4*wWU?zo>%cm_{b2JR9ra#yq{?qHw*uoTVtp!o)e4%* z(H1we#k+H%M@vvn;NQTvI%aUJ!0bmmd?VS~<;d~r>TB}5!)W_1n_|3@p!alpy*@~C zWRqB{?X~pS$FDH5KnY??Yy zovlm_ZL#vGJ7NRM+a@AqP(jY*1U9&vXNzILU5~6r)6w3$7ozoDP(R|sl-pG9d6Yr@DQK;9L*ip zkyA~Od1DdNNnvn(#o0p1ZtEvY&Sg5Gmbv9l>_D8Rs!?pl$sLVwGcs!C9fo%Gq06Dp z+uTQ`73?ll&u`Ja#Km)^6xvPcaAiJwF!SU>WL1l|fm4g(tJ)_pb`TIDNl-}CE4e+j zj%bOqDG!cf$Z35BDYh^+ovf44}rgB^y)Ck%eUUh{}_07)`0~^&>PRuuq^X$nJ$D#s-&!Te=ALmpjQkiAL(w zg0=8tX>NE)-2JJUde5w! zut7iBdB_$tV~$m+V39{u=lqtLOD+njw0vn?akL(27gh+aI0*0cK@Cv49g6hdCbw`V zySXhDN4(0(3d)b!pRa5Wz8_1oexo=?pP;^HkyQO8Fsm}J8mUuUTB#^*a->*Y<$E|B zo4!xjb~yO!G0Lu}ZwPAd$!hQJFsZ^k43MfN2C_Mh0m!OE_RnsDZ%e;Z6lR#Uj*WQF z+G0=;V5`4cR`R|g_+3PW5u%XL@}zu?$mP*Pwu=}%@!RujGHIFN@6&c|rLAcr{J3`% zfOIE`1v3wgFghOkYGb3^+!O>_@Zyzg@Y13*t9o&I_AtmQv0{Oce*OGxAnQ;P?NH2? zijB3y^;zVfb6qnDI@PrX`+(2 zL~ExGDvnEPxNPfeC3M9`R#MH75k{BRKo9>O zFf+7P!5hH!4R#v7(Z4#Etc-kEm{bKHgmeFJ=&Aiz34O=9VHudnfqr7c%DnD)!oQ=C zR76JbU1;`N^14v7`kR0rU}sOUJY}e~RC?{S7ID*k|G;k2qU*p<53Gj1ZGH}X-T{er zF~9>WdIWT`WBJA}7;NJJ0`@o~6(}QG@tA4L!hc-!V}N-SlnJDvn3O?2)>0=3XQXqs z5wIh)x1CuXc3Js>s*0S)0oMk>s6P(-Pg=j}JXkKiYAWsd`(fn5Kb)2OvNcYtd>ZVO z2+-dia|~J%dTaa1EF#->2qnsLoIK%FDam*zcba~0%C>;tAW?rn;+iMqu*`EmSM?CK z4ujWO;`Yf6B@Qz*rY0 zz53%549fm<>$cq*3O&Zmy2WH!jdWEep&I6v7=Z$S zJAmwcg?{XW?2(2fWSfy!n27~*S%1zOGEmG?B`SSpsk`kDKV94oiaV}NJ=G~E-ESy( zXA0_Rue=M!*6V)3NZV2SgV%A-bbmdd{hgEFd(O}i-shn)-1S$+7g~W66W=TZZsS#pI!ldxebH}%+ zcR8V_-JXo_7t4=@ZyZ6^HeT_HckJg^+eFvy958cyh;B%ON9Q!oObZL{Noo}J-((-XQ!RD!=D{@<0Hx$3su zMzN)MSopjV=f;L?B#BNb*KSe5%Dvp%x}lK1F!qiOik5gekPOwNc77kN2A$5>pU1_Vbr4tE~4xI z?#=x#ZWw`r;rBuiw?8(tNccW|)bXuqBs0V28rm6M$5g*W+|8XKve&dfn5k#{e4Xca zM3D=iK8s$AFFaj0|LlP259)nlOjH8ROgX9iy;fd8k2UcBCHVT5ixe*wPEcF_cSOv7 zi7bo%S&v(jrMDzGw$lLoUhqAFlpm+IZy_iFr9_b|FfnlJ1%10FSGJ zTTyd0Dj88+c#Se|oOZvF=M6VH#Ka{Qyyc<_ywKcw4}s(rBr%G19p zkM&QT2rX4{X`Z)_#V8Fk3QljcB+}^F{KYQdV=#KTwG;su{#F z?Ir{3DaQZ%U-D25Pn!JS>Ut}N+-#1GEgexqMN8T)=~hvRW;ZGP%k3nuTpMm6mBud& z&m0aHvaSVPUu3!@TKN22_pR_gfU(afMIY z4BOl{Zv`fMy)5mxz706OH-FRz-YXFb=SXgeOyjEUG7x}7xk`$~OC8%%rQVGl8in0k z^?rrfzQy&X%9{W%WlvQrWu?*)^37-^kw(+zQrOE^h#iQ4PB?BRaHJ)i#Y=}?d>6(l zR^!iMO_n~H-nx&y>}NkrTZ_pDl3mAE&=j;|W75iqLXD>wi0CgfsmgXV6COzxeAq1Q zVjk;ah@Vx%mvm!Rdpy%os(~DqRcSU&d%m~^S7_m=jO$(?LGP|x`C!rqSVpA%HMH8j zFi#n`7M$KxVh%sIf}TMoX|Jw3ihs2WYQoZ=RbD^oMHdO!QH&w+VXrI{T}b%1vjR#) zF~`UO$oZfox5j?aE`v5v5-3oWRQ)BnSu{mHw!`r0ildZ5Z15!c7-`cqE`FgOuB|G9FJ42px2~-@9D#pE11>6K z-k`vy>%NqRJzSR2m-$`F5~Y(iEu^#kuzfEPpkw?n*?Xx8;R9yS1>9k zDe#GJGrBQeUo2M0yUOW zbHI|~j6W|T2`oj*K}w)0NVAj_$4jJTOKxFTV(#dr#u~eQ(~3!MM4{4(PVdPHE!mvX$OqVc;=iO`Fp3Y8sH{8csm| zh{!H8Sg_uBVdE?fvH$(xZCB`%f^(T5Co#W-QSwgt1^^=#Zk=KlM(4qvI#D+Y+O`%;gfa zZ9{5~S))p2UJe|*ZQ?k^wQaT3W14B@7us!DxA>S#6r>zuCio9k#)O-4MzV|R2H{z# zS%m3|WitW(CTv7IyhmUnz>m{1#5M;i_#EBi!Z)-u9Nb7Msd{eH8!09=Uf}H!Z1G+9 z<~|#QZTq=$X_H{iV)k)iNFrC$uR3^_z6*$e5SufZ^?56yc!IFY&-3>Uk^~aEbef$` zVTjTt1n_-_a$w><%rbUV-wfP4sxN(F6l)W_i|!{jk}uR#c#B#X2jLE4Y>V;+UrYHy zti(!5cLtvgqGY!pR3)F(o!iNRWE2|jQM(OJi{~;=9U6AYq_=De7i2r zoL6>T`v-o+*hgw1Z>sjAHTb4vv_HVZSB!SG3!F{)x%3~SRYt~RcJ z>d-O~<1AKXTD7&*qnOB3uXim= zdTrNV4&C|M+{(=ERy~MnLInLbX_`pA$aSLXGtsaCv_| z1WbBj+1I_~F{ybz8L(^rW5QKOwN~d~G`X&9b7;{@o5w-vpEirP&K~Srtl3nbpRcv{ z?ymAU|HTr<%ATyIUr#H-MlCa7WgOt(?+S4J)m%#9>V@gnhC}TQhe#ATwfxMd_-j|< z7CX3RrV2@3tr$3XVmCaz9+NopWoCAUTj)pA4pL1-+pX2lgX#Ycp$ILGjJ5>{sl!Bp zl+vTNt$xV~TT`q|(MX*Y(ub@hLxy9cUbg5@e*;~Otk$g-nVcA{)$aON8gh*KN(SXO zKC2bH8e_p%D#L&vxs z!+2yd+uFWELy;V@Ka>)~O;d{r^F_o&=CW!HSSI(@0T-I6>SU4YX17EJaUXrnztL zO{J?{md^Hh3ox+|Ld@LldiZzu`7k1`qbUX__#OIBT%k10Io9#PI_xZyX711W4(`pX z*N=Zc0;|aT%)q9KdO!l)-a+I|DScLfNPMQH1RV~HWBjPqugu12akI8k158d=D1#(j zKDb%l6ioptLy#2}e#3P;+39n}H*Z;zQ7@No8Jg*NS7Kb=?nC@^+HC~bKe*iU(d(*W zs7J*`*$rTA+FE?Jv@+4~mCn6Ofu&u=jnD^C|PX#WJF=lCJ5j`eB0t6e};F!>Ns8vadx z*_iVu^0f_+l1>;z zekn`ad;>e4T^y!XFfrqN3oeIwHUumC0UGnCVgr=)R#jGr!s05zNLp9FRpC1$X&QAz z7R4Vrd}ORV*xj`QFkD>j(6NLwdv<=%oxUzH)ch)2xe!^?tCb^HiOgo~=bI?5?OPE5 zAP-dEKO8Y66bSH)Vs`Sh(D4waWsY`?&W3))KijrdcdhmO8QM==hcVxa=xUaXvLVx` zB5hMr!s6>@OlGs7*IQn?WMZ=|lyjJ6>u4{4gHq!6B>!vdS0)Ef^Ra%|(tKSDK}paD z&HkoWE{z_vV5Hs7X*^K0o8MZp=}Ve)IPjbc+_9_BWLxeWlucDUkIp9vy|}6dDzmqC7br%U)Kc)P`MqaZ9AJlhhd1SsF+- zc^Zi*Y#Fp|tm!S^gU%DRKZ=?F!*~Je-y>CO>+a9noo)IfRs3yqp)QSEs{;xA^5;D5 zW_~y#HkR@9^b|S$|GMw3Wfn8?*^f^ba%Zw78U%6qnwwrd(+dOzn#a zx<61!La7@fOqQw|$udu+e?Ly!Km=t+vMPUFYF^K_fds*HYCzCldntsJC&9_ZJBe_& zZd84ZE$0g7+a6s+<%^Xf|MtF=`fK!%2oQ0oG)~LP!;7#Mn4?TCK?`1PEX4cz=4b-gKk$@CKsxTx@AxnnsRp86OBh zeVm*h@9cJ)Ytph7S7LXHYN{BIO(caS&T@fmus43bGYvC#Tv|_MkUuxTEePdPii{Gnw)P;XL|HRW1b$H0lbF7qt zTeOwG!rh@|kc0o3Gx`UT4Qjgwr z6Ov7{OO6RDd5E-#t+@Iur%?D-7B@z1zezAd;o26e+oBT(TYsKGh%7mln4`8$z zQ9M5i*%B8$yMQ$EGBRMsvpx9L3t@E6su?-jk5`;jtl|ECWvi{`rWJ)hh*|3zL1Pir z;_vw;yQ=Z%abetuD!=+_B%ybJun#pW&dba@%2&MvN~3O2ze?!$%n8JZZhb*s>aYMYC=8!nsmxh4^kX@oJc=RJ|PQgu)t zp9Wgg|Ay^`w{(GLmqAjmuBY?SB!|ILXpqv?$m|fc7derer>{$01E#1I4@KyQcr))51C?OF|;FD z2&-kP`*sNK{SaJIT=v6DX4V4oCFeS3m#2d2F4X1}{n&yr7c3uj#C}%4A4z|l0`n?N zxmB@vR61uk&ugTqSXWHj-pIc;(OE%^E~QsqWfwoJG$e@pl>(G@zO)cbfym!z)fez> zI;oK`Ky^WUo4zoV&^_?K*G+!zOk@F5bH-IuzD#6?sMm9rXmMnDmGbd@(jxP=NDU|; zA|?|nLlwAbKX;wpX3pZa@C+d^Bpq$yYH?`>7p0K{Ann+{QeZ(Ei!V=XRK_S z2~*|{fige~)eFG+aee4R`&b{QX(<*I>bA45rY>rE-aJ*^_9QJuCdBI4>-#1jiD39$ zQ&%SYlP6{c7tqD zvGJG>*K@^#>g{|AKcGPZ?K=lMwwtw;>~}RS39YJsxk|)x<$l?m8x7aD->Rh!-+r~E zR2B>SsF}N9-)R0AiJ_v5u87_tRCU-lquJB2BkY=j&c3r)bg@lIwjS2V8`W$s;=Oz~ z!@JPtkoB0IQ{6lG1J#&!Y`!L9sVA@OA~XT|TYQFt>V-#6T}bLImBXhZZH+Hi;hr@ztJ z@I~%M-2Ud&N>18jf{OBMkpT1|T5Jz)lzO4piQ(TMQ?cBQmLFs=#HLO|4L;;7+IdIf zK8AH0fscb>*>ws!?woF6ZT15S?j;Cz`fC%wo)(VOV+PeT_r}Y=)SZnQIT~@o#MWO_ zI>-_(N5#L*idPx;Cx35t+Iqk%^UsPBT?#H>-;%BRAS_RgmP5Oq}->bVr!)7s5*4zS_QQ%r<;W*ec9>2>u20V!1mchy>_ zFU6+P_&gVACZdZinD!ynn1F4rY03Qp1C@uq6?B;KH1qM{3zHDp?nN}zOZAvRt3{CX zK_^LtV?LiWb8+>h);d)TIeSgZ83M<`xLsVfJ=aq5Mu5EU{AQTKiI84oREf;4qtcK} zL9~geIta|2gWJ+0C=e+yklxBN651*|6H(Tir^>mbl=FoX7CKE4$_2FZwYA?;kK9?u z<V!zz~Xr!LFrYoH>()g*S@kLy+9IA)0K~j&wHev-!p;X?R z54}+q-3@y|-NSyhZFT!OC(4H(%3AUiiOj}*;)`f~C5BYt#XFHf8_q65V;E(FChUwN zg0jsZVNgtTdGWb0{XFE38VpA`p}L>a(=bcIwRg1s5sh$Am&Q@gcWdFi(=5{RxiCB< z*@>7u-u$04+<}jf-)0a4F1z<0!A&Oe64%cwV59@_RbLl>k>d2|CvFN9a2c8}n^oCXYviCAM$TqY^xc+|Bv zyT=P>rlnzM@=9kXg@ zMGqvW^BzoFq9Y|v^Jv5SJu zt(#S#IoVGGNG=&*v-f(MUSl18S<7(b3rfMUw8qq{TJ?l=v(VPJK?r{Mq9f6$d&IB8 zl%BB`i?d<$Kr&|^M`j28%Cn)ORAd@!?QdQ1hAJD$nUK9<$v&ojOu`;eW zD^Z*SqI=gwU*^wx`2>u3Dk0`8S-!D--hK7+5jaKh^1h7EHY zsTPryckApZfHw~TO&m8IJp?^<_D@X|0xY3yt=3ojMtL{}R`#2t-?jrntyakJG0*@g zjJ)M?J`+3u+`JN+xosO`LnV(d=~5{b6D~xjXbYKS5i@ZW;%PGJZu2@kloXvm495eY zuOnw_q5zF$WmewM;<#swdhHAUfwNcK0c6Uq%suHqqR3H$Qi0U;w4d13MRkJ_l`JEM z&^x@PoCis9DAPCP4GQaEL0t-)7DnXVyjkshg0y`0tF50|OV#%O(4$%`%nGmCjlvF7 zg!bOv!WI|irW)>MVrsZkVv0yg2g$#OY3k{&=x^ebaf09c!VEuIhz=WDP%qs{Xl`_l z%O=CCwVIoeM-<|T0^O>xEWs-=QtYH~-zq=gh7qESqXrsrkZn$Be@(Kjy{i~PdiecO zbUlv1)UDmH9#U<_E$5=#)_CA{A<RHY}x zzQ?dznJYI3@R1>cThd2FxM3$9)^FlQ;n@4 zuW+X}&m@>|iP5v4pFn2U@ao*dYC?C?m^@j~5TW~qm$qr3o05E>Ck=T6T2aP)rzlnG zGje#<&pN<)1MC`i7TQw%Q}c?*oJc!Rc!t>{^?ih00vlRH#f5YtJ=wdCqXxSz(SV0N zD(Tv|T4Zek%p*@FOa7m{`LoDpVb_F$im-%)Z=nVZThM@Mdc(R;N@UtG6sheIPL-16jF{YHlFw3@-t_ zck-`9p=Xap6-Titt`TnEic`N`^@~JM@d2bndn2W6ywNLug!*Z`3cPBKFloH>^dqg_ z|9b({|Neq98PF_NeyM*ft!db>U82M~i{^+{w|D$=t7v+;8HK0kK8p~i(Xc&b`8ca3 zddg<(2!7`G*I$Nr{Y}U5ha8L*6&x3XK%>v#23Wd7MA&kRJRDT8va6$k5;=mH9m z>s8QL58ISD-}**3>$447AW3P4H>xe>3avaCdX6hEXY2J17_21h{k)1RKgG=V8M2mn z8y4~latrw1LBs{#?7rROoxh}ZS@tzm!%_`4mIcf_tc=F#T8qjHE0zroMIZUzcP@X( z%-FJ)h0i0*M_`En=*uh+)^>0bl*PYjW~dHi@ynG*Sh_W1H#q4dUCE7~LrSj=$W|r5 zBEU$hucpD6^ zi7m6+kOyLVnNGm0^I?|gsxpAL!JPwT9>MvP*Ac!ftQFI|up}tzk!@nM3;8JaBXk^z zgoCsDVgdZWfuLy$ZUrDap_(>cwrWNzZo^;R2hHlpMdq6%;cf7~!r-D>tLNksgF2c% zt$0rk?E2Qj?Aq(|OCNftnFVWKPn$gKqg(v)(tWLO`PbW#+Dk|P*3QtMYj74X!- z&^}niX&n0;PM;}34!}<&R2PgF3}?KI_KQNl4YNAeKo+9`no*Ah=OoJ;_BgPoU+Z(d zPN*7Z4Iq&TYz@!1pO59%^AthZ*8a-Gl0;uSNZxLYe>iIsikZY-!mUm?^(7l_M#<8} zRE-SJYFt*0dafi$MvsFT%N;LLyi(#U`LB5Dq%29TtSJ<>O=EU4S7ugwTrkG^`fua| z(SBra;NxYZj)X@GFB4=kOG}}uYWAN;?xY3J*k&%ep|;D<^U$?I%lj@_U_7S2@E^jB zWT&~WDIbs#UqrZuQv#B+HvPJK-8>IP$0}AlA%xY;H&GmHz_-LHoWs&x+#pwbE3ob}&zr{F+$9G(l#oFQMu%RfH?7?F8(p`ok_G&5KR6gjrh==ci{N7Y*{x zbX$xKoDZ7VRr@Fib;OgNu!g|am4X7E7%wZr6YGdl8X=8Ba^Ujf_;DTZk?;YmKT^P) z-jd~0Z5LEHMnWMuN#0Suh4&NW4z~xQlvI+#QOLNiRO8SJcL*e-s5L@WngstG zSyi$Ep&OuxhtZh|bs(%EA?PAJ|B$P>s?;3uXl$KH4?~2Mkb)pWplYR>q?@m(Di?RH zicVEZhEDJLjYgI$N1cb=c$sZqD~Ff)9^4$1Ht!~x7~46N!?hs@CfL@`>lxiXbKFs% zI9#y}`TQyB2A>(X(umv7lYHa}xZ(FjKr+;Y`>1BHA;`RN-aoZ=MFVk(-|8az~!LbBRZtX~B6p;lqayI5kCI z7A#9IWNX8}^tb=JM{@iPjYpDv$1o7ps*%VTqzxPpuA5qk?5Z0Mr%$4CvE!F?6Kn z6S6jLq(YSR3{ivtcBsrVnV62jZB}gt0mMQ1H46cKWpum&cXoi)aL&OmW9;9x92)?K zbLzy>440zlC_U3Q@eGkhu=$|vnxt{cDal!*_Knl5hZgeQc_6r_w~oHiaRkrLPdN96 z^ZA6+vf%u*;Iy33mxk61|MK7YM~~$A8y=4&`3uLK2ho0K8Z{qhR#q*-ysmPNd_*yL zCS*)gWQDvTqH-Hji_`9g@bPxnE-^+h1FNgr!yhcSA_x?Ups2T(xVeCGvBN3PHo%r~ zW@!@LBt#29{q1sOK0Y%LSwdgJ&jljmE&CrCNN+TdN$Y|LGx7&e#@W;ezMB5)B#w^(gtVPXk^Y z6Xj2t$Zl&w>~pC=@h+2XugrkwKnAU^_;0ocQ<%^k4K5diJ23PWvi4gAE0NirBbRgf z!0#1)RTqVI;QXz)Eq_h3buO4O;E-iWR5vp?laW3h(5B%V$ktr@H+GtG8qil@_=GqcvQXospp zbAMgGS>6pv^KI<+(bvSskgs3)%G>MnJ;)*DrcVGXaRnho3X$8qmiGmpzqOtxmLLgy zYSsaDoZ5n?svP^$@ZHk~EN6<6_r>s6{`PJ(eT7x)&WFFv!K*k*#$7E<$0ue3#au~8nGwP&kyW4|ywra@3+^ii4>7;Ul2o7WNZ~YQ-s#1Fby$m}G3{S{~+j^)AJi3m_>$ z4-Zl?s?wM6wv56m!~35p;zk(dLy>*WDBfmaa9G~8lIPir>AEu=Z!&K5OH5&WTOFyAO$F|hF81n3G6{; z@xO?4bvss**RN0D20+)5+<+CEa!tGT79mI_$N|j2y7>+&7wr-(U$d&o5FngNK=onA zPBWvwKN!p9=YedGc~kHjS$Z77N5DahOxZ=KjunUw<*r1b_fLpR%{ z@2*x_9^cDK_l=p^H$nK|{Of#v+C7{1@93umOYdk)!(aKg z{)b0`{4I`0lKcfj%VFbd;%0_u=a#i42-Cr{fj9;;`6daTcfG^GpQwTTI={ z2tZTFC!0Ve)NChKNOm{|BpPr~a`~x92UfXGnmw*P?eQXuyq%DxL0f==pOEeWCU8^#*rm#*q!nP=uE;ua>r=?-(2J6?GqN!BV+pfL3 zc^{Ux?zajRsuUePB==ry4a}S{& zrbCPs>6}%1#D=Fm+CO~>Rn9fx2v{b>8!qN(t}p@e4)=m6%|SIB1(wcgk|rN-&t$D# zOWtWo0PL@;cYq@ffrB8w+(j9HEO|e{sZmPs zd|uE>R<12T?-}~PliSf^2Jd)%)#d+w=(l7+*;-rSmYO)f5f-}P24AM(I<(1y&9-8^ex=U{sZ2+)?Efi2H zG&ifWBna@4*B|)U9t?3f0=+HJydbUyxC4`|y1lmqRC|GffL1MJYlhS5iRRckiI$Gm zJ`V1hz@JQln$~+h+V2#%$nNcD6}*1b`kgB!^syLrc+y+(EBojnXIQ$qYlMK!=*wM94l2T;TmI;`s*93xATX9$fH{KXnL5dYcpppjX zIM;Jhz2dE5%VdsZpE4aOiBLsk;)jif$cdfHlK%RrK;Unb@nu+&H`&g8h#mtz(V1cSd!%vRf48!0Cj2u z6nTKyzR&|u6ST%n%jD2)uUm;7x-agxt|qr?Kx~H|T}JlbHvnP_M0gFQq~uufH30bv zJ=xHK6M&Z$Ktj++gcmBo^xn}rkE=JJX+vv*W>nIdm2aj1X;>3zBXJRKbej8yZoS+| z__x}xQmRj;Y+-z)@c!(WiS+H?%l7B(ZK*1Nqb$RWeAM3ISg}MyM4 zOF&U>0LM8Hfuje_PrYruej-R_R*@l_m6F~pnj$3_kfkIPiby(v{P;5PvN|pST-Lxk z0zOC$na3MGkOM%HcX-Dm`duR+$N+{6x<(i`8$h)(`F4&*&fHSuvgDq&~L8)1w_PVCU6-$h(-k_t(0AKGgfZR$fHz6 zGur_x0YnU}7%dtDIt<*jmI~JmKzJtg^6N0FEBGa^@czBkN%%Wa{L{PN0R&*V}cH% zzWAwvCIXL-LFh{#6?WGko>X?P%IVr`Z$jW-(MFEPbTfyH+!3toK1p#41re0Z^W>~D z!1nPNfy)^9@iH*HVO;}j0Pr%(bxtc^MiP{G0bnT6?ypBL4Xw?B<@F8$iZy`_+9OE> zm2{-U1QcasrH3}C1Gt$@mKLsLCCzyXbqYY#LVo9?+=5$}lmHV}|6(1-%JWuEU;%J( z0KH%R-oTlnnqaX?kjmriss%_gG!vNWMh{|gUXg>y+OCFFgBLe)7d5Z9i80(60;l1hMSl1OJ*w!UzP7oPe_1+rq2Zg{&K5$u1Si0d) z{)2z=NRYpy@ko;I8M^O!=YPKLyvbuo)*=bEt}?Zf&QB+eV{s!PH5a<}y#wBon7aXL z92Po4=ga3~B4CS?kX8MqcKEt-9u>gLy0UUy9qYyM!^?^ncf^IFbz*{{iMZ_5+2l>C zCW)(N1A26cSqSS8BB`kaMUJq*cm36Jy)jjE?L-(`Lu(DH4a;f4-~0#v$0I@h4#y)& zzGED#ve*B894`Ouj_H1)c@6nzm1xZ%F_0UIQXoxWX~>nfLS}~5IdcqExD3j+2>@04 z|2Bi<1#1Q++*A;jh@2S`-=N)Uh$JA$rUH;r)768?>4fRqxT8WpN`#l(9+SwMq&O)8 zho8KH6SEgE#S%!7j2eyVhCY6)Doa1iwhzZ7Ajh?pEclEu2GAPBONFQ@hSNq(h9Fu% z(J5-7fpmu|uogct5@?wSZLqT1+W3kgkmY)lm50yvZRF&x<8$9*j8W926|1lG3jipz zt~6)v#ZjHK85KqE3;x!>|EL}x@ko;I8h(=`9TT`yl!#>IVJSdK(cQ*-YgYznoprkg zPi2#2QOd<|Nz+@+Yn+Y5N2So%hUhvV-JOG-$JdB>m z2n?tjp!B{J1+-`)8VO+M1$MLD6(kc8EAIJOWjd@Eu;$i8Sg(_m-XKJ;uVu`%%nT-e zl^jK)fKFhW8i|0{?E3gRY_IFB=w3FsPmfKu4V$bGGqea+?LqFLXoIIfa;0ygFj+zu z3@9`MGQbLvuwx#=SlfvwPfxptZgG z{u|*}4jCx}q6P^mgXRH);vx!{3oPi*XrTyu{rQii_0Rr{M!~tfB>a>Zo@m<0&rC;( zZI{D@7FAj8ZjKcXFx&ZglH%tZ!95eO>y3@cjhFyro9PjVf}%bY%>c8xELYDHxji3+ z3QoBaT7Y=9#pm_Ae%|T;b#@6T>aD?&)#PG^5s781OcN4@lmUReRY^+kr&Qb7y*5&L zx8nXetH`&4V+!o8=|i;EpsT~IquW8vr#{MJQ;x8q_lAC2@Q45ILloc(0w_Yr2i0I3lyf8?>oZU^ z3`N?$b4qV!l$#veChXqpEM6zCX*=u@P!)9SYz(z5^k;%9sSR6#6mst-=Z_UPfK0ST zy;_@M=BAr11_j2i=f%KOM@YAVM*m7u$o#;g|JN+6{^*K44~|E1)gW zR1X}^ib%jfvF)ZfEsX-)Lao?t4Qd@qWjs*Yp``M_jSjMCG|7oE1@-|o0)Seb+a2C@ z=em{ff?QR~M?KcB3x3Op;Jw5?@3v+*Eepmv5a+<<*N&&BC+K)VUj*x*zygd7cSus- zw%en6e8k;&B*||OZ|$lRN^NH3C&_iqO6I-e7LX!D4{d*+ho2I#R37(H$XX5};0GT* zjl7~qke}#SB@p49M}DMQOvl|s`N`piu&V~-{u%ZD?9o&TrK+zg?R)3nR0@>}029;# zQX)if>a()s=Nx{WL<~h6;obwGx^Y>fMCZc=FJq=(vQF3Q{Ief_If+{TZ*KHWNY??&pa9w;1}b}L(_)Emswz_WBS3V^? zqdX^HtzSQD*gL)VtU#C~<&|$CyOwiSC^+4qK_yYN1B1daUVcO-Hp<7k5{*gm`38KZ zb(onkIaU?f1kg&5B7*c4Dr_%@I&RygT|2aZSd<{d_E|nPe%UJW*vY98hD@HTLuaL| zf`9$*KN934emWjW@}1)U{cry`)^Lnc#aRavgG6z&N~Oj`AcyK{O30}QkmW$I{ci5% z1%T0i5O&RzM35o}lH&!Sy2`e=zO7VpOLV`-=bVvQl}=Dcl%~qDyYh)rvTYWnbpxMww5el^B zdfm(*fQ83j$5fS8i6?CeMe{_dQcqQEw)GA?K9SPM)h$1<#a*r~SFd%gW2??qEa4;VRQ)j=8+2V-0pG#?yBOv9kFSvit*Z6 zSyO5KcTAAHvO!o&%`Q!^tFYMa4c~V($3xzbr#F;}I|*h!9yn4kZjz8HXOgo5PJ`ko zKX*NoRB@!*rY)O=cILrfBXT2Y`Aih=FIzp%*n~WkpfWWk^GF~^Ii!4+Q_mxQ*W-~S z-#u;>W8~EW!esaHEHR&Ry$Du2?^XGAtUis1)zCvVdH?mPE0cif#+MuhB5YyEjN*FI ztzt}I$#faHCw`uR9089(`ofy8Xpka`>;d(kPhjDv7IBvWfx!>i+mhF+Gp#UDszJ3Z zvxH{9j7o+AXe*Hcd2MPP$;zMSPHXc~8<2>rYV9hN@^TZoIn&Gl03ZNKL_t)5v{4y; z;Um zy?TrwxBoI@L$a!H-lv-7-jdY{4(!z+CEx&T@@(9D9Hau>_i8b?0f~}J%V{lkBkeX5 zRxkb5d)080lF~bDIw%@oS4mYwu9D!ki8BT4Izirs7&eg%94yr`rhCTqbG{{52bf(N zT(@6^-vtqY8oK~ml5^Gs@)Q1A`6(*D!6Aju_nG}d9YRD)s1y0KeFrito2&^?2$W2rvOxxkw#I|7(*_B>e zGl=b=9jV7@Taf9L$xG_!3{Uv#_|rfAGq|(TVf&I?!Zy*rLPTu?@3GzuCOi6c4oWi} zr)4SIwYQTK4TNo*LC#U+Os=Ul1+RQ(5V+1tlkMdg6igVo;>RBx=cR2G9sN)FWNONC ziMg48ZgJbNe_P~yzQPn`nA%0NUCg#GvZy;k2NdL>N2LlHIz*Q@&&?wqaW5W8@|_}+ zj_Jc4G1&fzG|*)Ex*htZBG9+eU-#Ob{$~5~K$gFG%`XiuLQD$71>vK(e)O0ehZ$MM zt?ubNM`~ z$7U3NS5a6uR-Q5+Cx{q8-5ZgtQJEkUFYBcazOfxh_3by~dLnr9yV^9El?|BWXLT+1 z`{3i%Uqm3)F;dZjfS?hS+e=})S;`?~r2MQ4OhT{Ji6%D^*lYQ}@^}96qkHy<&x%Kq ze5aTq=Es?mWT~)-T!{xTQQjaIXH|Fz+A=9dOnI|ANiD1O^+wy2RU}(zHd|3T-*Z+C z*X^}8=VEsvd=Sx_0k3)6a7U!Gz-&o*)^F6=pY2J7fHMZJL#+DGHORL7#>*P=;?>X<63|ECL(=R|U$+m>f|8b$s26uPWO)O z^-DxsDe%e!H4%lX@YEg9b7-~B&gWYojrltwFR`InZy&mx79<2O^|{yef+%|@U8tyf zK&~mPVEW38BBnaH7p%CHA7zvCW%w)=qE)p;M5JR zH<$*_&(CND(h(74#75dtNobM}s@fo0I-uZej8;=MOLRv>V!e!QUWXL?xLy!Lc-^d* z&*AGX>l8^>u}#27#3)w(6Pqm0M3cQ*j->%_~&L|<7u-MCcT$iC?f+A-c~v(MJv&#N@#5?i5~ zMxYY4VVT&%6Hn(87TptMZ=_PRh7x60v@VowD}@@Xb}aLRZs3-bs8%l9oqV1B{AaKo zx=s(nH84h0f^>?yhapoA61MlNp?e{i-GWbVXWn|8MwI2*)uSj_Pktefsh$NB+csvC z-XW$NUzFrizS_6uN~Z7bDj)O5xoy2p-sEozm-7+7UGYegUm5@NfA$A43fBKAa&%W! z!kfS@rO>EzHxmJUbS6ZmIu>7|x$8Ql0R~qQJV_@>tVL<>*6QW^76sa^C zwgxPVqBp~`Fd2#pdTThJ`195cr>1BoSd@s}CUT&o?k!YRY;9Xrg*Msf98kgKvLYgJ zS&8oT!Q?a~!Ito>Ja^hm6<>Gf%2F;Xx7RUImXtqnZfNF`7?tQ82`$0c{a&aIm&hxH zBZC%dRW^R*Z%eW<5kRW?RXK1&AMuD!k4KXH%7{@Mx8&ai4JaMXd+nWL6`7ep#_I$* zLk3Zq64h>+9K%|@%MY>1J`Wp`yGQ`Qm2@r+{<)PNDJ-87w?KsMo`Tk8y)A>0T zClAtBQZLtVw*OKvLSQN%t$^;uRuxIIb$*keG7|%oshiFD{deRrhEFgIrSE8cb=WMa zl!Y6CSLEGRbyy^e*?zq_>oo$ue?7?=uDBzP@##Tel8C|G%i8P{LWIgeA|?Lt+mYNK z@tYNoB>5HbKmDiwN_Y&oPg1pF9V;^QYB6L-O0Fu+ZS9*P(vom@@*M*Z?1^xb6E&^s zlU7Dq#P+G40~CMJeMj>duz`7Ob8p<@c6lS!Y|cr8ln5O_zFmQi38)ws7Pj>CnsMqj zm*jO%)$QEz^YDJ@QtCjcbvRgKmHZO{c?HNopoiXk3k=s_=RTW_}bcuoCzY zQe_7$fu#NfFpb4kc5`E&0Ghg<+x`ElLe86iSAt9>IIL(MvtvTgSOOteh;apXt}cgB z{8yNIKjL>c9!c^mB4S_+Y!LKy9l#_tzY!Dd2wd-`GosXNaAnM#Ij%RrB=J>S>^?YR z(n;nl>8m3Q2v&fsVu>W3$-+_~A+##|$U;OJI=q|G4giQNZiQe)glJU_oK8lHhYBml zW-v?irNO!pwK{zl1&}g@HUR*EG=;XRG+RgSdqtJ$xRj7WI%j6?6t^Fvgy2J8Uxxy^ zd`fJVTqX z$Q`mZpZ;Z)iAsA zftn=CPmG@RelVpDB4C#@q_ZvC)`Q81HESZGF4v5(ETRF zOulBeT?134($F`S$$P|~&v+!sFN}ZmpZq~Yj191}{aJsXmE3I{e{}cvfto?e75{EN zSwuIK->1Z;Av%-eM!x^bUG*C~`n=+5e)||mG|yT3u_8<+6;Xq)1KtJdK+{BMz`)s@ z8-PfR3HnL4`<6QAO%%O%wANv*p|y4peNeXkd_{~z47SVN zbk>+Cz1w6N;DR^ZB#u?$)&fq0G~2*FN6-%dteNm|9?M`QDn+c%0L~^@J#jICsNvU_ zL$xfFd~1zzWfBc9FOCE`jTrxO<5;_-mQ?yD{nji`nf)qhhMeCi2-kMQg7f$z++0j<2)o@l02{#Z( z7%UUR6g_8)pE|P%?z@_C^Pr(u0v22MeM4RI2bTN$U&r<1JO{m4fsHTexyx~IQ#LmS zb_EeOGupGM&@$|uI~b4n-H1n${K9Zw%U|&z9^koEkw{h+$GBY(Qe|_n&_kQZj0w_I zp{>DG;Xx7U_2Pw4BG-8`^0i21li(>VFwhl`{rbEr3NaRT94edq2 zgrl<1&{(qYk+XgHehZZapbqE)paES4i=A+?2I~#IHB22<6S{qfwyMskv)WomYl7Aq zno|3;cWzR8Yv`@GrN*zya3}ZC9XM3mtTjk$P&0@-B7lp;byBS4vzz(ilM>|QzP*wm69PnLq9mbQ5t4{G!$X$1 z&+8<>gsyNM)IuGC7%Nf|Zlp_Gz28T6_v*rA1H9tzZSQBLooYPCy*0GO(A$FE7g$Ru z3{8X{gQ~FJAVw#Q-WyI!!>JimLEhwI=#?z3bwC^`1CkBv`hszBTrMjvE3b(Ux}(73 zpf2R4YP8=20Cof8H)5*81d{rwKM^V9bW-HNpcy-zAcIzWPKOT3@7Y1#yVyhtUCCFQGflpeTYO%9c zM!B`Ht65cf1+kB@|FZapCQt5vo)kf|sFt5Y z)uEE5ulhc5w9k@-U=lNhwSX;xW{Ra#4adYFjfy-{0s(>v-oYkXzSBkwr%I4w3EapD z#z+hYR+@WYjKCTWiQKQlA-*N+Koh(-v;m^%rv|Y&RCU!u7Sc;ZZj{M_5lP%Ps+U_47wO;v2@JlKjG0FM~5dl}*<)k?;b4Bm|js+(@wM z6jVENy1h?yq3rGwoTKm`Ap#8YFfSe$;{pudoY+?nG;1)O^B<$IbOyRwfh&})FAt0W zmggs|D--L*2V$K91$>QDKM^6>Pv})SjuCiydBFuMMzzso?N|lq9!R0plWN0{F9Vl# zz!V4*z16R^`ewOLgQNy-Yuk&qEc<;*ye?k=0prU+6wTg>`*SHlQi zt4Kh$ihuu{Ru!WNpX(x5E!sdHNc})h!N@?b=^FJ>tw2YP%ddY#>ytKQXiY#@$59)D ziNFa!7X)+@xNFMRG-tY#+gp^LIrdB4`vAtrnV{5UsS!)5LxOq)yR*$k1*yNSbtrn% zSx8)?f+fqtayxMZhE2zv*bL4U_2t{+kwYKx4)I8mUl?BcoUa9G-u`BaD%648s*`=E z-Ha%_Qvp3_l5EH^@G@46%gV*#xC$s2&AD2S+&P$&(7l`&0)K1(u3Lf}QAGCe;HG_^7t?TwFMFwJNP;n^A@V5@_GFBi3y%A6oy1)}`2c{v!Fwz0J z22?l_?$eMRYSs7Nv1FEwmc+6BU$h z!y&L^3*T)^l;6@O^s6HHoxAl=eZ(U^Cmu=i3uA(E@}|Xks~Ezc*DgL2X0j=;WK!15 zY)7@u7$cGSf*4F@J{*DExtE&gAy*C?O_UO4g-*0;#VHcd2KNgStvfuJAUy}nTOktf z96JUpD>zQ)Gtw?Fa|}21F`zxrF9UiRfGU2ttN?xlBymYcrlN^psACP?T4pO8@Ipgg zpIEBh1TacwjwnkCq%B6k4O+uuY`vaO9j7i7Fz+3`E4mrXh#2lu+}sq_3`-Me>wv6u zwlEU#o6$$IRU7t`J z#}OI3{r=9|WhNDDegk=th}hcPa+G^IgbKeW|LkA?hmYFw5uY88B>9EGMJ#Uq&C2Ll zIgG<17^Re>H`Y`_{%i?)}rjxu6JOfZhn2H!;eEiJ*xhVgN-Ufd|6* z+Tnpwwp>vF3;-Bo&RUmkaaTz+H4Hd9=AsJ>F`Tp{@-~GZKyqM1vtGQcnmQ~=7Z{Of zsSp#a;)plKWae4A;cR_oI=VG9YtY8?eO}I37Mdk5-EcDSvEpdjacYL8H*~AyS0dd_ z*;L#K^1Jnu=q>+`i|;)kj3N=0C_{5LLbrMKD`3=Z7P?pDT)od7b)EpP{YJCMjg)bG zziZy4K#>srbUohr3Fo;uN*Y@FE}i%laeGeZzmGsPqywQeSkBpw$3}G$aFmd@8;(aj z;vM3VB)>4$D7@TZR>FCd*Sbn$R-+3pDl z79zXKNO2wy?N>N3imMrA=M~`?C4?X%SeA}uS!n+xbxSB`Q8D&~r>S9#6jm(^L)jszb zOoKn*1{fh(hQMJygxz$5kdQ-0k1zxu4eME0VIv`ewh^=l6cQf~q-SFS(=Z`nSw>bk zLbM@h5P@Z5D~ucd3%(y`@2WLtX41%<>!Wtp$WcQ+n#?~>bqc=rUgLYp6yMZt~567dO4B&LzxT=S;?t`rmr@pBH zPK!d)Ho&S!@O5_xGV9I1S?ge_3lRwxS#bP+^aCTH5fQium}~Z3Ls@8RowlTsL`y)5 z%>?H>=M_8I#uL-hqujmTg>*9>kpH{-_fv2b$Wlx3y$8N}xcLV;3UCdXVM5t;TWa&1o9-wHggAT$^}&bks2jiG1P((4;X^yx71{~z`7!|Yae55 zPL}t)2&Stsjt+vQ_(Xgr=uwG&Yuf#kmg*J;1)RUsIB?5w`(qtL~zD0x{Hx4ILXzEa6?T>_+;?E<9w<37-mMdk+m+CZ1# zFgNtBfEq5^BO@?_S%)rMqbM=fN;sWjrm&tW9v&{Z%nffJE&vR*4n}8`5#2Qg*9ibk zC}4CJ%-Y~&YlfStLYu=yV(t<2h(jU9iDDC=<8|dCNPrPTn}KPaZzK+q&8b#M0i=X1 zT&aYqR@_w%eN`5Sl$eJsjFeynGviJs08x$|q6RdMF9pm3P7)J@y!XR=jF!p)fW_z-nYG>Rq zVE|fJXzQ5!jf^L?RYxHBy}$RLz?(OpfIzsMFZk>qeTqwKu&!w+%upYsh*WVQi=YBW ztrg%7*O38eye>L{oj^24iLX0K1J1q2u?P@y%!n}>qa3Bl(Frabo{i8buZo07cO_8H zZW0_*DUcFn#EAvW1{Ol)P}z|TlEMJXkbTQw1OvD%fppE#Gm9|;V{9@MN>Q?2b$K1; zeK&VHTEv4eHLS1(ln@GcKxUMgO}=j$6uw`ZEXvczw7^XPjw0*!3;v{U>2ptWHS0Kh zLWytZt?%oX`DJ2=9(?DV(Sh$q96|Dx7}}GUKIfbxEyMmnx0hw4Vk?3!jz#M={CvZi z9_FZ(gT-mVaAEgHDm{aPI>fDw1n#<&n$RWuR)~X z;c~&JpMJJJPtHS@ktyZtE%g+yF_)g+&LG6tMSXJz<_l_f)B;SE@Wn$xn;V2X&SI$d zElDR1E5IkHP&m3~fLBN9p|s;YUb}htB$6Z{i3PPXh)VP%r-D)d5=PCrQ7I)Dz@?(r z5C|v)cpY<)24=%)0>FZ@4Dv<5nfnZPg0_6G@;!=cLV#2dbx1})${yL6=i{usS|pw9G_OwsdXZ^V;;g+`~pI zNI3vdmSK3!GI_Zswp?AO<^8M<#C`#q@`fbQSJaR#AMfaR=a*wB+wO}S>P`$}hnp{K zW$y-Oz$~3G{BfQ)HgHc(yF69NU^jFyDn%Q4R3<11Mhb(tBmw9n`I^2G-%aJ>1K)W# zg5*a=sS-WAG6*(^ovds0-I5IR#7Nf;l)HGj`W>>A2wbfp4ns6 z-ngWmrwoH)1TUM#q#wY6?Fta6qMUdPFjCYYD93xj>u660UagZaarDoCWoX-syn@ zFU1igUxh(piGWimNG8Ooqw0V+gKotJtVe(_fRI5%DEeO7Arb+M%;8L!((mXgMJ;s; zq6=glu2xNANu-aitJ2SitCO6-wZP3VUmh^`zLr{xps6m|m8SQhB@OO|HuBxoum9z!)K9G9j7v( z6oM3>7KUVhjp3ogS~!e%5pEX4F@#gAG$nK4rfA(EE~yUMF`Z7BbL3-Nz6OAjgrh#n zj3eVNBg4=4hdjwr9VuiBvXOxqgrYoJ;b0~-c6cLHiW$r}Z{#rmCkt&=Pk{sQivrIG zcBUOtD!Lm=es&_;By{&(#b9}yuf6sWgf;KBW|W>m{VLEdPB;RyzFhaG5Ju5k;qur2-_i8+2%;Wm;pbl|{T9gMz z-OI;-_a-36VOM5DcZYjl`emWl>TrDs-Mp*-03ZNKL_t)XEr0|?7^f5sa1Zw8DBl9x zfcJRE{<`ZE)R0Q6rB|H_ILS!dJG>A~8IwB{gsC!St@z|_!o}=S)+~k6xg#`Rg&0-B zDyk4bh}TpI;SouhEg~4QKICdP2%;*%)E)_L1KDTG>*D~7Y*9K|E?Hi~;uT$W*wA|^eUPyH#TjL^5(Z)CHUpU59!)9>=#>h!2M#>O5hOnlr)fg> zzI=guYrE`1cet~$8iWnAV3lqH!@~Bn2$Um(T;?gqPTp*@yWTHAOhFjAJ58w5 z9f%0?MtTUxS7AVl$(KMnZbWJpipnKiNye^O4z?T>( zw;0F%zy9ZM*uV7eeCr_Z9C#IuAo&XHzStT)8?nfedh=vX4z}oeiQN_CWfy!n3@0-K zXT(bxW0LU>_K@|c)WgvEvVA2vn zbFV__4M|SuW3!j!90o;(MzWZfbg{*QbKShfIE^cBN(vifR{SI(hzJUXZkfjUQIDBb zhGVEemAu9|`h?YIvJk`gW0*c4_+G{lBtHN|w6N~Np&&9zW`U=&&6ZpcEJWXDXoTH; z1}u9ps%wB8gY7rZC4(4WWgKAzH3R_$i*;mqWAOd)BC=$Hqow)o%W?a>9%a;n3{+s~ zS#p$hj3loSTyORVN0RJGx^egD-#&F+$aCyv5KFeBESoavjq{c?Sq3uabl;8G0JaJ4 zd0t5_5svG;eLf)rm{B^ziUF1xq!UO8tkHv|6!Rv3zXkrOynn0619_h9x&3^NHssne zh%{6L(PPZ=@N@MBvmhkB50=0zfInp|I?k7DVRZv*&(q=P7VU)Bl&KFK7&uB0ABfQP z)CiCoieY#KeU<<<#iJ>|&are?V#UbCt94UhwFws<0rTdif80UYBYdk@Ss9lpK^ z?{4(W&i@voth(Nqadk_JFfO4-E5K6~>D_CjC`+zSH0BDQI*&~N7eVO0?{_@z##n&b zIulC6W3muRogk&6)QTb{#Rmu&x6ShqNswzeN}3cY*wxL!#UTt73XNH2j^HQ^6v_Ec zc_bw98mJ=-MqXJux6P(*1j@w}+jX5I&Cl_o{{6LANW82m;d1K(K_%d9GTAHsUOCjO{Gq zHb9P&+X#^FTIh%wZnoPwkA-&447UqAEsuM2tS5S^x3b<_7|$a&1}$SMCCZn+WWa*} zV>#y;+B1(2{Gz8{P!>MT`(-pCG*Fi7*L!-oT%Qs}iEk+Oxb<~lU)HkdwhXPNF_uFy zb16blC`6;&zA$P1@yzQ>G0eDmze&~D`SXZ`f-2S zou8yKPHYq&XAbPZmh`_IfBbJLe=?XH-6K%0 z5dpV~81NsjYn1*Y=!(RAB$?fO`$yGa5jEfZ{ISE$t?cmT{hVQbTTo#4cyo{tIsuYp zSn|V0>%i-Alv`hc|L7Nfi?^knQSN~oN~sVjLC|1%6d;#Hz+(Zu)~Al-gHc4HwD`yr z_uUu)l88bX<|TE^_rxd{FJ)tGP;HOy*Sn(k!TODxyDhg{AW%4d6xrQsO_6ZOa{EvS z$L-ej9dc^C1bj(lo^@{-{ljoRVM@gx9&$Tk%5j`U0DSmHma9SjXX>Z7Tq(xm*XJGQ zv41T@$riqWQT1cmpF0rOZ~WWbAz4Z-o3g9EW0rKuz>u0aNmklP%;mY&NkTQp4fA{f z89}r|>A5SjA}&Lee9ax*lAL5QZlmx;6$i-CkEN;*t|iw--ju<9eU8Dh9YGVDjn}uQ z)i+uZx3WrKY;O)6_;4JVKJ)f7`&<5Qy^0pu%P>Df# z3K7_ap;~VA_qL^20FcTlyzPte@rU3R!*ut&W^glTS7_fdc_YK@w!aM$)3|<7kbYsW zY&R0I#~{wE|E3pZn#9ovgGErD^ zy#rgZ004_6+oHgeo}ya<&vk$D*2c>=o1gU>@mJd3i|ly~!Xa6QC5trW^}A&D=rt)q z57_d%_J919pFGGr2i_Y;Ci!X%nJq%C(?S+dk1z6UhV$HT?j712$bl*Xvooe?f)#^M z!Ph?d+U}^MCrKU#%rO!HfUqc}?6F@&gks1Ztl{9`L9*cNTh$uctKs?~DYU(LReJp# zG4H3@4=QEK1t~M>Bnyq8?`^-}UTb+OY|UIiOMqOm-mA=X^g7KfGD{8(T;Vm-+dp4Q z-Z_JqP&r65zFa2`l^hChLJ+`0sr?x}OIq%qJ-;|`lv1;wrz2y#3h>ur@3%_0I}()? zm?}hKK^JjI3tKfZN0qP(8|(it5{?kEj_C+ucF^-aB%ax-CCe627ECo*wniONPKz|% zHjCT__k8Kg>vqSJhRbo^!AKqN-?%QcW469;nbyg6<2Me5u%kPVSD5T%2TK7gH?gvj zAv{X12VQ|ANWKz-yt8GGw$?DK;c}Vr_I$=XH*{;z9tOEqEC$M{fvAE-m$L1G3`SjZ z#?nH}Joy^?yKXXq&|pnc2XzqA%o+8)8KKv(9ME<%wD}yrv;AzEjegi>@eA?o{Yjq? z8-eKW$+DP^4ZxB~T@jQPV$d)S2Eevq>MnO5k1w$S$k7YlO8pTnY+52qMkK>&ogoEA z3AZeEPh&P0+_G(Q7T|0`DkfXz1ydmDp=SFBAdzwClck1k!Q(chWXaBdwB4`)2gGw$D>@o;$n5Spx& z2{gR{0cb2J-QY}UZ672(XU$-ly>Tq^gOstq?}n-`KrOP&lTl_Hkt#XdqX)XMNQH87 z+%G!o?~&&orL35T%jYsj%Z16Z{N?JylVWqU)lp;tGsL4LEYQgKh&F83C)ka`NxfvCZh;G1lH_t+N@Z-!p$b6{p{Gs)$0#SqHV$>(UQtoo7YiP7`h))A}XBIiim-}P zq-}t7wWaK87DC;so8F{5jP_$CbS3Pr1TZVA2*?X6d6XJG$wrxd>2T7xBKi=~LVDRP z&oq9QBO5d_t8q-*T$dXN9knDhJ-*LEUb)I9f#IV_yVCHr$UTT4Pr0k4*a9)YlVCE1 znczZ*(!0{*Y?4Bu=hloX5anj47%vhssOe+Lz-O?GuDqfN8Sl{({q{|O1n|yaxx5!P z)T^GSQEYp&%m7)%N1}oDnCKBC&);n5jP+yf-##~6{X%`8wjp5r)mHR!6(K*(sipu8S=*_@9fVv%@(Lt#!h6+#tcpd3Do(L=nw@IL=KoDm+Mw3bM>i?gNG z7M37}9a+c`3P^*fs|J8Rfs_87llb=f@I^h z80?A5K>6Aq4_baT)AUbWhxf@yty@%6o@g&TH{bbERiOh1UWy|~z6XBpCx2)|uZzW? z8{^?JLJOY{+c5k1ws-!tzDDKKI3h9fN+QhhzRO-jiCy72b13< z9SjzsNXSexGsxpDb?VE{ap%41^HbTw^}oA2I%58=!O*Qmz|&aY)f!Z7nI9Ae+@IL7 zlY=zMe<$wfozgHVr>>=^nhvgl_Nsid2HPTp;Tu*oMj6ZyeQE;OLc-hNC_C>_PdUBF z%ms|jk!e2FH@!a3YmCzIQ};1iw{gpTc+-<4ew0O$2g`Z$9hJ76%SIgCj`35KDku+-ZXiY3i7};h}Y0&Wbj-ScEwiYXM`T zP*Vva0Yw?98`K?b?$GT*Teq`*3Wq(L1Qg=MlaZfjx;WlprEmrEd~JwwmZ|2P9m9H1 z>)i|;2DK=gb&a15d%^K7s}!C(pk~R~b8RpN&O#^~T@V6Vyewbp*(zPj3WE zX0=#+p0AnK2M)XhN0590{M zGp2gNX_`9}46SOzRIIXIwLOQyK)@tJ{h z4%NH^J$iQx0a0JhkAy(RprPJQf)0mJ?kQ*(EqlgZg?oXn3G3#XhRX(RHfol3Uqtk1 z4i)4e)`h9-Sr#ACen5&H zLAdGt-hyjppijOej`Hk>4*niE@E$mVd@qrbf$8!`j~;-toDk5c)TI2DC~O-2bUV=d#gjrX_+U|dm(!8J5+U3&yk z0Zccum@gQSxQ09-HMa)*tI~DOdkVtWGsMoFEM8|otA*M>TN2B1**0LL+uPN0zhIebF0ELIP8CYOp@CzM(t=_{xjb8hB_ zu8Q6_B$|{%BMOED!!gf_QWdjyR0(EaISIyFRWoxmr}P(0%~*4o14Uxd?8A+o*0BKc z0?p?)50?@pf}3J)hPMy*Xw5LUj(Ki4_XelUaD9*drl~@86*Sjj&6LCv$?_!UEanod zea(d3qMvwfipqjc40Aw>p?8DI%9HY}kE%Kh3P!L>$8f)MWbfnH<7Q^KnK-?$6nSBw03td4-cY;=;qH2gq`!e&beT>zZ! zVBTQhk49p@i1|wA-=&5hQQGa*)|k zpgd!~oN<1b@!8ui@WtD=czb@pdA?v);0;1gOv;2>rckkwC|~y0acOfbC~8oI?AfZt z?P$G4fOSE)j!qMZ4ZU`V#^UEfsWD0@mBTOZ8Wi(zERwtMpiStFOvVtSC%qfq-e2(0 z8s_tirod%BqdP-$L`4v!oq^uxcsj%)v}k;0X}RPedj$MkKxJJ>0X!CGQ^zcd$$(iq zxP?NEy8=wv4_)n$#<8pzD$)cvW$iq5I)%qbj7J|0v?#dj-fOd9)?x%P#nuQVvh?Wx zsToRcR`yv=1Y8-S@`UJPU-buxXkh}cFWn)EM}g8QSkz(b!Vox0EihNeG=aQ9++qE8 zPzt@-4KsLb5MD3`vVE_%0n)PvJ~n%?36h-&Gc#v8m(TsmD0RJQ*a|#6b$@qX%I;r< zDfEHw4IDx83Thpe!|)D5H{k7g#;2cshWpDI_j7~w7?}WRuuW@4ooYzT2?K8EEy{bn zE6h8(IiQMiS}(a7!Mi~Vqh(X6J5UU`TpXo@8;F#cEf=W}j=<*`G#;zcL~t+*maOWP zfVwIk=8nsyq0fdd&XGxK5Bf|ufto_Id^)$j%MRw=QJ5oGFhIkpK2>sv(q@St_e_Bp zQCNo0vxU{kQ52X(A;xH?D5gLYc(HUuS(SeZ))_@f8!xdrvPG_t+(bwbgyRTp7VGWx ziqfn0SlGi(>}nKYhyYxdU0(o#g|*d=q8r2QKw5n{pkhm)d~^&7{aV!?8FB?G9A<)M zK8iK_rfdw)-IeKBunDYvR;ne`rg68YT;g<~%>((jAvJ7)d5+$XF{rMYjR>QZ zDT0eB)D-h&M(eut3|)b44=55Enk`qsJub2psZ8JF2{e{Q&(8!mIhd@;;w(C%o~F>8l*4V4qaI#@SY zmxbfpi^R{PhnCqIFIhzNCksmS+BrpoG z@UR0j5Ch5t_JTWh7)SqCRKhEg2oA|U(Ln3nF^!S;eEOKUPd;p5ShmGD8>-uk_i$4mTXmFR051b&|Mgdiqi;;0uM)* z5il{X+nC|pf4xR2n2;80<1?I=aB&V;=X>)p;gK0?L+ZM0ddzdg$cN%oyv{{J5CozS zcc*fM%meR_BS>CBIQoFI8JYo~e)cKezP-oiU%bWT(l9rR5+DFUK|M`4O%tS6IEMg$ zwvPESqbFG;0%VpijgqlBWXcrh3vf3@Q;sccw1f&&7}_0LL$0fn1xpkiA|;$7u2!MK zQG#ia}a5iVuPB2xht4~!VKpQ zr2-(%d8US{F)TkA#rwW6gXHBswA-b-=N}(IA%c|}qjyV5KZiTxazBF$q0|DW*i^VE z%m~c47xh|7u#E2%a@o|ZpSRU3^F@bygb-<0 zz+RYoz7SjDRtPU-KbrTV5eE*u6i1M}0trK#L(?1b{vk#_-oE_;mvgvcFcGFnP|Ji< zt(d0B;xxxP=H6i5VHTRFdSy_|=5WxExCESVM#J4H{0t`%^kSHG#zjw{77JXVWRk*Q zu8V)GGHV=08~e@uz;|`;D0%RpXc$stS|nzjoE=VXEZ_N%r?# zVHBex9fs;5M&1n(NI?)Iw>9Yj001BWNklW}-T`|BOO+mf@5x4_IGrbTmg%t8{Coet|be#z2i%(dp& z)HTcXJ(IYtlpr*yN$yX}E3OJhh9(aEoLGlVj1htqq{QR@GxPO@O z_Th{#?n9}CB))8=OsGY0H+npoq0FtpdV{5CfNsirW7d(m!rT^Cdlvv5I3ot{XE9I- zg__xy+Cn zfk~|chB&VcN+~EJsI`KNgbyU`&4bw-fBAp^2hXMifAKf|E(5?%{^$=pnR;3Fo6Mqw z7yVR%X#_}DhiB=qS%b995&*b&7&E+O`H>YDa!i|NYo@5REaXXYfoB<2jUlig?QF`5 z@4_Nu_rwb_%sj$Mx6+aj>b^-wE0!db4YJ zdVfm7s|pf5LE>3Ul>(6=7ErQM@S@A|Z9@>nqRPUV`I5YvKXl;05hSmn$>e-EpYi$U zpW*HKjED1#ITx@`2sjBaG2zWrlYA1rNo_p>6-`l@a48bAb-A1Gy@%*}Q{2BjKLr#fB^zfk1^91K+>&o4@m3^|D|3>;LcW{@?hK@3XQA z1XInQwZjz9tL07IbHxkU_QH{I7KA84vxe>!6BNK3C|eS8a(+}>5Ic&1NOSIwAcfH_ z`>6(WI7l{DWgdOa=;Mu&W5MW0E{4dSy|xx6*R316GuqtH8_+duu1sS(rBRHvFcj(p z>xu$~h4%;C*K7`mvOAD-fD#!q@lehY)XHeBN57Inhd0W(9P_&rq$i;W(A#P~5ry_J zNk|`NCNJb*#BEpI&z~)=-bTN6oZtGMjgh0xJgsY(cHb(wUj=p&2I-z8v_0o-g@9OA z9a)knr)Qb@hyJa<@NsLq2fin81j#ErTxOgf-s19bfx6*g)+IoS08|MgClq0nBFk{O zwvN{4WV3F?!}n#oYo`vi2B4yV&{hNC71;bSF z_Wl8%-JkJr0nV3(^QB>)6_?8eO%1(8P>hmoxMwhe&R?mZN`Vx?G}UG9P_n-`vcivn zZ~aCD*+2cS|FZ^!HP-;SKeAG~hLNMlet_T1;3{bC0+9+v%o3VKAfqA>XD};-C!i-g zbV-v!A~2|_Y1c%KA~~zM&FIE?y>*gAl;Pgb_^uU4NEjWVY z6)y9Pw_n`j;e3zF!v*uDVYEV~%BUhJ)iF&`ZgtmO{MHidOL*`L?cF(*Q-WfzY8fKq zzbq8Q51G-&C;~!&z}+!T6(t9}7v&XGd~x6K_Wpu%bDU?#`5c6uHb8d5I`+ix?;w+e&g?bX*=;>{@>!*KlP&#EGe_UC*6eyIK<(}Q&?LF>Vyu0 zc<9x7vLDq_y{#EsTl4^nfk-g-o~+Uoci>g!2SCiOf>F$Ny)Cy9n6u}+8CU75xHN}? z(6q;xjb;$loWbM}tTzv)?Qk`7*XZ(k5M~Sxrr69p56iaj5WWwawkouet%$I7D1F~v z-F4YlvWK}Jwb}d~{HTooF>%a79{4hG1j#F$=W~`=FF0S$7%Fliz?*4;u!E(d2%(6e zw}yFcG4FLFKr-*g4)$P>ht-v4_E4_^rJM=w6K9Yi2pz4?} zj`Ib0=#D;T4|4901yMA_3V`gjR)J7t$sw(0_=~^!e82Hy;+ubc4VGh6;JHkaEDecS z;T)R{W`e6gr3U#0k%e2-LL)Orm{4n<04Pdo8zh9~|Wa~em0I`F$5N07XN2;($Wd_iGLGy%9EmI`9V-J6OxcW+Qi zW`G52%BLx`FYY{jmM({zVY;#^wqFgR+dDBT`O&0YGO8mYL?hrFInf|b&eD*|CNMehx*8`^B>a5M{>G+-SMVSZem+~Qi+E@9pDZwz^N1nml%WxL$%|4e@1VL-WA~H|EAd`&W0U`1Y z00oZD44eR@1Q=(FO1oo5!(_e-l4BN4gco*el=DIp)=be&)2%)y0y#=}#2kU~bi!Q; zNj)whdw0!1{Z7MQ_#6M<&GY-IANl=eZeV4o7}!D>oi?Nzb%zkZCIDH8G@!#v1$)G? zQ26O!H<$!>M+}%1IC%k!MAk{R1S(Zugt>!dOOerLS=Ga7EXY?L;}`Bvmr9?4nSuQ= z%X5nn92Z9sUW4j(bO($j!(2d;>UgOod!y7Xw7>jAqxai^N3x8gHyY057&3_m4!jme zkbD9WcLb+X1Ur_BdYY1?FszB9_td*$?sJx&Qe}r6#TiTm<{dB!*Nim>0uVhc000@N z0H%>i8lpGo3K$rs9S{9s*PmO)BN`%j3oj!mW9D)6Nn@VSf^fu)S}Ir=zvq)rBHPHB zxnKJAzw;d(AfLlGf8*~zI`^OcH~x8J@?@VXSPjk$=Wrf5w+1ms4V8#^kheuIwklAB zVXlMA1EMg&j^GdqIz7v|o`mK_JV2u_*Q)kn)qc=xEhz@A>pWK6SYStoy9CL{V$Rz0VCHhr) z4k8s*7)F5RX5Jxi@};a77@4ZYG2C`N8h1yXPH{{Mc4Mtm7(<^XP?isapuza%@8SUY z6n^o4{eO0^>8F0=_Zt&|EmURA3FMAW!Gw+X$l^UVptGTR#Y7=q-xXj|s51v9wHE}V;*c)Uj^wc^+j)Gl2MjVcM_45A&d-k%uKogz4ef?GXRLOACd6c)Mg9A zwhr~35nwSKS+Zy708!X*#ngQ=tpj_Xu%j+H4(vm8wAYyZZbqsdM%-d9oc zD-xNej_>~dp(51PVIg1(b_?%Lrlnmmo|7q0EKQ;P$RZDXAdVn;1)&0xjw*t?yAwKj zWNZe2(tpqZZ5`@{rVXY9Xc9SKVJ+niC@1(vmX2)nGshQKK^AkBrhs$=;X@lbo!~U1 zcSmyzQV1-D);H(NOSXtC>-jPRC&Z{ZI9}?6sR+t6K}x|i)nI{U8Sa<<+TZ?N7a(up zI@|n@zy1fUT3O~SyY*G))jh=6lZEV6K{lAghEA8%NF7JB6m-bGuvwUF+sJ|dm#98e zqv%cESi^_&h$mU7JEQvE>=_<`QZ|x0sv1J+8GtQi5=BCCh6u~+d=eBHD40Qr*2DNb z@uJp~!J4AC>8DLb@>UeW^ zhejG@OvB>dFt?6AH*__$rXi)~0H`eGRMP?>jS-8~7G1C`QVj16){sPq$WnWA6z)(8 z1)gpi&+qog)HcM@DTM0Cft+hBB}4|MsbCTYmykL;ou(+qRRKBh-~QV7MsR!z|K+dz z_U`rnCx7w}t>c-goq)BH-891E^ zCY`{XrLzuP<_k;>t%o0D?}MobI4Xu!m0N@MVPEz17uAx;PMx4d(X~OfhawJn^cZaj z0O$=Og$0p>OYWXy(L7CeG0VwN3&-sB5!Vx5|ARfey2?he=lQ$={X1MPPw)jF{E;G)T3;L!X zA~w`S1B?Q<_Ri;HFiadQ3ZV(p=@h-Ml)CHM(ON_I4y3Lofgs}PH{NK+a`@n(QID+IAe*Rbg7XR#z|8wR76bSB! zK(0_O@anj~zX$9bQ_UTavRQ~W$JqwV=Va<=w~!%(v^5;<4GwFOO*$xycs(3Jgd=yE zs(?6%7KICHnNWpM3Zc}BD)PIMkn>gI7ys&d{r0hS{Tk9MijG}IlQku0;H;A z?qTLE8}WDs!E$^=Lj!M}TXaWCE z7uKIcPuSpQ=)pc= zz{T+9^afx`ODjStg364)^fw=mLmc>U{8zsgGo&L}db)_PIhYCEf@IaT!+aHv7<8*P z&)~Z$%co%|Ey93$WNP&MSVecBYy#!`&RISMcKV=F>gX$ujB=Dh9asXS;dX$GUgID) zJubIyi91hWWUmKN=fKCt5hS0$&;QDAN1!AR#}8q2X1u8dS_{w>y)gQD|D`s)3X%+5 zJArH=D2NVH?3xWd7pz!3s4^yJ5LHZ5!D%`HvKrlTDUd=qm0+tL!SSoX2$p~D$G*=P z4wV8kg7=0#f`G+nh7*G_h%{1EE9fksL8{>x!HKbu=t~Bp+TcC`v>EFGp}Q}Ea#SfO zGr!U2WalVNSh$P?yV`(j@c_h#g_>N61ib8H#ObjzuqEN}D6wXM4514=3Xr4c80WE% z)Wi<+m#51lhv4~vkBcKnK7$b`T?o^uK(*m?cf#Bh4o7Xkx$GB{Wt}lkqC)x$V&lB9 zode7HHDZR8=w(hqkWzs{Xsx48CzN`^G*#3LiZK%xtXq~NIDWhEU;o9 zj(JwIo~|E;xit_8gbB=oDq(>YBI^>)k?K$=NDZf2;hxGkqofO796{zRWQ&C!eWV3?t~1J+OksHFmk8Qka}3dlN&3#L+l4BoCtLG=|bzUx75 zD=7v~wrWTZs5{(k7bJmq2m~1A)!Otg{h91?VHqER^1#Qz5hUM%pZ}HL=AZfc58A|n zRx3X7AQ$jGV-|&bgKzpqWi#xr2&po23NnEWeb4pyQUFM}i<~CLU1gk3r*Ne}L8*>f z3r^Dn7A(QB$b@hG=6AMy-1iFpn_v68{8NAY`)u?i*C0TE$#q-tS!{c3TW`uWAZ!+Y zbr?FjrlOKR{y4;3WGFW|?L8PI~|K0XQ4;=Uq96|C0_=R8j+x*i%{s-(%W6VOk!9S@emmu{F zkpKXp3X*8v0jdiF(32f$o4!ja1*VPy!Zb1JsbIPbEmfEY(Sr!J*3b(T!MA?%%kyW_b)#n?yqMc#6Sc^8^0CJN>&-{?2GTas-O>Tr3PWE%jOu8eCk0-e_R z&RYh|YPM*=-aP)0>MOMS`*pzF2gfx)ULVtj0Q(DGOB{FISPTJy5IlH)pUeXXZs7=$ zFT^kY>fhl%`(xj4rz+^Z!@NQuVWG4o?ra3eOBRYeJqL#}&emVD$^_Gf%7i*ixI3M2 zcbY;a1u>}2Oh<71F2FZ`{df4!{OCWkL>eLub@WXtc^wqUdC7=EhR*kl%@k*k;5dTS zUUg=u>x_BJ=VHUI97+xbqi+6AOE$U^aGndkzGQmq7{>MMe4It@1LVjepMzRD>bx*` z9ysu^aBQ{S6Mybc{D8STdTTge8s^qh^K&@aZ_2Hny%Zn)n*7^lL0~DUQw`zq(*#Di zdK54qha%2*Bfjy&|CDL#=++m~2?3}gkjgks6AE+MlI_cxcR43pq@r>R2o)Ac_Wr0a z3elQPvW8Wf2x=)Pl~IczRC{QdA(Sz{xKZ380`5vdDKSDsf(a495eqG`m9-ERRfYKyqoQ`2(G0FIL}p1cd57& z$NNKH|L>0P&w&rZ5hP!MpZWR^nx=5|d2Xnts6A?_)8`QfATqcnA zBQX9hz@PfpexGU2(yK>VUZg+@FqJ7xv@@7(QEEX=b)<>mTw`QXRHwDLH5sbBx=YSm{F+#>|2!)U82cf&6yCu^!AMcb|uo|7XGb~8K`50?=cb2$4VY<>`14}2^fndE^3Uo!s3 z-};BU@0q#9jAQyeZg1`#>I74TDuvyaYG#uW$UKMgHwO%M>n6jq97X9qn5B=;YXnO3 z2wEd+Gnf4TnvGh{Q!bg}=6S|&KbFk#7K1hZt%%KmBF-&TiEMZCyf$VQ0n(n&HV+*5 zGI0dS0|&kW2vexRc$#pVp{1SH_GaCdK-sNDnKc8RjiE$0^b9^qnZ>z7X)}))5h^mV z43yWPuo8irqiHDrG;47ll;Yy%i~7Y@>E=3EUYB8S1xWTaKzh!S!XMvu8RQECB=O-L zdEm>z5hM>B_zLh;HmO~AH#1uTC5)hMXzu7rPzbsa+(SX9Z_1N8GP)5*opwR3XQ`8} z*sW$3#@!wx8)k-{y1{XtnI&ehdKA=0cDczYuLa8&k`C4YIj}p%=JwJ6`BY!>U-5=tSTlERbZJP-*4=zrB0u zu`J6DI{sg4?{n@WBC@L7En9eI3z&M~2NobCBtHZ;5>KnafV*uP1C|gIrbtZ93}o5H z?sl6-HXa!P1~o`b5MRRJ<}=vcRT1}`z1Cu|&pG$r$js`Jotc%+Sie#zqaq`2MwX)P zx@+(CSO)4VLi9bAEN{}=Ey9C~P0?s9cZkt5NeM?o@S*lmiqgMO1#s_=9Or(;kn2F! zgPsseA&|!T4)XEeRtn2N^XoBum*ec=HpkALf1t->nNCq^|hd^rjhmMrn{(dxIT zIK9jsuZ~z>koi4#bo;of_G8~(zF{Y&S0OXWl-{78O|Hc-{#=ICi(!l+m9U_NA;OZK z1(O*=1kj6Xwt-IG?-z%cv_5~_PSeXKe&|!9nhQENWE@aASC_8eyDkxU9a?Z5)a=Cp z@&)m1Tc*tQ<81%FOhA8GZdfk*MAxx>DZNS=Bvbm7mBeEGqVh!E!qidYL~HDoR@C@SX)R)ElDN9LBEo>#&3Avxy&d1=l3 zwqPiF6{H_$oBl2CB}*QLrPnNjWJ+(4ih}xpJ&vSfW8Tc8Yp z0xpJFMT_^Un2Q9oXL5qu%#1KdMIx5RbF3&O0;Fses7pAe*Z25RO?&y6c2$&P%dbl! zeE#dpIm`5B=U{7&hoQCf$MXKYr1ZMwE3TB@pf7#x_f$oD-{cEy6J)mHo#n`N8$8f3 z3)~ycX58D>^dAw+K!S_H7lc^S#jR(O>w=gyO7(3YY{9J$4`_rp;p&^j`ye9#3z{!? zi4oiJ=Nc%@xq53Bcsp0DK7O-{?{97sZVj84w>D#~^+4EWS~LjT{!F*W_m%DW|9~mI zVtL$}(x>3p{`>#apZbyS^2gD#?@a9Z- zXz!hLMF8D~tOwHi_7PFRG`37k=qs_bu8WkR;Z$!lDpjq|S@nJ=8tzb*KE|c^#+JRR zXx~ezvJ5ro!(98?D_h%4lxaRa_unSAquuRW?tf_lwBJi=UDkNvi1fkkHROeREmQiV z$e*Z`J|(~YXbKOo9m8H`bP|s$MO~P!(VF2cXw8^sV{VN$H(HyRX6spI1QFVYl=lbj zkGt$cb@Of8$Cjn(xtPYKKfZfgGRk!$NYC=jtWW=G4Vw)!-`-mD{ynv}&8D5rw!)ki zj~DTDD!0p+a5%mzADv4cd1- zY87fNj78C5q!eY)!tHQCYDFawaq7_j995QfkzVMdMJXaw?Ms$X>4VWPChCl(Zq=my zL5u>JtfS>FT12?cFxPv@HqW>@txcFar}_HGR6LfR$NoKSA73A@DuWJ`L8(O;_Xoyt zq>hzcsr9!o~Kwt_t0b9pYVX}I?_SZ%p0bn7RgYsT0=7F!X{+UM!!v}l++ zGtb{yOdZMy000}?Nklsy=g-q9VYdmHOq#_h;53^s?S(wc=(mYpq*Kh9)cWvp2Ig>fV?|0u)d}x+ ze8PFO9Iz~KzW8_gaZ^M;KwS%Cg0<iJBn_B63&6dL}&p;E255sV{;!4pym{@UZBIC zO2sjnH-=g%MJOV~pol|J?Tet>`HpZs@|_|mA~b=u7FD-F1!eg@4GX8)`P&zBf|-!E z4Q{uoZAYui11&8m>yEF>7LgaaZ`kpZsb@$@I!)CYjP(=GXq~|5bo5{-rVlpq%E3hv`Ikup38ik2{Vxx9FgJ^w9bppa?@Lcw7|FnBiggMUX6| zP>`+4bE|xf#i|SY12Ai)R3$#zrTlQKOnpqF}bv=gdyE2P3 z#$oKmMVk8~)9aH#GNrfFul%?Fvt>sA;K%;-3#(Edua>eUsH{h_({cBBFk7kdLLyO*)m#|D@$;(lfzY`@P_HEvP{i zm>T`gu&%w2Yn9M-ALV+?+E;e@I( zzxd-X&oILbQE&{mJ|3poeL(vD29Z9_P0GyaH1&#DcbuTj(|KA?e_&KWrJ^bn zSr$o;3UvT{JCbc0s2R{#Y6%y2sp}}bi>x;yFm;sJig4CUSzIytpBYIrV~EQA!$c{{X_<24tI~z6mY{^vrp8c}S{;$Ptif8Q_oyIJwt#q9iTa{ow+3bj>4ih?J^38^39Bx5 zs73n`Z%VIA2FaA(A&-OR>Sune_h2f$UlHqjDVc+aN-4eXat)C4-0)?-YDC{Y67Goi zVxe$Fi!hAC_Gh^ES+B2>J^I^R2UJBOk6F{}l|NxAJpo_(ov&*t6_G%t2THS`wdl?L zQy)}5TjSLFe#d^l*)TCAj0iB9`_KUFrN^Bv*KH$sA9MFQjz`z5RHS_CPfqC%Av4L8 zo``?@pL&-0Ge7p-zGjr>>u>_U=yyB^Gkd;u5?u;-F3I*(^7!LieLO<8V_12vmh}(s z`#+b1&C~0VKUgU}F<<(fuWM27J12`H1?r%Pf)?;-gwM40fO=3IiWaoMuI$+lJ9fjK z{m_qE$9mwf+p!z>jCG(&r6LUHQda;Z>QbO1xCiENGUsH@{oMFynu)$Ydh5Sj2c}QU zg6VlS*2c{oUzgs5%p_BKf?7CLf}#VutjAJSaC`1^Wf`cx^NOO&@PR%Nr<6YNN3}0l zt}3YZ7LCy0ap&Xt$o1U!xVC_Jv*-IHFTWNTG_Y~TY{1OOr?B+8kIDi3xAX1dhp+%aY^cJKE2$60gU_?Mg0*JKG zmEJwlMVf{ZLvKNkbu|P1O;gM4KKJz^om)u1=8t!xt%9*xqpHMT(`PW-WSAT$>3#a-g8>C*G|A@BwYhO z%5#b_$<6Z-!`}qnig&lVf#vTmqp6>yqraN32Qk{ZiY>$P;N~6|lAfOfUW~tw*CTF_ zRe(1-TJBy8U9LBC_WW~P#4Yj$tiw!Rq1OEpjgsT+6pw>?a9t^le?pLPMYga+Sq6QJ zt~2iA7>WML`BNG+W)HsgIxf7*lH6+AnGo5L%ewP+@7m|lrR>pe6YXd&BI==1-0F~@ z|E!9?+vWC++C`_r)rA!5tFh%YGI*kxY5$q3C>lZzl=P5Mt7AnL;Mc-g--#@^bVgAF zgU)3@#6>op>c}sT*+~nE8x{saeU)fSR-K<47}Dd1+SoS$r&5HS47&?!-_aP5tclOt z*k-4k)24;q(1Z(hfDhw*%x<*X1O|Q7!$d1vJ($;E`7tb2x_!L^g4lHIgET;}So{(BE zmfRbPZs4!ax-@ppVgsgcDO3OE!Y|taaZ)(s)4q?Nz~pj=q4wL?*psNa)Paof7nPc~bdVd>-bC7e2iX2w^Q?eYTama`6l2QuelL zkczXnS0A4YAk31^w_!?PZLoVPrgRutbtckm{|6w268}{neCpniV#H`ty6cg3NSQkm zBMSs|M$MfhJ70mOnlm+e&WUfu2PKEfT=D)CYX1T+vGIE`9fJWls+rzS*Oay95U+Up z!VGMF)N=P#0L&EXS%h=@fP|1s;Js`YL(eFwt$V*fc`5c`=gOcnX7W<8VGfB9< zO$ar9Dg`w^eCG``v<1LxONMO3<6oAGIEY=GUirB50l)u6`8Oa{5dzM{W<^6#E-rO(Z?26Z);rWJ)j}xOD z`BT_BFHYBmGCq&}rn+~vM?O$cI4z!iAm`q}W@YY(QL9I1)4t|+?~JyOBDPB1Y-m!R ztt*`SMy<6G{SQ*sxj^w92%PP&;Gww)5b3z>S(cyjhl~{-ua9@n{K6g0)5urdeKgr? z$5uW~g|0VDrP5bQIVpPS0?^InZ})9@XVRp7tLW}|?MP5&Z%z^11(>v4J^>tgcy#Y? z!AvxNgzl%DN}TUT#zM44_SOO83mz8D07rQOJh*MVC~Rn2LHp)SVGg^h=6%DO+8A?y z%s*B%Hcx-@D%4s+-yfI#n4*r4qi4WGC~3e_L}A%e@i19IsLjiWLmzdR#Ke$_%1CT1 zq&p1EWX>V|ha=6t{N$4H8eg4tl0IEOGGtL*%`Gd_Gy&@eNJjnBk#?nzYw0O}7*_U; zC#Z!4t0Jjer}!hZQI;CxwTO2=adT!N28^(6g$PE2f7paNFa4~3K>cfxBXTMU${;;* zcv$H#NxA>`)HsddCazuT*U4mYVo`wUFm2IVen?{Ho`ZPMVzwqgr#WxsVK}XZL3R+) zpj_Ds1Xr*!!s#v)ED@0L+5O->p87UClCva_bZiFGU%k8L`+;KmGB1%9#ccS4Fh)ZD zHBw)eSM}qWg=1E{#m2DDV_rsnR^|bxT!MVGHwBB?vyiR+QEORXIYxaHlX6wIh+@Quv zW(_=Cpq)E>6QFsrtWoqwcX(9+;-oFgcGdERj(}8|uObHyBoMem)jo?CThJnqx#SAE!tE~bRncRhv_+n0YqL+pdd8-qzwvyV5#QB^vNe7oA$gT zbM>hIIPuOH=_J<#4-tHw&wqP_D$?Ec(QV)ga~<G+IOy(6s#9vOj z@(B6qo;?iE?1(q#t|99ub|gZNK;;65$E{g7yS0Sx>5h`kA74BpIWW*;9Pvhy6pH-3 zqC{H<;BD%H(X}OJt(BTrMz0ooKig;PVTxo_Hy}})s-l67MGuLpvPV)5*96BG zR%N-FA+f^HVw8O1o$XN$YUVdb+Wl48qxWYRE@EFPPKU2s1BXCxcLOgB#%|Q%{Hp1z zy<0z}h0S1BmMdJ8m^o78ysdvOnJ>vbeFyK?1~hsmp??YaF?Q|4-n&4R>v(Hpv&kkp zxEG%R-ZleMQH3kXA4pM;4^L@$E!fe(EsDKgF;39@Mk^>!28QYkY}(OmP2P zmByO!0B1c~p6I1VcM_-$i+r1J9SQF%_(0PCD>!1pj9_Z}Js515`xY(R&w#V^R=a2y zSz7>P_HI*eTltJrg1r`j$Pfj`KO0gqPW4ytzW$l_(ICB4c(KOkdux|_Y@SFqcbpz* zow-S)sA|(%&U>I1>GZgNlQPT33U#d+Q~qFDGlq0}LFeqn`pUdm)qJDkpNf2rNKXSk z{YP8rO^gWPVoS@P<=@Jo>cYie4%82D{u!6kr^Jby^pP`$Gnc82ijLsLW-?-KKBPJ2 zZ*V9v)5>(s%Q1JAv5e%)Gt;_#DdX_o{%}%eIv<@P`fhQZrJ6&OBk;M6!<>Rm(8A2G zxTa$B+wFB9$KkCjeiPMm+ebV5O-Uy1wx^vaQsNDC%FwuV2`FXuMo9rCwWQ8Dbe7@0 z0o~whXN8{q&CyxwUz8iVjE{L9BPhS`heOgP%QsY9&z3xkrCw4v76)1F#$zVvwP9JXB&xd>pGj4}x(;MGG*8dO-&8UTCTjk|SH`XK0SI-T9Y6PjC=ufeI)9f@Qj!vAbiTB%-%mo?zD zM~l)Qct3X*dy;RwcFDH-2U?C}0Xw}n3&(k4M$pvyoH@0sQ_kw!C8=!Agh}LA(>Nal z@>A=yufD1|z3E=evz!dr*~w&rT*XtY^k}tg9t(R9qL`N~fPT2Ce9m)nyvbh4&_uXm1yftPI+0ecI;|nCrSV3AR<_K4@9&` z)n_se14U+fr}HS1?#ZFn$vwU(szpMD09J)~zI7ZCfo)<9iG-}FiHt|GHgA?cRH@*gx$97Abqg8S zEy6Ddok&V;bg9SlgL41Or?F~c2|lfkO4g?*DSn$lY}vhxcrgxB?94PvOw)vD z8w(jtM$+r*><)_705+fr|xu0TIoP1usZ-?pGEbNzD?I`xc0bJRJ~-|44UQz| z@=1;+d$f?fT9aiLhl@ZV7c7vEgI9}Mt0*B3pv|bBU<_|kZEm4a`Faea!~mldT?pyL z?xE3dCt9B|`@6!7?lp>zV{)z|sxPbOysGCsCoc1Lg+Xsb<^SetN&cp~Hk_^%E~x?5 zfT%XYyX81py5CZiJp#O*@ZMB&2>4bs|q=kRl-kYxRxFqV=df3pisWhX68O{|98J@JcQ zHJ*m-2>FG1;CV@bHqU?~=`YBk_IQGGFF-o2M6He(pg$w|#-m!mZ~GvUm5AW3skrf{ zCS{iY&vR*%_JV&3yz$>g`;e}YR8u}wg>a7Y%=-cSb{*w?c|fr z)*mY<(%5%_u9TdL*24(dXID|yP9e$_T8T}*zKfGv()Gs#c5E8_q8>0N*rlOKj}9@b z6t13CNZ{{tb4Kj>4_1*|dLaV^fjgVu>opn)&RPeLG@LmzXJyW*_*d|uK!}wwk1~-S zkz~Mf{I>D^TZ(7*?(+9tzxe}?c@HcVYNw}dZ$KHi0Z;%+#=_qyKkds__=tHjprg$E zAk|aL1FP{eAYhT$e4RL}RyAkUmA?}dLQem!BH3*9+X-eA1J1K@(z1MkUy$}YTQw<) zfrcwyFMd26xbIywtO5GMtQ=(x(1FAj=v_cr!Z9M=tJ8XDPQ-x$5karHcgojIp!$c_ zp@qsV!R8<;%cL9*<{qO@lN^pD(;)}mxO;q9KKfXC0SyzAY9V22o4%rrRyf{=TUi6I zprrj8-V$sC-0rSA1~)Wl=y-Ki?tI;n_Vo=Q=FC*hU5;<$y_P&{N<9ms3nx2TN8Xg& z))PHlZn|qCeJON!XG0p0~b12 z&9LO9@4&BXq_(xw&XRqhrQutZ_ddg7gVAm9R>HF1JodUIosv=jH3;0#HeGn)c3e)0 qvd$?clBg7OqyNAC-x*w*KclUU8lK(~&{n!Yz3%Fn>Xzv|di_5r%Ygj= literal 0 HcmV?d00001 diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index d6d370a..6bfed04 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -34,8 +34,8 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - carIpController.text = '192.168.137.122'; - cameraIpController.text = '192.168.137.138'; + carIpController.text = '192.168.137.34'; + cameraIpController.text = '192.168.137.121'; GlobalSettingState globalSettingState = context.watch(); return Scaffold( body: globalSettingState.cameraIP != '' && globalSettingState.carIP != '' ? diff --git a/lib/pages/player_page.dart b/lib/pages/player_page.dart index ca92d64..f785e03 100644 --- a/lib/pages/player_page.dart +++ b/lib/pages/player_page.dart @@ -10,6 +10,7 @@ import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; import 'package:provider/provider.dart'; import 'package:fl_chart/fl_chart.dart'; +import 'package:marscar_controller/pages/square_joystick.dart'; class PlayerPage extends StatefulWidget { const PlayerPage({super.key}); @@ -26,7 +27,7 @@ class _PlayerPageState extends State { Timer? _reconnectionTimer; - final int callBackPeriod = 20; + final int callBackPeriod = 10; RawDatagramSocket? _udpSocket; @@ -52,12 +53,11 @@ class _PlayerPageState extends State { Timer? _connectionHealthTimer; DateTime? _lastMessageReceivedTime; - String _fpsInfo = 'FPS: N/A'; String _bitrateInfo = '速率: N/A'; Timer? _infoTimer; - double maxPawRateScale = 1.0; - Set _pawScaleSelection = {1.0}; + double maxPawRateScale = 0.35; + Set _pawScaleSelection = {0.35}; @override void initState() { @@ -196,16 +196,10 @@ class _PlayerPageState extends State { final nativePlayer = player.platform as NativePlayer; try { final bitrate = await nativePlayer.getProperty('video-bitrate'); - final fps = await nativePlayer.getProperty('video-fps'); - if (mounted) { setState(() { final bitrateInKbps = (double.tryParse(bitrate) ?? 0) / 1024; _bitrateInfo = '速率: ${bitrateInKbps.toStringAsFixed(0)} Kbps'; - final double? fpsValue = double.tryParse(fps); - if (fpsValue != null) { - _fpsInfo = 'FPS: ${fpsValue.toStringAsFixed(1)}'; - } }); } } catch (e) { @@ -317,7 +311,7 @@ class _PlayerPageState extends State { final avgLatency = _latencyReadings.reduce((a, b) => a + b) / _latencyReadings.length; if (mounted) { setState(() { - _pingResult = '图传延迟: ${avgLatency.toStringAsFixed(0)} ms'; + _pingResult = '图传信号延迟: ${avgLatency.toStringAsFixed(0)} ms'; _videoLatencyHistory.add(FlSpot(DateTime.now().millisecondsSinceEpoch.toDouble(), avgLatency)); if (_videoLatencyHistory.length > _maxHistoryCount) { @@ -412,7 +406,7 @@ class _PlayerPageState extends State { left: 0, child: Center( child: Container( - width: 300, + width: 400, clipBehavior: Clip.antiAlias, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), @@ -422,7 +416,7 @@ class _PlayerPageState extends State { collapsedIconColor: Colors.white, iconColor: Colors.white, title: Text( - '$_pingResult $_bitrateInfo $_fpsInfo\n$_controlLatencyResult', + '$_pingResult $_bitrateInfo\n$_controlLatencyResult', style: const TextStyle(color: Colors.white, fontSize: 12), textAlign: TextAlign.center, ), @@ -438,7 +432,7 @@ class _PlayerPageState extends State { ), const SizedBox(height: 8), SizedBox( - height: 120, + height: 80, child: LineChart( LineChartData( lineBarsData: [ @@ -505,7 +499,7 @@ class _PlayerPageState extends State { ), const SizedBox(height: 8), SizedBox( - height: 120, + height: 80, child: LineChart( LineChartData( lineBarsData: [ @@ -569,160 +563,86 @@ class _PlayerPageState extends State { Positioned( left: 64, bottom: 32, - child: Joystick( - includeInitialAnimation: false, - period: Duration(milliseconds: callBackPeriod), - stick: CircleAvatar( - radius: 20, - backgroundColor: Color.fromARGB(200, 255, 255, 255), + child: SizedBox( + width: 160, + height: 160, + child: SquareJoystick( + onChanged: (Offset position) { + setState(() { + lx = position.dx * 127 + 127.5; + ly = position.dy * 127 + 127.5; + }); + }, ), - base: JoystickSquareBase( - size: 160, - decoration: JoystickBaseDecoration( - color: Color.fromARGB(60, 200, 200, 200), - ) - ), - stickOffsetCalculator: const RectangleStickOffsetCalculator(), - listener: (details) { - setState(() { - lx = details.x * 127 + 127.5; - ly = details.y * 127 + 127.5; - }); - }, ), ), Positioned( right: 128, bottom: 180, - child: Joystick( - includeInitialAnimation: false, - period: Duration(milliseconds: callBackPeriod), - stick: CircleAvatar( - radius: 20, - backgroundColor: Color.fromARGB(200, 255, 255, 255), + child: SizedBox( + width: 160, + height: 160, + child: Joystick2D( + onChanged: (Offset position) { + if(position.dx == 0 && position.dy == 0) { + left = right = forward = backward = 0; + } else { + var angle = -atan2(position.dy, position.dx), pi_18 = pi / 18.0; + setState(() { + left = angle < - pi_18 * 12 || angle > pi_18 * 12 ? position.dx * maxPawRateScale : 0; + right = angle > - pi_18 * 6 && angle < pi_18 * 6 ? position.dx * maxPawRateScale : 0; + forward = angle > pi_18 * 3 && angle < pi_18 * 15 ? -position.dy * maxPawRateScale : 0; + backward = angle > - pi_18 * 15 && angle < - pi_18 * 3 ? -position.dy * maxPawRateScale : 0; + }); + } + }, ), - base: Container( - width: 160, - height: 160, - decoration: BoxDecoration( - color: Color.fromARGB(60, 200, 200, 200), - shape: BoxShape.circle, - border: BoxBorder.all( - color: Theme.of(context).colorScheme.outline, - width: 1 - ) - ), - ), - listener: (details) { - if(details.x == 0 && details.y == 0) { - left = right = forward = backward = 0; - } else { - var angle = -atan2(details.y, details.x), pi_18 = pi / 18.0; - setState(() { - left = angle < - pi_18 * 12 || angle > pi_18 * 12 ? details.x * maxPawRateScale : 0; - right = angle > - pi_18 * 6 && angle < pi_18 * 6 ? details.x * maxPawRateScale : 0; - forward = angle > pi_18 * 3 && angle < pi_18 * 15 ? -details.y * maxPawRateScale : 0; - backward = angle > - pi_18 * 15 && angle < - pi_18 * 3 ? -details.y * maxPawRateScale : 0; - }); - } - }, ), ), Positioned( bottom: 180, - right: 64, - child: Joystick( - includeInitialAnimation: false, - period: Duration(milliseconds: callBackPeriod), - mode: JoystickMode.vertical, - stick: CircleAvatar( - radius: 20, - backgroundColor: Color.fromARGB(200, 255, 255, 255), + right: 54, + child: SizedBox( + width: 60, + height: 160, + child: VerticalJoystick( + onChanged: (double y) { + setState(() { + up = y < 0 ? -y * maxPawRateScale * 0.6 : 0; + down = y > 0 ? -y * maxPawRateScale * 0.6 : 0; + }); + }, ), - base: Container( - width: 32, - height: 160, - decoration: BoxDecoration( - color: Color.fromARGB(60, 255, 255, 255), - borderRadius: const BorderRadius.all( - Radius.circular(20) - ), - border: BoxBorder.all( - color: Theme.of(context).colorScheme.outline, - width: 1 - ) - ) - ), - listener: (details) { - setState(() { - up = details.y < 0 ? -details.y * maxPawRateScale * 0.6 : 0; - down = details.y > 0 ? -details.y * maxPawRateScale * 0.6 : 0; - }); - }, ), ), Positioned( - bottom: 100, + bottom: 90, right: 64, - child: Joystick( - includeInitialAnimation: false, - period: Duration(milliseconds: callBackPeriod), - mode: JoystickMode.horizontal, - stick: CircleAvatar( - radius: 20, - backgroundColor: Color.fromARGB(200, 255, 255, 255), + child: SizedBox( + width: 160, + height: 60, + child: HorizontalJoystick( + onChanged: (double x) { + setState(() { + ry = x * 127 + 127.5; + }); + }, ), - base: Container( - width: 160, - height: 32, - decoration: BoxDecoration( - color: Color.fromARGB(60, 255, 255, 255), - borderRadius: const BorderRadius.all( - Radius.circular(20) - ), - border: BoxBorder.all( - color: Theme.of(context).colorScheme.outline, - width: 1 - ) - ) - ), - listener: (details) { - setState(() { - ry = details.x * 127 + 127.5; - }); - }, ), ), Positioned( - bottom: 40, + bottom: 30, right: 64, - child: Joystick( - includeInitialAnimation: false, - period: Duration(milliseconds: callBackPeriod), - mode: JoystickMode.horizontal, - stick: CircleAvatar( - radius: 20, - backgroundColor: Color.fromARGB(200, 255, 255, 255), + child: SizedBox( + width: 160, + height: 60, + child: HorizontalJoystick( + onChanged: (double x) { + setState(() { + rx = x * 127 / 2 + 127.5; + }); + }, ), - base: Container( - width: 160, - height: 32, - decoration: BoxDecoration( - color: Color.fromARGB(60, 255, 255, 255), - borderRadius: const BorderRadius.all( - Radius.circular(20) - ), - border: BoxBorder.all( - color: Theme.of(context).colorScheme.outline, - width: 1 - ) - ) - ), - listener: (details) { - setState(() { - rx = details.x * 127 / 2 + 127.5; - }); - }, ), ), Positioned( @@ -799,9 +719,9 @@ class _PlayerPageState extends State { child: SegmentedButton( segments: const >[ ButtonSegment(value: 0.05, label: Text('精确')), - ButtonSegment(value: 0.2, label: Text('缓慢')), - ButtonSegment(value: 0.5, label: Text('默认')), - ButtonSegment(value: 1.0, label: Text('狂暴')), + ButtonSegment(value: 0.10, label: Text('缓慢')), + ButtonSegment(value: 0.35, label: Text('默认')), + ButtonSegment(value: 0.5, label: Text('狂暴')), ], selected: _pawScaleSelection, onSelectionChanged: (Set newSelection) { diff --git a/lib/pages/square_joystick.dart b/lib/pages/square_joystick.dart new file mode 100644 index 0000000..f8eb3d5 --- /dev/null +++ b/lib/pages/square_joystick.dart @@ -0,0 +1,478 @@ +import 'package:flutter/material.dart'; + +class Joystick2D extends StatefulWidget { + final ValueChanged onChanged; + + const Joystick2D({ + super.key, + required this.onChanged, + }); + + @override + State createState() => _Joystick2DState(); +} + +class _Joystick2DState extends State { + Offset _stickPosition = Offset.zero; + bool _active = false; + + void _onPanUpdate(Offset localPosition, Size size) { + final center = size.center(Offset.zero); + final delta = localPosition - center; + final distance = delta.distance; + final maxDistance = size.width / 2; + + final constrainedDelta = distance > maxDistance + ? Offset( + delta.dx * maxDistance / distance, + delta.dy * maxDistance / distance, + ) + : delta; + + setState(() { + _stickPosition = constrainedDelta; + _active = true; + }); + + final normalized = Offset( + constrainedDelta.dx / maxDistance, + constrainedDelta.dy / maxDistance, + ); + + widget.onChanged(normalized); + } + + void _resetJoystick() { + setState(() { + _stickPosition = Offset.zero; + _active = false; + }); + widget.onChanged(Offset.zero); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onPanStart: (details) { + final box = context.findRenderObject() as RenderBox; + final localPosition = box.globalToLocal(details.globalPosition); + _onPanUpdate(localPosition, box.size); + }, + onPanUpdate: (details) { + final box = context.findRenderObject() as RenderBox; + final localPosition = box.globalToLocal(details.globalPosition); + _onPanUpdate(localPosition, box.size); + }, + onPanEnd: (_) => _resetJoystick(), + onPanCancel: _resetJoystick, + child: CustomPaint( + painter: JoystickPainter( + stickPosition: _stickPosition, + active: _active, + ), + ), + ); + } +} + +class JoystickPainter extends CustomPainter { + final Offset stickPosition; + final bool active; + + JoystickPainter({required this.stickPosition, required this.active}); + + @override + void paint(Canvas canvas, Size size) { + final center = size.center(Offset.zero); + final radius = size.width / 2; + const stickRadius = 20.0; + + canvas.drawCircle( + center, + radius, + Paint() + ..color = active ? Colors.white.withValues(alpha: 0.3) : Colors.white.withValues(alpha: 0.1) + ..style = PaintingStyle.fill, + ); + + canvas.drawCircle( + center, + radius, + Paint() + ..color = Colors.grey + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0, + ); + + canvas.drawCircle( + center + stickPosition, + stickRadius, + Paint() + ..color = active ? Colors.white : Colors.grey + ..style = PaintingStyle.fill, + ); + } + + @override + bool shouldRepaint(JoystickPainter oldDelegate) { + return stickPosition != oldDelegate.stickPosition || active != oldDelegate.active; + } +} + +class SquareJoystick extends StatefulWidget { + final ValueChanged onChanged; + + const SquareJoystick({ + super.key, + required this.onChanged, + }); + + @override + State createState() => _SquareJoystickState(); +} + +class _SquareJoystickState extends State { + Offset _stickPosition = Offset.zero; + bool _active = false; + + void _onPanUpdate(Offset localPosition, Size size) { + final center = size.center(Offset.zero); + var dx = localPosition.dx - center.dx; + var dy = localPosition.dy - center.dy; + + final maxDistance = size.width / 2; + dx = dx.clamp(-maxDistance, maxDistance); + dy = dy.clamp(-maxDistance, maxDistance); + + setState(() { + _stickPosition = Offset(dx, dy); + _active = true; + }); + + final normalized = Offset( + dx / maxDistance, + dy / maxDistance, + ); + + widget.onChanged(normalized); + } + + void _resetJoystick() { + setState(() { + _stickPosition = Offset.zero; + _active = false; + }); + widget.onChanged(Offset.zero); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onPanStart: (details) { + final box = context.findRenderObject() as RenderBox; + final localPosition = box.globalToLocal(details.globalPosition); + _onPanUpdate(localPosition, box.size); + }, + onPanUpdate: (details) { + final box = context.findRenderObject() as RenderBox; + final localPosition = box.globalToLocal(details.globalPosition); + _onPanUpdate(localPosition, box.size); + }, + onPanEnd: (_) => _resetJoystick(), + onPanCancel: _resetJoystick, + child: CustomPaint( + painter: SquareJoystickPainter( + stickPosition: _stickPosition, + active: _active, + ), + ), + ); + } +} + +class SquareJoystickPainter extends CustomPainter { + final Offset stickPosition; + final bool active; + + SquareJoystickPainter({required this.stickPosition, required this.active}); + + @override + @override + void paint(Canvas canvas, Size size) { + final center = size.center(Offset.zero); + const stickRadius = 20.0; + final squareRect = Rect.fromCenter( + center: center, + width: size.width, + height: size.height, + ); + + final roundedRect = RRect.fromRectAndRadius( + squareRect, + Radius.circular(size.width / 8), + ); + + canvas.drawRRect( + roundedRect, + Paint() + ..color = + active ? Colors.white.withValues(alpha: 0.3) : Colors.white.withValues(alpha: 0.1) + ..style = PaintingStyle.fill, + ); + + canvas.drawRRect( + roundedRect, + Paint() + ..color = Colors.grey + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0, + ); + + canvas.drawCircle( + center + stickPosition, + stickRadius, + Paint() + ..color = active ? Colors.white : Colors.grey + ..style = PaintingStyle.fill, + ); + } + + @override + bool shouldRepaint(SquareJoystickPainter oldDelegate) { + return stickPosition != oldDelegate.stickPosition || active != oldDelegate.active; + } +} + +class HorizontalJoystick extends StatefulWidget { + final ValueChanged onChanged; + + const HorizontalJoystick({ + super.key, + required this.onChanged, + }); + + @override + State createState() => _HorizontalJoystickState(); +} + +class _HorizontalJoystickState extends State { + double _stickPosition = 0.0; + bool _active = false; + + void _onPanUpdate(Offset localPosition, Size size) { + final centerX = size.width / 2; + final dx = (localPosition.dx - centerX).clamp(-centerX, centerX); + + setState(() { + _stickPosition = dx; + _active = true; + }); + + final normalized = dx / centerX; + widget.onChanged(normalized); + } + + void _resetJoystick() { + setState(() { + _stickPosition = 0.0; + _active = false; + }); + widget.onChanged(0.0); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onPanStart: (details) { + final box = context.findRenderObject() as RenderBox; + _onPanUpdate(box.globalToLocal(details.globalPosition), box.size); + }, + onPanUpdate: (details) { + final box = context.findRenderObject() as RenderBox; + _onPanUpdate(box.globalToLocal(details.globalPosition), box.size); + }, + onPanEnd: (_) => _resetJoystick(), + onPanCancel: _resetJoystick, + child: CustomPaint( + painter: HorizontalJoystickPainter( + stickPosition: _stickPosition, + active: _active, + ), + ), + ); + } +} + +class HorizontalJoystickPainter extends CustomPainter { + final double stickPosition; + final bool active; + + HorizontalJoystickPainter({required this.stickPosition, required this.active}); + + @override + void paint(Canvas canvas, Size size) { + final center = size.center(Offset.zero); + const stickRadius = 15.0; + final trackHeight = size.height / 2; + + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromCenter( + center: center, + width: size.width, + height: trackHeight, + ), + Radius.circular(trackHeight / 2), + ), + Paint() + ..color = active ? Colors.white.withValues(alpha: 0.3) : Colors.white.withValues(alpha: 0.1), + ); + + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromCenter( + center: center, + width: size.width, + height: trackHeight, + ), + Radius.circular(trackHeight / 2), + ), + Paint() + ..color = Colors.grey + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0, + ); + + canvas.drawCircle( + Offset(center.dx + stickPosition, center.dy), + stickRadius * 1.333, + Paint() + ..color = active ? Colors.white : Colors.grey + ..style = PaintingStyle.fill, + ); + } + + @override + bool shouldRepaint(HorizontalJoystickPainter oldDelegate) { + return stickPosition != oldDelegate.stickPosition || active != oldDelegate.active; + } +} + +class VerticalJoystick extends StatefulWidget { + final ValueChanged onChanged; + + const VerticalJoystick({ + super.key, + required this.onChanged, + }); + + @override + State createState() => _VerticalJoystickState(); +} + +class _VerticalJoystickState extends State { + double _stickPosition = 0.0; + bool _active = false; + + void _onPanUpdate(Offset localPosition, Size size) { + final centerY = size.height / 2; + final dy = (localPosition.dy - centerY).clamp(-centerY, centerY); + + setState(() { + _stickPosition = dy; + _active = true; + }); + + final normalized = dy / centerY; + widget.onChanged(normalized); + } + + void _resetJoystick() { + setState(() { + _stickPosition = 0.0; + _active = false; + }); + widget.onChanged(0.0); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onPanStart: (details) { + final box = context.findRenderObject() as RenderBox; + _onPanUpdate(box.globalToLocal(details.globalPosition), box.size); + }, + onPanUpdate: (details) { + final box = context.findRenderObject() as RenderBox; + _onPanUpdate(box.globalToLocal(details.globalPosition), box.size); + }, + onPanEnd: (_) => _resetJoystick(), + onPanCancel: _resetJoystick, + child: CustomPaint( + painter: VerticalJoystickPainter( + stickPosition: _stickPosition, + active: _active, + ), + ), + ); + } +} + +class VerticalJoystickPainter extends CustomPainter { + final double stickPosition; + final bool active; + + VerticalJoystickPainter({required this.stickPosition, required this.active}); + + @override + void paint(Canvas canvas, Size size) { + final center = size.center(Offset.zero); + const stickRadius = 15.0; + final trackWidth = size.width / 2; + + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromCenter( + center: center, + width: trackWidth, + height: size.height, + ), + Radius.circular(trackWidth / 2), + ), + Paint() + ..color = active ? Colors.white.withValues(alpha: 0.3) : Colors.white.withValues(alpha: 0.1), + ); + + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromCenter( + center: center, + width: trackWidth, + height: size.height, + ), + Radius.circular(trackWidth / 2), + ), + Paint() + ..color = Colors.grey + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0, + ); + + canvas.drawCircle( + Offset(center.dx, center.dy + stickPosition), + stickRadius * 1.333, + Paint() + ..color = active ? Colors.white : Colors.grey + ..style = PaintingStyle.fill, + ); + } + + @override + bool shouldRepaint(VerticalJoystickPainter oldDelegate) { + return stickPosition != oldDelegate.stickPosition || active != oldDelegate.active; + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index fc37608..eb86177 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -41,6 +41,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" clock: dependency: transitive description: @@ -142,6 +158,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -184,6 +208,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.4" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" leak_tracker: dependency: transitive description: @@ -565,6 +597,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.8.1 <4.0.0" flutter: ">=3.27.4" diff --git a/pubspec.yaml b/pubspec.yaml index e2ade93..a95d9fe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,7 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^5.0.0 + flutter_launcher_icons: "^0.14.4" # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -67,9 +68,8 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + assets: + - assets/images/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/to/resolution-aware-images diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index 467e587..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:marscar_controller/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}