mHWz(A1- zBJdbIMuAoV%b`UO24m?O8$rr2V}_s_$TT1XsuDCG;^3QpCN@jWI$!$5TMu zfvpe&QxJm=@&|DN3avPeVPb5AK>>Nkpd-8%BQ)2d`%vZ^L0rJB!qMkj%@aSpfm%A+ zVFu-Nw3R(tkU>n*UNI=Jqb+4vn9(;{&_PCPGRQXC?MCZ1aday|>oiC|`Y O;B;^@qv4=tK`ynu<9WorNek%sa6V%z9AQ_Qb%rr5b|oGEsq7-x>vO!#Yn z1uqh81Yke0 0G2^27oB#}{whRoYg`*!(>L>sh0mwHV!~y&u zVPiZh0hFQ1JUj)sI!O)>YQbb4+?&7Sfu->sj{ aWNfYH#fa |lK*4fV%{ qHyt+K08XZXtoM#e+9`()DAhD_x#`VfU=B^(-qrAFUlmqY$iYfKW3#^4x4nf77e z-zQA||NBpDW^aX;q;8=#jbtD?_3`}+$)C)6j-WBQnpkYjShQga{4q$cBuEaf(Qf?w z{w+PbBCT_f3zNp7M-q-FH(UA9f6B7!QLah-`_Yw)N5f+_4`Z qkRPROBj5wy}ESbRwIK>p4qv$(|3yI-ygzUx-|aOG;z53si^5z zGmQM`plH$hRC@7Pl&;x8nYh=+&#{QhGUBFzTN^78;o;{VG6@z92OgT}$>q}2cVaB; zv!}|g+;$HjRIChm=y@%7QXe{<(cbO2((e)xAKyG&8zlVmPB^;mKJ#-G?5>EUq*lx9 z^7pOYKSj5vvbTe;CM!hBIuClS%zwA>i8Cm7pXb<_=UAHg5&_?ISYI+{64Lw7m8rWH zSGjh`z~g&9rL03c9#b|~L*+Qt@nG)(p0?LlxeVOK7=M2MTF-3gS*>a4RTpjOt-ZZT zbLg~)?T}m`9Y;%M;Xos@5{;4kYqcEPRmg|l+-g#~d|BAX8|?q3%uUqe=gjc?LpB+6 zrDtpgn%Q0Ys-K *v4KC#R&Om~Q>J^R nAG1qd_x5~ue}A6Y zC%>Jo${m-0{W;kc>%rVAQEdfxblcn8g_hoMW1M`+F5uLwv-C^vUpTtC3 7)`9Nw$O zYYy2(Bb4t$4%Jt9ZLDt1`WSj|!fK6Ad`d>%y3^-54u3^U4viU8R#6dmo#Sk1Xy|kN ztY#`b08TDcI&)HHd-dCb$;Qg;G5QB#v9a!5i(m81&o@O0wn|joYGSf3U%tLQX1E=o z5W@PY(#Pj8JoK>F($$KU@>vqwrHN0J1l9Pnu&!9+ 1Y;g}vSSF8TrWgC4WeFstJ2_35V2e2dOt*hAp2O`1v- z1wK38wCoZWB6!sJ*jgJKN8UX+AfQ*2Q*&_+#jlwqWm yGAjtU#iU0uG;LrG+A8pqR`(fjq$8{$3thT43Clfc8tJ~zs6D?= z&pJ3bw7PE>dz0_x=j=B0k*1THlMDDpLCa>ewZ0rVz&Za(kz)+D`R4eUN?yagZlmFf zEo*uZXl^2bW@0)rL{PUNez_;+gbAvpx4j@EoA&|PO4Bh@N%op*D1_3G8<5+_UV#kj$_*`4iK&uQI32|_*}4qw7= z_a4GZ4eb$3aOS&r7p`X;eDv8S_~4?W>st~e*Ftwz>9UH)S;4tnx0buL%iYBwm~x*u z5f0m7e#K{JrEIZ95^*2xx3?pAGN!XiAJfUK`pRz4hh`X*$HJn{zmna0@G8kWc5~A+ z3w-HPf<)bA?}dm32OJLP3IWiKkl=FGYyDIZE&B+vUDw8heHvCOR-|RtMi20)##GUq z>AP~oMP8oN&}*5|rfi=4)un`ydfDw0(jGq_ec9l_lsFFDzk*|Z4ga1Sjkx^Ax?ckM zZcDs)ZA}1`+t6K# Y~QH$)tJdcuS}yKI5-;>C+7#KAX{b{2h*5Y$8^TvoNd zJYD?lv1ChQIXISe*}MY0TTiKrFzkl>WhM;H;w~9J_~-0kE4URVSs|pQ#OTe*wY9af z ?#R(^JuJP)^OYN z^UR*x4}~i}n1o8dS3A>x0n$ZJ!JR|rgJ^HfkJK@5aulIc?FV |psG$;m z$C-<+i>8y^47>P{3E8dSPKvVw<$@eI^~=Si_9Q`c9OI>fTS9M5TgM|c4W8%Zgdvf% zjIcSOC_7>Z@n99!vFK;7WmD*@moM!%SM3Ji<$E6sV(iAwRIbs$*dm&Gc4S`bOU6I? zicR&O2@!L4v2Q(xPyDRctOsL3d|6mupPqH))=$c@U7Uh~ArNMhU|)3EDr16eYJ=!Z z2`ve1GM+JK23%_wj$oE!n7QKXVSyTKd^U6o?tHzTxk$@)7O`xLg!i|QGf}cX^gXy! zr((q{72e+dSo8P@CXIwCOc^rA+(dHdNvA3GimmT9nrmh4?byd`;__hO7WbKH6WHlP zKfl_@PS3+r-`bBU_ZHky0WT1eDFd8lQ3t`}%Ue@Ab8~Z3wbIuX0-TXCr|+ ZjId-Ym6LoVTb~-*Pn0p=>^|l>^Vklxt8HtI@!?x zW&=*hW5`O5)q_>9T}qS!EJ1sw-|;|#q>IdSpAxzT*0$a>$;-LR#E_#D0%Yr&$2Bb0 zcSv>ul6Chx6?2g{Z{E26C??cAzM8$7sLwW7IJGEUdbYx*li=ZO=Q$`ev$Zl@FB|x+ z-gx94dvk20_O?r0S}UnNt)b^U*(b9nhT99#n+wsEQq%M2{K> 1>4x7K>fW=k%Ej=FdVsgRMpoIFqKgIR4SAHLYP~W@NQOBWd VJMNh98JVS4Ilj5+eFW{xO-dpPnCiS5lgpe}>L)#m(uk60PKj9?}csVW6 zq<$z!_MYP5yYt_SKeC#A=9y8SuZB0 VzyeSr$1a+Q7-^WDo%zw1; zju5Wge6zU;3H}qr+LNN92%3>QcaDTh@$u+ltL!m;e*P!ju-^EzFXe~amwacev~o}e zt|S%nAvxFT=oE9(j?h1dcRIG@z;4-&-)q^GVchoY96lw5r0vZul_(+o#(tMU_P1rk zDaNz0NHXaZ+zUDM+@wC|KplssT$=IP!kB44nb&Ylz>~ =~V*h1UuL@J<`jyOe&sL$wv%1gn7+$LR-`(~6GDlC@mxZgk zM?aaJVs+j_MoC3A*`7j0Mn+~p%>(5HSCTj7!Gm)@zs|i)s(!*d$Gl5uY}4a=ySN`W zyd=40zXZ!^>c&RSGtBNQw31gh9d@h0)M+lAqI4LS%Ql$Hv^i(|e2nY504My|;)=4e zUwC>w2i=eP`FdIT=`Q0}7H8S2;a6DyToVfFgQOlS lK4>38v2&`vBDjTsqU%uGZ zvsbUItwn|AARq+C(0wT>kYj6)!Xw{}*&wyJA<4nLk{Y#Rdtj^JM!G7z&dv7}ohX{{ zY{xei_GnoB`cm}5g3+jwlCq!6z+K5%YRT}b{Q@w4-BUA$+pU2WUeC`589mf*QtT%d zR@lDP5h@lbmPAkbmzM%G(mBP&XVljn0P^9`yh2uAnXGa>Ciabv%DKDuJa81s@`dUw zbwIahUx`c5`;h0)sur$BYa^3Yw@HxN8!AI-@_u)zex@Pa_uha6Wx_Y&T&GfA9A%L> z#Zn%7hK@(o_F?~e6@U#K-raOe*>#A-te2rHD ! z=BAe8@C*rlRvICZ%IU13K)-;1sL=Hm;-e)ddrqtl(+!6!8g062y(RC>+bbC<6v?Fp z4@q-yo~2dDl37JD3HW|WhH1r)P~L}koO%);Z)BRDtZ4jAp-HhUmuQSj#{~n-KN}6n z6%i7LY8D@}*Ir7A9VfoG{L193uy7KaN}9K(wNH2lI;9MVwqi(gnl|bYInM9jr#I0r zIddUR?U%tBJ{@m cQdzg#%v zp@MOjz{FQ(3CBGJJ^7w{h)$noZ0JeiPf^>ETHT$d5f;zp%-6|Ce67^?zxk1RcM)+B zSaXd?9A{}m4xK-DckDdjHd5NRbBnvtANFE+|Cq+PRHyQAZ$6b| op=rkgU7D{`=rN}8Ns
zG;PmU*T^>o2_+I8GE%~s+I#i9>*#(K*~48KcTe8|yRJ7Aw_L*KAN|$(A6>pvTAw`Y z?%4Byfey0aS@)&mvt^645PI0o+WJ0u!az>VQU!&hd$oh?=G=LEz}IV9w{P *DE`$eUD&GF1PvX^ojE!r(pB9R@sZJU(&$NLxLih#r!RM3 z9)Z9-_O?~V1Ska0?KMJkl5CQGsq=h~NvOu8snuXb0^sL`Y=Cu8ck4AZKztNxsrGNn z=4ei2_bgve8#^!7${41M$K%ykSCC>DVAU$YXWJA(At_1WF)>PhhfGvp`y2f;s)mn5 z`mk%(LQ&n2DD5!;C?Yb^5U35n?&9uCW`f5e(3q05|J)+y^BWk$sE!{$ZUm4FnH-cP z35TqU?n1?@G1=GAp$@fQxYE7K_4LXcfT5uVOO84Kv0Fn8vsX0+1qH-hGDmfWcGwdJ zXTCZ~st;sRD}4?E24yV1{MltVC{663&Q4m1A054!=sL3ZN7>>fdU|@T5=UNu)xdv9 zj}i! U(cWuVDxrN4gGd!^Jt<`sZQA^j3tU^hOOxh+zL-nw}+47h+# z+2?WSNy{%^=7#*|KH88o$NCT?jgO_pMG0uv;J8)z*!YEnZUf$BU|?v2vOEmeX~Ps| zF*Q&wS?V%74h+lio2Ilv-;OMO$xBHx9~C*g99!xug*dk<1YyV5PJW*I#!DVjY_S=XDIy$R?e?J& zlJHr()f7}?Op+S-=FLf $0=g0I%;-(z5N zF^-O%Bedk0(!st^O{5N2>PhXm0*~ZI92|g^lA79BT6)%v{t~Cn?Ul+`uV3GXD#l?f zQj=7~yd7=ey>=`3;Y0JTjDsk^1ur$T4IF2B_WME=9Wpaxg%s|$TjCG)TEe4fR8Fz> zU70&3ySJcA|IO~QV{dA1lcZiqzn;0e*6MQ!gTbuj0&x}#Jk|A{z%%p@_N_e(-3OIa z%*k8I0e0z7Xy=%HI*Pq^%~BQsuf<%&D(U+W|65IdqzlcWVKFSud<_rVTGOGdg$fRV zY6v<-s=hG?0N;&ZaVXD^nSCt~1afGZtabhc;1Bf!1$U?ldZZoqK+0KK0t`gAV^Hdt z 3r0*prrLktn$)sD(OktfsJ%hW~oi#cf`$PF7)gaKPYQ$1c|- zht~Auirm q-tR-EQ-nbXsY{6BN%*H?i8z@(ZJhdc@~V1^t5HvIfzMZs^~v}X?vX= zlK)d_zm`iDrLSe_SF4dLhSExgJDLN92@g-Uw|}M*ZA5kx5^&InKN5mdAM^f^fG0jv zoVE!>5-@isH8K8Ah51t);o5aQJMha}<3@&Ai>%cf#BsQ~GX0HfpJh qohJS8&NlgR{ z$%iG-q^1(F9Gw^&lB4h}5>AwF-Wa{x!y nk6c{KL79@a`ROqxexKI&%U03qz(|gcul0=CvUoL`$5d*iGW+br$NF zMa=f8Ca`*D>X0=w7{9{R5WylAYGc8k8!K%`J~Z4#ybI&xPfUYiR@I~v1MIA40{uvv zf|dxxL@qWuiitV99};lE7yUmHuzDeJrs}(XOTZ}(L=dF^f|1{- }d4&A9wO#S+J zQB$LF)rmol5-0HQd`~3;0ddFni)Zb3pA Y>*eL3-Lk!rLLZ23q_(zJy?mIP z`+qntO?GAy+(?4~$-gTzd*Ri%G^6NJ-HDUcu$^JqoC})!z$M}>m7%@sPVc=0 8=R9LK06H`-=`XOYlsnz_vdlj+{`>^p`4lI*0>z9BhcoG4xn3<&WZrzz5 z{ZwDRRIf(jd%qz@vdDS!_K29+s`qD}rXU6?WQ{w9;w8wmwP9~lv+R2k`tv*Zx)?QL zYCQR^K^YbqspISp<5hT!buND$4%r@JEN*Th_GmOW*~;p~CoXWJS|TV9_V~+*u4tL9 zh1HBuDsexC2qigNb{;A{sPj3wxdTXck=ssZ7G7U7g*>+iWZ+c@Y5Fexbz3Wgm*xEu zF5~c8d_sYC-#Cv^K&fS#6!7j{&NU28v=5Eu4JfhtTn4>1TX)uE-5`y+txvu}SRep9 z{5vZ<+k;ezJ5bTKXX>8uUQRd6wdmv{r(wOIpg;~Z^$8_m3=UOr$3IJd_ B8qE z9T|L%wjAH5bWPy_uN8fnjTzAbo52=Bl1~f3pD+2A%%Rdhd)!+4iye-^-&joEKY9+i z0tiPWW+PQ6@LT(mH94WLR6xX@YO!+XNbs+M5|roxQ$^x%H9*#tF90*VHU?ZGL=(w3 zzz!}ZO1k{egS@|5C+vOITY!tpAJVgk%|Mw>6U2?7cYA-|G5Bn4xwPRX;mVu9c|)IJ zv8=V} zP6)l0*_pOdf8%g&t734h8840&ZCJZba>tyZ+x|ZI>}oQYaoxe-o;L|V zMTFe`{ fGM zik6(vP%$CV1gJ5Tp4(WYfNsH~uQrwC?S$y4DErY5`=L_ =7`1Fje3z;6AYD2Fj| zrD_*l4iKna*@lMRGpqC8%AgI_=d-hQ%DV6D%VKU!FmwH5G8eHV2(_U>VwTU;;$Xqk zXccq#h%6%xCvRcFhxERtyE4D6RPIOvTdSHV^%P(!y)VMkEHnvU)6-K0_724&X2Af^ zOaS=v%_+@F;5V6&1wrup&0Dtu*51I17CO%c9yxE+oi)VcpR5QT-(HvFtNubG{rcu6 zLG~5k_0676O~a4C-Sb=39(r&AS}u$&cmBrSZ0(2*M+xe_fy(1Y#m0{wqIH!n(LOr3 ztDzysc$ec8gY!`gGe6SBH4b{64ydUIsKC0qIz5+ur#{ r13Ev0}ld2u$kI9DBx*$ z)SdxPbEE-DuNKu04v5$teZ+pq>TRjFbe<)%Gatt3E^!zIM#k#4=hYLPWgHfjRR7Zg zxQQ71>CPyx+aUQz-Q;?P@73hLRoeKH_Xu)wZ1@W<0@UbUI5Me6gly3eT|PA5i{v+c zPaPw}PQQ8o8kQSLhm$YH{)rbcP6 `^vWba1QsTEnj}s!gNW$mdd=XFA98z2yRk;Uj9jufs z0#r5jh14vzQUq{ulNDIydMc%f6OELGN3#?+Hv0XA7V)kl2$CQ*s() WU^f*>Z#GfqWUR;e4qgwydpLh$1AKzD3M+A$Mmu2>* zUq5GW4<0La3V{+GD68N6spAUL9mK}#{@tH=^^l2 v9)Z_Bsrd4Qg*M0i$g{8 (`Q=6qn)Uo{6>BY|vGs=&Hm+1gqNY1%)Q`~j;$0?BOC zkKnaB95gyUp17FX+^h<%z~I=&d>9K(dwZj17NtvpG>4vnV;#U?mjPCs0QQ1O*gzGM zBQGy+bAn_vG%b)~A3`}I+%T9dhT?8?IEX`L+7(TIL|VEZUM{Vmy&c#_?YF=!#>jGH zmGI4|Lk=?7g?#||>5c3B4Wx}m!QokTcNc~0#PcAn0;_|vTa%a5mk?BR2|6%q-IJeR zLAxYtY!rugb(rH^nx>H55pPbU$*! 8)D{`TaHkPY)hE$h>nDjd3z?J}tG%>A4t} zV}1bHrAJeZb>H0Fs}d!UYMW71bQXVVp6icv*aYBOxzc;92f(S%<~NSw?*(6l)=l#* zyB`CYwg_$WgvEIfE0j1+$^-reTUJaU>K(&N34X^C_hhZHh|@#I$gCX=e$Y}^*)5d7 z&q=TwdAGOy^Jh0;ijW?SEe6_yyu83LT ABE&Y^`@2Y#0?J1{+ zzVnR_VMnZba_%CWnRS0j!lE0bYEOit*>tn1+&azSIakdc&4R&hLM7Ug@ci|j>)EtI zXA3=*f?cwF)kkc0e%fdQ*9f|xo6vro=_`J_nTxPyCrsX>{yz{i8_e*U*Is-Aie7dN zlav1g$35g_!7auB{YZq *_Ub-MXdv^ke|E_ZCdp zB^-@Dy|{>f`LfH~6=6B`sK32GcZpUtj=WWdin-_O1>8t58J>Q+J3G655z+fVKb@bg zsi9#QNI}n~Pm1wp?fhVCAws5Z1yzV5Z|)qTK1>}%M?r>`mY%tQWAI=K(`hfVGwCh$ zd4ZnXfq2Ms>7I?xq3c=qoWIvxLSu&Kjygh?{q*3#xp`=60UlVMhE6f-X(S=1abLVB z;%Fw~E@pFBHD*Xi69<|IbShKEZxjqB?GTcVQppp pu9XJ{Pd3!PU6t|er62gEdhzr z&o$DGMjN3&9QhV-jAQs?cB&s1GJpp-=q$VB;!Xo)fG_!o sGJv@HsFo(4JJ!J4W$ZdFXUe*BZx6f=0C)!95b__?X&$0g3^r-#Gt2 -=VOc!1C4YAGm2O+oVr74*)89l z1wk5( Vfd12$f;O8q7VIzfU%CiOVommf)D*hz~GjmH&vBz z>a)O&xd<)&$-rRJ;t&hDfB!cwL#LiZa_UrOf2r|@eLea7MGZp}pO87}-v 1VIw#RF|YWyQ~zyXk8G!OzSb>Mdb2B$uVwEdO= zLHq-k;T%sOPS |_MDi31pv;#lCQ#ltyFLAv2E+(Sy zh9+(#91ssfNtqM`Zye6g!*gk3KP)}=4nlM?#6nN@qaV_fr8q8-2bL&v_`e`WSt9}d z`%eM}1(iYHS)lgJKM#E|J#yj%#CUu!u-fk+u4$LKo&d=ORCgl4U_iMHiGl;s{y>{$ z&8^i3(xBT+Zhg_@%Q#R2kW~V~fk EE$)|g;M z*~i%zK>2_SUH_Q<8$#s+20 M~Rj-UEG7g7q;;M_p2;PGe_BGn=y5+tJ(4tj5t!H|;Ckg&by9~wU4X!`I0 zxL~2?xHH+OO;oT6P9wWj W_(I)Q<)y5FT%MYy`mZO&$gJcJdx*f<7qDkU+bd}otz zybscym9kbKN>FE@qSdYk4cGgHdhXQcTDhbWE`iWp|E}XYab$M(2!`e<2&EA5*85P7 z%TV{OmI7)~PSVuTX$ YRICYU2VA0JA4g-a!ilWO~ykAwnW9VUdweUCxz&OK#r0sdvF06I_mTI1fN#dX*ID zvr1vhY>!#~2rVM5H#ac>CXnclq&(nY3Zp{$k)R<#dMb#}t Ro%Id+ zfRfX>*`fMATg!y4gMh2p5L~j_hGTfK>B%C&psZ}PX0N0Ir3_j>-oXo{r=_J7Eu=56 z%)qfJH6;bw;dAcp60;Q>LN*m^Jca$vx{)oG(E9)*4rted9# |1!B%ih1UHoYh@!NHxMNzW&L504 `vo8w5PSkYGmZS& zH=AQlpj2Z|J%AnZ6rKbMDe|h ) (nY<%e4hY!A;>Bc{; zVouf_qEg1CA^M24H~E&vt8;%5+ekspEP!bzyO=z;xp;0^33FFa7fN&dLqw0CpozhV z*hfZ^MI1YCa5&GJ9kM^xix|1F|B9>2fLd{QhsKt`j*g)XwK!yySR?^x{6}&QW=8Tz z Rfp7~cvZLzaKN%DZv8J}D`VR&LH}VwuhTQKA3R-M8Fg@5^ zd4ICRpisauNJ1L1kh>J``{01_Ob^tN%hS*GOMyVZvC>15PrZAb&+qwp|4->|i$*oO zp*Ba?Avyt8-@h1HqR<7(^4E}e@MoRJsX@xJwQ>FreF6p>gNXIdI*snRdAp`DQpAK@ zHHmhw_Y4|C`4mPPx#I0@Tds)ND_}@#ZjLwv?~ti6jzJNMd`V{apZ9 SMLZ=Er zivlWYXX^JMR0Uty|5PVHoqZ9Eie>95KNLuPSHILRj{5Ooc1TLNmXCl8(g^?SvDK0z z<5&Yy#7cu?;M%L2s=IBk=&S~)6C{wZh+jnT*VOahdTfYz5rBbuYlc2mZ4d=NXK`^` zsSA=)( Ex0B?z1_`?E7~s}`j3O3t8o$(Q!wtubJNbb9g!GTeuLTfE`RR9rhqFK$ zP7F9Qs%IW9X6?HvDG_fEtcJ;-aQ=^Uh3`RVr5mqb?+K)(QOF+u=)d;>f+9K)K^U*X z@7x<4{XiO2oo{|`vf)_ypx#JjVizZU`ZUL$yE%sB^Q-fI99v2_RuOoKPTc0^kb5YO zUaNwwy&b7ru&bMFmv9zZpl2h J4fR6OvRvgopqU!W`r*J4hQKkn@`MBY6IsHR0vGATBO)n;LzrHjoBEeTbs~ zvLq0-)*#@3&VEy bVl_5dxpmTz%`n>@l5t4C2b z<;z_cw;q9>oGOSR=yzrr-AT87ORq^;Ss5wo6+;ixNCx9sf1?F)>g-TAM#aW9x>RoH zBZ}MZEPd@lYyBR`n)v_l`%dA gUmrg=CcrC zWZBQHLKH&+kI4+Gpv};odD&HHR-&LSQnu8tg8YFj4kr$3LG_J6(~D2jPX0F^@qS56 zsU&CQ2Fn>*;0Jq8x&G8vQl&=X#(X_YKgnl%jV$S{?XWzM5?aGrAa4do8cPn9K~8ey z-T4{?f|Qbi8_FfSf5+n3%{RUsF97U(9@vsdk+@S$3Vq0mtvg!9^oVc{`r7j!AGUFe zDIL4CyUt`ri{%7qS2plBP_9CHv#|X~J6}Hw0ryn*p_N=m$s$G>dpaQB^0{R<@CXor zKmd?>?k|{nhFGuwG=@M^N5q< ;P_WB{yIogm;bLgQ#)?ziyOiIE6#XA^tL1P z @IBn%W7=C~pP;z0* zo#!}j-mIGH6!AE%`gBD9BRE|XWUHyn-w_X{WFKU!PRZXYNz8Hp*#&Gl_TQBxS_6@f zPKB^b`UyI(fFje1<+K2hM(ETMNa^a3z5eVOL1_%a61>Fsj#Q&Q3q%vbd7R_>SA;A; z>kA-{)!z6?R;qWWclZCg`2eWkq@Mb*- @}qgJkaxEGw;N4Sf(LiLj%S-_ z=hh pV=E8qVeb7FD7ri-dYwOzo2g$Ht(`GPJTH-G-L zc62gTbaB4@-TAg!x!9dqC;Ik-c~9OPjX0&IkAD4*@r+aC+=DubEBj8&x$M|wnsS}} zAa2`2Mkq5BH6_n>*qZb3UQAeU$QoQOMfDvf+3ow4k1vB;Gc~n6Uc5a^AKRMftVxDK z^^!&zk=UvjKhLkTw#$7Ienc(a%;h2q^-OS>a*r=h(}%D?+I(*r*RVMf6sk`VMPjRa z##*Z>ljm~O$hXY7`43#bhB*qum~}iA?Gn z JGa~4ywcCQJ!P!QpYvy&NkLtW_TA0l}DZB+xH&G>?hIDuhKQM zEub`;LX@ZV lX62%R zLRA^=lhZqEH*znKmOTwriG $7TTQy-WzxF zE$j1=og^HU+{X`2){yc0qR~D2`{5nVc(TvRD=FOvJdpvi#%pjU=?Pjq)|K%6Q?eoq zD4-U1S`AwD>(HK$OiaxB7S2%silEIu?_*TZKj`}AC!VHPar~Q4ohi)1i*3 Y?O^V@4hJ0Y^FY%Z{hul{kC^wzgN=XT6W*ik^ZK z>~N?u;`E(fbwbaIi&B8;9!|mLVcXXpD?gw&f-PUMW}gOICs&%l84=b~W?`CB=Z6|U zM)IhJ@$un9WpE=SGg*63zFnEmg?$$n7sXuXjN AOMD!N|%wHGOjbvn>6$i54;rFHe~S=DB1qRqZ0~0@8yjIjp(fTkc?jX&~Zo8Q-0< z^@@*Tz^L9SLqkR%6Qy;b?WeA-{j{d0291H^b?eZ uiRULgNo*$kXBYzRqw0pE^(ahQj0rd(}kRmPV%AMo!G2u-g}DosQmiZK|IMW z#C)i#8u| 9Tb@6?g!& zP7G7=_zS=bUc+D>fMRN9m1Pg7m{|MfTKnhADkn~~GaK%c0WX=ZVcaJSejQihG=1CU z;2sn=Hx`Rq`eNE{nT=T-pEo*(Lba{$lS9eo*d(1Y$2pOqC3W3L_7Vez8H-Ae@9Aci z$>r|Ms!yebOJmXZ=-~4u`{jI3r@g4rv5$=9`}maWdoTC$j5!hlP$4FJncB!1nRIk# zn3z=#9&CU2z*%!QeCL!N2}y6vBWm-BE7JsjioLM@&+Z)YMcsK9a;VEby&)oH)s^2< zYT 3O@|!xV{o8{X+h@L5<$_wGmxpvuTO&MB?dj2gdrBTZmADj$ z5yO|D eXpbvt$bOUdwEuPjBo(4z*mT%I?vyn eOWydADDU{frYixc3c0|_X*_bWaZnKN0t-@X;r(8 >>H=dI*F_Kgu8WDf(!|8R8= zJF?w#IPlatqiISgypfUQj{2emvtBCb -BMH97Ur<)Y z$!w^)e-|?!kV>?m1%r8k!2)Imh1KGZcXla%`O<#iGI6csrfca1o;`gOemx^hAvDT; zrJ$e(d3V&QM<~)$=Pw52k6QfDGjCxt?-oimy-bY0X63NHuCH_2dT$gKX*GVxi82H~ zd1eQ0B^4HagofQ>D?UyIiT7rF@Y;cg&fq)L%@=O+${0wvUU6SF{xymujB@JJQ_*%j z=K6$Iu6(R?oS-ud)OQg@5^K~gWZuZYi@wnNR+05Y4biy0Jn(uUVB8XQ_bJ{~A0Nwy z`iM99683QVQjLvaZ@f6=Q?cBedp`I+G2Z(Ygn;kvqGf+m&?6`qc~Ugx-frS QUVp$V9HYNOqG5|A$j;GOOh5%lWrcp #F zn31tvkpp9AN8GRb&aSpFlhm?IlP_LP#(T`>N9pZ{-GuUdi1PEb{T{niL)G3StRi|_ z$zw&CPRfY5`R~H6o%5&<)x9hx>)h=AVW=bZ*I-3^I18_8X}!+K5MX3x=9iGrnV+AZ zf9q?N?nUz}VjeIY;xGRhyX;P2M|?oe5}*a>Nc1%{G;~TFQ~mt?xiN5dQ~kz` z7f8U?&~W-XxF1sVvuDpFgk8J0x7webYY*qbIu|Sr?g)yr5trFlca=F8B*|YW>FBz1 zjBBUZLLWZ7=H^zsu()WmA<4(b=eRU+Rpa_~_jJ|GxD!Y)ocM%IlIdb9y)0!+H2mrj z()&~Z)ULtVhbi_-XavO14z_@Om*J2xVy^Rn)SuwG5#6#&T67Gm%DC~C$noZInJx9H zFQ17PY1?Nl?=lSX-j 49FnGC z5vj6tqKK`Lw|v+?a)X!aeC*jz#2wSd0+Rt1t)`QcQ~9^T$6^JHHma(R;MR !woWX3DZ$b)VkkaL{)o zDz8RBvV{XjYEF+MBO|}4hwO0r7PTcS(lIhJc1n5!`9awDaX%zP14)o@R%`HQ-&j+$ zB^-#g-rAP4{}#A3mEJy`tpc#vrh?aL>Ly~ks=-rBWVYVk736e>t*%|%zUv{UcmL5N zbvwIUF#Hso@bTle6|-4@u{yiD3NE;jOgA4ihm7d6(_J#@`Avc72D i3S3^8WO3DUKt;ua*=F8iBIO7Cn5Knr% z-7MN_26~|2;9wm3PJf98w5Ke(vl2iHWz|G5Z+et_`1tDAK^@&`>t6J{lp@5gf(NMf z`_N*tsJXW{7P9`M6L3=ZGhC-41_#m!; `rZQTjCY^1z;WeL|D z$fOT)Jc(BM{7U8N)9WbhHy74d9FD*SZ6n_=$BNuibIa6p8b*?E7=LsauBC7%z;R?= zLBY%xM8XALJOz^IPB`Smc<^8 O@j09Za8&#z?VWyFmo;h^FtK^j18^<9OlCi3i zAcbctTn#^E?5BRkNct-Pf9GO|opWb)@5`fv0qox}F!6l siTtzseu&dA8Fh4daRVvzS0 zp7Rp*Y-E8Nz`W!5 8C4&9%u$$V z;XM F0{BFG4qHCHs{06?{x3!V-;6O^R4)0$OPtLNMULcRf z1kcEi|CF2} vR3EQvncd0N)f2dNQ>!T(zTg`O z7XOGNrs961#9z5s?i)P!L&zblMH;NllQ1Lc!EeZRri3qKLOD8AAZiNSA>N-NC6XT$ zYCSiY;WujMQFnEnzvEu2hRe(2r9JTbxrn$7b!V?iP8<3!jAwHvmzeT>OZRXVWiHtN z3*(`Bp-O&!HHcPQcP1)IdA9smUHw<2z(n<)%<`>Dp*e(~FoRnF{#b3_aW3CyiBlHl z NA3 hgAs7-$We5>`oEs2*t^h_~+*{4>dbD{2Hcw59gg8mq85BDx(cp zdB0`P&>)TiqW4#cMH%H^HEq$V<~pXRQ;dxjd-!XG*7wWxKGQG7^IpS;?VCQx@kh-7 zRf#~g#ra3!Q9_Z4?#fexgS|JRkv-;HaF750Kr9jO|BDoHi&|@Jg6q4Y3+_aCZ|Isg z(DR<{Nk&jRswa@2Go+`&s}#=M01}zJ+*@dqgo}t^Jai}>SdBjC8HATWs%0ogdvi^K zKqMLY IIWDi9FikWb=&S$hfix8g|Aaj|Ud6_vAHtEc zS4Sr{EiFy&@&84yv=18U3vR7 y {T#isKHFuY zBA$kzsX!Og?uR^H;yV9gQA!iJhed043&e~nIQJEyj-(wcvQPz~yde)bb-`NB7qA{9 z+A3o6!=y#3wyZc*e35!_9JvY$W8o++!>Wj~dk%M$q-AAgxomcw(A1qLr=Z|Rqu(Xx zLL=n~+H1=x_{I$>KFMdmKK1;d?`0cr7Hy8(`1_c%9jVt?#qII^xAHK%_c6m;J%91y zg?qiQe#xk3 aBzx{o0i6R zXRt#5TYadenb~U_8A#fwwnktIT^AaTEkg&&5^m#hhYOw5;qky)^U2B@Lf_0G@r=h$ ztA04iY0Yo-s@a&$51NV zB4-BW-O2Y*6{x}v>i`QT5YDpEihJi=wgy3Np3AHOHxG|QH$`Azpv6p2t^~LXcx|j_ zsG_xX7BU8~mmzH8SY*<`&yT)`C55I_YEh9EY^~tX(8}*+2~uuY0PQpt(Ky@-xB oKcBu@WO`kGU0XX9PBR}D7QT#Nd4REu930s}huvQ{RC4X}$P`CD)D;FdAWgxg zJ?bEJiY=3p*|+i0guGD0z`z=~$dOMyOG}Op_3SP&_wVl!wdxW13}?_qEjo^0GcfS} znhWgiY1*J# 0NGjmhB~6qc;vxY%!qDPQiSnR)_q@!FGl09Pozm$R{m7 z^yHd^)DDY4B)QYRcDL6i@u;usRiN=EdvcQzHM**rTF8m_F|D#YeSL5t7@R#94|yyo zAbWUXf=9_00{-ww+x!CSoAUunTStthjn+JnxjlJPgyfYG~ zuWU5OjDOU9_On-ZXYI1X>YOp`uJrVex;Evvz$OPJovo5hb`^KWirU=mwUmXM#BKx6 zc~}(0R-a)DeNE)}ur rArCluDw(}F+4mx-kWbJRR8kj%UB>Wuj%OM z5LUyEoL2>9dl}Zo@>9H9=`u$vB5)rNdaJPkS6}t5*E@2qd=>oBa ~Kr&o?;a-@|}d8nM`Q2To$`EFd=3Fx813M+^ZQX6*WCQy$I4hTjMfJ zFWs&>I~PDvCI-rNiTZCNBkBeQ0~6O2-@bh-2DdOe!D0D<9w>ER X2^$>4{{7G4 z$^i{7g-2JeTnRgEGmrswPsl-0h2r93#Qxn=*6F0>gHji>wPC>QgQB-z`|NDH!z~MX ze=JnQL_QR*(;%OWLOad$T!pz>=3Sl;dsw>2L*|^Vp{_pBUAdh<-kOvR=TdSSzD=BI z-6vNDCzk$}Y8wAcHQQC6-6HTYF)VfO-ksfHgOCEd&J1j#Q)K&m03tz@a8U@=lJ_D* zIS(XU%f2Ez*!1l{d!&QwMHAXhcZOTaFiTL{PUped;jz)t2{^E+VP%y8w^`vqyKu@? zru?>@%K*OWM?M)9(`z_;f{d+;OboE#LnLW|)V1r6BAo^z0Nj;Px+vxHetp+v!pF#- z9 PVtCgA8DKabD zQfH}%IHgNsRL&e$YfDK)Q7SFa7Un`NOk7HiISgj@pn^`PY;KCfB=I^0CwaF7Y1z33 zJ@wEZ(8Czp9xmMb{hagJIp_0 (H?sq+H7h+c_qZdCaiN{tApD^ir0MrLnxH9lvV;DV1r9r3gy? z1U1aLJ=>cs7K_ nZa@? C^%n*4Dt?>ffHxGiIt;fxlklJ1*awkEE*mcH)mAG&j|zq z6&{BS%QoZqb!i@VPX+8j4Z(s2uEVaA!#Z9Kf!7_r xn3)CkW`e55rNaqgDmG0o zLHwwRA-6Q$w2{Sf%&!-~6}rZU%C5z9u@)|2GzfjM 91tHq^oO(j_FGPO#`ph zERDpUsOxATqX>dvc@+(Z47A#e0jKF$URc 8VL;z6+u)x zIi`Qo!8A2A6ae;@Uq#~=ba_UIKT1!)tpG09`NOWKomLYhpJC3{S`FEvO G6|(ZH5i+4*`HFmsepC@jMlZmjj&+o&s68*@>K1D@}>>?w!xx{48`;Nz}@ zM|P>R%|>2$-Oo!`yvHd)bCm&x{&;VFenA^l%=^={WO#r0Lc+d4qqY!juYx(?H3-8I mZ(ho3FUT_gKmPr0(A&Ej*IfH5Raft`H!CGMRnVPOQ27h30|YPt literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_figure/figure_today.svg b/lib/matplotlib/tests/baseline_images/test_figure/figure_today.svg new file mode 100644 index 000000000000..55fa803f32da --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_figure/figure_today.svg @@ -0,0 +1,364 @@ + + + + diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py new file mode 100644 index 000000000000..a7cb397d2f43 --- /dev/null +++ b/lib/matplotlib/tests/test_figure.py @@ -0,0 +1,37 @@ +import matplotlib +from nose.tools import assert_equal +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt + + +def test_figure_label(): + # pyplot figure creation, selection and closing with figure label and number + plt.close('all') + plt.figure('today') + plt.figure(3) + plt.figure('tomorow') + plt.figure() + plt.figure(0) + plt.figure(1) + plt.figure(3) + assert_equal(plt.get_fignums(), [0, 1, 3, 4, 5]) + assert_equal(plt.get_figlabels(), ['', 'today', '', 'tomorow', '']) + plt.close(10) + plt.close() + plt.close(5) + plt.close('tomorow') + assert_equal(plt.get_fignums(), [0, 1]) + assert_equal(plt.get_figlabels(), ['', 'today']) + + +@image_comparison(baseline_images=['figure_today']) +def test_figure(): + # named figure support + fig = plt.figure('today') + ax = fig.add_subplot(111) + ax.set_title(fig.get_label()) + ax.plot(range(5)) + fig = plt.figure('tomorow') + plt.plot([0], 'or') + fig = plt.figure('today') + fig.savefig('figure_today') From ca42eaaf6ad63eb831d0c2212e2d4ae779a46dc3 Mon Sep 17 00:00:00 2001 From: butterw Date: Mon, 20 Jun 2011 06:50:35 +0200 Subject: [PATCH 003/214] named figures bugfix --- lib/matplotlib/pyplot.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 0c1575990ff4..1b8f5fbb6db4 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -271,7 +271,8 @@ class that will be passed on to :meth:`new_figure_manager` in the else: num = 1 else: - num = allLabels.index(figLabel) + 1 # matlab style num + inum = allLabels.index(figLabel) + num = allnums[inum] else: num = int(num) # crude validation of num argument @@ -324,6 +325,7 @@ def get_fignums(): def get_figlabels(): "Return a list of existing figure labels." figManagers = _pylab_helpers.Gcf.get_all_fig_managers() + figManagers.sort(key=lambda m: m.num) return [m.canvas.figure.get_label() for m in figManagers] def get_current_fig_manager(): @@ -347,9 +349,11 @@ def close(*args): ``close()`` by itself closes the current figure + ``close(h)`` where *h* is a :class:`Figure` instance, closes that figure + ``close(num)`` closes figure number *num* - ``close(h)`` where *h* is a :class:`Figure` instance, closes that figure + ``close(name)`` where *name* is a string, closes figure with that label ``close('all')`` closes all the figure windows """ From 4d451602b87090947e7b6cde503acfa8d0bd3655 Mon Sep 17 00:00:00 2001 From: butterw Date: Mon, 20 Jun 2011 20:49:39 +0200 Subject: [PATCH 004/214] warning on figure('all') creation --- lib/matplotlib/pyplot.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 1b8f5fbb6db4..705f947f384e 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -14,7 +14,7 @@ """ -import sys +import sys, warnings import matplotlib from matplotlib import _pylab_helpers, interactive @@ -266,6 +266,8 @@ class that will be passed on to :meth:`new_figure_manager` in the figLabel = num allLabels = get_figlabels() if figLabel not in allLabels: + if figLabel == 'all': + warnings.warn("close('all') closes all existing figures") if len(allLabels): num = max(allnums) + 1 else: From 32293edf29bed8ffc74ede12b648dd9b37bae903 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 22 Jun 2011 14:21:52 -0400 Subject: [PATCH 005/214] Add axes.labelweight rcParam. Closes #332. --- lib/matplotlib/axis.py | 6 ++++-- lib/matplotlib/rcsetup.py | 1 + lib/mpl_toolkits/axisartist/axis_artist.py | 12 +++++++++--- matplotlibrc.template | 1 + 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index ab9036289f41..7e929d888b86 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1552,7 +1552,8 @@ def _get_label(self): # time by _update_label_positions) label = mtext.Text(x=0.5, y=0, fontproperties = font_manager.FontProperties( - size=rcParams['axes.labelsize']), + size=rcParams['axes.labelsize'], + weight=rcParams['axes.labelweight']), color = rcParams['axes.labelcolor'], verticalalignment='top', horizontalalignment='center', @@ -1809,7 +1810,8 @@ def _get_label(self): label = mtext.Text(x=0, y=0.5, # todo: get the label position fontproperties=font_manager.FontProperties( - size=rcParams['axes.labelsize']), + size=rcParams['axes.labelsize'], + weight=rcParams['axes.labelweight']), color = rcParams['axes.labelcolor'], verticalalignment='center', horizontalalignment='right', diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index b2ee183ae5f9..ddcf65cfcfd3 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -441,6 +441,7 @@ def __call__(self, s): 'axes.titlesize' : ['large', validate_fontsize], # fontsize of the axes title 'axes.grid' : [False, validate_bool], # display grid or not 'axes.labelsize' : ['medium', validate_fontsize], # fontsize of the x any y labels + 'axes.labelweight' : ['normal', str], # fontsize of the x any y labels 'axes.labelcolor' : ['k', validate_color], # color of axis label 'axes.formatter.limits' : [[-7, 7], validate_nseq_int(2)], # use scientific notation if log10 diff --git a/lib/mpl_toolkits/axisartist/axis_artist.py b/lib/mpl_toolkits/axisartist/axis_artist.py index cce0639a5bc4..59239f6a0b01 100644 --- a/lib/mpl_toolkits/axisartist/axis_artist.py +++ b/lib/mpl_toolkits/axisartist/axis_artist.py @@ -1381,7 +1381,9 @@ def _init_label(self, **kw): rcParams['axes.labelsize']) #labelcolor = kw.get("labelcolor", # rcParams['axes.labelcolor']) - fontprops = font_manager.FontProperties(size=labelsize) + fontprops = font_manager.FontProperties( + size=labelsize, + weight=rcParams['axes.labelweight']) textprops = dict(fontproperties = fontprops) #color = labelcolor) @@ -1407,7 +1409,9 @@ def _update_label(self, renderer): if not self.label.get_visible(): return - fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) + fontprops = font_manager.FontProperties( + size=rcParams['axes.labelsize'], + weight=rcParams['axes.labelweight']) #pad_points = self.major_tick_pad @@ -1450,7 +1454,9 @@ def _draw_label2(self, renderer): if not self.label.get_visible(): return - fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) + fontprops = font_manager.FontProperties( + size=rcParams['axes.labelsize'], + weight=rcParams['axes.labelweight']) #pad_points = self.major_tick_pad diff --git a/matplotlibrc.template b/matplotlibrc.template index ff41e2fc0119..0b76e55b2a45 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -194,6 +194,7 @@ backend : %(backend)s #axes.grid : False # display grid or not #axes.titlesize : large # fontsize of the axes title #axes.labelsize : medium # fontsize of the x any y labels +#axes.labelweight : normal # weight of the x and y labels #axes.labelcolor : black #axes.axisbelow : False # whether axis gridlines and ticks are below # the axes elements (lines, text, etc) From d5a20a194fc58485261ec86d81c40946d5ddaebe Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 22 Jun 2011 15:25:19 -0400 Subject: [PATCH 006/214] Add set_theta_offset, set_theta_direction and set_theta_zero_location to polar axes to control the location of 0 and directionality of theta. Closes #316. --- CHANGELOG | 4 + lib/matplotlib/projections/polar.py | 108 +- .../test_axes/polar_theta_position.pdf | Bin 0 -> 19727 bytes .../test_axes/polar_theta_position.png | Bin 0 -> 75626 bytes .../test_axes/polar_theta_position.svg | 1602 +++++++++++++++++ lib/matplotlib/tests/test_axes.py | 11 + 6 files changed, 1717 insertions(+), 8 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_theta_position.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_theta_position.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_theta_position.svg diff --git a/CHANGELOG b/CHANGELOG index 07eca61726bd..8e25c09afdce 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2011-06-22 Add set_theta_offset, set_theta_direction and + set_theta_zero_location to polar axes to control the + location of 0 and directionality of theta. - MGD + 2011-06-16 Added *bottom* keyword parameter for the stem command. Also, implemented a legend handler for the stem plot. - JJL diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index c3f9ea7f2e69..c4589040574a 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -36,22 +36,33 @@ class PolarTransform(Transform): output_dims = 2 is_separable = False - def __init__(self, axis=None): + def __init__(self, axis=None, use_rmin=True): Transform.__init__(self) self._axis = axis + self._use_rmin = use_rmin def transform(self, tr): xy = np.empty(tr.shape, np.float_) if self._axis is not None: - rmin = self._axis.viewLim.ymin + if self._use_rmin: + rmin = self._axis.viewLim.ymin + else: + rmin = 0 + theta_offset = self._axis.get_theta_offset() + theta_direction = self._axis.get_theta_direction() else: rmin = 0 + theta_offset = 0 + theta_direction = 1 t = tr[:, 0:1] r = tr[:, 1:2] x = xy[:, 0:1] y = xy[:, 1:2] + t *= theta_direction + t += theta_offset + if rmin != 0: r = r - rmin mask = r < 0 @@ -79,7 +90,7 @@ def transform_path(self, path): transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__ def inverted(self): - return PolarAxes.InvertedPolarTransform(self._axis) + return PolarAxes.InvertedPolarTransform(self._axis, self._use_rmin) inverted.__doc__ = Transform.inverted.__doc__ class PolarAffine(Affine2DBase): @@ -121,23 +132,40 @@ class InvertedPolarTransform(Transform): output_dims = 2 is_separable = False - def __init__(self, axis=None): + def __init__(self, axis=None, use_rmin=True): Transform.__init__(self) self._axis = axis + self._use_rmin = use_rmin def transform(self, xy): + if self._axis is not None: + if self._use_rmin: + rmin = self._axis.viewLim.ymin + else: + rmin = 0 + theta_offset = self._axis.get_theta_offset() + theta_direction = self._axis.get_theta_direction() + else: + rmin = 0 + theta_offset = 0 + theta_direction = 1 + x = xy[:, 0:1] y = xy[:, 1:] r = np.sqrt(x*x + y*y) - if self._axis is not None: - r += self._axis.viewLim.ymin theta = np.arccos(x / r) theta = np.where(y < 0, 2 * np.pi - theta, theta) + + theta -= theta_offset + theta *= theta_direction + + r += rmin + return np.concatenate((theta, r), 1) transform.__doc__ = Transform.transform.__doc__ def inverted(self): - return PolarAxes.PolarTransform() + return PolarAxes.PolarTransform(self._axis, self._use_rmin) inverted.__doc__ = Transform.inverted.__doc__ class ThetaFormatter(Formatter): @@ -231,6 +259,9 @@ def cla(self): # Why do we need to turn on yaxis tick labels, but # xaxis tick labels are already on? + self.set_theta_offset(0) + self.set_theta_direction(1) + def _init_axis(self): "move this out of __init__ because non-separable axes don't use it" self.xaxis = maxis.XAxis(self) @@ -253,7 +284,7 @@ def _set_lim_and_transforms(self): self.transProjection = self.PolarTransform(self) # This one is not aware of rmin - self.transPureProjection = self.PolarTransform() + self.transPureProjection = self.PolarTransform(self, use_rmin=False) # An affine transformation on the data, generally to limit the # range of the axes @@ -346,6 +377,67 @@ def set_rmin(self, rmin): def get_rmin(self): return self.viewLim.ymin + def set_theta_offset(self, offset): + """ + Set the offset for the location of 0 in radians. + """ + self._theta_offset = offset + + def get_theta_offset(self): + """ + Get the offset for the location of 0 in radians. + """ + return self._theta_offset + + def set_theta_zero_location(self, loc): + """ + Sets the location of theta's zero. (Calls set_theta_offset + with the correct value in radians under the hood.) + + May be one of "N", "NW", "W", "SW", "S", "SE", "E", or "NE". + """ + mapping = { + 'N': np.pi * 0.5, + 'NW': np.pi * 0.75, + 'W': np.pi, + 'SW': np.pi * 1.25, + 'S': np.pi * 1.5, + 'SE': np.pi * 1.75, + 'E': 0, + 'NE': np.pi * 0.25 } + return self.set_theta_offset(mapping[loc]) + + def set_theta_direction(self, direction): + """ + Set the direction in which theta increases. + + clockwise, -1: + Theta increases in the clockwise direction + + counterclockwise, anticlockwise, 1: + Theta increases in the counterclockwise direction + """ + if direction in ('clockwise',): + self._direction = -1 + elif direction in ('counterclockwise', 'anticlockwise'): + self._direction = 1 + elif direction in (1, -1): + self._direction = direction + else: + raise ValueError("direction must be 1, -1, clockwise or counterclockwise") + + def get_theta_direction(self): + """ + Get the direction in which theta increases. + + -1: + Theta increases in the clockwise direction + + 1: + Theta increases in the counterclockwise direction + """ + return self._direction + def set_rlim(self, *args, **kwargs): if 'rmin' in kwargs: kwargs['ymin'] = kwargs.pop('rmin') diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_position.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_theta_position.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c41ec898c98838a02cafe59356c37d62a97dcc7 GIT binary patch literal 19727 zcmb@u1#lcqvOj3al7$vCj+j{*F*7qWGc&U+W=4ydnaQ%4nbBgjn5>h&Z}+{o_uqTB zad9zIlhxJPNtIpIJrVgMkrNW3VW4G(CaG8hl(#`M0O$d>1{Tm msA%j2(0msqB=Roa*v$z*CvN>NR^T60@E=qhpbelCc5@O{bkcV+1~C6EK+#O! z$lS&h0Q_6Lh^>tifa$OPf1ATV|32_f2L#_ajBT780qlQY@wY=CegNncj2&&A9Sq++ z`tU&E!##(0-oO2Wrjs@{GS?Tdb$hq=Lm~?+5WvjD_-@vJtNIZ7Pfa4`R`0F?=tQjE z?G-XMv^9EHA!Tf1>SP9B_=xFWA#-$cFxIz*cFR1=YLBMjbSU!X5l)Y<54n%v^qb@J zOy}vr2&~nJ{UU%1Quow&6Z+Jxw;(}U?~%if)Kn24$ pnc~T~&8So=>KN$L-P!`R$9Q z#o4^a2+thav3x((Gn(i<(UEs=x4=bL(84!t3+%oj?hw0|$07Evk*U$XOBQ^B1y$I_ z$ZUg2(W*c5F;h37ofEV9kMEKn>N(#ubK2V+eRY2upDlG#QQV&B9*+XU3nr_oHAJ&K z4n|*J= u%fGrcT?8 z15e#1l9dp9-L=&kX|#=i-=+y!zMNeo2bvB(-Fq(=ySl-$zU)24b}!XXeAFA&PuiZ! z(!!Ia$s_o>9^b0X8?eCCxnhW-P`pNgb&HTZ$vPS`gWookFuhBj1mQh4bdL3h@=5V4 zy}jp`>PSrwkK|YdsSKUQU#->!Cc4Vyc?@o oSEc)A`MbAXh`+dme $frD;n_s{0dyW7YrTGj*0U=?{rR& zxuhg`O4KyR(wh67LU?pYfM!{R8Ewd{3ticm&QdHdaJ29&uS4(?&AXI+>3Yq(97``^ zp`%j(E+3UU{Elm0USYU);%*mJv5ckgXTZ^Qe=%+CJlP!2 h|q zy%|7}wqr(*Pg_w;3GnvOZCfNc)lkp5ZB(;}dKzE$t_&nC6lcESA|xA1 #CN^O?wJ&d$c)SNv_CJc4lWh6D3fz}3w#u@DRTX9@D zo{8gZwA`Z50IlNI@d_bt8Yv!=xL7cOs20YXHe0B&0m$t4eK7sC;G9MGo3rjLA~CB* z6{FjP!Q+Nwq^aX@JeCktwF#@!c$ZVhR~p@#I}iPXQd#~SQORJLV_&iH70V~N_SCY) z%OFrBrEPoUnalwEJUjl+HXXX_SN$+9A&sK;U<$&s`LrjkA;tLO*N*tbJI3D9xX{4| z^6TSI-71D0w?LR(4JiI=5@#Rrq3fye7{xOd!GJi9V=wC0crQqj)9dxNMWaE&`pw2A z1^ZXw8CL_HYDT1|04IuutC_=Z#rMd!za;~vL(p2BJ*x&$?JMuRZ&fv*>P{5z) KRPj`o3v0AfIbJ<&<&)kyYb0IZ=|=DxR=~P`<~LX) z+3&S0hJqF_@5^<%>lSNZ&NG<7KXHR94p=PluDz0kw S+-V*`vy_@GP1GLQ}f`ayiM~JlMVM{eV;7Xd+2AU5p zBZBY;5U2-DX6j!O?vRSZ$&a7=3lw*UG*)?{Wa3Z}3rwIAq-_0!5AW5nfKe(SkuRSh z2bJK=4fvj{Z|i*MjAuODrT*|e%(cb|)=!$IO+`8!Rxdj(x>i>=oAf2jbAFX278IFK z;;o;15(j1wmFo~wSqz?jqS<&ZY9$A{F@Tgp=PdrlW}FYdJnlAe{0>=x#AE!qE0aV- z8i+8z_#Nyd9$@bIWf_bat9 AO%^n)<4Ucq_TUuk@06k#a&_>BbS3F?cs zL+^`*W2_W8Dp APJ(20B1e1*&)B|mFL>q7v7>=M~D&=VJ+6VSFW zvEQe>Y wN6 ^6MefEEI+FB5r+xwF?K#EVhX9o4cgFI$rbkdbjWch^qgr&oy~$417zSmdkJp` z7s`Wx%}a-QqIWcp;Z$L(f$W&K|1k6%cF`6}R%lWgsk%q$5UNP6 T&`15pp6NC69I-^095)|A;d8gvN3 F~hPl1LPe$`GO|& zBua|DAl3c}<3vQGp6GE*14k4LOMpz?&Q7s{fg#R`4It$p!zPenCe=lzB~>RWjka11 zl9$IQwaKZY1I(|GbP*Wu=6I0$ 7%4gf8p%KcWZuj(#r` JqIimlA#r}#g3jvz z6T;Sa?#8M&B~OBKCskb(E-??{NX9m(QR5||yPr2u)^(?KQ1z)U7RquKn?}l_ z+}B{lVW(NXX^N_~d;xkM>kMNg#BLcG#O|=f<3oL8u=y%GV=nYvnCR<92$k;;PI7pQ z#heB*5s7#kjqr?8_GXHc_zKv>ajiWtMwezqKf9_Tl!Lli;|Xy)=&5U8oQT bM+) zTIrH x%hyuMK64r7yg*p<;QpR_Y zerJVdbR)DsoLMYk>0SoXISm ezy6R^9!Z(;%6n)8&h`kws=#hC&XtZfL)L#`mF+HzHX;cuPhJ-!*NT|r_K3O0^ zQ&bZ{5-svCs8O 01KaotI43h$BKM^+ll~elmq%}WeOdQcl<)*m> z;3FF+Eh94hUgmq|RH&|L4_B!LZ&Cd?n-J;B)(?xZ6XF=mgndXGr22MoVvY{k6S^OU zQQ8SvE0(r4PSL)E>VMut(6c_{XdY}Ltd=xh6}BZQ1KlKljShnK_$5`n9vf1zuW=xC z;ts0~Wih5%J89#$g6`RKx=f`ouX{|aU_UBM>=o~Gb?&Gn(}n|IODzl%8_g|Fw~A&H z(d4~k7c(A>s3g+^d8ol_pB3D0(tPsPqJq`aZ7!uWwe1KL0p$!gCZRjaQ@ReR(M7_% zcnb@Ubm^YzD4lPv-YyHsf(|~8P}W{-?h_O-LWkjErDr-_Y}wcEx;rprN#w&y ioOvDiVk*?2zt%Y6Cml#F}FN9G@T<`U(JOllXQG1gAK;@{KhJ^7 A-i>Xl)f}<5r6NW{b!tkbF(1;Ix7PPV_ z#zf%3usR#RN6VG+)2;bbfKv|J04D}MNyR{rSUrZ2T@$EQ+)FuG$RwUsB#1~nW8kzL z?B$~q0IE+`6Y!Z27EGFPI`7#alu;lHD?BN%!$6*5BB~Y)iWDSOr{2tFEe#)#ct15(u;5=6+(l z8YW*PCeTm?i7E-t4m5P&V@{vNM%~6ooS~Ya hj) z{xzGc;7Zw(9lxCW>5Y#2U>1L73ISnF5wdJUn$0=W9zh%;M0iMVvXSF=B_xZK7P|1Q zw3k--rn?R#ICG>{jy;aFZBj?w0~SwLy_b4vg*&nWH-;KGRQR;!9ZOAQzec?VVNigm zUiQIvm-%8+D+zQK#wLzE`xVDp?koO_NsJ;yp|31@MQ*f#mFzRmyz3z2O+2bg7Cl3| zVWW%jS1df$^9$G!)S_P(Jf-u|VNy2|?LIM8A|j~G@FLD@)s)X4a=}V!quMSQFtjQV z7%=+Gn2Uu`m-h(N{hToiyXBDfb4NDdipmNOryI4bl2ar4lu_P!t#s02 zos|H)G!rqqFB6MK{Xyi$XLU6J*60k7R|?*IC}WUWe*pZkbCN4|;81DiwZv%{sAN$g z4kTm17782#2Z#x_1Ui~Hs$=~QL{p)76GTijl<{U7uC+t`E8At19df*j jQTGn8QS)3u=I$5uLN$Bp=4ySoZj=B ;ONPBd(BQ?V@LalKw1|&_dX@9@ ^ABS(PA!(;wbMGTxOfQ=9+#m&HF>^10r;>s{Owg8Yavbb(7i5iKgkE-w|NUQ3~ z@+ui+b;8mlF$cy*rUviVPezd$XlbLV@KIEaPXzgp?W56nQ2EuSqCIQu$WDD`X#7d4 z&Bh;bCgTh{W_{`dM@%BcN*$h!u!;&T5d%gb|5I5)h1#d!(F=9fU2#N&IWB5);e_qJ zf{`|dOJO-D975cUYHVDBo_I@PHp33GJ1A`ox|VrM2a<#Yc}RSZiohYNHWJI!Owv0} zPe0AW)xiV?lz`L-`g3gwE*{7@SLg) Ab+ zbn2f8ABwYIdqOa-epgRq`{T$@BC+Gb=;?5)DPmt3kZ#0k2-8$^l@m%)(VNt85m=Uz zLKzLlS0Iw5Q&*sJ>_YMoG_1x6r$Z OKUwetUxAWd2jnQXBL$ zg!O0G);BKx) @iw>Ao zl9m~05FI=exo3Sz8vHWNSdC=u8{Pm+;5FhUYD#GnNT817{#+^I{+OzvH&)s=41|Lb zAwPcxO}8jCl%5%QB2py3KATv7&R*PYX8%Eu;;%mlA>EblRuH%drP-(-@)I0(pQ9M^ zD_WY@f5;J<_=&NpDnyp%J;va*^S1i3{ek&buy$rNbM*`_-rDUVcKp!!t)Qvu<>3AB zEOzd%;nm&(QQbehaN@1i@Zz}LZ?SU=DQ`0b6wP??9BjnD-v4RCdb~>6eZ#>zyz;$G z@#W%)v6?_u 9Q@*F(E**W|Nz&i%7&&b?>o)!EeMfmV9Y26&=3XIv^Fp8FQ50JL6g zs0r<6-6Kr~uQJfr=)Nm 6mg_ZnIfuIbV*W)!U>RfbOEH?51bXJk z*Qexh+vOMAAG539x{*{k-NyLOKztlP!wqK!TFSz#-a=+=<6a+c=6qgAILE8|@JP*` z2vP2#ijd}PhhLJ%awyYyA$hzA$}>@*GJSUeZV#YRESQ^w&op(ssz#f=O?1Q!2dXB6 z_b@i;eXN;2qx-UP($PCQ%NBc9)U8(C6OM100nt%6 ph@HnFfne-T% z3cHEdT$N-2J?1<>IRKQ)-CRsnSmiZBch^S9L5&qOFkr$(Ac}iDO9rT3zDVsLkuiQT zHN021Zaf$QWxDDyn!KFCE-qK6W0*0U{G0@_Oy?oma8T)>^4)`XVy(7sSWDf18h_Fn zyJ?EaVSQ)!bwXj)Y=wr-;bcP!WJ*@Fu^#04klJ{T)j4*ybaJ^ib9zPcwm|3C;Hk!r zo?P)zGokQK6L2s&xux z>e5t*_^M%tOulZD_(A6^3%Fov7=|2O$zRmYM;b$~k5b-kVEVpqT+c30GaH?b*N=*D z_tULr-{?0CIwqq@d}u6cCaVl*9p&?%SH>KDQ=reOPP)X{I)}jrcP)FuGQHcylMF30 zPZu|iD z{$&c+9>i+&lFK*yf2uk6dsVe ~vR@z!eilH?EkTA=6Hmy-B|vaZeY!lfB+fG~?*RD&#o1+)A`#=yKt9+|;-{^-x=9 zWZ&uQlL8ZMGuPmAN}y~dOP94?ICBS{(#uo8v9euwZ)7c@U;2GiiPtIoU{v9Z;|On( zHEUzDTR&j6y_tW6r|oOp8V@ID-dTM+L0)_1_-9#PD^p&demLJ>o(WTf@>b4?u(?{p z_s1+>CZv}ZewBMU{ ^KTAldxN zc{>>QJuN_yje$~nvN67mYT#xMYDn)cjY&pE7QGC07mZ~#SHPJnlj0=#v#d=H>gtx0 z_DKP-2w`$gd1A`xQT3+V0Z%e~PBI B6$+hcUm4 >-@)yRwuo^yDmraKIy;-8@wbq89u!7l zrfBuz;A{P~y=Jq?(V7`j_c|F$;#i8a)skz5gE+Ay3^Maup+t5Ymuzth6g2?&LBoX# zJ_vc%Iu*O!pGGXxgT(2na!uUh!mqm26w6n;PId4OF>Dpu<`=pJ ;=&$;If(!yLq!s@7XcIz6+ zSmYvRSGcY*uc;J5h|xJEXvED?pGDoFEjPqih*P2y&fuqi;k^8YkSuERnP7ix>5Bbq zIC@~RaWaqZP? SV+UVd_Lp1Vd$ zeB_I9u6d5Ce2r42q})Emn{Z-YR;4El*4Zd!_}&|JfQJcG2MMN6P3WUl7da>y2s%ry zyAEoYSBmhs$vwJoCd9y|1;@8;az;@JI+|j4HT_REO@3hGuh2v;dpDqI?rU!T1d F`v}hPa>XsnvD+j1wOc@uji6;|JU_`_ 0@j3_7es9VC#x;A<+bte)N@O$;=%xj-VXY?nC`sR-#<% R#r^wkB8L%ry8&Q*GO+ESAgDeWf9EPnFO7HV*v z^*TA`m=gt&wQI{<-Z4aVA&_coM3j|h<;2SsH2!D$R9&ICig95%(`U)}s}VGYoN;vF ztxtD(q|ET;gzDN2l7Hn7F}IogEc=UaT;)u!<|yx2C=I=yq`m)-w0OH-NUBc1u`yL0 zJxFnNzVJK4V1|+lP=|V{G0;G{Rd8a&&W^s4B>z^vyWNK Vzi89**Z47^5&xH62ljO6FbL)`KG} zQ =?->7D?vufBOHKpP7?;nK zu*}n+hXQ$A+OB>hTXN)?<%|j0E^-|333h=;!9FT6-^ar{7)%0D4FBx8E-GJBV|loW zaezw` bGZ zDAbH(NkM9uqs$R(JE`UZ6fnIqGd&XKhzeOZFoUDX;Z{# eT^*E@}BOo_!z;$O3nzv(K7D_vZ;5EN;n}qzksI z-<#6Zo hUKEa|4M`mpek1{GJ0d zc1d5!Co~@eQ-m}53T>pqycf`_Ze;-?u=EI;P%vDCDt3j7mbxwpjq52+;FxKNe(;^c zHism5PYI4@=Vq;9M#Q*#M3Emw+5Zx$8N+m{Ur}7pQ5Mty*tc4q=vH)}!2VN4q{ad& zb8fh0I{g&$njlcKUeJa6F-Z>i8{ahEcFIbL(!+v1gM^8+Y%hfV D9(fR$)^A;6veG* z0Qe+&H47vs1z%03BGymiOlqRyzw<2O$g7VO9Pzt7HcjKc4rJl>o2^+>kcK)cbnfa# zpihW*-;qj=GfQ&k9vF^R*Q=LjTD~8$(I+gLHA(AL2ThpK^T;puNg*<{kFAgi-`U$F zF0gzg_H4RSVTlXiwSH<0n_IIu%A-*4%(hX!Hc>J>Krv!=8Bu=3bgU~&T*TMnQ?APK z9m`8zgt>}%&mbnM$K%-kdhNDn{ldv)knJ{|er}V_TuXt>)}lox@65*O4dn0(cj cHh`tA=Xvy}gG5GtN9?Y1x+HwatWSB7>Jv-GtHD7pnQ_rb7%t`g{ zqnORDRo%xB1UKhsP|kIW5tL;Rb}+g4BP<_VOrQ1;-hP%B{i{-4Y502O1$?k-dpbgA zAxc!UN;cGA)&$I**#o5_(Mpozv#`10+3_BB5*b`Bz>)&%w966$YZaQMV=^e`fz&Nk z(`B}i%K@Ps&eF%(jMBu|T0jPol`*&@Qt%HN6>Z}P#$QxY^Av(&?nL5=lTBd*EHLAg zOWE=jv8CnG`u*-)rFQe5kIhV?M=*70O=arAb`Ivjf58ga$LII*{qnMB`dr9BF3fHD zb@!|MQ&b);*s*t$1-fdS<#6mbTqZVpHcjDVW?mgT(vmE7ZyFVKNypw%lTBd|y$ox$ zWj|tm10=pjOi;rFDL2aXIn&}|k-`YVBie&rXu2Y*=N?kbX9TPeNa}%>$h@ISQDnQ& zvReLdLGzm qMPh4ltkwV+zfs z77V!A;I#^DrT2AKS= x9PLzV~FgcpD*|mE5XjNq_)}Xq^$=%X1 zn5A|px3K;6>)F1WqBSAJBlhG*8rcQ%?Rn+l1`o%o&3t>M(GI)k$?4MBm(RaK7WM{D zv3Qe3MT2nyemx&Ag;4pVEyxrc)VA%n7+w !Nuv5 f9^Uy_4gV8gP#XH`!XT zg+(9UBn2_K%cvh6h`8vqa@`@r20@klYs+05ZOop2S3|~gV-b8XMdOEmpS2GnhAD(F z4_)fExmK{XPQfLbaQ1<+TJ5^6_|Nh|#||M}msaw=3M^N1Xl#fGEcur5>TnT0Q+dJk z7-f0uh*Jea=x>k8)7JRA0sipiz?x6N+9Y 1z0m9(1i5l|+#wln^kt*Le^)qMl%{=uKP zj1ofU1OR3}$kuKL1H5?Yz4Cs+T~l83<*oB?;y!p9<|Nm&$3nxc%H_X)FD7|#%lRX9 z!8qr?hEqb!H=-Ti^O5wa!#Edc?S)$~Wjf1GLQrb3o#a(D=*rK(pSbn@&Pb3J%#kxc zNryqYXGk(zvZR%*;vXAd9PTY$IC)pDoW@d7(n~tVc@nc(F+)8yzjyu9%Gu&VWnAKm zgh;8X^@1Z% zv}y^fsIMs)!4T 5AEHa^37>^e |W9+62f!YzB&T+8H>r6`-^rtHmOD!}qPmlBbLTX)OhELezD(w+1O z#>wi bIZco>Hu z{qUkE{o}a#Efl z`azVf6G7UD4se5B@y&aJ^`Dhk`HvL#ex5&Dn|KbiX@*8~ROfi9q0D6M_;Tt}?j+)~ ziF{XMkty0ix^|{wzk%&av(#UvkvHzyyKa+IX>(3UpCMh`w@+eaV+!VyZjZQ-C8t*U z++5P06*H!}ypjI Qz2CIi6MY0s2%+*4GvP zCh!tGtN8b$)~u)%^>J`=d@JD6{%Kgf4O##Fpe&`gZ~JQ6!$Lb*LU+u>S#}SQQ&x6| zr`_gWsA=BagYkaext***d~i0Q4Ju_7w^kaM Yo1s(}C9fSfTdl%j{KN}O%PMbbYlT+*b*n3#LUJoVq!QqcrFAy;l?IJe zRQXr3Lxmugt^dM^%o$rXO1-CL=`ywTIa6#z-WR3zoU$Pmilp5$=+GVtq;f)@VLHwJ z4JjVw3UxO<>!EOL6g_7Nm{Zr|$^CCEvD6Jv`Kh=OZp?5a4kkhEl@KY|!H(a40?W?2 z&?JrHpwMCO+|b}-= JYOA>Q2BY1lSRqHBJAnRFRG{Rkp1knK5^5sFO*~|M zY>xeyhZ7VfE)LHkNw1_8Q7(9}=S9Mef_yFp 2Sg4^>LzX*x_xIrt-e!h z_z@&nu nZW}PAsgns%%Jt5UR1eEjkh)8ZAg|B=COtRWqV@Y=2W4yA *f=8#ogn^pfckO)+&vt?G8NYjb$j;Fn6hV^G12Fgl b-F7-Zs{n z1hs>7`)XZk*a4s_EShTsuFchz)+ Fbe{2ItT zp9pApT)TJ6%FtO)o34NDHska}19Odb-u-Gc=AbUmH)`6fH2 JsWN8oBn*7)A~94 n8H@>1WBLGk4vjtZN$>luIvaJ$+FtTJmjnvOC(E+RQPS@cnC;icI6row;M#-%w8> z>#60~a&-0F@oG5YZoE49XjJa{w(0PSVFuR!{JySPDgNqqH(op+ G-$?0TQdTNn)HDHJ6Y8w?b4lP8uUj27cI&bK?Y8T zHaXat>T*+HGYq) c@!3At^&{u)wsBvUNM{j)5M$5x}Ssp~by< z3iL+;bvM-3=QPMt8ZZYN1sc9FVE_z>H-LzsJGf`Y2V4b)Lg(e)e^ggXx}m3SeMF&^ zuPK^I$)_0_OcR-GqE*$(=DI> p>h%OpAG8)oL2Nk^5lB5V|bD`wgWFI(H#9pnfOO{cV zs`9#cNs_QxVCIy&nqy%NR}!JU>z2Ee^RMpc_8E3soG16johUBeoT@QT&+Ca*{Pnik zKi+Z~i#4*t`%b6GZI9H?4py|2U8xy^4H13&c4q+%kCyEiHs>3(KQfwI%6s;$Hc$?a z%FmBo@10!NJD-PbRA0u&H}rSU3)^v>UFhEYHSWp%SLJPC7`gba@$&6B_gDA>3wz;~ zgA}SKTXC;wl-ix{^% wX^yNgsCb zB?1N1TMvNkM&#VEf4+K&@J2Xhd*ItZhDr`9pbR!;Y{toc25hzxZaxEe4e|FNT-#nb zo~0Qx@x+u&H(an2wKHAu1Qc3D-NhE`2RKRr!Pva_irAcaVg2sOVzxD+KpnPK*E& p+k`nyzEpvtsb;Wu_8>CJaB0fKOxU!gfN*tq W9%2emmKRbS8X)v93 zC>H*Jvs0Dzj(0%I*!J^+pDQY?vd&Y|Zv46pgkh}TToy}~(lQGha}1+o>Di|Z!HwAV z*wepHWaS(XEL@$<*; -hVyiA(v?=oOht4{34@5@aX<2>X>;AYEpXtPU{Ui( os@v|=x^ylsO_y{$S>x-l?VRJF@R60I?ro&%UTsM3s}g>VCm2S z5@n4Zuo<^Ig@~DJwU45WGhz@{I^)td?k5kY#_brl#oib*hA|HsH|eX6Dj<|pofycU z8mUX9$2ivxXKD-apDiP{2MsLkYR1oHf (>(02tA!T1-`qNIpaTmSx3%ooZyNBM`P0;-qItpC z)6hLEQscL^>Nop`R1+ prQNdOG*kISjZjgd|m8# z#@qK+*71U_0fC&UwG0yommu0F;b&9~NHLl{>+^G(79;`fVf+@yev(HAD)&rIA($#e z8_glI7WaN(nM}Gp)U}RnN_B4Z``3qQ)MZCQHxPY)nZom+AiIFRaR8gTr^VCu&ZN+{ zcJ8>^qEoQmmeyx`R#5;F19O0VV%}y2=0IgA!Mw}HAG_vYB{>@;JNJ`ab8#wTbb+5? zhq@RBHckaoWj8fG$t&)G)kKuBmtqz-N8+I5!AuCDrw0RYu5bkFGZ^gPG!^#n& a#bMn{sRl>i6BBbpt$?6HPMM&0$)qMPhd*=3NAe3v?v_kYGqGO@*N`drhL7>D zBS%2nFqLA7f9y}f(4n0lloU|K(FOh42T8|v+{;do;g%%ClHD +4 ?Y;{+OJtgctvt*)H<4A)kkoiDaX16{fgmy9g$%hyOV+I3y5>N=mDZDym^ z>9~OND{B(X=KJSKco`-aI+g98`_EDEv8zsb8dvSi?}uHrR=qu%w|DT6m-L-uC|>Ag zItcD;b+u#WPjCWf76t0J6pdyz(u-o2aU)eXM7jPPcDZuBe|_Gf2Xiu?;bS&+IzFnk z{!xAOkGieDs**m+ml&9s8Cm~X&BgFhTlJq5H38W^Dxv =po zzYWLeBuiQ}zi68<#L;}Foeq3sZl$Y?|BWzCQwU5gPSsZ`5f*+*%WepURY$^C&lfBa z6f#-7o-w7=Iytj9iyi3y=4|JLA)kio)R#Sot$vtXvHK_MAbXgNm~>Uv=qqtIlIXNX zlRv8jPzSecKEEZ`N$I6PiNAImkQ!E~&}16ci07px1BS~RH7voUX|Pz1eAv{)?k5cI zAUi4EFrif9%iT5<-+?LqtjI6-U2%z~LVLHq0%sNgdW3ne-Q)fG=kr09uJpf&-2W`f z``=2_m>B8*Z;@-aAE1XlVF5?K%z8*-j&ZCWS?&JH$BC+s1;$s_VI rS1@1O>_YiNHpiOZh*%JeD^aodAw3>9XXA8JL9jtU%Yw-0w 4h zk*Gy&^{6q$@Ag|Lj3CtgP+63)-~)d+6T&O9&jy}%%Lb~dbY+N`3*z4(6u@SzY>?=g zh3k$3v6oZ_S$JhdmwSi#yTf}QfNW`W;_kZOxd<`nf8ZvUhic;miBW!gH}-@QS@|L6 z%AOG+yjL0u-=C)`@Q^BpUwjfF!0|3qW$ZwYTeb)pf5X&XriA{Ytd5@}Vn-S%&US5- z4?U~UINSZawtEd>Xz1bhZzkeDtr28o{@447MxH(XGe6|$0jh_9 l%?-rUU*XKXZf1XQsZ3?=Cj?GC(72p1d^(CY#g z>Ojns&%B1vtRD7mQa_i^oH1FzJQpoxP2?D<(CvqRfGavL4W;$V7Dd9GX-$3|YDHWy z#wf^0`WYESBu$_omU~QE%ETWFmR~NPAB8jEb2LhnrLRn60sE{axw`0xJb}f`iB`_V zUMQ-XIXXN5Lk02LG2SDrgjLRkfMnObD)^dty2rXP(^@}p^PuBc*Fle}cD3J#9V^}V zz)H9Cz`c9&`0}}=P!sL{4B&fy{%30d6Vty2kVS#LYMl@E#2Z>0;O8=)c>rGObG{jp zs0%IFpc0-Qjh1BoXiT6?lR(>jCT<;u{ri3xIt)2pm1Lz5Hcsx5D_E)9bhM*uArlcG znFO7X5I;x)^9MF%gBIt&(2_TX$d%hePdPFO31k!nIp0#9qrE>p>V>Nagm(wgp-Qb8 z#}HNQYn%NF>V@F7`w$kuBsDo4T3aOy&4>T$yJ)5Ny_%95VEPP4+%7UoF3!)ze?<(I zy&kQ-gziZ_F%`<`EQ0VnuLntdEYm=n;|ZR}iMpg4xI0=ME%78qWhu4dnlElXMwn2Q zB5ccQ>&@N5cTGFut1}MZS6m=B_nIopG9*vOG!AyfNrz<~#Q8Rc%=L{4De=ae+(%cE zw2eHD7w&7WuP$DGWabxJ5Xb49rtr_`SIhd G>MF*j*oY2&plgG@PZuuNsXO9eM7@Bav4U2^& z{do%`s-+x7YGO){GQAee%6Z<%A4YMhtdLpH=Ffq3SN4H3;?H;X9-qozJ-)2N&)^WM z{TmBEYL)+^4dlIQ_pU~koC%CfGDwvSZzS9&JwhFIztbuq zcFCFO!W`R zIcX?_e_O3(Jk}=g&~W zaFs@(u0kDW8ah*9t>dT%Sh S(_9);DA>G9S^Rdw|Imt9}z&6 zxB%spxA3EFY^(g>&V^Nw?)O$no0~W6iDXURVWB6rSCs(%*o_pYt2j~TWf3x>2|Tz$ zT2@>V2e*NDGv8Z|G1bHK@Z|L?3@W)6<-dvFM=||>5 X3PV;MQbe;Y8Jrv7t z?;$8 4PH^JLA91E4PBA4LAej>Lf)AU*V;+Lw4!L`MR%W#+XtW zG~MSWhQt)uQWD L)az=UQQ>;}UF^)z`iP+EqyU*7@xFNKfgRCy z_9{ON!;O7)vaHp8DuqhiB{=5@$mh=2jrgcZ&n@amt<_U0vdd}nVjSekE