<)$<8D~CqZ?e>x zafE}N$hGAyzSI*=0dU7tuezkr7 ^HzuHp;%B$g;;B;?lXmW?U07GQu$I*0 zvd1ISB@VCG@%4+ZXWodHF5T958F|BAV%J|xH;_DQIb+LbsehZbf@sC8n#jl4}Zu zn!$yrjlXXD*Y}>wU$D6EGR7|JTg=nv?)|#G8@%x|Lr;nYu>cC1Kri%8#JL~>f{1MZ z@B%i8fxpS;82f--ws9j~vU#c1R${X*-8}d^@&5h$?-wmcX87v8Gmg+}mtISB?WMDR zy+d|5 16dFKN}58Sy=eR)YBu$Zt^neaQbnGxGCc1@>`9EQag&_@fr?(k@tAk%51 z#Ys?%lVU%+jHb1;Oe5{AKE%63hxqyKonInP*h6&jx^)+mmi*EMw3q6}%?7JDPW@%u z90Ij|oR1(M#8viNcJ??t9!F0%7wo$A^v+xCt1!=}#z%&HDtJc^$4CT!=CpCBsvZw{ zwOTvVYo`rD%Ww(GL8o^O9ThJZJHTnigz>^m&i|v2F>S*EQh~9?NMJ^q8uAb%As%`; z{XL0OO@+LsJSrjd|9J}N*|&Nt>cyL=*BIgy<+v1PV}+NqMhWQ};O zgALY*&wBf*QM_wGYgOZ{br&&D#KW%KNt5`H8XKMJOQ90EQF5kpG?C_rjOz2hoJjKI zB}9{&9OEnV^@B01H)3VaS$z@fU_c+_Rp#=l5@Ht*5AI?6D*B@~=Alr1RpBcZOM|H_ z9iFsk<_x~Jq@j<&^VwkaNeC632GxNE<-vNp1NA^rC&+sqd$hZ_QH`92tJ&L}m<)#b znN5gIi# bYSqK19VlGBHx`Jq~HL(JPG6= z{~KySCC0{9l#c}-7=(#KFNlwc)u4@8jSt063XY)>Z~>CMCf@VCv>v%iAe+YGZzs1& zGJ=}BAy>E|-v<;om+slsLGK^4RO9p=d)Hgz`+Y8~IQ_4@A5?>qeDn#CervHj;`r&5 zCk)I;@^`G&woCjKY(Wj#zHp7*eu=+)@V;Q!zT<$s*TlR|OW)wLn@Bbqds&@%`{47e zv6m4^gYUb{-H?4nVad>Q;+ dcx@O(nFu zMLjrAvZ_CuG?9KcMctH2Poj4wP1&z{4sc#| ${dW2(nMNDk2rYowN)m1^?jlSRq)4V~7GiQ{7zIK~Tb{QncA^*2c zb~ydAgB*7_{TMTxBsSmy5$>pJB5JDYAWzgYcy)CnQKOjfD2k_TFi$}*+dOzZ-Z t$RlHd229;^XSa1bO9x5PhvVdT+MvqNE zFfrAHNy=xqwoB*Hz)dt2>Y)q6Efb(WS!s=Utk>GZ_G>NVj#^iVz7zE4%dwm8ydarQ zCsl>(IWO3C@Xt^{AL;0_x+0dV?DnfHVYjt=f;wIHs`q2pylX#ANvG9LY?hPgYm;co z0d*;6kJH5cL*ECibBAHYI>2B%i(~G0D_9N^SOJb&r@_h*jKj+LP9`|)*IGRh>q_Q} z`ovY%sGF>Z?C Fth+Bd_zOGel*`)PK~KtFudKFpbOUbdmmKPe{q!h6&7{;h z>C`0pAt0sw>XZYg=}sHK`+|B8Z*V-J6LXoe+M3nI8moi%gm(a9feBQ0v@Vsa)ioWw z_)GQIPV4Rqt#Pk)_a3V+YTdKP8ueLs@3#6z>QyJ})uD^O_1PcTQ0k3aP#-n-ARR+} zOWe!Hw07w4;`5>fQp|XbOD|wh^B{H^zTssgrhuCaa3NRc*3;k+O?;I|X}(L=2XNm6 zEnC260)?q?MqRW(QPlf9A*T{`y!{eU$RkH=&3El_M5`sa<>n`{%*ej;N{cL-M5=`X z>v@AkmZ=@)HfnP@ e*tFc@$D&_vFAL{U^ JBVVW1Sir7Qry$4RCSzh*EjSdArpr$#4F*=ZE6g+3FmaNYys zt&tg>C&68vVv;~;_&NY>)lesgxj8fHe4A}vFn<$s2i >YTfF8g%)f-Vq(>oWkbudJrG$5e>sn^1#Z@pF8 z=vsQb)K{mzv)DPowOD =8<=>T z%XK@HRikYoXIamDVK)wMCOXGh+)5yOoN-cab$jWcC*b!UByZYt&>K)Z2R&z+fLqD$ zy~LC85b6c+1d^9{pqd*EW9BS)qzMFEz&;B|>JeJXAyV%GG-m>ZCVSFeK#aK_iNj~a z;4==unHtb({;7ADp4KbqhuT3gL4Fe8F0h9J#UTGwgEoz7EAI5$_U^U$
GlPi7$wX>mwAa9 z&zbQs1aq1-wq+J$vs&zKw|yZuc>-pbE>5n&v#h|gt**1Io6%$PuX6+ACs*K&G=6gV zof|(#8kisQc(3+i-mdnR_^t+tMrzbP_L|~7;LUok;dQP-;(!m>KDupX^n7@Evyf4M z3z<<(iBK5&Xd~1B-cdt(C0>ia|M?o?>wI`WAJxK<5!>|P?YE2K?b|Q74d;=~jog?Q zh_~<9!K>lS`!r+d8Sx>=#9Zer7)NjlUX9NOYU@N^Gto6L;Sp}Ae?&XmEMd#j){v#u z8uD5;SVGp1EQR4R)L>IBD7Lm(y&>y*i{&FLv 9heYwv zmZL{k>}G8D3Y<&DLwk{f{PXtq_33#yZ@HGwIf2gH2A_siT%IWIlQ}S`*z8Z5qYDr; zi`yZ@P^~p>hG^{~XUuJKOqoyOFArmy#9J-`XL6-1U*QSU&HpJHKkb4y! 2=kL_m!#RIV8CRWZBpoEyJDUV*NdPD zv~zHcWU}qI1s#$dXR+NBv>mWX4h46n7PtIWhuiJ=s_g!(#qGG6r*RSw@<;57L&7=u z+2h4Wf_ROI-J&<8ph2^ume~~ZERz&ew5Co0BzB#8b;ro(B@LR8T>=!rdo(~LMFZ46 z^2KkTdX?i;QblX%(&yCw$;fVLZE)~;kEfjiM8nA~L+^^$i;CcfJ)FyO1uSPi;3MeO zNcn>vZ0M}`g 3p0Qtg zR1_cm(p8U45>a@aC|-vuXcp`8Yl0$nvJ j^8nX z+SSJ=46#cls7KYK6S(i;=z6e^7V_-q1Ss6vPpc;!5e|sU*d_2B5ID~O;eeA?ZsFyA z53s5>)rpfFR;#+g7PCKKvpH-r+YWooMqRcT+s^M$VtWvUcAIU7)rx$y&jj1hPsESK zNwDE^o)@Fg=!WVa^MK`0)GoxhjE4rn8q{NbVNftsT)pjgXCP2xsuXg=N$4F`UsYFd zc(?}MeuG ~&PS2Oi2sUY#iE>nSXc9M(UtTAZ$LY0R zJ}A40T=KQI`2A|X#q0EtT&G@GRYRRlx7(?{MdkDW*(EZmAE~p-L9tKgBVi9elRUy@ zSADdaa(RuRKPyA|fK9qyvPxeu`yC|SVJo+OTeP2PSNx*sdZY1rlf!GFZ-v9^O0&-) z7@$x3jrbk095#-1Lcj0@U>X-nq1}RsC6|XuwlSC2jNvAKK+0!ebAiqaqzQJ}03;_9 ze3Y6XOz;bYCB8Huc4#Z49o3+Z(l3y{B@@hc`UN66SG^8z_R5GYnH_XGS Cc zaojkQ*}8BO^GYo@jTP-SI1)*QX7&X+Q_0_0=t$#@+40RH;Al=d%TlSlJ5$SxS|>$O z6q?+|;mBs)(R4b&DYmXc#<_X8U9_&_Nc+%F#mB`7f=@_tFFvm5)l@Mi5O!{6F+ve0 zW+7*1f#N2Z^3r*c6Cs|I*ttsDP9b}+B0iXimXs!_ahWB$NqyOBVUt6l+A78KRfD*U za-LGy@T{*HCS()rckzm#T|I71DY2+!nfl9A8U19LXg0iNwJTY#XYfKRl~UeQ6Q~V^ z2Y+k X|TE K<~1-LHE5*yEmZhqVZS(J;3OQ_cc2cZ<+m4}hECawLp8 z1W&96?zP7KQ=rWN*6STRBaeEA%j*v$^Tg(En_@9|Y#yh@UlGehqQQ8|8wuwlku&uJ zY=GNgbVr=t>TFXpRm5#J+3B`tiDDst+~dk8r1V}2 {Qpq zWT)78>Atm=2%nwY3e@y4 SjqaEL>pV9(gN-r%kFuEH3x`X?VPB@YdTMobMt#s5iR5u#QdKn#_v{9g zV;sFGpH>B1#P^6-FAZmj*PmKVCI2>qj~^5E4ZQ~4XBIm zB?s!1mKoPQgT=~oE%bQe8ZM~WWx7N5kh!I1;K-KR#xY^2<-E?0!q$hj>vtYDcKyS< zO4>Yzrn;?12BuaT8?)q*KQK7SIN50Pm&E8t&{MdE?*^OkIzNicX8MXPV3=$qhuUW= z%4Wm+V2ZCh&;s}~V6%X5_xXFFm-CL8Xs(X)yRixz-4Jw4WYcy!`X=AqzB#-Vy5zAZ zx5C}^WA5`fZ*qFRTUDoCZ*rQ{8)zTj=ICORN!>Sk8@%o?w!s0bdQkHqb8^ s@uo%N(`e6~gu$l_MwIabteNKuAC+WgTf-p=8eltt~PQP+Il;BO|74K(% zh7S#2MH7YP+$(}hYnp s00Bj2zTEF{!Sjc2f4Y84f(6yX$& zZ^K0urTzvk&1rAoH8=vWTT%`7>$$D!dVBrk2AkUA^m5 Td7auT{IO_76c(>UHsOo;;<;QL zmqfOKq7|`dW%LK$xR>I&EKHYB)y1>f_~KZ3424nkDas~zX`-YgLB5z55Ant-Fbf#3 z`NA}e*TbOeJ}u&*j@vW5d<*3B!d-)bNZK5o-0(3#oKWhSpI7r>AekH!kH5rbIK5uy z;6pfn?_`$NB|T3`oL-I1p+sep;#F}k2N||RuljDXGMT7~dpPXH9Ey(_U5U@VsQL74 zVatoMJMV?A&%%7?{Fp#YI5v6A?8zG_baU5%T(aw2KA&rFt21!s8&-gfmGDvEZZ2H- zk~sPGWWvt{E+!a;o) )IW~*3%i&g<{2-4FzB;ltC(-t>)f%o7#h&YVXyeDE#eX9M?7O{=)%dLW? zBCD=&r4`XhSu1&iR`nIkT5@5U?rdvpysBNDH`g$I*3TBwIFyEIoBGr^! =j#qlId(VgSJ)YL$2>b!+Nn>F1q7Y|3hMY<>m)$ot~0rY^J zcZH-=QplC$;U69_@Lffp1R3s>Mb4E8?~vbMQ2+GyarIq;fr7`D?PP4{GX0#ate8+) zS?%~>+SCsmjt{0z`(UlObLp}R7`tHE(w+M&J1QzVAn8Glze@O?xSh?1PmZn+gseU6 z{9(Gu7D(HumTGP3fKC08J#GKcn(^DHS$*2(&sb>@yk_-x+=q88fYqN%Xk09iOcpFN zZhwOUz-_15HYI6SpI4u^Clwpbw% te_GMezuRq~W+tlya?TRgsvU3RSsUn2@9aY75aCo?6ue-7Y6d(m;? 7vs0(Jo9z?){-i*TaH=o-f7(V_RmDWae2IUw`EQqEU_{zeWHRs^^&E-$$K z;@-8kq~ER{bD%eG+5Jh|+P$LR?{~9?6<4pZ`V%k~Ivna-4%ishT)krOS+}n17} Y0yIv41TX6H=+%Sq78}-w}DpNgU=QlK?A%Yy%E-+HA0Y|Tg7YGfAW5K zwKqc~X7F~w;AT=LEbA(U{`3z&dF=)kck{Qtx&F`^8~GD5x uPVn^iKPv|2-;IK__nF_Q3G*${2p&H^2h!Xe_-Q%#S4o(DxQ*}Z1 zhAY$G190ev$@m$A>5}EkFEJUOaYg7dN5ooQT~%R?ghWe8X=#Z?R4)|`kC|ojmqVd1 z 5S4PabM7_2mEL5Sy^7ZTi_Q^f_* zb_QkxPM8ez6 S*Fry z;reS@?bh(L(yFqS>Z_EHAz1EgZkEikoKo%_+w3Y=q{ 5X< zA~SenKAlk5Atf<5#7Lw~YMZ88d=h8oBctK*L ^|@0$z~}?xK8o-*|;k5xQ+iuCadXZQt6CMa5J(xr8oX)@~9svk%)qPWRbu(QD8M+ zxJIF4=ne6xm;}vEV9%K@KvkmmSl_zEVSbwXr>KXT20!_FSrc~<^2lFD)(4Q) zn#y=eyJdglDg6Onjn?p*QIER! l5pYkQ)^zrPT z81!#^Ezasw@h@%Zg#AojEC0qXX?o zid0ukA8{d2^?CxLi6yJ+Olg>
tf~=6 z2Pd2{ja6@1B}5GdL*79-o-b`F&Bx>Ud|N)xamyfhitv^|d(^=7>)EqHT6Ey!L<-P* zb*Oy-?HRrY(bj(lu--4W9#qXc`1|ahCwZ z#DWl5%iy(eY9I@{?z}Z5s_&gxy {^^D#Yb$Dz3S72w9o&2Zw36KEilE7~ z|9v*8-gz)#aVr+qXC_zBJowMnJ(;P0a!|C>&9*PAD0!a}T>*B%x%K7y+AhgX`4bg_ z6=^rLM0Jzspx&1t`tm6H5)-Pi5)eU=4S);K`;tA`3na9DiNjvcxYK)+)k2XalNanR z-#W#FHQ+W6-pIRUrdey|)r^~T^q+>MbF0qlMA!cO?)oJ)6K5fZRxPM1cIgf`+i_lH zc7AQS`ktR{PgxKbY+)PGCk62qu^O-anK7ZR+N!pT(7VCwDPHR*+f#Lc4fR!Rmy}F- z?+>|(rP~>~)B*C7zr60;9emB`a>VyFIU>Wc?u?Se2*d*h>Z*icsp7qNj;SX!sp7HE z42I7h`^lieF!&Q)ept4XAVpwF0MD!KrzDJO+tc-9o^?2$9aH~w8QXQ }q{D%j zy>@$jc^TbzbK7EeFKt*br=>t*ZM=Qv8nIqVCqjt5vy_D4#%VIA1J0Ps9rGkBDH5!{ zye*N6g;pJ&*tB)l?!yN4y{>~|#YHpc@5nIC4^|Y~VB3FE>_Sv=udoxeggZEDy#bRA z^%(l2vv5sZSB6CfRt{YN$eg->=`iti30@7QGIxp83OFy<2xFQi4L3Fvni{!S+=wtH zJptt#K`G8(nbFm9bbD*r#9(DTks%PYI^D9D+H1e*CS!+z8Y>gkzTCRm^Wm=q)V{i+ z=YqB?zR4(CQFlR|-D6E@wd(UX`y*s?NCulF<`6Ars @vHR~u8I@r|%SE`@%8%!9VQ#e>FY!r6k-CSPKMv2o-eP}egm?@$c zZ tlVJx*eAeqLE9)`qOV$y!r0rI#J>5dIZprTV zR~U^e-skJYfLPC;A=Y!8rl&6F+BRSrB0V*mo~CexundZdsRF^(bj)0Xe_Dcaj)3zp zrA`HO`g}_%+gOrm%KjJOi#H{WxRx}Q;BTBPU#&-P;tL5{{N_b|g@z(1%Vxu)E_@y5 zh7OCbiaq$=4E8?-7{?WXJUov32k<}|_%DF+0Xw +H(FJNgPI%$j! zyo0$5+9xf1rhFkl>5OJxOXHIkcR~>wS07L+ID`+xL&WL>W5!elqUsP$bSj{PG-*f} z{2TrKLrJVL{`Dgo^csx#Vntnq%8kZN2k4$LO$r$_a6eO;#;8jU(BXj37l;i0)9!HC zKl|*T^q~EtKilbPb*9_#{)Yw?4k*#6`YOi^0}41*01=S@5#q z{wQv)(ZLi3j9hLhhDfpVU$i-1wyJig|3`NFFY**-^CZ(7S{&44mF&4oP2ynLg+{Bb zll_;`v_lJX3faksfG4&P!B6mIr`1D`uy2S{F-N-QuK>d;C!;zogS}Ne#WTqvYMMxF z*_0{E7)@%VP*O?YqfUvb-D~Jd=i=rmJZN&t*u}DX!J01i1|?Beg^uvPt%r^LX4uI6 zLcAD_qgi=R%8Ux 73le{_%Tvr1)beh Yw|QGlqX*#^HZIZuaMYX zH{5U+ldhQD`IMPn+}OSP=g!4rldV-jwtRBSBInOnce7NoDv7_r4sr9Wb2|}@(^}Io zmC>|@npWI&o;zzZ=KGZVz;~Dt *rVVS!6<-0fmi5a6R@+KAf5RPyuN ziOjxOJQ-W?TyjS8sZ3%-1mLCAI!3QKrd9nJWfGD8aAd}Vk?4by5^2pI06u=`s6h}h zt%!Wea0=n&9?p&YOE;jdtq4;C!Qgj_n}1P3XWunV61G+z99_JCsm)xycp Bx>qv6I~Py(<=)XS$FMHH|%_L7u~vZ zr`o-XW>P(BqVhI~Gok$G1;{$^KX-9bYv+9OH6F5neBBm-SpaEY$lYXchn@LXnGL z7qpnH6h0lp;r60Kb&4C?7LS6;@Te}XishpE?&%=2fOI;CdQU53t!zdssja&~3we@V z6YhxIHw9tXp`Kso8XD%**YBCMi^JNkfjxd4UCSq-ZKryilyT$KpBz*ucuRXAaNd7V z!yG)&Fba>8qwyHg<_!fe+!wrhbb;oIJqn@mEhF)3)-uc240gZi%SNm5%chZd{gT~l zrW-;bb(7g^m%c3F4|IPQVv#S0EW+)Tjlu+I3{S>#`%hXGzy@L0)U~Kw0%;r;KEZho z2PA8wR1CQ_@jzRpj%}o=tz!|ReB$gew(gi)i?MYh0uC{@@BD `yw?sTdsS6A zSF&3(`Fx4RaJwyH4Mk%?u2MJHJbu5|BATI6zZ0=vPS^JhYrYMY`VVEtxfZC@Z~XQR zZFb2WmFq9P=2EECH=2z0^on&W(hj598g+)I&e1jKe2*KBL$pD6#=lDjc0!vFzv71V zWc+Em9XQ(MxWzyVO3cvj3EvAOL>^9IkqMTV$9BjOb{w*KqSlq-Zw?;RqY&A7+ ^29{cwD2ij@$s$fG3@V`*DE9;@VlI_&_$B_H08p$6R={tg89{f>h|U^$^t&;$&* z5o-y|^N5c;TsMQZ&X}QIH-puW_>2QvK0|$d#tbT%arx(bs)6@=I962e_c;2TSW$3# zdaP!R?5Dj^KX~A^LL)m4tqAkj3G2ba{K1)g3++8rpHW>>0cmUA^Ui`kW^i^icf) zbsdkhoHBGwd{pFLNiFC5C6wlx?i@?N530yD(Aa~x#G#91T=kAc1ePR_;#C`X8T9Lc z9>vC |aY#$!}A<+*He`s?# z{&L?7qWHpne{s0(Da}3%CXy;XtE~JC_4B!hvpgUM y?Mo3hrj+_i z$FOKESHRv+^%b|3*VFg7j{n`D?;2n5ZPo7bKsn~}l2iS?-RW}&T^{GHgbUn*gC4eh z@S3vn@-o)Xb(-TU>+37WapS=kcvSJY!TFdH`cPBu$};zwlId^Som2KCc`JG$Ul-A# zhYc2d_ho{x0=g!I!ofF 2~EO*T}Y(DI|Vvm&4&))iJw=y-$c?MvQP*2hG%CgdgnavXK_t%*O-- z(26lhYFbk4!1x?O>P)@X!X0%xG6*@ar19heV@*_&A@$Gm5dVdKrN+<9<@WG?v2lp} z>OsHkjzd;=)G{F^!gt0?2yBkH5srP=9-rUu+jB +$rVX6g=CM5|4z@0`wG(Fy!5E2*&0LUY%X}9QSpu%C;DZUAU~k zC)8ho31x-ydQZAC__Lp#x!-&~-4TSF7rSkVy0saF3-kYOLQjrJSBI*N2+bTZBqQ)V z!+nghTo;t)gyf9VIs%!C8#hALi^x3A?hE?t>PP<%@%2M|rWSu6o^e`FVdXh|QqMVs zll%)-{h*%kjKd7)wB3WJ34Rt0#eB|d=89<%)O9%DFrto8xIkD{tRs!cx8gf#FBbD{ zLXOHo`TB((p%bx3J@8^n!s>h>&b>mH&?jt#1)86?3ky)XUf3aQM$LX)x1z>yodIyY zOHke~3?Pr!PvYBBRgjl!&Y0hdFPe0s<__(Byv2HO^hs#+YP6$Om|AT46nuSXfxo#< zdpCc771E7(vJv@B7>6-{z8BC=12kJTh)(a<0LEoKp4yJzb$E)$EA$ClkQ#2U2YuX( zyri&AE8B?obfI>Yut9rj8+u!f-{FxNu3x2%*cNSF;)EY7X6^HSpeTlgnny(&2>~9k zLs;-FSsOfU91xhCaO8#Ij=+Y%To6FWNs#beNs8dZfcz^r2})9m(v*RBau$Ilc`5}y z{DsO8F@g^ULJPsEdJTMS>ZqO?sF9lBIMobC+7?(5+aMT?M+89!O`wSo6er`u2vcbq zO{W 3wVUvciDZt9_R zw4OFlFIMIz+Duz$EA`PfI-mM!fVR^Px`1}lF1nC*(;m8rE~YQgCHVBtrF0qXGws;g zTZ5nCb*!nYZ|nBXuI #+1>3Z7Od;tyt${_uIKAF&Xbk&d*ikZeOr5s zJzF|^H(R?lbZ%d}W9{0_Jr*t5x2tEsrd7}@+q7zW+I6aO@y#b6DZY7UPw(133FlqC zTW#BVwywXhZ^!vNI=32lMRxxA<_mhed+@Ilwn#X7`a8ufy QP_h2sL*5F-rqT}LE5oxb6;n-xw~)YR-Q0+ZAO`) zzo)y;uw!d?pQ*oRU4PHO2E)Mi&VJj@4ZYiYx_bM&Hus=nPiMcQSgf~Y<&}!bZJT!t z=t DsimZ&&dVt?8aE+qPe5FTPg0k@|Zy5c$hDbZ%Z}AK2Er zb!$(5*M$H<8UPes8!Wszt+r`hU;oa|{%*tC&aO>*3tKw-H)&;t4SidB%v(Dz=w08r zy~nT~k6O2NVurVE?%djA=-s-m<9q^EL^ix~Zqzu%)lR$FOd5=XxuDum~l8s+i;t z6qEe1Vv;|lC(Q#r+qd^_T|Z#h+&i!x5cMO~*SF20HQKegcblc>!eU+fj%^(5fzJN^ zzMV3kjuE$;d)93~b?fZ!UB6+(y-j;&`vwg2Hpj^{f5oXg{s#GEnf3znwjG-{^IFD% zK1{V?U_;+F!$4Q(Rx6+QVrMua=t;Ydb;bOy&i?Is(!i7E;i+^FZ0X#*dDJYUivyd1 zYI=3^@U4i1l@G3-@88h5wR`)99b488aF|x>x$@{-BuT#o@N$pN$NIVjo#7uiXp` z&`Jk(^lsM{Yw@Lg@%CYb6(JhFwd>Qa=UT8-^pu1YFwUW0dNyO)26}8G`sq4_L;4do zZL#TTyOu641xde=hfz?kB4de;7$KWB9mOI(799JFx5Ff$_-=ji>Ni&YZ&) zy883_9z*ya5A6Q}&m5Ln literal 0 HcmV?d00001 diff --git a/components/rate.vue b/components/rates/rate-one.vue similarity index 100% rename from components/rate.vue rename to components/rates/rate-one.vue diff --git a/components/shareAll.vue b/components/shareAll.vue deleted file mode 100644 index 7cbd813..0000000 --- a/components/shareAll.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - diff --git a/components/status-nav.vue b/components/status-nav.vue deleted file mode 100644 index b0ed12c..0000000 --- a/components/status-nav.vue +++ /dev/null @@ -1,188 +0,0 @@ - -- -- -- -- {{item.title}} - -- - - - - - - diff --git a/jsFile/tools.js b/jsFile/tools.js index 531362d..2f5df27 100644 --- a/jsFile/tools.js +++ b/jsFile/tools.js @@ -1,6 +1,6 @@ +const app = getApp(); const tools = { timer:'', - timerNot:'', // 埋点倒计时 daoTime(){ let daoTime = uni.getStorageSync('daoTime') @@ -9,13 +9,10 @@ const tools = { daoTime = uni.getStorageSync('daoTime') this.timer = setInterval(()=>{ uni.setStorageSync('daoTime',daoTime--)//设置倒计时 - // console.log('埋点倒计时初次:',daoTime); - // console.log('埋点长度初次:',uni.getStorageSync('maiList').length); if(uni.getStorageSync('daoTime')<=0 || uni.getStorageSync('maiList').length==5){ uni.removeStorageSync('daoTime')//清空倒计时 clearInterval(this.timer)//关闭倒计时 // console.log('上/报,埋点'); - // reportBuriedPoint(uni.getStorageSync('maiList'))//上报事件 uni.removeStorageSync('maiList')//清空上报参数 this.daoTime()//重新倒计时 } @@ -23,13 +20,10 @@ const tools = { } else {//继续当前倒计时倒计 this.timer = setInterval(()=>{ uni.setStorageSync('daoTime',daoTime--)//设置倒计时 - // console.log('埋点倒计时:',daoTime); - // console.log('埋点长度:',uni.getStorageSync('maiList').length); if(uni.getStorageSync('daoTime')<=0 || uni.getStorageSync('maiList').length==5){ uni.removeStorageSync('daoTime')//清空倒计时 clearInterval(this.timer)//关闭倒计时 // console.log('上报,埋点'); - // reportBuriedPoint(uni.getStorageSync('maiList'))//上报事件 uni.removeStorageSync('maiList')//清空上报参数 this.daoTime()//重新倒计时 } @@ -39,15 +33,6 @@ const tools = { closeTimer(){ clearInterval(this.timer)//关闭倒计时 console.log('倒计时清空了'); - clearInterval(this.timerNot)//关闭倒计时 - }, - maiDian(data){//埋点事件 - let maiList = uni.getStorageSync('maiList') - // console.log(maiList); - if(maiList==''){ - maiList = [data] - } else maiList.push(data) - uni.setStorageSync('maiList',maiList) }, weekDate(){//获取未来七天星期几,几号 let date = new Date() @@ -63,10 +48,6 @@ const tools = { isPhone:function(phone){ // 手机号正则表达式 let reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/; - // if(!reg_tel.test(phone)){ - // return true - // } - // return false return !reg_tel.test(phone); }, // 电子邮箱验证 @@ -83,6 +64,21 @@ const tools = { hideMPhone(phone){ return `${phone.substr(0, 3)}****${phone.substr(7)}` }, + // 手机号中间加字符 + phoneAddChat(phone,startNum=3,endNum=7,character=' '){ + let phoneStr = phone; + phoneStr = phoneStr.replace(/\s*/g, ""); + var phoneArr = []; + for(var i = 0; i < phoneStr.length; i++){ + if (i==startNum||i==endNum){ + phoneArr.push(`${character}` + phoneStr.charAt(i)); + } else { + phoneArr.push(phoneStr.charAt(i)); + } + } + phone = phoneArr.join(""); + return phone; + }, // 昵称从第一个字开始,后面的都用"*"代替 hideName(name,num){ return `${name.substr(0, 1)}****${name.substr(name.length-1)}` @@ -113,7 +109,7 @@ const tools = { str = str.toFixed(2); str = str+''; } - return str.includes('.') ? str*1 : str = num + '.00'; + return str.includes('.') ? str : str = num + '.00'; }, // type:+加、-减、*乘、/除 // len:小数后保留几位 @@ -229,6 +225,65 @@ const tools = { // console.log(time2);//1398250549123 // console.log(time3);//1398250549000 }, + // 返回当前时间 + returnCurrentTime(format,type) { + let date = new Date(); + let year = date.getFullYear(); // 年 + let month = date.getMonth() + 1; // 月 + let day = date.getDate(); // 日 + let time = date.getHours(); // 时 + let minu = date.getSeconds(); // 分 + let second = date.getMinutes(); // 秒 + + let newTime = ''; + switch (type){ + case 0: + newTime = `${year}${format}${month < 10? '0' + month : month}${format}${day < 10 ? '0' + day : day} ${time < 10 ? '0' + time : time}:${minu < 10 ? '0' + minu : minu}`; // 2022-03-31 16:05 + break; + case 1: + newTime = `${year}${format}${month < 10? '0' + month : month}${format}${day < 10 ? '0' + day : day} ${time < 10 ? '0' + time : time}:${minu < 10 ? '0' + minu : minu}:${second < 10 ? '0' + second : second}`; // 2022-03-31 16:10:07 + break; + } + return newTime; + }, + // 返回时间xx天xx小时xx分钟 + returnTimeFormat(startTime,endTime){ + console.log(startTime,endTime); + let newTimeFormat = ''; + let currentTimestamp = this.timeToTimestamp(endTime) - this.timeToTimestamp(startTime); + return this.returnTimestampToTime(currentTimestamp); + }, + // 返回时间戳转时、分对象 + returnTimestampToTime(timestamp){ + let timeStr = ''; + var day = parseInt((timestamp % (1000 * 60 * 60 * 24 * 12)) / (1000 * 60 * 60 * 24)); + var hours = parseInt((timestamp % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + var seconds = parseInt((timestamp % (1000 * 60 * 60)) / (1000 * 60)); + day = day < 10 ? ('0' + day) : day; + hours = hours < 10 ? ('0' + hours) : hours; + seconds = seconds < 10 ? ('0' + seconds) : seconds; + if(day*1==0) { + if(hours*1==0) { + seconds*1==0 ? timeStr = 0 : timeStr = `${seconds}分钟`; + } else { + timeStr = `${hours}小时${seconds}分钟`; + } + } else { + timeStr = `${day}天${hours}小时${seconds}分钟`; + } + return timeStr; + }, + // 时间戳转时分秒 00 : 00 : 00 + formatDuring: function(mss) { + // let dangTime = Math.round(new Date()/1000)//获取当前时间戳 + var hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + var seconds = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60)); + var minutes = (mss % (1000 * 60)) / 1000; + hours = hours < 10 ? ('0' + hours) : hours; + seconds = seconds < 10 ? ('0' + seconds) : seconds; + minutes = minutes < 10 ? ('0' + minutes) : minutes; + return hours + ' : ' + seconds + ' : ' + minutes; + }, // 随机数生成 randomStr(){ var strData = ""; @@ -268,30 +323,18 @@ const tools = { return newObj }, // 提示方法 - showToast: function(msg, icon,time) { - // 弹框图标:none默认无图标、loading、success - var newIncon = 'none'; - if (icon) {newIncon = icon;} + showToast: function(msg, icon='none',time) { // 弹框显示时间:默认2秒 var newTime = 2000 if (time) {newTime = time;} return uni.showToast({ title: msg, - icon: newIncon, + icon: icon, duration:newTime }) }, - formatDuring: function(mss) { - // let dangTime = Math.round(new Date()/1000)//获取当前时间戳 - var hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); - var minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60)); - var seconds = (mss % (1000 * 60)) / 1000; - hours = hours < 10 ? ('0' + hours) : hours; - minutes = minutes < 10 ? ('0' + minutes) : minutes; - seconds = seconds < 10 && seconds >= 1 ? ('0' + seconds) : seconds; - return hours + ' : ' + minutes + ' : ' + seconds; - }, - escape2Html(str) {//富文本 + // 富文本 + escape2Html(str) { var arrEntities = { 'lt': '<', 'gt': '>', 'nbsp': ' ', 'amp': '&', 'quot': '"' }; return str.replace(/&(lt|gt|nbsp|amp|quot|src);/ig, function (all, t) { return arrEntities[t]; @@ -300,39 +343,10 @@ const tools = { .replace(/\ { - if (res.confirm) { - // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 - updateManager.applyUpdate() - } - } - }) - }) - updateManager.onUpdateFailed(function (res) { - // 新版本下载失败 - // console.log('新版本下载失败:',res); - }) - // #endif - }, - networkStatus(){//检查网络状态 + // 检查网络状态 + networkStatus(){ uni.getNetworkType({ - success: function (res) { + success: (res)=> { console.log('当前网络状态:',res.networkType);//none:当前无网络连接 if(res.networkType=='none'){ uni.setStorageSync('isNet',false) @@ -341,12 +355,84 @@ const tools = { // 微信小程序原生API性能优化 // #ifdef MP-WEIXIN // 连网下,检测小程序是否有更新 - tools.updaX(); + this.checkUpdate(); // #endif } } }); }, + // app、小程序的检测版本并更新 + checkUpdate(){ + // 检测app + // #ifdef APP-PLUS + + // #endif + //检测小程序 + // #ifdef MP-WEIXIN + var self = this; + // 获取小程序更新机制兼容 + if (wx.canIUse('getUpdateManager')) { + const updateManager = wx.getUpdateManager();//1. 检查小程序是否有新版本发布 + updateManager.onCheckForUpdate(function(res) {// 请求完新版本信息的回调 + if (res.hasUpdate) { + //检测到新版本,需要更新,给出提示 + wx.showModal({ + title: '更新提示', + content: '检测到新版本,是否下载新版本并重启小程序?', + success: function(res) { + if (res.confirm) { + //2. 用户确定下载更新小程序,小程序下载及更新静默进行 + self.downLoadAndUpdate(updateManager) + // 清除所有缓存 + uni.clearStorage(); + uni.clearStorageSync(); + } else if (res.cancel) { + //用户点击取消按钮的处理,如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了 + wx.showModal({ + title: '温馨提示~', + content: '本次版本更新涉及到新的功能添加,旧版本无法正常访问的哦~', + showCancel:false,//隐藏取消按钮 + confirmText:"确定更新",//只保留确定更新按钮 + success: function(res) { + if (res.confirm) { + //下载新版本,并重新应用 + self.downLoadAndUpdate(updateManager) + } + } + }) + } + } + }) + } + }) + } else { // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示 + wx.showModal({ + title: '提示', + content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。' + }) + } + // #endif + }, + /** + * 下载小程序新版本并重启应用 + * */ + downLoadAndUpdate(updateManager){ + var self = this; + wx.showLoading(); //静默下载更新小程序新版本 + updateManager.onUpdateReady(function () { + wx.hideLoading(); //新的版本已经下载好,调用 applyUpdate 应用新版本并重启 + updateManager.applyUpdate(); + // 清除缓存 + uni.clearStorageSync(); + uni.clearStorage(); + }) + updateManager.onUpdateFailed(function () { // 新的版本下载失败 + wx.showModal({ + title: '已经有新版本了哟~', + content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~', + }) + }) + }, // 文本复制 clickCopy(data){ uni.setClipboardData({ @@ -405,7 +491,7 @@ const tools = { if (res.code) { var params = {code:res.code} uni.request({ - url: `${uni.getStorageSync('hostapi')}/api/user/login`, + url: `${app.globalData.hostapi}/api/user/login`, method: 'post', data: params, header: { @@ -430,16 +516,17 @@ const tools = { } }, // 判断是否授权,没授权,前往登录页面授权 + authTimer:null, judgeAuth(){ - let auth = true; - switch (uni.getStorageSync('phone_active')*1){ - case 0: // 未注册 - uni.navigateTo({url:'/pages/login/login'}); - auth = false - break; - case 1: // 已注册 - auth = true - break; + let auth = false; + clearTimeout(this.authTimer); + if(!uni.getStorageSync('token')) { + this.showToast('请登录'); + this.authTimer = setTimeout(()=>{ + uni.navigateTo({url:'/pages/login/login'}); + },2000) + } else { + auth = true; } return auth; }, @@ -456,13 +543,10 @@ const tools = { // console.log(hInfo.envVersion);//develop:开发版 trial:体验版 release:正式版 // if(hInfo.miniProgram.envVersion == "develop"){ if(hInfo.miniProgram.envVersion == "develop" || hInfo.miniProgram.envVersion == "trial"){ - // (开发版,体验版)-配置全局域名 - // uni.setStorageSync('hostapi','https://hengmei.scdxtc.cn/api/'); + } else { // 清除所有输出日志 console.log = () =>{}; - // 正式版-配置全局域名 - // uni.setStorageSync('hostapi','https://hm.hmzfyy.cn/api/'); // 开启埋点倒计时 this.daoTime();//开启埋点倒计时 } @@ -523,7 +607,7 @@ const tools = { const res = uni.getSystemInfoSync(); if(res.platform=='ios'){ uni.makePhoneCall({ - phoneNumber:phone, + phoneNumber:phone*1, success: () => {}, fail: () => {} }) diff --git a/main.js b/main.js index e8eecc4..d6c7be2 100644 --- a/main.js +++ b/main.js @@ -1,5 +1,7 @@ import Vue from 'vue'; import App from './App'; +import store from './store' +Vue.prototype.$store = store import nothingPage from './components/nothing/nothing-page.vue';//引入无内容组件 Vue.component('nothing-page',nothingPage);//全局注册无内容组件 @@ -10,10 +12,12 @@ Vue.component('status-nav',statusNav);//全局注册头部状态栏与导航栏 import containerSubgroupTwo from './components/containers/container-subgroup-two.vue';//引入头部状态栏与导航栏组件 Vue.component('container-subgroup',containerSubgroupTwo);//全局注册头部状态栏与导航栏组件 +// #ifdef MP-WEIXIN import share from './jsFile/share.js';// 全局注册分享事件 Vue.mixin(share); +// #endif -// 常用工具 +// 常用便捷式公共方法 import tools from '@/jsFile/tools.js'; Vue.prototype.$toolAll = tools; // 响应数据 @@ -23,6 +27,7 @@ Vue.prototype.$requst = requst; App.mpType = 'app'; const app = new Vue({ + store, ...App }) app.$mount() diff --git a/pages/tabbar/pagehome/pagehome.vue b/pages/tabbar/pagehome/pagehome.vue index 60465a1..257ae62 100644 --- a/pages/tabbar/pagehome/pagehome.vue +++ b/pages/tabbar/pagehome/pagehome.vue @@ -48,7 +48,6 @@- - - - - - - -- - -- - -- -{{navBarTitle}} -- -{{netText}} -刷新 @@ -228,14 +227,13 @@ // 暂无更多组件 import pitera from '@/components/nothing/pitera.vue'; // 公告 - import lwNotice from '@/components/lw-notice/lw-notice.vue'; import footTabOne from '@/components/foot-tabs/foot-tab-one.vue'; import containerSubgroupTwo from '@/components/containers/container-subgroup-two.vue'; + import { mapState,mapGetters,mapMutations } from 'vuex'//引入mapState export default { components:{ pitera, statusNavSlot, - lwNotice, 'foot-tab' :footTabOne, containerSubgroupTwo }, @@ -313,6 +311,62 @@ faultsList:[], } }, + // computed:{ + // tokenEv() { + // return this.$store.state.token; + // } + // }, + // computed:mapState({ + // // 从state中拿到数据 箭头函数可使代码更简练 + // token: state => state.token, + // }), + // computed:mapState(['token']), + // computed: { + // ...mapState({ + // token: function (state) { + // return '追加的' + state.token + // }, + // userInfo: state => state.userInfo, + // }) + // }, + // computed: { + // todos() { + // return this.$store.getters.doneTodos + // } + // }, + // computed: { + // doneTodosCount() { + // return this.$store.getters.doneTodosCount + // } + // }, + // computed: { + // getTodoById() { + // return this.$store.getters.getTodoById(1) + // } + // }, + // computed: { + // // 使用对象展开运算符将 getter 混入 computed 对象中 + // ...mapGetters([ + // 'doneTodos', + // 'doneTodosCount', + // 'getTodoById' + // // ... + // ]) + // }, + // computed:{ + // ...mapState([ + // 'token', + // 'userInfo', + // 'count', + // 'obj' + // ]) + // }, + computed: { + ...mapState({ + token: state => state.moduleA.token, + count: state => state.moduleB.count + }), + }, onLoad(options) { // 获取当前页面url this.$toolAll.tools.obtainUrl(); @@ -322,8 +376,29 @@ // this.getIncrementServiceType(); // 调用获取常见故障列表事件 this.getFaultsList(); + // this.$store.commit('setToken', 'token已改变'); + // this.$store.commit('updateUserInfo',{userInfo:'用户信息'}) + // this.$store.commit({ + // type: 'updateUserInfo', + // userInfo: '新方式更新用户信息' + // }) + // console.log(this.userInfo,374); + // this.add(); + // console.log(this.obj); + // this.$store.commit('newProp',{c:'吃火锅'}) + // console.log(this.obj,382); + // this.$store.dispatch('addCountAction') + // this.$store.dispatch('addCountAction2',{amount:10}) + // this.$store.dispatch('addCountAction3',{amount:30}) + // setTimeout(()=>{ + // console.log(this.count,388); + // },3000) + // console.log(this.count,390); + console.log(this.token,397); + console.log(this.count,398); }, methods: { + // ...mapMutations(['add']),//对象展开运算符直接拿到add // 工单跳转 goWorkOrder(index){ if(index==0){ diff --git a/pages/tabbar/project-list/project-list.vue b/pages/tabbar/project-list/project-list.vue index b693514..fef511d 100644 --- a/pages/tabbar/project-list/project-list.vue +++ b/pages/tabbar/project-list/project-list.vue @@ -1,16 +1,19 @@ - +