From 6339e8f336ae79afdf07de07e3ccffbf03137410 Mon Sep 17 00:00:00 2001 From: Scott Alexander-Bown Date: Fri, 4 Jun 2021 15:05:19 +0100 Subject: [PATCH 1/3] Update gradle so project runs --- gradle/wrapper/gradle-wrapper.jar | Bin 53637 -> 54417 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 72 +++++++++++++---------- gradlew.bat | 14 ++--- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575b0cd0173fc735f2857ce4bd594ce4f6bd..758de960ec7947253b058ff79c88ce51f3abe08a 100644 GIT binary patch delta 41653 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 z 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

+I zG}a2-Ym&}CSIqz-Duk-Em&pRs)|5;JelkIEXje4H%3wpa?p4GT5GrXsJflDBnab!?Loe9lb8kv zRr=wbs(fZrD?{Z*TGhTmUd#O47?1RVuhb^%!w_$XUC++}XmXY9n9Q|=&!prEujU)b zD&8a{cddpu)$LHJ>jyNcaBEjYNX@5DR460f+KA@U_R@RLVcRLaq5w5d#%u6^iJY7# zSPiUnU6C8rE(59@(@abVI9!FMpCG_*2clG7{wk9L0Z^%aR#n-qVn|fpU1O>lX)`9o zp?bSW&3ppIQxFwQXE$^X1eyY%T%5}6L%!U@O+I*!LpwBkevrMX5&JeL!x|3 z_yo9KLyez+Ve^S^4FETA?OZO9sE5$A_kv4=Ki1Np{P5jBaJmZqbmG#CR_f7!2&{a0 z=`Tqe4;Bd$H7#3L?X={S$WT?jYUbY+tz6X?R|Z+ma|Q4Qk~*F*>nRm zjP`k?PdNoRZJm@5qH%MbI%5z!J<=Q@gb(B{8RfW>0pg!M1;t#`UkY1e+$x4n7jUN) zQ7$I6dI4JTgK!S9Q~Z>;xYowYZNI~zN$IzAf6W5hyC(u*H7B=zmnn~+XLc%JY_2f= zFFRA{=@0&kf-RYZc_9DALA)dV?NM+bpg;d;$@(7-3XBl}(llh9P|flF+GkT(ciR&S z5i8jNg|#XLQ(-Izr*D{8=@i13funa!a_D#O#^uP%`V$FUe!AbE=asOK(rZDEVM|Jm zhwvN+Jq(RvGv;G45{&G3L3y{H8QxpZXdMA8$< z0PpQs3`xKZ5IrsJdct_YIuGuQF#lNu z#zck23TzgZjUz@MPLnk3goHDvX#&g8cGrGlS_G}`ItIEr!Z$E9eB2pyFoSJKcT&d^`g|b!bfR~Mp>Oy~8 zXJzXHpfknEDmJeQ$Cst*X5edQn~C}Je&Ee+x|~@+tm~08imvP8!1=ybjZvKYaF?d3NpL$7m)}W_;8-Rc}yj?mirRoDw$(`^G16Fbx?NV zbcaqj$B8kuPCxT+)R!GRfgZlGEzhn?<{#lTfavTt4sNLbV$BKMD1*+*osIl>hQ-Uh z|LUmw(xCd#ma@5tlKi=aFu(SSnr;EnyYCuaxUOt_P6C%)kjXF~l&h3=9SJKfqwy|_ z1eR8Vb}LI6%UZ*ZyKh)?EY%|m!H@!WPoruupP&pj<6v^5^Me^awT+KPn;DwXG?hs# z;HF7)K6U~NGn9&9B6Bb%pqK2}yqCmySw=kLplQrpZ=@zbFZlt-AR}o|HK3RHSYEE# z@b=@D8pp)%teLootiFr%Hdow^l|}5$ zxw`L0Bw#$j)4Vt0?fYG5EMnsGAt^QikYt&kK^+!a{+aEJFnpAstb~Ei-Y`}53N8Mu zXl+vr9}_XJnB-udI`gs^enP-gaPMdqMbn+yr&gjS#9Y^YkxX{2)jo=eg@Vt+le}6R z4Ei$@T16-gK9I$H#}=o8nBAcZ0HbKStDdUwoa)JIV^F`{=^zOXuep3rph8lQlii5v zq%aisJ2#XRai00Q1Z~&r^1Ubnc#;+LZt#{mb$*bO30^QEh*~W)Sg%}(8@{V2YKK}a zFa5}X+8_Xabyk3y01C2S5|Xj4e~j@kOHJS#ZkDwY+X|*GYiz5N^EyuiKxIHse#s;G z=XTzhrUB8nOR3E65r;#spO^HSZMM*(5R9lbDL-tI+72eno1%EO#i)H}#}(fl<)qq>E@sWb{gS*^0CaXJaKhK{qUxfj85%MZ@DRdR_Rd*H`1#>@i42#-6Fiwx|hW zSc1P_2)chn6)?E`ydGs}b%^2JG5HzND>(TX)64t&TQtAY1remxFC_o9B^Z)f)G#4= zOlD3azXJ4`j=REQ$}94ngMhLwmSuoA9%HN*aR6nRIQ5t*?Kk&_0VUO6GHL^r%P5WK zUF3H90jM$z{^{N0)^pEFo8EXxGQDt4_b@X?@S4igb{qOQP)g|=^1g&zw(Yik=+bnS z)tznZ%I#7~Y#L^wi%z~*!vB?omT2vz|JDFye|+nce;x$;p9V1fM+0Wn2mx2FsOo5c z?Q_hAJ*G>PWMsmiK&<~n2BO=+&@9N5A(AQ41$WCkri7Vs+Htg^qZhnOd=J6J4{Hi= zhYVv4&P{m!rF!w?ESinkvhca>J9D4^$a9^)-v9gcff@Myu06~UTj?b#iYmdDJ5m|V z$^K6MlnQ}v`pCrKiAqDEo(s@;NDtSD1#_0DhnAj`aZw0~uOgbW^}=0Vx)y=m`!$N8 zH`J5dOUcMfS$1d3#6&8sGE5h$mTxNzV~t)OJq-gQT5jGgiOwe3U4ix5 z1vTtC)@crh729QN?7B25iv>?Le_E~}hvNyxXWWhwU6y;yPGaN~pA?XRszBG2=_&r& zYWj4LO#)bIr1Cg|;iw4JrB!caW%1bTv>1`&+Nx)>$ITYaQJP7$yOJ71w~pz zq*lgja{}WaEyf-e)W$e1Ng08eOmddpF0TEA-bCg4P>MY)Giqg_Lmj-P}wuvV4F^qU|FgGKSb^qN4;D~v)McTe2E}XB!lS{&+R{Affyf(w6MD8h1Y>Du zn%;ab<38*fdlHEN=`F2?53ZL2JWIQgX&8QJ0w@*SsxuKDClOe1#wVVf!ZAVu=vdh8)SWM5#Sh3^9cl)LMTin*0rliJgpQjn!*}n^I zGqmior20tMi{VKs4|3&sUwi%J48HK^y+ZsdrFnCn?g855W#I{&gWTyz^`WgQada@c zHCQeV>6S=@{%Jm=b~ZI4l1nMQK}C+Z!$ngXqOY<*CKGx{sxw%ij^+>AM zF8~h|g6$5@JG*1TJEO9linEYh*FijxAI2*R(*k=Kl9)FpJG&B;^lwkgR}}mNh30|% z5LWzyD5cIYjLR{K!3v5EPVh&ZdjytABJb#;Tti2CM{jG&y)uA?G+3=ApS&JZgQNsk z&!KJjzmWgiAIrR%x;0u(r9%I^NzS=kMWaIk0XZN50a5&GlBCI#5dVDghbgWm^3U2D zx_1g!wChG&hzVsJ-6n>#DwQFa2HgnH-9jY)K3UZ z9qN%*;DFx=ApM*Ay6rT}uaJG5ch-9|oUHpf9e;o3zd3<(#|DnLqK61_M^*4397d@7 zh(wjcPpITJ+s&F#MgcL-Bg%>Rx@43Pnx`sw$~&nyx-7L4O&H_Ceq`|pQvk~c6*$6} zqhn`3kb>AlRcAk(f}~MP@oxOlGqWE*yz%>HIK#-J7-c`|aK`b)u!fO)b>*LII77^w zeWZ&VW8no$d;GYx};{|vGxqCcq4Mw&f#RA9YujaPeY<{faY5qf0mu$%1J52Cz z#ld50Z?(Y-g@Ck*tsms!m2sJA*lzwhdNlV3#sf?C?L_xRY?lnU;#<6?Ymqh2v_5lN zTH5ZsyoH^z0Esp^`J8x!Qjcy7$4}Vq9#+DqDxdcJ2TKXxU8+<&dAE7bfx2~6N9oSr zcFsNM;O?_4?v+ICh1`EKDWYOetk*De?50hy+6SVi2myNFOX#NJzq~H%R(&y@*Q)$l z%`h2l=TOK`7cvOykIQZk`=+~(t-$>!sLtbS3Wqgao=21IJ8d@?Zvd)-y^W_ZytwrU zR7zOKMfMsInwT$XM1siUuD^!1{xrL*5*oO>FF!2dvGiS2&4eeL&IM0>a$mtE=5*)e zWzF26Gy_Uq#~2)vyi{|>G_^dyopJDu!g{YgZ}a15K1EfO2y&ZcUW*xW%>E!Cyi7u) zV>&61dh-#CCaA$3kJIE2v!lCu>5Qsk9gFWdXpbu1M@NIxJ<6;XV^Lv`_BzzOSDk;s z30g`t(*zLLz`mD78%90b_7)$^^jLOoyvw5vr~{aTDzv*(6kf?>*Y(7i`<+A$-Adl` zqW6yxd*4e$6C@ra(E&pR>b1w}=zw2_=&fFo=@$&VMrbbOHJD&8w#81s4X{Ve!6ELM zg@tw9yxJ`KrrP_jmY;>{G^Z)$Clnb{JEg|;sXL{Lc>+!P#u8LJ!~1GG2la_PR(Lo(S@*mCz6qh!Yn z6Yz??LwWLUHBWkW#I@E=-~=c7s&2Ff_56D)d}K`v1K~T~?gQX~QvI$qH7DX8n{G#Z z(Uu=@li^2Z2v|ZW6>cr_=;9=pf zwMD@3q<6w8i78*7uY~7KIP(QdfGAv9cNw{a46XNUS(nr0WuO?&B;+1RRqlW*Ray-! zhyI;;<*gj!<{G`XZ66rN18dO1)1S+CcV=x!-ly(yYI?iZ!{I7D|A9vvuenJ+84 z*jyL~QeMh{3HtS>kY9Z;Mg0oPE5)m`6}&T*DFA%-Y$&H2(&L=MCoc>Dpu$6d-c~q&piO?F)I302^MBPGDq~|(h59Wr0!8t+im+V9n1^}MV9aT}q z=C^i=;+Co0EYXW(W-!yu^(a*t6#K^x_+;lVfJkmaSyW?FtSCAjfh->MKv0QmTvk<= z(%lMwYyEoaEt{;zm}uIoqGJ)yDX|it^gX*0YmhUddPuKj(0&geCFLiI{oDNlRmz&c z+On?1I7IwxSmX&mI$4flD!|##-wjmXH43$MaS}5Bp%EY3aS(Hvc)$$=0Q+^-gkAUBX=suAlIPj9~3Py38846;C^QFkA zekkiz*4QhH%4#oJuT{QDoP?EkY8S!V7v*=0E`g5I=o3=em^$CpA|R)LIEXQ4%cLUi zd*=s%-IA3Gud)(`EZO^~u@bCYhE7HMe8R*b|uf)fV`UOI6DDe<0( z=+ewHIrf_Lb}m`0PA5iYwO>hhQKL4&gkD`)dVy-g#=rfwsI9GSRm0Zt>ZY&n?R9Va zljaRz;lY_>hIGU@@NIGGn|t;*_s-AI;QMn~GRle=fK(_jmoY{eM-m4x%nk-&1GXNU ztiUN`A!xV&YqVo1ymJeOu7QPB7M_i^Y9Bz>R+BT)or-=TDwMylPav+ym1?Fvl*- ztP{(XscMm7&OW{Cp4q7Vf`$qnU0Vv)r6pwp=Z;^N?4a($dX*2?fa*>j0`|z}XP4B# zyH-$}x@&6e7M>dtO}Z4P75_mB%U4!4Ig-ak}6I_0uy!d?JCZO%PIML_mv9)c0y zcJE!Hzi;Rc7&ydhroVet^O2D$s-5VB@Eggp-??s2X-lQ4a^V&f98$-Uqo~6?sdrEd z9kOuG473+0qYbbRYTj)=dUf^$=molT4sA1o;p1#CIXE4=TZ^jPm&eLib2!=S9J|~^ zcgx%4!e%qBdY%E*jwXWdH?|;1LtS^{tV+f>$A8oVzlDsS{l8mw!@f6+G z+$f%%Mk+6)&v$nvipw_%Mq~h7d#EuZFHFmJ9Z~Y|7tV)Eb-McQlcmV^2~a0p4zL`* z=YAD0$L=YSrLlQp+s;HPW5Qrh{^sE?-)>&*RJP(f1W5!u)v=kDw?$thFC{Eq9kX+H zZJ6t3_P#tc{$gv|jK!v}vg%3NC^c2$LqfbrqW2j}y>qKrzhp^~W7X%5aU?;OB7`D` z+hxI-DIIlduYu6bqr}@X_9#c`HXk#kox-cgdBACk>Lf|!om2CeDlJsTx<<9|mFefC zB#}eKdt?R-S8w(I)r>niQ-lIT>RzcO~k^bFTI#iq5 z37%Xwe`aZlGDOAOHcpw3ArZ0QUQUsqN@J?)&vpj{QaEiIdEiLPYIs0FL^tzgo9t4< zy20~DD~GH5-BiUR2nX!Fu0r*{3IqywxRrx2xsw@X3&>QjzS1mYZdz-(H{D~98hbpS zY}uIdAxP0<742KSNDxJ|Q7uT! z=yL;dw`sI{rjz*bV_)&%|maH0V6?ZYRfx^i8a-lie#t67VQbGIh-aVOo^7o)K=`grrl{WSS9*Q$>lN9 z<&^L>O_+tvBhk3AVk>eK;1iLxNh|G8(`En+(sR#7<4{fpuS>ii1a8m z&e#H8@&mHqwg;;7SWkh=(bOs}WX0NPpH(>rcGHdW!nTT5J6yC_N?kW?Z6p8( zNqFgUXiOQCvUK_N4d~<1G~s2i2{hz}Z;*(F>KGgGC|dTQ+!t_T-XI&}7CX}vC%l=o;! zS4B}b6RN%4jFgbfYFT~PlpZyNH6s9hLL7yn7#-$%)Iy;8Wb~pxO z+9+oJ&{5OrYVY2ts9rjB2D+(-r$eim6g^=}dvoWi!WqKR>T|D6R{7G?b1*<=pvY65 zNA8>EJ2#+ciHN^s$^98St-i=s-6xbl{X(LjAa-2MX{va>x;4i^>B8qv?NE<;e~_cv z2gP2={n_thi!{eWUG*Qn{pg#I5t&)gTIq9t;S1=t$E0hXU!M;PxsW@eL&jXiKCQj!PHv} z3S#9K(Kj6KuZ5$ys!Vf?rT3?O8O3sh0_eOGuy+?q!klqSy5q|3k$hrQ~%8L z!2sM0JdHZ`a!$k9Xj^=#-`R^X{ya++^fPl;H4<6OBLM%;lXH!a96x{%+-u_0{?WG_ zuL6}=wkHbRkrI1mY&tDLZ5!GsB3beXju4gS=NNS ziDPiZT|w<`x%*i^e9Zxid3LE}x7pH`zkF3)AEib1Sxl{^+YL6ZXx5W{@XU5MiVH)> zABS$2vKOyWz3i7p9swX?D|@9bJ1f)~rI-{CHJv;=KhWwT6e4!xdTF{XUW~8$B0Eir zeAGYzUY$PLx@)vNyt!I~RyuuzB}+LaS}8pDwsutX;<0|s18u^}-6M{}M(9KmJT9Ti zFOpF69XhQ5ZJh8l;Cf9otA!zH;gih2nomej^#e+<>~Z;#0}4>Em=pY4s0UjXvS{!O z+irof+By6egKEH8M0c_C3UU64Y)17L-5oNGq`JV^JoT4;+5n{y9Ra?rb+k^6F|cu# zi^3H_^;v7YSFuLQxv#+?rrM8yU~1Hsau}ZKf_aU{m|8%RAxf1&`e~Xm#uSDR&A^ne zl4_(NS-Qcr94^41vFZyni{taymZSXfj~5L}yC}am3V4&QV<`CX5Lmm?jPGV%L2QzoLle{Ux-|OfI^NtV47jD= zj6THNjMDxZBS!EKtp41oIb|1I)=_eQV*EW6EJa5HgKe-x)or7L^hXE+WO=`n4w$2L zmR_5v8e@*$ue~8Vp-eLJ$ zgO7AP^blPjl_e!^(E(Oc%rGJ^{l;~M>T+AMXI#C2gmdzDIg7OcG^)=*v+~$P_qL^8 z5LzytF!`{8!s?vyR@6`Ts~KN%Gh9@~VU8Ig4e0w~2tCOgj1g!lHqV@b^F=s!_X#bD zrYu0B!PpBGm(0OD3~Ceb)M@Z4O2@lSmDKojzE+e z(>XO;&JEzIFwIotv{IIQGGmh$cai{isf=bhtHLZ9 z9XppBn5;^dp^Br!;_q1!Yva%y@azKtnF1P)D4)w&=cAI6Fjn6cuL6>S{OgO>lJme7 zy>cVlI@qwId9)rRl8U~Mi$0$*n?x)X3o8&SgT=GX#e5R31&0NC=3>{yqqrweM-$)| zF=u>tZPjGkuf~{4)I;-XT>7d&QfFqH07RA^;R;p4G-PD~@C%vl=*;>tO#=UHm=mwK zHxX{zZN=Q=8_M_@FNI$_xEB_lUN*>aTLJZVnT(w!pdj)gk0*PMxw*Bq%d z%Yi68g6Dwz{y>7HQz&q$U#{xng7SJ17AmqIDQv)uDYkvWj)LfGr_-h~b%@``A^pPH zTN(t<;7_!))ex1H1?BvbqX}_|EpR;PAui-*b;a0f@ROJuF7@u6<|lgMhNS>T;bK3Y zoPIf9VR9kabB>MmkhT*y-d*Tf3!!;`H%yD!vMe{wJ-=u6+EgPpe;MJOt0^ADD)&p$ZN3P#Dk4dUt(n43%;^ z3yPL@@H9*8j#mzXgj_#9N*5K$#4WW&lU5xf*D+QkZNNC&2SYb(5e(%Yt)SuEp>rho zr%;O@XytKc3+5}r6z)stR-X%=^x}4?9zwsS8~+$!RRuB>mOaCFCwu{l-PUS37rvQL zNFZtm3L%L{#kR!vOF@}ziODaBYwv?4Li@!LhihvFU$(uT4!fcemOKy2^*{wh63T&} z;3U9o=uaAL17ufK-6)1Rmm#eKbd9Utv}tUg)Y=J%3ww^RBxsXlUMnJMBoKV_i!b?P zKqpc_3uzZ9h+I($<$(bLJ(c-Bu7P{WtF5CD5ZjIkzev2by3!FAj|<lGrZ1nZVt8Uvl|YkiU~r)eQ8%hz=)s4tFK}_0(2y`kYVpAq7eoNC?0_B}+f4@}1kxag z0t77b<0^ZnG+LNzEJ*py&+xoazs@!t6}O#}YgUNxep9`m@{zAyLRfP*`lW-tZGKuY z6SUE*OJ;cUPd~;W!M`PGsHYB8u37`nb@LKR1$4MfaJJY7cL>*Q zALj5@ruGLn{?Gux`a|Zzw6cI0!ME-@LfmN72fHPk0(hJPW+Zmu-k-U9Phy<3!LODA zomjjBf_gV>xv&%1M_&|cfc)q z+xJ^m)z7MS;?&dDMjRgugs%bHxIJ#;{O0Vu{pvY~BjW;?C$0@?$%kP+FIS8#dOfSU z3fA!o*+Nv6*(a`bOn$+Gx*Y=9r^+oxgXh?wGw+|a>->#T!&8Il;8H^Tqx)%nrSThG z8Va)wuh1G{+ujTRtk+-%WFzf_WuG~@3l75|I74)y59;9y$t9AnKnTHk&;uI1WEb&j zA2wz;LjDX8;5%j_=1+eVz`oW>I^>IVwocsdC@gm;Il>o74#h{<@Ws04tGCcJLFXDc4A;1 z0{09+(dvse@&c#uMW?=IC;Q54uF4; zBM6t^yKx%{ziYp;2I_gC=5zj%;f&iL*&jOJW`p*DEc)O(*Mg>>FM3O4-iIvP4_PCm zQuqrb0}yifCbjYp<+&mhz93aY0?bhqd2iV4m+TL<^ES@@Ak>hL-py_~Gx{g)alHb9 zs|OuWE=v%FS3$8~1BVHTeJMKHjlUER4t}rcE>I#-XI+cSFRCbq=@i>%y*XqnX`5@J z@I%J`#Wp$@N2`#)a0Uo}Ix4+3P?`Urp6u)sT>{L5fQq$|WeeAUbw^OBUi0^bcU_LqrOLMmpaGDdzY=(tmGl{UQ#7G9l?_N(fCabitq>*Xkb2=sh88Qy?( zG1jEbFT%L}bRgLMC0+^Z zRNH*E_!snl)2rPrdQ2TN(WvjNuJ_^825Re^vmC9`$A+oR6!B zo>^JEu5&Yerr#g)j*P&)L4@Y-&YBX87G%AQ#u^f|r)E3Dy|Mq21Y_xNNM`J5t;6AO z9{}G$a>R>P8d3%mSqZW&%9^>Ik?IiSi*!h7Rr#Q4j*(wOAC))3{3(ua$#1ZFad z3W%R-cG2cC2w%~CIFR$095Zkn^Q;kV*9=F?+KPQ1*-vJc+6(;Z(tAG<+KoOvEfF4T zog15d6?L9?fzIWRKufWw{PNsZtF{I^DZrs7eYRE_c#qBy<{Z&}^mPT4y}Cw%2d9I6 zR!XrOWj1!snkUEYzEUHbq;-V}gQ$o2Y!=SA>)+{}P)Low8ofvX8+;D_7HfC*?3f(; zs1%lyBGycNeZ!cH+Lu$f5-$nxEO`??GUDvZ^voVRbwnOH1jhEF_ELN|PqQ7PB4B4R zfZ4k)&7mT^yz6Xpm~6X)eR)FWplo9?R!wdeds5$m+ssD<-MiY1;nqsQU2Xc35>i*) zCl9+62?K1!x;63GVos)+`%LZM@{VLDB$%k4+6%G+%uO$m2Uw;`;updaiU+#YM#{Zd zP<$*%2%>N%$}74bjI1z*8>P=V4nTaTTKpO0c!J+@zKLq$FmT~%1+^~vn%XN`6j=W3 z=yTgw4H{Y!Mqv0%+$@Z3A#Am$~oB-8Zc8C+Ef7Da$ z`U$9pdw7lIy4DE9!g3}z9|or!f2Hc019q#2?py^5!yf|kt`>s5gi66W6<}}AJI)UV z3E3Qi3_kzBAMqLz`0MXS>v>!*D6R1Cw%HeT8aGucJ)d1nifP(5rN&rw?XijGI+FEK zosRM>e8H(LI@O=XXaX8Vu7>1IM70=fwL7OKNHkJ?r)bXL8A)I9BZOZ5PYcDa8g&UP z_G)>A5W%)h*();g4l_MVHIWu+0y|W`c>RSR==%BJHN>AMp#%E3F~C)8%o5$gH9k-H zeK3amdCB4#6z_s!$q|kbP{XoZ0xEIyQN&*g-l)^rq9oImy4;}@BtS&weeCJs>@cQa zP^#oNGY-WF>I5)z!a7K?;pFjBDCfb8A;r~LXa%_Z179|!A8>&X3Sfv;?lXNB6F~=| zVjLQ^&?&F=ZiuPg1OT`DJi8!D2-Jr#=QZodRR1eDf$ynG_*5@ z?d=f4Kh0}W6V>5Jz8Qx$(Zk&_$sw1FM0$^c@mW!6VwYL`d9l|mdTpd};0Ei)+l?-v zH}^F*#@^&@{v6*L)zPKeTkiq#@%#(AKk#k+toVL<0FYNqYjQZCL*^HJYx?}f6T8Fg}0|Ilb$Pf zAH45zwDW=Zzuiu1t%Gd&-`x@^R*I7z6TsUDPaXTOeDkCO$8xAcayvCO9l8C|toZb9 zI;pfO&cv$SQg-p$?EF~%tF-KW6A5UAt* z+pHW%%eFl{;5z56@2&6d-GAKo^S3LaAdFET%HuJ8zz*`DZV1({ynr2aF>C~gBEW%z zcGq}92e?xMp(ElEzLzBudM9I~4BqpxzOdS{5jgig{jjeY7um4y$@8a~*Fd8mQ6S>f zn`rZ+ah5+>Aoj-|@;>|G2Gz1gvKBT!9Rba#kFXiy~w-;HUUFxHqa38uDb03|2ANJ_;Jt*^am?$8W5b^=_ zi!HE#x^jOB7a#lf1_%EFA8&)7XQ#v0%FC(J(#uRvxblw0zF{qCMFkaK889tZO2I*` zwPatql%C$~VKo_BZ)BbySU+c#ASv>5s&qENF@GA}JA2+fw~IT+XY1+KYWV9>zfZKM zgfwKBKMaMR7yKxAxtzH!M?*xBR_in~zX@eBzG#PMwn67$D_d&mhbDs6*bRyv;dXfj z%^!b8YZ;rCa!R7e)kjBh6wv0J)5K>{`btKDR(r)d6BQ4w8bkRK?_VxK(PCQhbkpwr zFAF1&MMGS@W|qTo%OYrLCzFd0_ZIp!I{Tr4rs>Vc&;R+N6+Tosv~E9gq2+E!Qif<& zKIZN!7B9;emzlm(lm%V1D;_l47EWB`UO!j_k~_sosRDiF2Y!a$253XNF!gE_4H7YS z&%eq4X7=9_AGegJ!0Hpw2&+XO_%8QV0h8s#H8r$3zVNmDWqA zwy^XiqO#Vooru~ao5RT8O^%kbLQ7AQMc2Ji=aAjJw!?z~Wug(_BB9*KaH zX`>xm^|>qgzAMS7cb$XK9=asz|B+`mFgOu zt6N*z*)KUwcJ_JG6_earQ&|~UWte2V9@PTlNlmqV6#9o7$ROLH+z%Y-#lNVP? zGm5HDeIt5nH-IAyGc@9DA=7C&+f9|rAyE!nLu-G2$=Y(3ZUP4{qQJpVtKWb>d z#RgNGpT^_ZoMx<1cC^f^DLUhzj0WLA2Avv<<|j~4MSDlJL0?Bl^MR7D4se+kbwO29#EbL8(DQd<+X?Ki zD#s5wF1xr7ThcWL%VcL<`g8MrKgnSBSSq|-&)|zAdiwhxLgX()zKSF7IkZ8ej_9+t z+fuBrKOcV1x~&Ph@n;NijrqkiF6>1ow#SX3=ixc10*iT(eAK+yp$^gfqEt7du@CxrT4@Db`RLu7L=nHR)lW$mU zoy5miSs5Ny(KWs2JgYPHBzO=sSsax1wDACA=2&JH-Pe-s`q)tcvIH2_CfU}Fm{^Z8 zdfvb|@%;ku+heq!&pI$9G5&VbOtn-s=(QArhXq=x1fO$=C0@Sg$x=_Bb5-eq34myW zxRis(oTy9Jw&C90YsR|3fO=(MxO0AF5{?kJA~5Y)VeD*?8665uUYH|-xoHcPV^$bo zEFJeuYmQZj)h&KHS9QbmDlyB-Slx((k{5Vjb`@ii#0gVlrpSa2?V11Igt#R2EL_>5 z^_Y1cho-I>rV?L=wj_bY!)LRt2Us^dtqkk!!fTuI$fr7Jkin?Q8&%C4mB?|9YiVE8wryU|Ml3QenGYvD8eAlCTKTkCeBAhU1DL|!4)JT9 zfi(R)1& z2j&Y|*oismgv(GR5EemErrYXT`UN+2)S8tZ1~3Y@v)8TqCaG+7V`q2(Yh7$Bj{V?|qqPc?o*H+|{?t%- z^YDd7+7K;z(YE6XE_3C|)9wktu$(!X!PartFh+n^KJh3&kE~O17we?yi)P^#pJ&-T z`3*0#k2hxll7|YNCkwA_2WNkT1a0q8^<;PX#disk(VZxYk%zV@4nW@ht}CK9S9nFO zKF?%q704E!S5RrI)3)=6!b~$dBUXFezO~z?&TorUZEXlmw{W3uN)Lm;2!IA%9Y%U- z={%-$Ofd~V>B}(ClXo25hx)#!5GFd}ymduNs+AznmGXS%Zm`)_uBnu83X%?GRMeufm%9zuB!x~mtm zYY8GDcn#Glc9J@`pgOy&(j)*tN>E%v39{J4S0e!e)5cp5k9M}l2>r3lW)h?xM=qWBF6bs|i$yzvFG)$&@H`Baft5|xJ8?`pkIqaTS zKjRB~_c)h*0AS{ItTne{;-MdX_7d6)9ofx7J;AA3^4i3`Sp+*nF%KLRGdDW}!y%@o zbLnHb^l|m{EWW6Uu<^9i#v2k>Yj{4Qw=XM3oJU109mokE*OzV$6(D%GuS8pk%ex1c z8dfFu`#*yJYk@;?N^6?`Szr+?AP^v$|4jS^V-U&X$bdX8NH4T;^dCrttz{c^F6h$X zR8ZKJ#JRw@ra>fa6rx0=LW>~#-dv1}`wNYo8|9;PlZuU~WvQkVE`Eh0v|KLA&1m^+ zG)e_epS#(MKHd*YPj{YOdJ)5Z#Mzr(@9#eEJ9tHbr~4A1wU{`X_Cp4A+c? z&3hstVs+(cgnB76@c_liW1=3xtLaoiLgoE2GN22f_KO>xaMYBBV0>K753fM!L7K1V zKov%y&V)5z?E%|wEn!|dd;aqQ9NaLqz%V&NadMbZR^p#SMxQ*d3GkEuwO&T=IeCH` zu)_ctxESwH^TXX&zSkG*r;HkCID&jH(hDd(8h?+9E;zD;38*hd96+kv@-A%at2uT8 z0364IhI@Rvc@f^Oudc2)X_3x($_o~TnfV1!Zre~6-zPAFk~vuOTc11G3&&N$g{TsG z`$`(xT53x8hbxA}H~0597c+twa=>RvX?AepBh4VOZ6yR$ffUKybdnpmZc}?U zDb6v&AaeJJNBQ=$t0?5hntLt`CH=Xcmr$Xq5M=gY-eTsEin3$qln9L#DVfN?WG49< zewm#iXZ|F%_a+|Qc_}&^2iEbi=l4c7kAgT+32|iBfZ$lNU*=t4eHAI`%^>V3=f{(KULQZuCX2%V>3y}RoCJM z%ID39(we6tJPO!JspcpHW3T`xj&wKQ@v2B>dxbCozT7L&pfvZE5@ugY&>9{Syg1F@ zh3jWyE=e`=?Xi#Dd~Cu7)A&X^fX1P3NFHCsar$pH3FD)8Q#sv_JZWr9_3kBfRwJ@x z4vCZ2*xVYgAz`OmP<3f6Y1XtztUBoY_6IX9fA)%WhZ5oTtPWwa;e8PE_MRqmWQ?dxU8SipC}hCQ7_0BUrxG^z#)Nd` z?NP1s@Kr!+2VB&RBp^G~E-3W1b*Thw5`unl@-K?;`LiTB--= z2AXVWED%TZHjk->F30iB_jZTTpB+8*@J@rn6VSQ#+%Zrn$svfN&&qq~^#1SdK&Sd$+%)5qOUQ@^U`J;z`q74);JI9WM) z={szvpGyyJwJYgT>bMY96(&|U=Pq&OGb!_YxtMaKD^T0_CMt~wq+*Y$`6U4Ka}=I9 zSLuI30AfbOSj*Vsw0yzN6Cq=?i81_EH@s$)iR_o5S3-N026y6~`478iu`a9b`DZFR z4|2i+vk~_n-t!v$Lm`Bu$Wd9%=4>;0B`u&y+fR=+ydlH+oV$PdcE>X9UevxtdRg&Z zZoZg4h)RZc{x03)IC;+b?0RIK!dE$u72O(r1AsJ)LEC}vi6j4=Q;YRy_kdF!1yI>G zxB!@J4TrvqYW=CHL;cpA`r;Fres{v7vB?SX8I|Cj>R5ql9{AK}hXCPAzUziUg-3~- zIENoaL;L!nz;@$MHZ|tNINqVbgi|PO9KrrsQi2HS50*S2)WM><#D4@|*<*`dUa%M> z|EIq+zd}^0NX@-vg&T#I7-0V3EJ3xRDHIorL(_y}C=~rauHG>?v#@E`j&0k<#MT58 zV`67w+rDGlwr$(CZQIV5=iR&Nd*1!CYyDWYs=BVL*V$(u9Y+;DuNEh&97DNC|CQ5i zh9cOizNXOdON})&Tw@_;jWN(jxHpfQ?ifdnDKrrkN=9$-?~H)&B5I2(4BJ5?MPwsO z(zU41IS#iwy;Wsl|CxLs1f3Y^uR-n$A(kh=yp^f}UuQisL~d~nbhAE-wHU09UnQqM z?Jbsu)paBf0m+s;k7x897nfu-#xAkQE4lC;5n)oknmE_|QKKCdeqi<-`|WHJNi)mBIhZUnNwFmt$mYjU`4qfkKnKQ6b5d7^(B)r% zaE>*|V|vmaIQ%AgDLj>ySjnC*Ze!fSG0ZyJ8)lCBu+gg7 zR~L55ZtnWK@|7ppk-a0ha23qzF%`~8rw(dxEoR@x){D0K6=kE9+sCWA_T;K~ z_v@;jAXfGwJ2RZ*!dkOwFRIhDzN1{g5VV$E6tf11=G=-qVi`H3ZQ(VtC9cNG3{U7K zs_PP$YU&cSmeW#_vh23jm3f^XvyV<61k|N4`CBTtzjR)?8vxO`Lv=J}Gwe8~D?{R5 zi#OV~+mpV%jeimeiJ2z_e#88ttx;=Tl`BZH%4e^HhL6dhx zP6wV;dBT&=s%%xLApqW8?GUKk0VFe5HyQ+!z`*|-PpO1w)8?S&k# zhE$(I;985HPj+Q{xn)xP>vQEF5|yOE_GXD=Tw?mC8D0#3w#c>gLFPpR6>(sp^mi(p zn%+O$(apZhU(b`jp693^V$Gn*rE>&0qOB+P6wd6CJIqne3;*B#*6I|pYYqeuPy<3d z@h=*Hg$wQ?`sOl@dKj++9x$+cFc>2d?TREEG?}arDvysK6S3^xkc{Tg98ok&mb@4# zWiDb)M<3}7NMVW#A(E*Su0{oC0erM`W!0khg_t)uAjgO>(r~z)5$`rFf3%kuuZNNpuQ+423gqH}=7m^EUfNW?GLW1dwEevPC?E2UJm1?N4 zQG|tfF9b?+zz{CqHqX}RZ%prV{>?xemVb1dY0;W3+VH?m3ml<&KjKY4`v;T&#;q+{ zbjaH*mbc%qzN^+=#9k;>R>U6lX%^CL!vugrv|(EGMhlFR)Kw?fYpjOHio;?hUu72{ zJI;=-Vn`7|O={I@hW$+45Gpf8^9Gt!Y^!c{pl(3EZJ!C6#m6zq^!ecH<)6_YIZ;=2 zpOeVo7PLa`Xr#rEJ>?-f#Xc{_m;aZs^Fe&(X*u2AJCAANre(I>?B3Q)ftUcS9-cCr zpvX7=I6wukLE~)w_rw&#XomVN$SNGL$v$5Dfe#Z+nar$}5@4LarorGYA1?2LuQc2&?Ma@mKS(Er@y@LuiYb%9(IH4Sdvs z$qy5%si{iR`x-Z$u^z>2wI{Y?Xt&tb24$-tNkCIub*k|9U%130F zRrR96XE12)ON^h1pZ^usML3CljZ%S@N;qM2v+3Y8iqvvP#M0y@xUkCL*xd0h0G&+7VOKt zIDiqJryvU$T^#E%>aGh~+Numwa$@%WbNoO*PHhF95?0A2Y9j05 z-Y(oNevuwNei0hp9ys)&YcrrGh?j|EQ&OupM25Ea9>X(3tLn1F^P6-p+D!*N$m&Zf zg8Va2-(_kO7*{u(d@KV1R1?>L?1^v^FjGv5u1ygd@2&58pUJXwv0;>!b?gk3TtmMu+?^l$$>kR;9FNuoVFY?b2uHlV^6e1oqXx zx13L7AT4m~u0eQozd|C9j@m5Z;Z^&lI2Z`^ov`u9TOM5$%b)EmgNLSq!g>Q5KZ$h4B;W;%Q ze)Nl06HW`Slg$9Gx}i)TCt6eBHDGJhK^{K0ZIawoo3-t64&h*<28i!VN@}7IM+x|a z=S;0^lH1{R*EOx&`js_w>=ToowF(daj2t_Le0!}7t*)=GhhvDWY^7)jfF`!NLC}|8 zVFxHcTR~{hAZH13CYojnTAaa=5YE_w?l052=6%eWQ1tlZElf^ z$QLw^k@yncu;`8Gc!F1QSxjL?-Lc2_X{pB4+=8Of&4rCB(uUF=jRuNq(_qNQcKVI# zTRt2aS-x;c)~HQ$FY)J7)aJg?9lnCw#?|;p_)YAL78$+K1r!StV{??TRUx;#iQBH~ zPoQ#nY?}ba1wqCb%W${z8iAD>LOifKW%Db)IxW!og&i$gh=-gaVxb&>ffLMQL|ieJ zqch&FiQaT|=GEf1AlM;7F!YWU^mEXRZFC5Ohv=8N+ z5K55Sh!%FqZTSA?AkQWHBPH=G`8vHZ?wP!(MHl#V(W(At0P>UdV^HYY4ijG>jRI?Eod8wr#PbkH@UlbS54X7-eocr_|jG(Rvu zFc*%~H!qM?CKz6$p5M3jJ+hBIj>i)L*#Ph!=MP0AgTNY4uGtL+98IHrDqCg1ft~bF z9t`-faz+m*4SxV)_z|i8v_B0&pO}%S^w6*}>pm(?+KmJ{;=ZE(>pTpB{Ew!h!kVpk z>*gsqhZX_k`^}k;tsSmEz<61Q{oD;t#nJDp;V(N-9;af zffA<(lcjWn55BE@!w0^tdIJgomm7V_4V!<7jVLzaCEXuJArcHvEz*lNb{b~FgT}u_ zjk2J-Xs*oAYsc>2J$VV;?clLVv8E_(PomGY`(8M}SA5^QCCzt{mD`{f43kjfGf#~w zPrr)Dn#6@Ck%TT6EgBwrlEDuhM!3v3)vOQDU6L$@*I4DWUOn|~s4NE54fW(z9-r9h zZfN4g%?!Aya89Tl1$60(Lq!uVMxTPJZ%QK$X!95pwbE-fS`F3UJ3HE03{A9nkVS}8 z@9%3kEK9Z-lf8&lqHS_Snn)XvbTeA4Kt8NiV8$da)U&i@BHzc&Tu+1h&?T{mJ( zRumRvJ;O_kXN(uzH`M}|d$*u*^7`uIXsE?kQ0O5{aIShDlq%57hj6gQ4dEH2)#VB; z`*W{{)+$AajX14`=vJ*O787%>c(PdS^=D&mQK2WttqqDSR*JHWc-?r~`))YdaPOn^ z5Q`&GP9{Dqy{%<^&UtwIVkSQN5{Ub3##U7{L^#Y31LYNterW(2@2Uct?0MteIFemb z-G%?6g>M#CN)+slga{*F{)V;?9;6Izt&>-{s^LAQ?%pM2v0PknPz#wnH^ z>=*IR^o88JaCg~NdB_O9yVu6(L$)9NL#Llmgpsg^F!db}u@ja#-6|?Ml+D@^v`k(> z-Or~^Q57&^kFkd7RNN_9`%gret@PheHrofd&B#mnk3u5@4;Vhj`65QS>fHcTfVHWl zCH7d-$YRofpE$1NXHLaDuPd`1z?c8EwSS^IrQ4^6x7nvb zuLfn*E3F6Ml+)R?5%4rI6i?l2CbpHChQaA`&jo4j%|b(K<~z|CbXqLPH*cws+`uSn zzH(Q;RFp*RUa=iLcqU;w87TLbuO6??l)VmnkoPTGT~SY^C)>Ccj(}rcNf}uV(^dv2 z!6!%-1o&9gHYri7m}^NrtZCqeE>){1&Pcv>j7kIY)TuR4*eh)16=&AYs%ui1I24CI z-7xN8eyyMFD175CjesdDi$R~4F)L}ZFE1e1W321oBZ?qKI}VytIp}t^G;pUjgM*CU zuSseq%zd0ipq6V*ot<@N&n`jdOG! z5&TofI@@H~7$z=`l6xnwgHxvtp^JusVtrzQ9e|gRJ2Jc|pv;&Bon4Z`X!FruYn})}Bl(p9^5cI-$<7V{`?U357M4ov|24 z=|hdx1-5|rBf5+*h74$7Bf*@(xW%loW}K<3e9dDn32-ir{VhVR>!oip@=QiCO{~xp zL^<=u%N}Gyr8^I9DI3sCm;0%ZzJ>#ESKBUZDz&iN7dp9BG`;jj?z)iy-|(D4#c5yY z3YnY1p~<;_0AxL>G-K4zqqM-0qfim8xnOU4fjedn$@pu0I;mHPHAtDbE&$2i1p<9( zKfLLa5E9`I0HpbuS$tgd(4F;3onuk2DJ0ulnMY=kT5WM-xBCOOqQKm8<52<6vG543 zFGQ;^P>QcqdYlr*ynn2Dg;}%7ff)Yo^BPqvI0x1(Q+fE;HA4ph(Thcw-(VTr#(YG? zO+U{?OEX*-XA6V5X0#)+gdrUU-|&wq1FK*kl^dm0C+R-z((?;P#US9jLK7NRcxPS8 zOpuIrrGa_wB&gAe=hQ5xihl!KThf)fC^!0@NjAovX9%xQwTU(u+H_riJKDb_86O&1 z%CY_}C(gQg9zgXKC(42n^}7wgi`|DV)kIm1)zmE&`o-x{>k13Bspr>?RIA{F>u8L>n44bs3S zQX-nN#gCCyk*q_A(ZMM#L@ya0J#!6|hW@rD*t7Tz^1o|~1QVgnzdzVYxp+?_8cW5g zNjd6C31x8!nemBny3vX0eFX$+8RZ+fU-FF1e;FAYnVFiI*%WP^;Sqpgu+r?&(GE=t zDU#9Fi!jNH4hqgFjt%Y66OR%NkBZj*7yk142Y+dP?8&g|MeLME4kP6R?zJok`$C-kjt{OK}38P5419hm2->h$}MbI*_xOr$uqsU&t zt6G~3NzCMMO%$2DDU!y)a=j_)brvkF-}H|pZCTP^ixh-q)9QV95n)CiJvjgY4PRG# zi^&mELBTqB6p~7Q{)Gp)twn^;e>d(~)MyjGLDN{?ZTD;Vk}{;p=~rInw%4ZLH;X_|K+@g_S260;fem|v4RjZe#sBy^BE$(%8N3dei|2$ znW!x{uZuSPJ}dOz(gzHIzhg$tCv#)mm-yMZm4Y~5ZO|#RSGa#t=V|#ffP9JG4vS`%d3#Z|)dg`L zhsY?DBECIOsL{kBU0%xssQ` z-yq1LMYxRPMq4pi&$y0{A>yo2zq$xEnRs&&+w9F}kXY4BP1c_boS2K48=K^k-;CIu z;_d<{*K?P$@4X;s1kaFwV%h~u_d2%@kyFAXzl%#Y7ECTqO?25T0(=Hg2vl|e>m<^} z<_dG50I=Mnf{*fJ;XJo9l>(U(4wJ(sO8xe=#Rm;6+i1 zipfaeV*>#_M4ndGNfaFkv!? zj2?;42Jv{!b`5CFXOp404u|r}M$Nd+exW0Hyv`r>X%;ayP;3!XPI6P^S5#U(usckZ zzCUv;4U@>XeV;mS8sGi%sc^zkEQDZNvbfCtZ+h+k)d%{e`R%5g{5d3ciWBDW9- z>o42URa?StH$ye6+jR!5-iT~AO{CGw^bx=oSEY4gWZAg2ZY4^>xzlgR&$oIWif6#g zW61Vfl1gpHzG`#t2Q7w$d12kuP<2rt7z4Q~NHw<@$O8dUk}%mqt%@^EgS$5lN< zxDtsAm$8tN&fi}L`FTs{t zvu!R~OW;cq`5J=A)m9n!@4EeqGTPN_kFw$Ff;%W(#e04nrR^Y zYXSR~Mi_>w1f>~K6pzg|1+~T9|LgGQP9#`>Skz9p*!IT&3f%UDtYPVKd%f9~#OKeH zn@KvQx$1D3MO@X`CFC*w3z-4QJ!jF(Gy4l5+#|*`F&uNapK^#gaxa1Qil*X5LDsNj zjf1SPMOGvf$I~KAKxtn-vh!m!Sm zZn1hCm2B{2Ttd1EBO9Ciu1pN7a%O->)%uuOr)EyHq!fkyDtQCQQAqyIz5O6;3 z0UuHL0@0=}uw2Y5`2T+s{?F;mWEBDYe|fk6i3KoCzlVP?Uco;QlK+#yZ2<%T3s+LxY7{~YkDry5F9M)sjFZYgOZw;n>sV> zDju~^Ywo_1C_)_zIyHHZOL=nNPi}9#UT@pkm3$_~&h_b=HK79U$LaT(*Bf09?^9QU z-&p|Q-#lB1wcsvQIpoCos0JtiX>4M(2#LEpHyukIJRPkfISDL81ED@-?B$&jIB*xH zhd{Amj0bq_L6wUGyj8%m>J`)C+mJ zn^IpjSq9SIiUJF@BOeRgqmY33fYs!{T&rrcGiNy=2fR&W)64pc*d=7maLR`zwLa6! z+MyvXrGa{^(838jHq~U?uof>= z2rS|mg^eXTcXlT&se%_kQleLIqg^H2Ax`KLf4|+S<)9CfzPa@nMK2p{l*`+DfN@j< z#PgND-Bro%LWB0#Q5U#$=R6~Pv(%1|m))I_Xl~1KIFGyAlqD7#)T5f+-4eR=Ts96* z!8&AvFm#{DTSZC|)`F$~GcfbO7K)lnyqQc&m-3I$p|j!BS8)K)TxD**{AtQsw}G^u z-S;onY$!onV7tY7+JTg>Jf~egor`HH(9fuJTjH0CI=Vz3O=#+9Y}=N*VDCv&I6g_H zCf9+Gi$?aWRdif9IcYl3PgTH-<1b!%31ZVoFf^Q6>C_$m;U7VQj)wicv;B>Ds-Drd zDYY9%YSqzjKi3Nw$I#(+TOIS#h1RFi1yvb~I_1F1I6A*G)!;ORdCF1kg>Q+?r371= z2(DXiYRum-c{y2zan2R%Rk2jH#doG!35}*c5o-1mgo9@NWv$2^?@SnaD)`b2HarQ< zt@^1_xwOdbWWF(nzu2I)xOlaoJgGE~y)E=<$G`uK&s_l+9;w^jkzl{32AA8%_RZWZ zDvKuH%*SST5^`85u!_XBtUZh8nrRDVBrfC7^pmoI%hMCeA?@Q=u%KNo# z!HHm$n9b#Qm;+EkAE=+4Cu`h(BMPEP>E(j1hnX^v?R9V!?YoE3=?RDN9_~F^OP6ec zSTq-H%a;Y5G<6xiGVDI1eC6y!U-%2`3PoLi-pSuEw|`E%{^|YGK~v*RJXnT z-0}qaWbPY9-V}vbvu4V_o9M@fKC47M zKas^pHUQgJM;p2ZDWnw41hoL(7EIYohu#d)fIct?6u-t zpb6$iusPOLXt)e*2dk!TzkQ~*G*kVFFfJ2S-QN;#ksz2ltcB=htk3TFXa z0YN5z*#qxP=g|sG@6q~Z&t}k6M9QIQvv0|^M9vdqOb2*@)p^5cZn4PE7o+jYmZq49gtUw@b9d!4R)aCZs%_XEcW&9n=IS zrZ#Q4RUc`(x^&C#{|-82aSvjmmHdniLr8M-7Ur0~NM=opP@8nPQils<>~;gltqNRy z@FZk0j4nnb7L3$SJSy9AmQ`-P@YvrpI38au3G-&1a0s7#rUPXQY`l%QK~&MBdgwM$ zJ<^SDkySMR^ep-rS6jT{rWeaQoP7db_01V_{BzxNAyxYe@84v9vk?27&>%u!)kt-UDmuk$0qD))%Z$W2 z!*;h26ocumY8`>`dsbQ~$v0W9kl)DH3UpsrTpi&XfDC)*l)5~$XI)h5LBY6B0`OfH zouF@jn!(}Nd;cECS*#cJ4G4MYGBJ9nTA4aB1pS8E(pGLIZFW#QV?m1)!rO+c+f!!s z(jBD5=9?U~zj`oxf`QaC{xFKR!K!+2k-7`#kU_<}jQnTh>Re5`SXF@$(eux!#9z1< zSVmsZ*2N4o{c3XC)xO_mJVC=kcmE9@`_H|PXMs^W`BS*A$9Khw0<4#3<+-tJ6mP&q z;Bak>e2CzXGxRYq8B>XG4X`KaPBrG72eNk&cf z5G{V-gTKYJ2NK=T4Uyg%?KOC{_Anw}&-gLSY2!jXoF<{X)6T?RKzBhCTY#|tpbC#p9PnkY@!D%UG0f=TP?w76C~ABrej zG*r9zPKT3104B@9AUd-uohGeKd-!S2SssJvK_aw>9lm~7ttC$Dgk0O}))wd59D6un z`NDjRXd74>ZS7}2BG!`6R!>b_C8w>p<_&UPJuK^Jn>5EFpI?Ihf@agoc^9+rsuN<7 zgN?H=$5o2)37@=TJl zSg49)wN&vCeJXX$q>;Gp3nk(L;9jr-2P_(3^rqAtr|N)n{-lug;jN;MyuX-Dyqwb! z%y0|3Nh?yjL{OtuUFhj|sGuLP{|+CM081G@x7J_e{87$6A+f1#Rxi~AHv z2&?Rcm>EJSQj>?@dXd>arpd82$2Uh@`HFGEuy^uQShJ`}l5klTXZLvIWK=x<%6hSs4s zf@ll`Mfszq&Px4aScyAH3-Vm)hH{2&#i+I;dy&e>?Uv9Gr9>r$JWveF4^EQQlV;ew z#X8H6XrinSidaq5goYDzSe1+QEl{48y75b`;TP$Sitsc!!uu)Rgyb*vjU-qyPa(+( z){ts&*cR+lDbjJANU`kz%eZ|Vv(>LVbZ9u0VH#9a=SE8j$$8l}^?=UMMPuMkRIREk5bG>tj4Fdzi6aJ3HB`$llUVA@ z(`P@mkm^z4lT7t!oZ0g_%Enm8h`rBSFe`#^rrJ~93*eGn6)k$6m*O@y+7Id)YYN#+ zD>>%pKtnjrxn$M@@=t53*>a^(mdyHVuE1-XiXk}(G(S~Up~M-mHG0Upxb-vy`;0l7 zZw9Cr{*_Fw{B7yCNUJk!^QH5X6Py3;PnH^>F4sS9yl>0#kQ+IRxhdNrvYczc*v-?> zF+>CBsg)8{_x10Dc?uB|HKl>M+RKV~hau3F?tOpxE#zVVkTdiw*&+3uKv>d>J~wLO zS)#A+)Va$k3<>Gl!+Sdu-u?@AOY!saN$yqnCrk zc{`j&IoQ*FH!8_ROJSm7&-vek8n*{wYF4{@6d%k#a1{ME7qi+Kr%psIUXz=o~ybso*UycE{B`p-bvK0AbL9gz-nHit8yf90+UvEWkO2Fmm z>~~!hmx?ku2?h)vF@i%(Wqy(#QhZJU?D$erMLUl3{e8Rt_8V24pOJ2Ui$#8y4ASKG z^L=)P?IGyaSe1he%&#|Rb?+f^6t|c=VsmdX9uh4EfKisv7_ad9hGK(&AlW_35}#m0 zQEWYJh(wFMEjT_3fj(|v%fNkT=mbLuT-9&0{)>FT*IVe;TI{|9qQ2)~V}@}!+WwJLRH zPO|yWvYV@bNp9fFT8kKmaH@p&jT~jl^9~?oO45bSp!lqK3oURcu6XoB*NbCxmqk$C z3_I;drAg0z~NS%>QomHdEO$$I-MC83HLn{NnuH09HwdrQOo%Lg|3G}k6k&o2B zw1>E~DBX^1W4nbIz{jfHpa*TkosYFZGKRq!8WnqWoP*0)dUa%*P6|_Kb}vX?HJqIL z0JP2=4iWaUUBP&60pjn`@FM9j3+?OG&xJ?cE6s!&FR4~%$M*LJak&RasT-3Rqxd&* zQt#3@cfUtdM^FodrmW{vae7GKU5C5~z>67HIlVOEPeH3#@wHoTYqsniDK|U}=N$6f z&?TTLJ6f9V%u)1>!Plvls!C+5dQcb$>Eah_L6jw5R}{7eHE~UHN8k266X)1e+rAk7 z_racFsWlxxonQy{o!?zhFOujE{9lT5{cHUcy>pY>5_d@P=HJNmIrFY1F~Neu0UZ~8=$lKMhq=0fw&zz`Y6t5(j*KM-=j z&R}xdi>~LB81^+Ct~4wJs&I_$j$BUuOcml4FZ` zj`dEduUC+v6c-Jren=uMCERTjPXZjS_Th*NU|!;%`*5C(BH6YRWFJ3r*4#T479u}Q z_O77jOWpp<+^urXlo7*C0*iHfJj-rq&*KkoVPCx33U)g=;im1}-N51^G?%{8x00?; zHh^V8SpaG}S;q|CD83gffTwLpr`3aID$oel#Bwrr@=&}`nCnVCN2@sZT^)oj3h}44 znu`;OrFIPS{{B^p2R3;aVtky9@C#MUJjEHVFjQdZim(vdpo)Y^ac?DV$)`sqK<{`?$cd5DY% zRZe-C5^-yn$qLr2Q<6t=M%c$EnEWPfhYrw1;-_ys|EgcCgLJn}E zF_lZ+MDoSo;Bobdm<&_C;V9}GgPk=Z7(55Jc;cb@A|HNq(FwZciBuE7uzg_2`~~+| z&cYw02}18!9DV$pqdLM-SKirl_NCkZJ6!_{8!$~!fPjW*eyR+j_?ip|!2j7#^C(}Q zr|YF!TB-6!B1FET@><`j+-sBH^7`^|OLN`B#$(;xLi4oyDK&LM8iC?zfB%Bdqq=ix z?fmw-(Piu7r4?0#H5?#!G>7m8c>VapPdIv9jq^#L{3T0xevqrkeW^QF8mhjJm+5Gx z&5eDrwA!zey2ScqmXSWpeSE6a6D0e}E3_ZWjec9gJ9X^G`|E(^fJI}UBopBVi!gf8 zj5m6IrFx!>;Ci3s@EPn?8ZAtMTf0BrON)-wWYi=qLi+KR)f6x~@8#Jv#Nr6U7=C~f zDdkkA|74fiaCiqj5(e|C1mjP$%cIC&FCy1y?M#r}?{J`)bE}n!;m|mA@2D|$&!&@O z7b!dLnk(DbAs&KZ(IHZNKL{h`)b`gHmNVn zi6?P&%+?>Ae;EL=bJxP?b2jUkD;nh1wP6d9YbnnSs_tcT&r(@csC_3bqRz*?FrNny zoPS6A6syY+nHp~S5A3h5^=ilVnawxo-02;Q!;^W?AG3M&gO&W&@uSX>{?Y@66;Q#I zrrIMBgB4iwDax6*x?~$z(GdMsPO(w4EapR`@{!Fy5jy}{ztb6px+ECd$xMMwjtkR}t0d@FMp zk5a2hO?eO2BD(;y1{^K{tjIy!_9mff1eOgDi1CUg@r5y*%tPlc3qqE<=SB~E90xGHH%A{vi7ZR35|K9dV9G_x}7Py z&Il`wK5csi&!~YCj#K9<+4HY96wH9U+t8(-3GZU4{v?CbdlY@>QiSA2cdN z+_gIYSQ@qlew+bDwQMFCA?mWEEX;^hO<@eWD{VA5$bG34E%L(ilntj?3@LWlMw~Y8 zCXLxfAt-rT(n({}Olwz4eErI|XMSeY-CKC})3CZdJNfHJDkC@SUYN?c?L`yu& z!8w4Xd>B9~?YHfS1;Gn+FM=gd=C})o=BUpA!BKL7e5DUXUH@(*;O^54YiG_oYf~BmDCms;{GsGHP5SO6NWx1y3=5Y5L0>l?37Ofl} z@nF9pPB0<^L`OA3g}75Q7JMv#-&YI1xrTIf!)&6{*63`9GwmX$6sxLdA4#k z%%GPml{7pk_@8^R?o=UDJ-qBgu}4u;Ju0%b2|CJlh#}F#iFm_c7)AUD0eT~lO(kFq zeKhuiwNVAaAg|P-eGz_T#Vn|eXu%+GU;edo!#bQf)-4SuNjbKv1uQ2&XykW>F#Z|m zh@qXgJr*k|OG1!+7E*=p(xTp#aax*{;Llc!q{iI&7<$LGpn0bK7Wb=};rM;-=O%F^ z}XA@`!7*b7NDO z+z>oUgY;xbiwZR%^Yk-tQ23akfmEgoS$zM-Lh;mz63v;hLp^%9OgfJP#r#8Du3!!t z`0uH!R8ZRE@iB*>di%e#afY?O)egwLClt!)u=x802Lo-8PcDUoY$6>0q{{>Pp`)U) z2l5oKupBWrt!4z<=5rWktROZ8U6>=~?sOK>uP?&-i;`CL!e=oJJ(S6iX3`}>q@GgckKrBW*?rzf8lKdWsFDB``a9VhWLlU_zO&PFe$@Pvv!_g zsB`RNm6WWwzV1yPLTvXz!gVEf>)u#>{PDLr<^eJ#mog}X4jW7~g4iB~3_SVee|;nj zWW~lX&ny)@VCEKD8#b9}BtFi{DWj4;o4ch-gp$U^^mWs;KZ6fVX6g;Ykb+?^t}W@)78q%{{a zt2d4>G8Owt@&m1ZbQl0Qd)EY>e@M=3!(c|Pb$MrBeO$3Pq}L0@?&`GmbT^`>o@s68 z_yxlM{nZUBwW{L*1cX{eiw+i!pV*9Z2s@I^TmGcmmxR1h6m+dAl^CsE8=td6F_6=o z!Q*_8rD)g~4bouH7z%1;PJ6?Tgvhc{DGY-lG_~98rkM=a{0uN*%Zb9kuBj15YGxr* z0Z%EGW|gM45iu0*0=|Da$UV{*h)l@F1*~>+${zV876lx z%H-l|%Y8Dc-}0LAY1@nT!kS#TyW@3~FZOzRim$-%*>M^*SQ#aV2>oQ&VVhGi&0V6b zF5o^x5Abh0GReglXJn8!ptfxKu1^tc~oMwGlFa|wq&@Z`N!#s*0Nzegj2C;_n70~HjA$! zAex-OjlTVgZ~Uy%+9|d_x^5^RDy-fvxJBvgn3}7GAvmW^q{cL2{@o$NnlU?hxwo;Q zw!EZ9k_QNvRN+k8BPBbTZ>s6lgZ-YkT))jUHWW(1Qtw=zz#DS-y;L8J0oSb7eyH6O zNneRXSZ%wNRz)O9PCL&`x$LR2>K4jE>s-5$)>+i{0HTfOmR+O~?t~i3idLL9_tJ$F)NDUW*3C$tWCjo#wq8&S6PYU<0VlSPTat`Aw?vVwB zRi10L%_2=%%Zsg=dK8S+OhJIZJ0P~>FgTfz6EVf8Bb%0FI}WT_`+I`A19_TfAY2;k z?-zmBOsFerOp;?Yb6=t6z?$NDd7eNS@ruBXU6k0dUTJNV6$={wSfn;g3Jl%-vS1OG zcMA~w;C_!B46nlHf1(}jffaOzf&)H3WuQjQVD=zd;jPTA!fL>|G?c+B=#SVOc<=F( zE3`2F%acc{RaJh*Y#gkjahrYX5{Opy=cldaBacrrB)U_MZr#LeX~&QBIy zepZxMRQK^PlNNR(j2v7XzI1t>`{JX^+EHo-Xa}7 z&lgarbGPn7ZHMpf5pbU)MgG7XLHDTnSR04VpPyz}kuHFH9sm42eLi5g%B?T&WH&;l zGKQ)=TK;%B>=LS^@6Cg)DN&;5mYQwjgI1_{^yr{&8xOaCo#n0y@wNv~#X6fu zPG6tras`*nTuWJFmdyZTXRYs)PSKB{$14kn+}F~6#Cc7Y%(AGTK_|I~9c~2uD8vT~ z<6@@Nj-wK)987?KBE-UEB*5vI(LGL-CvSaT@DU_gmKIG`lmgIpBx@A=tkQrhy|ygo zEQW@ZYD_3#-Hg^rkwsgE-Vs$@yjDd-9hXn)@&N_>w7ntH8=~x)N`z1WGBb}cI_GE2 zjck@UPfJRkmZV*lnD&M^j~nUbp4Gx+rX%@vVfhQt<*t|+gFw{wFu;^hKyLZAyditL z2=@iFEfyfhaZh-v@`DZP>4RYVooq5r1mu4$>(WW64}3$kLw` z_=`Og!c6hx{DJHgPk2fo5WRKAygcnu(AqjrRkC`1K4(71zjG-#^AmW<9i`jimCGH1 z4>9qcr)Gdj;t|h<8GtzJ0rs}L)YJXP8ec3)_VAxPAs=M=GbNL#JYRNfCHp|9&lj{i zlP|Xe6A5;8Vk>cxB@mS5P8+Tyo+RimdT=esO!WgeeLDuVjpH7D!njZJbny1v)}UG$ zKitlSoUV@CJ(0$B2v{phPNenmRWmnMAjk3{RXUwCSH^3*sz%>JiS3^i?ZXX0H zj%I96+@K$$FM)>r!NR){C=(a>5(QBzVpA$u`-F%lJVS*q;ZpxJ?hePS3+e|Ow4JWU zA2Bk(kA1l34&@EQbVKR){BAa7O+Qc)fX%FHxwdvv%R#us^YqT@xSml2>?Rc} z61$RvNCAFRU_xJr!6XZ{uZr(1LcyY%;fkhR38hIUZ6a365qs?1BGtydb+0{&$zs5y%8+WKDS10?P@>#+LjbJP(2y`;QkDd^OHi^LdetS zq}Khj43t7{=s^6=nfs~iZCfy`Q%d;Tqy{OHh`u+jvj%zE;I^`LFzuBvKk?J3Kiy5 z9(*ZC9LNeVW~zY+z7cZV2!G#aQ-OcOCa&9yZ zIu*EI_cwuHj-LqhkV0+*PG_FxRG$F+mjFR;h(L8>r_InYR>4Mw%amj1pp;21Wt)Gl zLJ?=He#d$^M~V@bQ_6?Gyq7kX*3icSWex2wY)J_!amF32$K9{jA4e;Q)6LHc@AgBd ziL+07a{#>$d24Kt6`C+OEkUBa6zo42gelRqC+b}NMgiV}g~MZ5WCht4m^FQ4Ap(2~ zr^x|)t@!iCPi&}2zGOWZUFak1VOjX5IGI-dOz)RS2)&yoV2Ld7b3R32*5t@?J~3WY?MW!NgQZ`ue=vE0Kd^obXMrqb6V>9( zaDq2Ny^z6gscsjwi?LsGnV8?b@&Nm(8?tZ0&sjYtL}BKO$Kr*`5{*fuNCAK6hreiQ zSNuZO%PdMNSUj?~CR7g%WyBC+0p265RhW6$pNUXy9mbIH3nxoA&>r zXyEX-#-Dk>x49Dde_Xx)5c%iwe?(I1A9EPX|A?eJ?(_h8PpDB5RL9T`CKn6*#VR(J zKewbW+MdLrl6j$oJ%~oU&E@%Zv3^W4?$cb)8{1sRTMp~l-CdtRe}}>#(C2aLQcfu) zRGG?&Bi-OBFq9IM>6j1Byz58#%J*E^`&|by;p>T84%dt~ohB%?8Z0fGwoL+w9ma1n zcG&w59P0q@(uu^KXPRIP;{9*V^~T}F9Y=9SEqlwYnumR{?uOEknzG@T~`0?&?)sU`)aF5k_Whx4~`u`9q!l4XA*9 zHWg!bYy~Y=LwoIbIM6Ok;gXg<#)YJHc{Ao59Cm<5jK_fFue@;j=k4gb>DR5c>(5e( zXH^InkHsWB1_FseWeCO!{N0rJ(Zd?_giP>P8Ww3hBWVAoU7PT>&z{&yrnN&BhVTi} z;0{mi@qEIxF!G>7kvEp>#^dgL_l&I-Jw@grCv=WGwIP|HR)a^P{tLUNY`xo;O+gM$ zH&p<3QJd^T%{>kIE0gER;`w*3-d^QP^{Mk{MbTh0hS={S%XqJ*O9#Hl4>n6;;%d9o6?{{w+Yn99=3@YzgCAjqod`W4k47?LE) z_z72NEL59F{)2)7Ax{O|0r^H4Qv!l8@i?F~hAF5Xc^|nl=Y+~r?5#ByAS!9R@_Y(Z zgAF2OwTw`M1YGDCMHYB)--4BUEy`vQXYTn&bi3HxJ_y=Soi?d#iP*x*ULJ#=;Pxsu zIwE^E^8ah>I-uctzCWT{E$V7P^xkWT5-p+y(QC4cDAA(Jl7a+5HhL#kbV783wOSA@ z(IQ&ZC?SGK@O$fL#pL_3{H+SZ}nRo9fluw-jH%CB{R@}vEsohea za*2SU-m;dmYTS6s-nx7sP~4~!!<%OdNnFR>1` z6MW8&@ZI6h> zn!;!*ud67>O>0$=8>22J#hW!g_m2}cWmJ5&SKp7%H4D!3Boq3shbT|$lgdMQf)?uA z%49DP;;x%JXG~Y6DBhB3E0nJ`{$eh;A$22C`aSu58<}Ws>|_L?&6x7!Z04wcPu)eK~z(DnVXZks{3*ow#J>L zS47JnJ^qw5^!aJFC+{k#16bac56oc^>rI1Q6c2cY1`k(KvcE(JbKl3J@9DzkHfB)Tos?w z!%RhAosZLIv6~@5+)J!VaanITGzB@{Kwt zgSNy|*oj4X6F(*shg;rO^--V34Cxb%w(R7Ey6f#^^)o4VQ`66Liw}q}_bDNxQbKp! zvO{X)+FakS*s0IeCp$SL=@bo#_VQV@KjW)^LO->kV5!C+?erk-fCO_Xz>jOr$QDRP z&Om~NB@ZWqGQfd+pfDgB)tAAT`iKm4MJ##oZnh*>i57?khqR>HNl@bQ@Q7`_2D8-wG^(&y?;KDk}Vz;em*&PLFr*4O%wH-2?Qch^LATafW}Lj zl44pgBB0m|&(PV7Nr3*K^jcvut}L}8QT3S#guVIwNUGT~x$9x$qo3f_gPvdc*15!n zXi0R4>D?LzWVj-k8_w#8-K@U$xQzGhrH}1tVkVM2L;^Zmuz(yEH{OMm`m1Frg%H_T zoTjlIN3VA8@B#_WOBJLnQDdNvRmx~a=6go24$0@z;LH6!=hBd?TeEfVN>aR$-r5PZ zui^ugUD>I(NFmZi@!lw(7vJX@zl`TkcJa2B?vi$m*Tqenkod6A(HiuuCi;8j$>**w z%)zYMtWAXdVTJBYyOrvF0?&OVGuj+sbitvMPk`Kb^y+#O@moR&NUyDV`*rZ9DrH=v zfs#RofQ>-~e@?r}?j=XD-K|TP%+&Gf302i;rh7zM%UT4%Qa3@d9wD1IMm)MwH^Keh zDE{+z{pCXQ`7Ee+8AaCLZ46va&NByQ4t5_xlkQl(gk^g&-dXO~eU=HlkUHP_*5rd> z@paQnE0(pwNMuz}(MO@MWA2F3Pi?Vloz>1ZlStH&L_zsL(VUUt92><(F&4OQ&cv_0Wg$;|Qz;0&CiIN=_!_?|MY)%y_PCOVB_kqwjOJp6| z=od@7cf{?#XP6o3`HB=I#ma0KVRtx0c_S>dT;-lPNO-o6_X=U?EWSEzu=4a9`p7}= z9m4C@E*DW8eT~XCXF`eCmZ?~zKVNfR*`%v*_}Ka>t6Ayk-7!K+Dw6iL@OITlpVui~ zXxxv~fR$g0pry#W6*cg{ohH#y$QHE6gO`}T@43G3xpV8wneeYnW(}9OtelrZwQ03H z(>rjq+-A;)ze>&J-Hy+qT(XT9@Jt;FlGr^vPl}uQwbvDHRMh{0hEDAE<6A_euf|6asl=eucH*!_(i;!b*(S zb*T&}6l$#M*L^BzvhU0g*i+V16H9jG6Q333AWa#OXoc0Ro72@aEN;Au(byvTF;A{@ zDVjqugdCD)kzhWQqBfV=-`|_;h45Y6IQsGRkRZgrm^-$elvM7;wv$S3W-0@hXdWAZ zDyj;f2AGGH^a^(WT#A0_^ko zfb)>`d6y4ZEXMjE;gd__BD+5S_xJgY&FeCVv8uYItd6c509MdyJ6GUbhhuq zBJAjs`PR2g8g0Gu4S2q{c`_8$<%0}_7+%a~a74G?_OV=wVD&E^|9-gKCa?Gbam~jf z2kK_F?I)(NY*vtU{z28_O49++2yr>L>qe-Y$D9I1rh^raB*Px)FGM>u^HvMYep|RE zsVNTHBhh{-4-)5|zi{CkL(&J>`em|-mng&jShizfhk`klGxS_Y6M6Y*>#5oWW>Oyk zmr*djf78)Sw6NcUNx?6|uZ>pnRt@r#znJ&!G_JKVS-pQqWvN#8O!(+^yu!-3%ii`B8(6SMz-xaFL#RN z^;g|XDA=`dILJHBy_hrX<$IlwtGv|%VYBhN4tV9Y?oCGE?$OuHTf$h+JZw75ded{D z*6Q?LOknU?T8O}mIhJ;9|JK7K0k2}hF;cMDHQ9Ig<^3Lp9r%jzqOb^^$7xX%)iT>m zHQ0+2Qu zGK*7Eme8B2$~`F!3`nru*v*m4DYrEQjl0kGBtu@-mzdWlNk>1)dQD+HxRIJrjj*`g zFu)@jEXKnamTfj(XbvlL#!dag0bXB?&}HB`r_>NJ>`xn}Jj^pz2w6HeUhm`{)GzY! z@sw$mBfKoV`~8`(1d_(a(U%KtE$R)rz0DDg1-|=SWOv>c60XSo7_1RzzVPrP*?YW{ zMRFa(CVV$pmYZhBFN~c=B#_p@SKp;%9;pmNo+ZMucSB^`}8du)#}CMx;jV z*v^48{(wePH94$+UawqX#}#!abQ63)^`x~DBBFFd#7I%?RdEOJ?m_J+q511eftDUYmZlON|WdjU9>d~y&Fiv0r^&SZhG>|36dO)WL2 z`vpN7$Gh-HY1*tU?~Np=q?tsdR)fUpbvROzVqJ-#ci6UN-!Q_oUo<6P6LFJ-e^+IL-Rm1=*X@xXfr#!Ir0YmMkLeqY9a#DgD4>^h1U1J!P)UJgNNud8)u4A^^m<0@>u(2^6 z^7vqBgO$C}^v?GE5>($5PlC(6K>A2WcZ9Gzgz~Q0>?{5=ho&MsgnmT6W1gnl>aiaV zvF922@m-FfRq&p!iVQs*(^4ERab;0_zKSbK6KN2~Whn1g=EYG9kyO!M^|Mb}+9wz` zLh0R^$?a#tc~os4YmBa?RPXJrM%tRV=VWRmtXteHS=ad5P^i9cHsouO{46fS>c#f?XZfr#RBJAbf^>8LwU5 z9+D+kg-2QL$7?KfmB& zW@VtyUXX)tWrOUiqoD6(tYK=DeGw8vXK4oSMrgiJ77laQZYd9$v=rx4X-Nu^$LUb> z^U%8=@g0YSP!lFHl6q@Ig|%lOeJI+J!=bClpYusyQQWiU3O45=USmVr8@XBZ9xqr- zB;Pi6ioE^ga#Z$!(^{}1a!*jy@5w=7+dv!M7Yj!IM_WeL-SGCzp-Rs?T2e;M!o&*i zt-`9?oef2~jB{*I2y34j$HjY1wEww6x|Amiji65Y41#31$hF zoqEBYe_2JF4)V6S$(4%kb1XLKlf(9GIx^A>H5)*;pdBTA4-{(NFB$<3e%-|f=POHk zES8F$!9oPPlLntrEeg>%%O%QbYu*N85%-pb+_UQ)jB}W%N8EDme5&NY8Gm29wwF0I zcj9)VZ8c7i2B#V;CHQ3Cn7V4^S~X^oL;@)703N ziHQt>p$2cTgON1#ed>oH_1S1tEL5565`e%@3zC5uC_b@>d|RuXt5 zPp-E%FcHHwSEo&+)|qPOmO|EK&BsZqDj~RI{IAoqf(Jw8i7Yjw>ssp=+v|9id2nip zYGQJCXsxaoI{tWOi|Qr2Ub+-Mu0mAnjwO_35;K#8!Yg?$OQ$l{bMw^$(GZeL+&pLc zcIH+&x{Y&2FR%whw2dlp+tXviZlWl-n-Z6;K5LkRs95Nr4-psU{))KhxXAla9q4A& z;Nfjtu>W7C4Jo64Gi_kz*TBZ1KJ(v=9Ep&T1|S~D?EYT?Hg)@1D6rO*(LZ(6jFbhn zbk%`3hIue~UL9N<7XgG3@S#RSf0k#V@L(h}?5Bnw!1E9Kz%LEJT+Poyfpw^y0{p(^ z=>Q1-Bl~X#Ftc-t(fpI);AwZm1@eCr;ox>sJhX}xAln%o`Cszk#qIRCRiRAS@Yrq| zcr1!gflA+GwKx7;C~-cArN zxHO8HI2}aiDMW+ zKzM>z?BG0&?Y_X?vETF4BN||x!;K6Jiwi^IEBX_BbQkH9Zj#d!nGe-dj6lr%8ZYqp zj6tDiJ)ty7lERNW@lJCvb|S>!c!-~H^spHO{;uXf8+u`3@nDcbWB?KqJl2xzAJVBU z5U}_#NXe=vnoc%EpgnEepER;qSnL=SxbDvrB7hfkl43Lx%acm=GCl!Bck!JTh>^e# zLtwDU2|gA@bsGOWM-PBKkAZ({16S_(EgL;Qfth3H54b86Y71oCVRHE6oM<>2@XMWn zbb>z%+Si=z{&VM_&UxL%3By6r`5-Wq#Jij*slU(k59xO>Dd4@*7^E8S6Viud zeE3=%#Xm%JeBLZzo*UqN=$`pksR|wUJt2~1viw8(6SDWWx6%ckoR?GYZ|_Fe8#-1b zAE*b!87wTBUmAe#s?hb2-`2Sf{PqSk$HLDo=_z1TC*|KdR`0^68`$A>L%+KNG(J*U z(gppLK?3NI!_d+82(C7)eEPazgr8tw6QWM+(e1}*?0

{zdzp=+ zOmNHB)Ti<2nV?nRN(BKUHKyy0Rl-~QR57fL8%A5pR0}T|Ryr*N{n$tVC~N?RBC+2p z(ambJ?!?gKL5wDK^27ls?E!9C \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282..f955316 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From a273d21c0923bc2b3e0652a5269d7666a9e4904b Mon Sep 17 00:00:00 2001 From: Scott Alexander-Bown Date: Fri, 4 Jun 2021 15:05:59 +0100 Subject: [PATCH 2/3] Add demo example of spinner with custom adapter and the fix to getItemText is working --- .../materialspinner/example/MainActivity.java | 158 ++++++++++++------ demo/src/main/res/layout/content_main.xml | 44 +++-- 2 files changed, 137 insertions(+), 65 deletions(-) diff --git a/demo/src/main/java/com/jaredrummler/materialspinner/example/MainActivity.java b/demo/src/main/java/com/jaredrummler/materialspinner/example/MainActivity.java index 7b2cdf5..5efd074 100644 --- a/demo/src/main/java/com/jaredrummler/materialspinner/example/MainActivity.java +++ b/demo/src/main/java/com/jaredrummler/materialspinner/example/MainActivity.java @@ -18,6 +18,7 @@ package com.jaredrummler.materialspinner.example; import android.content.ActivityNotFoundException; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -27,56 +28,119 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import com.jaredrummler.materialspinner.MaterialSpinner; +import com.jaredrummler.materialspinner.MaterialSpinnerAdapter; + +import java.util.ArrayList; +import java.util.List; public class MainActivity extends AppCompatActivity { - private static final String[] ANDROID_VERSIONS = { - "Cupcake", - "Donut", - "Eclair", - "Froyo", - "Gingerbread", - "Honeycomb", - "Ice Cream Sandwich", - "Jelly Bean", - "KitKat", - "Lollipop", - "Marshmallow", - "Nougat", - "Oreo" - }; - - @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - - @Override public void onClick(View view) { - try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/jaredrummler/MaterialSpinner"))); - } catch (ActivityNotFoundException ignored) { + private static final String[] ANDROID_VERSIONS = { + "Cupcake", + "Donut", + "Eclair", + "Froyo", + "Gingerbread", + "Honeycomb", + "Ice Cream Sandwich", + "Jelly Bean", + "KitKat", + "Lollipop", + "Marshmallow", + "Nougat", + "Oreo" + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + try { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/jaredrummler/MaterialSpinner"))); + } catch (ActivityNotFoundException ignored) { + } + } + }); + + setupSpinner1(); + setupSpinner2(); + } + + private void setupSpinner1() { + MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner); + spinner.setItems(ANDROID_VERSIONS); + spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener() { + + @Override + public void onItemSelected(MaterialSpinner view, int position, long id, String item) { + Snackbar.make(view, "Clicked " + item, Snackbar.LENGTH_SHORT).show(); + } + }); + spinner.setOnNothingSelectedListener(new MaterialSpinner.OnNothingSelectedListener() { + + @Override + public void onNothingSelected(MaterialSpinner spinner) { + Snackbar.make(spinner, "Nothing selected", Snackbar.LENGTH_SHORT).show(); + } + }); + + } + + private void setupSpinner2() { + MaterialSpinner spinner2 = (MaterialSpinner) findViewById(R.id.spinner2); + + List cheeses = new ArrayList(); + cheeses.add(new Cheese("Edam", "Ne")); + cheeses.add(new Cheese("Cheddar", "Uk")); + cheeses.add(new Cheese("Brie", "Fr")); + + MyCustomCheeseAdapter adapter = new MyCustomCheeseAdapter(this, cheeses); + spinner2.setAdapter(adapter); + spinner2.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener() { + + @Override + public void onItemSelected(MaterialSpinner view, int position, long id, Cheese item) { + Snackbar.make(view, "Cheese clicked " + item, Snackbar.LENGTH_SHORT).show(); + } + }); + } + + class Cheese { + String name; + String origin; + + public Cheese(String name, String origin) { + this.name = name; + this.origin = origin; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Cheese{"); + sb.append("name='").append(name).append('\''); + sb.append(", origin='").append(origin).append('\''); + sb.append('}'); + return sb.toString(); + } + } + + class MyCustomCheeseAdapter extends MaterialSpinnerAdapter { + + public MyCustomCheeseAdapter(Context context, List items) { + super(context, items); + } + + @Override + public String getItemText(int position) { + return super.getItem(position).name; } - } - }); - - MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner); - spinner.setItems(ANDROID_VERSIONS); - spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener() { - - @Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) { - Snackbar.make(view, "Clicked " + item, Snackbar.LENGTH_LONG).show(); - } - }); - spinner.setOnNothingSelectedListener(new MaterialSpinner.OnNothingSelectedListener() { - - @Override public void onNothingSelected(MaterialSpinner spinner) { - Snackbar.make(spinner, "Nothing selected", Snackbar.LENGTH_LONG).show(); - } - }); - } + } } diff --git a/demo/src/main/res/layout/content_main.xml b/demo/src/main/res/layout/content_main.xml index 3c243c3..d572ec7 100644 --- a/demo/src/main/res/layout/content_main.xml +++ b/demo/src/main/res/layout/content_main.xml @@ -1,5 +1,4 @@ - - + + + android:layout_height="wrap_content" + app:ms_dropdown_height="wrap_content" + app:ms_dropdown_max_height="350dp" /> + android:id="@+id/spinner2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/spinner" + android:layout_marginTop="8dp" + app:ms_dropdown_height="wrap_content" + app:ms_dropdown_max_height="350dp" /> From dc198e7d1604718508e1dbf5681a03fb34c2dfd7 Mon Sep 17 00:00:00 2001 From: Scott Alexander-Bown Date: Fri, 4 Jun 2021 15:11:43 +0100 Subject: [PATCH 3/3] Fix the issue where item.toString was being called instead of getItemText() Remove Hint text as it was screwing up the count/selection listener --- library/gradle.properties | 9 +- .../materialspinner/MaterialSpinner.java | 1113 ++++++++--------- .../MaterialSpinnerAdapter.java | 48 +- .../MaterialSpinnerAdapterWrapper.java | 55 +- .../MaterialSpinnerBaseAdapter.java | 195 ++- 5 files changed, 678 insertions(+), 742 deletions(-) diff --git a/library/gradle.properties b/library/gradle.properties index d2b7810..bdd8627 100644 --- a/library/gradle.properties +++ b/library/gradle.properties @@ -1,11 +1,9 @@ -VERSION_NAME=1.3.1 -VERSION_CODE=131 +VERSION_NAME=1.3.2 +VERSION_CODE=132 GROUP=com.jaredrummler - POM_NAME=Material Spinner POM_ARTIFACT_ID=material-spinner POM_PACKAGING=aar - POM_DESCRIPTION=A spinner view for Android POM_URL=https://github.com/jaredrummler/Material-Spinner POM_SCM_URL=https://github.com/jaredrummler/MaterialSpinner @@ -16,6 +14,5 @@ POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo POM_DEVELOPER_ID=jaredrummler POM_DEVELOPER_NAME=Jared Rummler - SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots -RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2 \ No newline at end of file +RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2 diff --git a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinner.java b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinner.java index 106ca23..117952a 100755 --- a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinner.java +++ b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinner.java @@ -31,21 +31,14 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcelable; -import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; -import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.PopupWindow; -import android.widget.TextView; +import android.view.*; +import android.widget.*; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -55,583 +48,583 @@ */ public class MaterialSpinner extends TextView { - private OnNothingSelectedListener onNothingSelectedListener; - private OnItemSelectedListener onItemSelectedListener; - private MaterialSpinnerBaseAdapter adapter; - private PopupWindow popupWindow; - private ListView listView; - private Drawable arrowDrawable; - private boolean hideArrow; - private boolean nothingSelected; - private int popupWindowMaxHeight; - private int popupWindowHeight; - private int selectedIndex; - private int backgroundColor; - private int backgroundSelector; - private int arrowColor; - private int arrowColorDisabled; - private int textColor; - private int hintColor; - private int popupPaddingTop; - private int popupPaddingLeft; - private int popupPaddingBottom; - private int popupPaddingRight; - private String hintText; - - public MaterialSpinner(Context context) { - super(context); - init(context, null); - } - - public MaterialSpinner(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public MaterialSpinner(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context, attrs); - } - - private void init(Context context, AttributeSet attrs) { - TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MaterialSpinner); - int defaultColor = getTextColors().getDefaultColor(); - boolean rtl = Utils.isRtl(context); - - int paddingLeft, paddingTop, paddingRight, paddingBottom; - int defaultPaddingLeft, defaultPaddingTop, defaultPaddingRight, defaultPaddingBottom; - int defaultPopupPaddingLeft, defaultPopupPaddingTop, defaultPopupPaddingRight, defaultPopupPaddingBottom; - - Resources resources = getResources(); - defaultPaddingLeft = defaultPaddingRight = - defaultPaddingBottom = defaultPaddingTop = resources.getDimensionPixelSize(R.dimen.ms__padding_top); - if (rtl) { - defaultPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__padding_left); - } else { - defaultPaddingLeft = resources.getDimensionPixelSize(R.dimen.ms__padding_left); - } - defaultPopupPaddingLeft = - defaultPopupPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_left); - defaultPopupPaddingTop = defaultPopupPaddingBottom = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_top); - - try { - backgroundColor = ta.getColor(R.styleable.MaterialSpinner_ms_background_color, Color.WHITE); - backgroundSelector = ta.getResourceId(R.styleable.MaterialSpinner_ms_background_selector, 0); - textColor = ta.getColor(R.styleable.MaterialSpinner_ms_text_color, defaultColor); - hintColor = ta.getColor(R.styleable.MaterialSpinner_ms_hint_color, defaultColor); - arrowColor = ta.getColor(R.styleable.MaterialSpinner_ms_arrow_tint, textColor); - hideArrow = ta.getBoolean(R.styleable.MaterialSpinner_ms_hide_arrow, false); - hintText = ta.getString(R.styleable.MaterialSpinner_ms_hint) == null ? "" - : ta.getString(R.styleable.MaterialSpinner_ms_hint); - popupWindowMaxHeight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_dropdown_max_height, 0); - popupWindowHeight = ta.getLayoutDimension(R.styleable.MaterialSpinner_ms_dropdown_height, - WindowManager.LayoutParams.WRAP_CONTENT); - paddingTop = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_top, defaultPaddingTop); - paddingLeft = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_left, defaultPaddingLeft); - paddingBottom = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_bottom, defaultPaddingBottom); - paddingRight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_right, defaultPaddingRight); - popupPaddingTop = - ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_top, defaultPopupPaddingTop); - popupPaddingLeft = - ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_left, defaultPopupPaddingLeft); - popupPaddingBottom = - ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_bottom, defaultPopupPaddingBottom); - popupPaddingRight = - ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_right, defaultPopupPaddingRight); - arrowColorDisabled = Utils.lighter(arrowColor, 0.8f); - } finally { - ta.recycle(); - } - - nothingSelected = true; - - setGravity(Gravity.CENTER_VERTICAL | Gravity.START); - setClickable(true); - setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); - - setBackgroundResource(R.drawable.ms__selector); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && rtl) { - setLayoutDirection(View.LAYOUT_DIRECTION_RTL); - setTextDirection(View.TEXT_DIRECTION_RTL); - } - - if (!hideArrow) { - arrowDrawable = Utils.getDrawable(context, R.drawable.ms__arrow).mutate(); - arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN); - Drawable[] drawables = getCompoundDrawables(); - if (rtl) { - drawables[0] = arrowDrawable; - } else { - drawables[2] = arrowDrawable; - } - setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]); - } - - listView = new ListView(context); - listView.setId(getId()); - listView.setDivider(null); - listView.setItemsCanFocus(true); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - - @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - if (position >= selectedIndex - && position < adapter.getCount() - && adapter.getItems().size() != 1 - && TextUtils.isEmpty(hintText)) { - position++; + private OnNothingSelectedListener onNothingSelectedListener; + private OnItemSelectedListener onItemSelectedListener; + private MaterialSpinnerBaseAdapter adapter; + private PopupWindow popupWindow; + private ListView listView; + private Drawable arrowDrawable; + private boolean hideArrow; + private boolean nothingSelected; + private int popupWindowMaxHeight; + private int popupWindowHeight; + private int selectedIndex; + private int backgroundColor; + private int backgroundSelector; + private int arrowColor; + private int arrowColorDisabled; + private int textColor; + private int hintColor; + private int popupPaddingTop; + private int popupPaddingLeft; + private int popupPaddingBottom; + private int popupPaddingRight; + + public MaterialSpinner(Context context) { + super(context); + init(context, null); + } + + public MaterialSpinner(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public MaterialSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MaterialSpinner); + int defaultColor = getTextColors().getDefaultColor(); + boolean rtl = Utils.isRtl(context); + + int paddingLeft, paddingTop, paddingRight, paddingBottom; + int defaultPaddingLeft, defaultPaddingTop, defaultPaddingRight, defaultPaddingBottom; + int defaultPopupPaddingLeft, defaultPopupPaddingTop, defaultPopupPaddingRight, defaultPopupPaddingBottom; + + Resources resources = getResources(); + defaultPaddingLeft = defaultPaddingRight = + defaultPaddingBottom = defaultPaddingTop = resources.getDimensionPixelSize(R.dimen.ms__padding_top); + if (rtl) { + defaultPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__padding_left); + } else { + defaultPaddingLeft = resources.getDimensionPixelSize(R.dimen.ms__padding_left); + } + defaultPopupPaddingLeft = + defaultPopupPaddingRight = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_left); + defaultPopupPaddingTop = defaultPopupPaddingBottom = resources.getDimensionPixelSize(R.dimen.ms__popup_padding_top); + + try { + backgroundColor = ta.getColor(R.styleable.MaterialSpinner_ms_background_color, Color.WHITE); + backgroundSelector = ta.getResourceId(R.styleable.MaterialSpinner_ms_background_selector, 0); + textColor = ta.getColor(R.styleable.MaterialSpinner_ms_text_color, defaultColor); + hintColor = ta.getColor(R.styleable.MaterialSpinner_ms_hint_color, defaultColor); + arrowColor = ta.getColor(R.styleable.MaterialSpinner_ms_arrow_tint, textColor); + hideArrow = ta.getBoolean(R.styleable.MaterialSpinner_ms_hide_arrow, false); + popupWindowMaxHeight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_dropdown_max_height, 0); + popupWindowHeight = ta.getLayoutDimension(R.styleable.MaterialSpinner_ms_dropdown_height, + WindowManager.LayoutParams.WRAP_CONTENT); + paddingTop = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_top, defaultPaddingTop); + paddingLeft = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_left, defaultPaddingLeft); + paddingBottom = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_bottom, defaultPaddingBottom); + paddingRight = ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_padding_right, defaultPaddingRight); + popupPaddingTop = + ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_top, defaultPopupPaddingTop); + popupPaddingLeft = + ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_left, defaultPopupPaddingLeft); + popupPaddingBottom = + ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_bottom, defaultPopupPaddingBottom); + popupPaddingRight = + ta.getDimensionPixelSize(R.styleable.MaterialSpinner_ms_popup_padding_right, defaultPopupPaddingRight); + arrowColorDisabled = Utils.lighter(arrowColor, 0.8f); + } finally { + ta.recycle(); + } + + nothingSelected = true; + + setGravity(Gravity.CENTER_VERTICAL | Gravity.START); + setClickable(true); + setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); + + setBackgroundResource(R.drawable.ms__selector); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && rtl) { + setLayoutDirection(View.LAYOUT_DIRECTION_RTL); + setTextDirection(View.TEXT_DIRECTION_RTL); + } + + if (!hideArrow) { + arrowDrawable = Utils.getDrawable(context, R.drawable.ms__arrow).mutate(); + arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN); + Drawable[] drawables = getCompoundDrawables(); + if (rtl) { + drawables[0] = arrowDrawable; + } else { + drawables[2] = arrowDrawable; + } + setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]); + } + + listView = new ListView(context); + listView.setId(getId()); + listView.setDivider(null); + listView.setItemsCanFocus(true); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + selectedIndex = position; + nothingSelected = false; + Object item = adapter.getItem(position); + adapter.notifyItemSelected(position); + setTextColor(textColor); + setText(adapter.getItemText(position)); + collapse(); + if (onItemSelectedListener != null) { + onItemSelectedListener.onItemSelected(MaterialSpinner.this, position, id, item); + } + } + }); + + popupWindow = new PopupWindow(context); + popupWindow.setContentView(listView); + popupWindow.setOutsideTouchable(true); + popupWindow.setFocusable(true); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + popupWindow.setElevation(16); + popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drawable)); + } else { + popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drop_down_shadow)); + } + + if (backgroundColor != Color.WHITE) { // default color is white + setBackgroundColor(backgroundColor); + } else if (backgroundSelector != 0) { + setBackgroundResource(backgroundSelector); } - selectedIndex = position; - nothingSelected = false; - Object item = adapter.get(position); - adapter.notifyItemSelected(position); - setTextColor(textColor); - setText(item.toString()); - collapse(); - if (onItemSelectedListener != null) { - //noinspection unchecked - onItemSelectedListener.onItemSelected(MaterialSpinner.this, position, id, item); + if (textColor != defaultColor) { + setTextColor(textColor); } - } - }); - popupWindow = new PopupWindow(context); - popupWindow.setContentView(listView); - popupWindow.setOutsideTouchable(true); - popupWindow.setFocusable(true); + popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - popupWindow.setElevation(16); - popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drawable)); - } else { - popupWindow.setBackgroundDrawable(Utils.getDrawable(context, R.drawable.ms__drop_down_shadow)); + @Override + public void onDismiss() { + if (nothingSelected && onNothingSelectedListener != null) { + onNothingSelectedListener.onNothingSelected(MaterialSpinner.this); + } + if (!hideArrow) { + animateArrow(false); + } + } + }); } - if (backgroundColor != Color.WHITE) { // default color is white - setBackgroundColor(backgroundColor); - } else if (backgroundSelector != 0) { - setBackgroundResource(backgroundSelector); + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + popupWindow.setWidth(MeasureSpec.getSize(widthMeasureSpec)); + popupWindow.setHeight(calculatePopupWindowHeight()); + if (adapter != null) { + CharSequence currentText = getText(); + String longestItem = currentText.toString(); + for (int i = 0; i < adapter.getCount(); i++) { + String itemText = adapter.getItemText(i); + if (itemText.length() > longestItem.length()) { + longestItem = itemText; + } + } + setText(longestItem); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + setText(currentText); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } } - if (textColor != defaultColor) { - setTextColor(textColor); + + @Override + public boolean onTouchEvent(@NonNull MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + togglePopup(); + } + return super.onTouchEvent(event); } - popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { + togglePopup(); + } + return super.onKeyUp(keyCode, event); + } - @Override public void onDismiss() { - if (nothingSelected && onNothingSelectedListener != null) { - onNothingSelectedListener.onNothingSelected(MaterialSpinner.this); + private void togglePopup() { + if (isEnabled() && isClickable()) { + if (!popupWindow.isShowing()) { + expand(); + } else { + collapse(); + } } - if (!hideArrow) { - animateArrow(false); + } + + @Override + public void setBackgroundColor(int color) { + backgroundColor = color; + Drawable background = getBackground(); + if (background instanceof StateListDrawable) { // pre-L + try { + Method getStateDrawable = StateListDrawable.class.getDeclaredMethod("getStateDrawable", int.class); + if (!getStateDrawable.isAccessible()) getStateDrawable.setAccessible(true); + int[] colors = {Utils.darker(color, 0.85f), color}; + for (int i = 0; i < colors.length; i++) { + ColorDrawable drawable = (ColorDrawable) getStateDrawable.invoke(background, i); + drawable.setColor(colors[i]); + } + } catch (Exception e) { + Log.e("MaterialSpinner", "Error setting background color", e); + } + } else if (background != null) { // 21+ (RippleDrawable) + background.setColorFilter(color, PorterDuff.Mode.SRC_IN); } - } - }); - } - - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - popupWindow.setWidth(MeasureSpec.getSize(widthMeasureSpec)); - popupWindow.setHeight(calculatePopupWindowHeight()); - if (adapter != null) { - CharSequence currentText = getText(); - String longestItem = currentText.toString(); - for (int i = 0; i < adapter.getCount(); i++) { - String itemText = adapter.getItemText(i); - if (itemText.length() > longestItem.length()) { - longestItem = itemText; + popupWindow.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN); + } + + @Override + public void setTextColor(int color) { + textColor = color; + if (adapter != null) { + adapter.setTextColor(textColor); + adapter.notifyDataSetChanged(); } - } - setText(longestItem); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - setText(currentText); - } else { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - } - - @Override public boolean onTouchEvent(@NonNull MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_UP) { - if (isEnabled() && isClickable()) { - if (!popupWindow.isShowing()) { - expand(); + super.setTextColor(color); + } + + public void setHintColor(int color) { + hintColor = color; + super.setTextColor(color); + } + + @Override + public Parcelable onSaveInstanceState() { + Bundle bundle = new Bundle(); + bundle.putParcelable("state", super.onSaveInstanceState()); + bundle.putInt("selected_index", selectedIndex); + bundle.putBoolean("nothing_selected", nothingSelected); + if (popupWindow != null) { + bundle.putBoolean("is_popup_showing", popupWindow.isShowing()); + collapse(); } else { - collapse(); + bundle.putBoolean("is_popup_showing", false); + } + return bundle; + } + + @Override + public void onRestoreInstanceState(Parcelable savedState) { + if (savedState instanceof Bundle) { + Bundle bundle = (Bundle) savedState; + selectedIndex = bundle.getInt("selected_index"); + nothingSelected = bundle.getBoolean("nothing_selected"); + if (adapter != null) { + setTextColor(textColor); + setText(adapter.getItemText(selectedIndex)); + } + if (bundle.getBoolean("is_popup_showing")) { + if (popupWindow != null) { + // Post the show request into the looper to avoid bad token exception + post(new Runnable() { + + @Override + public void run() { + expand(); + } + }); + } + } + savedState = bundle.getParcelable("state"); } - } - } - return super.onTouchEvent(event); - } - - @Override public void setBackgroundColor(int color) { - backgroundColor = color; - Drawable background = getBackground(); - if (background instanceof StateListDrawable) { // pre-L - try { - Method getStateDrawable = StateListDrawable.class.getDeclaredMethod("getStateDrawable", int.class); - if (!getStateDrawable.isAccessible()) getStateDrawable.setAccessible(true); - int[] colors = { Utils.darker(color, 0.85f), color }; - for (int i = 0; i < colors.length; i++) { - ColorDrawable drawable = (ColorDrawable) getStateDrawable.invoke(background, i); - drawable.setColor(colors[i]); + super.onRestoreInstanceState(savedState); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + if (arrowDrawable != null) { + arrowDrawable.setColorFilter(enabled ? arrowColor : arrowColorDisabled, PorterDuff.Mode.SRC_IN); } - } catch (Exception e) { - Log.e("MaterialSpinner", "Error setting background color", e); - } - } else if (background != null) { // 21+ (RippleDrawable) - background.setColorFilter(color, PorterDuff.Mode.SRC_IN); - } - popupWindow.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN); - } - - @Override public void setTextColor(int color) { - textColor = color; - if (adapter != null) { - adapter.setTextColor(textColor); - adapter.notifyDataSetChanged(); - } - super.setTextColor(color); - } - - public void setHintColor(int color) { - hintColor = color; - super.setTextColor(color); - } - - @Override public Parcelable onSaveInstanceState() { - Bundle bundle = new Bundle(); - bundle.putParcelable("state", super.onSaveInstanceState()); - bundle.putInt("selected_index", selectedIndex); - bundle.putBoolean("nothing_selected", nothingSelected); - if (popupWindow != null) { - bundle.putBoolean("is_popup_showing", popupWindow.isShowing()); - collapse(); - } else { - bundle.putBoolean("is_popup_showing", false); - } - return bundle; - } - - @Override public void onRestoreInstanceState(Parcelable savedState) { - if (savedState instanceof Bundle) { - Bundle bundle = (Bundle) savedState; - selectedIndex = bundle.getInt("selected_index"); - nothingSelected = bundle.getBoolean("nothing_selected"); - if (adapter != null) { - if (nothingSelected && !TextUtils.isEmpty(hintText)) { - setHintColor(hintColor); - setText(hintText); + } + + /** + * @return the selected item position + */ + public int getSelectedIndex() { + return selectedIndex; + } + + /** + * Set the default spinner item using its index + * + * @param position the item's position + */ + public void setSelectedIndex(int position) { + if (adapter != null) { + if (position >= 0 && position <= adapter.getCount()) { + adapter.notifyItemSelected(position); + selectedIndex = position; + setText(adapter.getItemText(position)); + } else { + throw new IllegalArgumentException("Position must be lower than adapter count!"); + } + } + } + + /** + * Register a callback to be invoked when an item in the dropdown is selected. + * + * @param onItemSelectedListener The callback that will run + */ + public void setOnItemSelectedListener(@Nullable OnItemSelectedListener onItemSelectedListener) { + this.onItemSelectedListener = onItemSelectedListener; + } + + /** + * Register a callback to be invoked when the {@link PopupWindow} is shown but the user didn't select an item. + * + * @param onNothingSelectedListener the callback that will run + */ + public void setOnNothingSelectedListener(@Nullable OnNothingSelectedListener onNothingSelectedListener) { + this.onNothingSelectedListener = onNothingSelectedListener; + } + + /** + * Set the dropdown items + * + * @param items A list of items + * @param The item type + */ + public void setItems(@NonNull T... items) { + setItems(Arrays.asList(items)); + } + + /** + * Set the dropdown items + * + * @param items A list of items + * @param The item type + */ + public void setItems(@NonNull List items) { + adapter = new MaterialSpinnerAdapter<>(getContext(), items) + .setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom) + .setBackgroundSelector(backgroundSelector) + .setTextColor(textColor); + setAdapterInternal(adapter); + } + + /** + * Set a custom adapter for the dropdown items + * + * @param adapter The list adapter + */ + public void setAdapter(@NonNull ListAdapter adapter) { + this.adapter = new MaterialSpinnerAdapterWrapper(getContext(), adapter) + .setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom) + .setBackgroundSelector(backgroundSelector) + .setTextColor(textColor); + setAdapterInternal(this.adapter); + } + + /** + * Set the custom adapter for the dropdown items + * + * @param adapter The adapter + * @param The type + */ + public void setAdapter(MaterialSpinnerAdapter adapter) { + this.adapter = adapter; + this.adapter.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom); + this.adapter.setTextColor(textColor); + this.adapter.setBackgroundSelector(backgroundSelector); + setAdapterInternal(adapter); + } + + private void setAdapterInternal(@NonNull MaterialSpinnerBaseAdapter adapter) { + boolean shouldResetPopupHeight = listView.getAdapter() != null; + listView.setAdapter(adapter); + if (selectedIndex >= adapter.getCount()) { + selectedIndex = 0; + } + if (adapter.getItems().size() > 0) { + setTextColor(textColor); + setText(adapter.getItemText(selectedIndex)); } else { - setTextColor(textColor); - setText(adapter.get(selectedIndex).toString()); + setText(""); } - adapter.notifyItemSelected(selectedIndex); - } - if (bundle.getBoolean("is_popup_showing")) { - if (popupWindow != null) { - // Post the show request into the looper to avoid bad token exception - post(new Runnable() { + if (shouldResetPopupHeight) { + popupWindow.setHeight(calculatePopupWindowHeight()); + } + } + + /** + * Get the list of items in the adapter + * + * @param The item type + * @return A list of items or {@code null} if no items are set. + */ + public List getItems() { + if (adapter == null) { + return null; + } + //noinspection unchecked + return adapter.getItems(); + } + + /** + * Show the dropdown menu + */ + public void expand() { + if (canShowPopup()) { + if (!hideArrow) { + animateArrow(true); + } + nothingSelected = true; + popupWindow.showAsDropDown(this); + } + } + + /** + * Closes the dropdown menu + */ + public void collapse() { + if (!hideArrow) { + animateArrow(false); + } + popupWindow.dismiss(); + } + + /** + * Set the tint color for the dropdown arrow + * + * @param color the color value + */ + public void setArrowColor(@ColorInt int color) { + arrowColor = color; + arrowColorDisabled = Utils.lighter(arrowColor, 0.8f); + if (arrowDrawable != null) { + arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN); + } + } + + private boolean canShowPopup() { + Activity activity = getActivity(); + if (activity == null || activity.isFinishing()) { + return false; + } + boolean isLaidOut; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + isLaidOut = isLaidOut(); + } else { + isLaidOut = getWidth() > 0 && getHeight() > 0; + } + return isLaidOut; + } - @Override public void run() { - expand(); + private Activity getActivity() { + Context context = getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; } - }); + context = ((ContextWrapper) context).getBaseContext(); } - } - savedState = bundle.getParcelable("state"); - } - super.onRestoreInstanceState(savedState); - } - - @Override public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - if (arrowDrawable != null) { - arrowDrawable.setColorFilter(enabled ? arrowColor : arrowColorDisabled, PorterDuff.Mode.SRC_IN); - } - } - - /** - * @return the selected item position - */ - public int getSelectedIndex() { - return selectedIndex; - } - - /** - * Set the default spinner item using its index - * - * @param position the item's position - */ - public void setSelectedIndex(int position) { - if (adapter != null) { - if (position >= 0 && position <= adapter.getCount()) { - adapter.notifyItemSelected(position); - selectedIndex = position; - setText(adapter.get(position).toString()); - } else { - throw new IllegalArgumentException("Position must be lower than adapter count!"); - } - } - } - - /** - * Register a callback to be invoked when an item in the dropdown is selected. - * - * @param onItemSelectedListener The callback that will run - */ - public void setOnItemSelectedListener(@Nullable OnItemSelectedListener onItemSelectedListener) { - this.onItemSelectedListener = onItemSelectedListener; - } - - /** - * Register a callback to be invoked when the {@link PopupWindow} is shown but the user didn't select an item. - * - * @param onNothingSelectedListener the callback that will run - */ - public void setOnNothingSelectedListener(@Nullable OnNothingSelectedListener onNothingSelectedListener) { - this.onNothingSelectedListener = onNothingSelectedListener; - } - - /** - * Set the dropdown items - * - * @param items A list of items - * @param The item type - */ - public void setItems(@NonNull T... items) { - setItems(Arrays.asList(items)); - } - - /** - * Set the dropdown items - * - * @param items A list of items - * @param The item type - */ - public void setItems(@NonNull List items) { - adapter = new MaterialSpinnerAdapter<>(getContext(), items) - .setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom) - .setBackgroundSelector(backgroundSelector) - .setTextColor(textColor); - setAdapterInternal(adapter); - } - - /** - * Set a custom adapter for the dropdown items - * - * @param adapter The list adapter - */ - public void setAdapter(@NonNull ListAdapter adapter) { - this.adapter = new MaterialSpinnerAdapterWrapper(getContext(), adapter) - .setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom) - .setBackgroundSelector(backgroundSelector) - .setTextColor(textColor); - setAdapterInternal(this.adapter); - } - - /** - * Set the custom adapter for the dropdown items - * - * @param adapter The adapter - * @param The type - */ - public void setAdapter(MaterialSpinnerAdapter adapter) { - this.adapter = adapter; - this.adapter.setTextColor(textColor); - this.adapter.setBackgroundSelector(backgroundSelector); - this.adapter.setPopupPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom); - setAdapterInternal(adapter); - } - - private void setAdapterInternal(@NonNull MaterialSpinnerBaseAdapter adapter) { - boolean shouldResetPopupHeight = listView.getAdapter() != null; - adapter.setHintEnabled(!TextUtils.isEmpty(hintText)); - listView.setAdapter(adapter); - if (selectedIndex >= adapter.getCount()) { - selectedIndex = 0; - } - if (adapter.getItems().size() > 0) { - if (nothingSelected && !TextUtils.isEmpty(hintText)) { - setText(hintText); - setHintColor(hintColor); - } else { - setTextColor(textColor); - setText(adapter.get(selectedIndex).toString()); - } - } else { - setText(""); - } - if (shouldResetPopupHeight) { - popupWindow.setHeight(calculatePopupWindowHeight()); - } - } - - /** - * Get the list of items in the adapter - * - * @param The item type - * @return A list of items or {@code null} if no items are set. - */ - public List getItems() { - if (adapter == null) { - return null; - } - //noinspection unchecked - return adapter.getItems(); - } - - /** - * Show the dropdown menu - */ - public void expand() { - if (canShowPopup()) { - if (!hideArrow) { - animateArrow(true); - } - nothingSelected = true; - popupWindow.showAsDropDown(this); - } - } - - /** - * Closes the dropdown menu - */ - public void collapse() { - if (!hideArrow) { - animateArrow(false); - } - popupWindow.dismiss(); - } - - /** - * Set the tint color for the dropdown arrow - * - * @param color the color value - */ - public void setArrowColor(@ColorInt int color) { - arrowColor = color; - arrowColorDisabled = Utils.lighter(arrowColor, 0.8f); - if (arrowDrawable != null) { - arrowDrawable.setColorFilter(arrowColor, PorterDuff.Mode.SRC_IN); - } - } - - private boolean canShowPopup() { - Activity activity = getActivity(); - if (activity == null || activity.isFinishing()) { - return false; - } - boolean isLaidOut; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - isLaidOut = isLaidOut(); - } else { - isLaidOut = getWidth() > 0 && getHeight() > 0; - } - return isLaidOut; - } - - private Activity getActivity() { - Context context = getContext(); - while (context instanceof ContextWrapper) { - if (context instanceof Activity) { - return (Activity) context; - } - context = ((ContextWrapper) context).getBaseContext(); - } - return null; - } - - private void animateArrow(boolean shouldRotateUp) { - int start = shouldRotateUp ? 0 : 10000; - int end = shouldRotateUp ? 10000 : 0; - ObjectAnimator animator = ObjectAnimator.ofInt(arrowDrawable, "level", start, end); - animator.start(); - } - - /** - * Set the maximum height of the dropdown menu. - * - * @param height the height in pixels - */ - public void setDropdownMaxHeight(int height) { - popupWindowMaxHeight = height; - popupWindow.setHeight(calculatePopupWindowHeight()); - } - - /** - * Set the height of the dropdown menu - * - * @param height the height in pixels - */ - public void setDropdownHeight(int height) { - popupWindowHeight = height; - popupWindow.setHeight(calculatePopupWindowHeight()); - } - - private int calculatePopupWindowHeight() { - if (adapter == null) { - return WindowManager.LayoutParams.WRAP_CONTENT; - } - float itemHeight = getResources().getDimension(R.dimen.ms__item_height); - float listViewHeight = adapter.getCount() * itemHeight; - if (popupWindowMaxHeight > 0 && listViewHeight > popupWindowMaxHeight) { - return popupWindowMaxHeight; - } else if (popupWindowHeight != WindowManager.LayoutParams.MATCH_PARENT - && popupWindowHeight != WindowManager.LayoutParams.WRAP_CONTENT - && popupWindowHeight <= listViewHeight) { - return popupWindowHeight; - } else if (listViewHeight == 0 && adapter.getItems().size() == 1) { - return (int) itemHeight; - } - return WindowManager.LayoutParams.WRAP_CONTENT; - } - - /** - * Get the {@link PopupWindow}. - * - * @return The {@link PopupWindow} that is displayed when the view has been clicked. - */ - public PopupWindow getPopupWindow() { - return popupWindow; - } - - /** - * Get the {@link ListView} that is used in the dropdown menu - * - * @return the ListView shown in the PopupWindow. - */ - public ListView getListView() { - return listView; - } - - /** - * Interface definition for a callback to be invoked when an item in this view has been selected. - * - * @param Adapter item type - */ - public interface OnItemSelectedListener { + return null; + } + + private void animateArrow(boolean shouldRotateUp) { + int start = shouldRotateUp ? 0 : 10000; + int end = shouldRotateUp ? 10000 : 0; + ObjectAnimator animator = ObjectAnimator.ofInt(arrowDrawable, "level", start, end); + animator.start(); + } /** - *

Callback method to be invoked when an item in this view has been selected. This callback is invoked only when - * the newly selected position is different from the previously selected position or if there was no selected - * item.

+ * Set the maximum height of the dropdown menu. * - * @param view The {@link MaterialSpinner} view - * @param position The position of the view in the adapter - * @param id The row id of the item that is selected - * @param item The selected item + * @param height the height in pixels */ - void onItemSelected(MaterialSpinner view, int position, long id, T item); - } + public void setDropdownMaxHeight(int height) { + popupWindowMaxHeight = height; + popupWindow.setHeight(calculatePopupWindowHeight()); + } - /** - * Interface definition for a callback to be invoked when the dropdown is dismissed and no item was selected. - */ - public interface OnNothingSelectedListener { + /** + * Set the height of the dropdown menu + * + * @param height the height in pixels + */ + public void setDropdownHeight(int height) { + popupWindowHeight = height; + popupWindow.setHeight(calculatePopupWindowHeight()); + } + + private int calculatePopupWindowHeight() { + if (adapter == null) { + return WindowManager.LayoutParams.WRAP_CONTENT; + } + float itemHeight = getResources().getDimension(R.dimen.ms__item_height); + float listViewHeight = adapter.getCount() * itemHeight; + if (popupWindowMaxHeight > 0 && listViewHeight > popupWindowMaxHeight) { + return popupWindowMaxHeight; + } else if (popupWindowHeight != WindowManager.LayoutParams.MATCH_PARENT + && popupWindowHeight != WindowManager.LayoutParams.WRAP_CONTENT + && popupWindowHeight <= listViewHeight) { + return popupWindowHeight; + } else if (listViewHeight == 0 && adapter.getItems().size() == 1) { + return (int) itemHeight; + } + return WindowManager.LayoutParams.WRAP_CONTENT; + } + + /** + * Get the {@link PopupWindow}. + * + * @return The {@link PopupWindow} that is displayed when the view has been clicked. + */ + public PopupWindow getPopupWindow() { + return popupWindow; + } /** - * Callback method to be invoked when the {@link PopupWindow} is dismissed and no item was selected. + * Get the {@link ListView} that is used in the dropdown menu * - * @param spinner the {@link MaterialSpinner} + * @return the ListView shown in the PopupWindow. */ - void onNothingSelected(MaterialSpinner spinner); - } -} \ No newline at end of file + public ListView getListView() { + return listView; + } + + /** + * Interface definition for a callback to be invoked when an item in this view has been selected. + * + * @param Adapter item type + */ + public interface OnItemSelectedListener { + + /** + *

Callback method to be invoked when an item in this view has been selected. This callback is invoked only when + * the newly selected position is different from the previously selected position or if there was no selected + * item.

+ * + * @param view The {@link MaterialSpinner} view + * @param position The position of the view in the adapter + * @param id The row id of the item that is selected + * @param item The selected item + */ + void onItemSelected(MaterialSpinner view, int position, long id, T item); + } + + /** + * Interface definition for a callback to be invoked when the dropdown is dismissed and no item was selected. + */ + public interface OnNothingSelectedListener { + + /** + * Callback method to be invoked when the {@link PopupWindow} is dismissed and no item was selected. + * + * @param spinner the {@link MaterialSpinner} + */ + void onNothingSelected(MaterialSpinner spinner); + } +} diff --git a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapter.java b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapter.java index 1e6ceb9..e6436f1 100644 --- a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapter.java +++ b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapter.java @@ -18,38 +18,30 @@ package com.jaredrummler.materialspinner; import android.content.Context; + import java.util.List; public class MaterialSpinnerAdapter extends MaterialSpinnerBaseAdapter { - private final List items; - - public MaterialSpinnerAdapter(Context context, List items) { - super(context); - this.items = items; - } - - @Override public int getCount() { - int size = items.size(); - if (size == 1 || isHintEnabled()) return size; - return size - 1; - } - - @Override public T getItem(int position) { - if (isHintEnabled()) { - return items.get(position); - } else if (position >= getSelectedIndex() && items.size() != 1) { - return items.get(position + 1); - } else { - return items.get(position); + private final List items; + + public MaterialSpinnerAdapter(Context context, List items) { + super(context); + this.items = items; + } + + @Override + public int getCount() { + return items.size(); } - } - @Override public T get(int position) { - return items.get(position); - } + @Override + public T getItem(int position) { + return items.get(position); + } - @Override public List getItems() { - return items; - } -} \ No newline at end of file + @Override + public List getItems() { + return items; + } +} diff --git a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapterWrapper.java b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapterWrapper.java index 77ae21b..7dd946c 100644 --- a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapterWrapper.java +++ b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerAdapterWrapper.java @@ -19,43 +19,36 @@ import android.content.Context; import android.widget.ListAdapter; + import java.util.ArrayList; import java.util.List; final class MaterialSpinnerAdapterWrapper extends MaterialSpinnerBaseAdapter { - private final ListAdapter listAdapter; - - public MaterialSpinnerAdapterWrapper(Context context, ListAdapter toWrap) { - super(context); - listAdapter = toWrap; - } - - @Override public int getCount() { - int size = listAdapter.getCount(); - if (size == 1 || isHintEnabled()) return size; - return size - 1; - } - - @Override public Object getItem(int position) { - if (isHintEnabled()) { - return listAdapter.getItem(position); - } else if (position >= getSelectedIndex() && listAdapter.getCount() != 1) { - return listAdapter.getItem(position + 1); - } else { - return listAdapter.getItem(position); + private final ListAdapter listAdapter; + + public MaterialSpinnerAdapterWrapper(Context context, ListAdapter toWrap) { + super(context); + listAdapter = toWrap; } - } - @Override public Object get(int position) { - return listAdapter.getItem(position); - } + @Override + public int getCount() { + int size = listAdapter.getCount(); + return size; + } + + @Override + public Object getItem(int position) { + return listAdapter.getItem(position); + } - @Override public List getItems() { - List items = new ArrayList<>(); - for (int i = 0; i < listAdapter.getCount(); i++) { - items.add(listAdapter.getItem(i)); + @Override + public List getItems() { + List items = new ArrayList<>(); + for (int i = 0; i < listAdapter.getCount(); i++) { + items.add(listAdapter.getItem(i)); + } + return items; } - return items; - } -} \ No newline at end of file +} diff --git a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerBaseAdapter.java b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerBaseAdapter.java index 9b61400..9293103 100755 --- a/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerBaseAdapter.java +++ b/library/src/main/java/com/jaredrummler/materialspinner/MaterialSpinnerBaseAdapter.java @@ -27,140 +27,101 @@ import android.widget.TextView; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; + import java.util.List; public abstract class MaterialSpinnerBaseAdapter extends BaseAdapter { - private final Context context; - private int selectedIndex; - private int textColor; - private int backgroundSelector; - private int popupPaddingTop; - private int popupPaddingLeft; - private int popupPaddingBottom; - private int popupPaddingRight; - private boolean isHintEnabled; - - public MaterialSpinnerBaseAdapter(Context context) { - this.context = context; - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - final TextView textView; - if (convertView == null) { - LayoutInflater inflater = LayoutInflater.from(context); - convertView = inflater.inflate(R.layout.ms__list_item, parent, false); - textView = (TextView) convertView.findViewById(R.id.tv_tinted_spinner); - textView.setTextColor(textColor); - - textView.setPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom); -// -// int left, right, bottom, top; -// if (popupPaddingTop != -1) { -// left = textView.getPaddingLeft(); -// right = textView.getPaddingRight(); -// bottom = textView.getPaddingBottom(); -// -// textView.setPadding(left, popupPaddingTop, right, bottom); -// } -// -// if (popupPaddingLeft != -1) { -// top = textView.getPaddingTop(); -// right = textView.getPaddingRight(); -// bottom = textView.getPaddingBottom(); -// -// textView.setPadding(popupPaddingLeft, top, right, bottom); -// } -// -// if (popupPaddingBottom != -1) { -// left = textView.getPaddingLeft(); -// top = textView.getPaddingTop(); -// right = textView.getPaddingRight(); -// -// textView.setPadding(left, top, right, popupPaddingBottom); -// } -// -// if (popupPaddingRight != -1) { -// left = textView.getPaddingLeft(); -// top = textView.getPaddingTop(); -// bottom = textView.getPaddingBottom(); -// -// textView.setPadding(left, top, popupPaddingRight, bottom); -// } - - if (backgroundSelector != 0) { - textView.setBackgroundResource(backgroundSelector); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - Configuration config = context.getResources().getConfiguration(); - if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { - textView.setTextDirection(View.TEXT_DIRECTION_RTL); - } - } - convertView.setTag(new ViewHolder(textView)); - } else { - textView = ((ViewHolder) convertView.getTag()).textView; + private final Context context; + private int selectedIndex; + private int textColor; + private int backgroundSelector; + private int popupPaddingTop; + private int popupPaddingLeft; + private int popupPaddingBottom; + private int popupPaddingRight; + + public MaterialSpinnerBaseAdapter(Context context) { + this.context = context; } - textView.setText(getItemText(position)); - return convertView; - } - - public String getItemText(int position) { - return getItem(position).toString(); - } - - public int getSelectedIndex() { - return selectedIndex; - } - public void notifyItemSelected(int index) { - selectedIndex = index; - } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final TextView textView; + if (convertView == null) { + LayoutInflater inflater = LayoutInflater.from(context); + convertView = inflater.inflate(R.layout.ms__list_item, parent, false); + textView = (TextView) convertView.findViewById(R.id.tv_tinted_spinner); + textView.setTextColor(textColor); + + textView.setPadding(popupPaddingLeft, popupPaddingTop, popupPaddingRight, popupPaddingBottom); + + if (backgroundSelector != 0) { + textView.setBackgroundResource(backgroundSelector); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Configuration config = context.getResources().getConfiguration(); + if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { + textView.setTextDirection(View.TEXT_DIRECTION_RTL); + } + } + convertView.setTag(new ViewHolder(textView)); + } else { + textView = ((ViewHolder) convertView.getTag()).textView; + } + textView.setText(getItemText(position)); + return convertView; + } - @Override public long getItemId(int position) { - return position; - } + public String getItemText(int position) { + return getItem(position).toString(); + } - @Override public abstract T getItem(int position); + public int getSelectedIndex() { + return selectedIndex; + } - @Override public abstract int getCount(); + public void notifyItemSelected(int index) { + selectedIndex = index; + } - public abstract T get(int position); + @Override + public long getItemId(int position) { + return position; + } - public abstract List getItems(); + @Override + public abstract T getItem(int position); - public void setHintEnabled(boolean isHintEnabled) { - this.isHintEnabled = isHintEnabled; - } + @Override + public abstract int getCount(); - public boolean isHintEnabled() { - return this.isHintEnabled; - } + public abstract List getItems(); - public MaterialSpinnerBaseAdapter setTextColor(@ColorInt int textColor) { - this.textColor = textColor; - return this; - } + public MaterialSpinnerBaseAdapter setTextColor(@ColorInt int textColor) { + this.textColor = textColor; + return this; + } - public MaterialSpinnerBaseAdapter setBackgroundSelector(@DrawableRes int backgroundSelector) { - this.backgroundSelector = backgroundSelector; - return this; - } + public MaterialSpinnerBaseAdapter setBackgroundSelector(@DrawableRes int backgroundSelector) { + this.backgroundSelector = backgroundSelector; + return this; + } - public MaterialSpinnerBaseAdapter setPopupPadding(int left, int top, int right, int bottom) { - this.popupPaddingLeft = left; - this.popupPaddingTop = top; - this.popupPaddingRight = right; - this.popupPaddingBottom = bottom; - return this; - } + public MaterialSpinnerBaseAdapter setPopupPadding(int left, int top, int right, int bottom) { + this.popupPaddingLeft = left; + this.popupPaddingTop = top; + this.popupPaddingRight = right; + this.popupPaddingBottom = bottom; + return this; + } - private static class ViewHolder { + private static class ViewHolder { - private TextView textView; + private TextView textView; - private ViewHolder(TextView textView) { - this.textView = textView; + private ViewHolder(TextView textView) { + this.textView = textView; + } } - } -} \ No newline at end of file +}