From 1fc84239069fa19da7f7c7b0b0825717aad4999c Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Fri, 26 Jul 2019 10:50:32 +0800 Subject: [PATCH] Sorting posts is now available. Minor bugs fixed. --- .idea/assetWizardSettings.xml | 4 +- .idea/caches/build_file_checksums.ser | Bin 533 -> 533 bytes .idea/caches/gradle_models.ser | Bin 254881 -> 254866 bytes .../infinityforreddit/MainActivity.java | 61 ++++--- .../infinityforreddit/ParseComment.java | 3 +- .../infinityforreddit/ParsePost.java | 21 +-- .../infinityforreddit/PostDataSource.java | 162 ++++++++++++------ .../PostDataSourceFactory.java | 25 ++- .../infinityforreddit/PostFragment.java | 41 +++-- .../infinityforreddit/PostImageActivity.java | 1 + .../infinityforreddit/PostVideoActivity.java | 23 ++- .../infinityforreddit/PostViewModel.java | 50 +++++- .../infinityforreddit/RedditAPI.java | 10 +- .../SearchResultActivity.java | 1 + .../SortTypeBottomSheetFragment.java | 88 ++++++++++ .../ViewSubredditDetailActivity.java | 33 +++- .../res/drawable/ic_outline_sort_24px.xml | 9 + .../main/res/layout/activity_post_video.xml | 8 +- .../fragment_sort_type_bottom_sheet.xml | 97 +++++++++++ .../res/layout/sort_type_bottom_sheet.xml | 97 +++++++++++ app/src/main/res/menu/main_activity.xml | 13 +- .../menu/view_subreddit_detail_activity.xml | 13 +- app/src/main/res/values/strings.xml | 12 ++ 23 files changed, 635 insertions(+), 137 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java create mode 100644 app/src/main/res/drawable/ic_outline_sort_24px.xml create mode 100644 app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml create mode 100644 app/src/main/res/layout/sort_type_bottom_sheet.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 6645f2bb..6449e76a 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -35,9 +35,9 @@ - + - + diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 1c28698e10879fe5800594bbc2c87bb4b1112316..4b5c0b5d9d3143fccd2ba676361125c5ed6ce271 100644 GIT binary patch delta 15 XcmbQrGL>b*3>F>E6MHw#sbmBIERqG_ delta 15 XcmbQrGL>b*3>Fc^`*s`WR5AhpDv1Sn diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index cce3e8326bf251eb50cffcbaa2111f568c703030..80643aa14cd4064e283e46c667425ea0279533b1 100644 GIT binary patch literal 254866 zcmc${37jNFnKoW?att8%DGG8bbmx6F9t<;p12Zzta3~%adG*vxbyrzcJ=5)t_pPWX z;sIWO3hFL+vL3ANdb=L$xr@ts;eU1gP#68yb=~iYh>Wbvtn7}-s;vLw&z|ngi1&?n zBjU+7BHrWne{ZbobsJlP_S`g?54-JVINfizTfOOK7?J7OE(u%Fbf??i9R>aA-qL(9 zJwH1gkYHC6|8By+QMjGI-PR7HRGqpJvqR?ly?*2H zt-HxyqAc{AEoE!7*FSG-bv-2p$k=kv!t z<6CPQt1oIC+-j5XA`m@SWio>(E@n~}0=ayt6Fsx>JSxvan3z)W9LdGgBJ;D#&VCmoLM24Yt{-mp z-frVD``6$(I*`+8BfyR|g^B_Hty$eTU~A(c$;e*RY(?8ie^x-Cw?oU^Y-+eQMXB2n6KeQ?d}|xFy>fe)l(V=My+TrVk_pTr({O@ zGM}zRjPwH50)H`0r@(ab;`QHn(oKi=9@$!riBA{7hJHiM4m=YEA7j>os5^ZLR@By} z-zD9p?QCHBjWgN8-5GS7o&Kg4>Gi0j*gRk_Ap4}?x$W+(zzIf=3TV2+$9I|)-hwBh z_@h=VepMIp8_+&8QeEtqvXSo}fyFoZ=U2g=iA3mW<^Eq!)<_W`;5q-U6A8 zrhODhd2DUQQLq%WqHMKOGu5&U%9hFYFk5Cv)M*0-=V!Bp&sc^a9g%FgM=aaHjh&9@ z)H-Wgo7U(;IgqV^Bl?X;?)Q{tGniGQnE4HcoZsj-j;AwvCiygMjylnN7|jRG2snNy zf7R|uXvy7m+P28^$X|sHoNV4xnmt^b_d8o=P(NukX6U?_S%4KX ze*yh|FcnIyh2$H-x|3gPN&ERXM6@Ee8u{D=Omy&(;{s`ht$yPaE~e~r{%ND@Xd^4~ z$d!svB)Y2E-$nlo`i-+!D!YTCL$}918vVv;D;3?ji_oI7QeqN6Y=~B&T^vlZ-Oo3M z<5>26+Jcf-g6)|@Y{i@`upgGPD7aJ5;>$c~!PX|ljbzU8u}Mai4@r(*@}|I2ObIsN zNs)Y?IR+&hlM-pKOJ9n%=0-WGDLPbW28XIV6Hzqn`$JMWw&%G@BU%rIYIdQ^Cv1Mo zC(Ev#lt@~UFOw|0_WV3lqA1LuWWRA#!ZUfdiKB*?NXgS8a`YR=ifX-uxo8vPzOmo$ z;#10BbR*yjtF{T_M*2;B`=BO8(Y#pknA8aoR(4xE*hBTbORx!QoRcAv^k@Y#N3hai zZk=<|>9eIR^S$QmE=(pqjm3*TB`bt2>g;U>QBFpDPKFVEkqC&Bi5B}^EccC_Jv}I< zth?fymVcFWqTk>{k-UV$43(-IQiVHR#oyc4|`C>`)IRfQg<=V{WbME~`m`j-a+oC=RNuTr^ zXASo&DRX(3V4(ZWy_kC)bc}yYbJQ~3E`KZf%7-dfH|-z?p4>aJn#DMATrVv$^gS;v zl``WPB+4XHNwDDvQFxh?Xucsy^&y$^bz7jbj8yYum{82fb-DLKvU#~D_0#Ths4TRk zDBUx1Qy?KB3T5P5+IdkfWqA;zwhQ~EeuJY4cHMo_Y9&jW>&w|^nT07ZWj8+k&|WE` z2;D+_w@Y5-2=M7tQcAQ`ph~_-((QhOi>&nJfCBGii+xfLV;!cyCp|nQeQ;3|J9LhC z^nJ>MYfkjhl}(5yea_oHN1F41LAqPtPERL#ee8eu2SC923Pp0l;GHQiopR+Ls5!DH z0@sVW?K!?D8KAIe)^LH8Mp7i|&hmz4S|L^!N1C~^BA3iJaTvf)SW@sVEt#2)9NkJw zr78y(bf!##oO}`vo);RxF?aAf!?5~+xeC-S8oPu>*RaZt)u%`nWg zC8?dV%v(GZ)B9y`GYq1;UsFQtzxxW{ak+d*Jgr<|cPbUFK z`TSEskz;HAU7jZ2+;`}f7`qg)LBZc_S!EiYyyv??@jiLTMJXPN1)IF&du+T+TAV!Q zlVR|

XAIc-d+SnufZ$6X~TwSzDH+Qa;QWPMK(u^Yz9Z&!S~r_^KJi1=Q__Psp>$q@(-rx zOrDLjMy`!c#ma*|KsD|KRSUXvr$#GKU>p;|_F7s&oxrt7p}-po?8OCbjiiZVN=MpgLF5OH7UTSg5Oi~ z?g%Qlr#^9R=`twTU9_nu)T8ZOna4EBT*h7iTL~QHgUqpWOK4xX5cDrdE6H&I6`CK$O|SyNV+a6gWsY2B7Ac*dkcQd z+|o{5h0(LnMEIFb9X7X=dC0E%{*#SM@-*AxfyJG&FBwZElt@Z1u$ zDcOYOaCPILIas8ytMn~&j1rO1iOR-oBkA-n>-4d}p_rVNTL3=YX+_;+#4`mk+SJ|x zW)DpDpjHo1WcVy(Ry3RVy%31@LpO~nft5xeQxG*VX8{vYD=)nDb1C=$ zHqd_l(Whb#cA>wS_QMFO7lm0G{f3rnKc=TZK&rvxxVPP1QutCx*rFj|!Y}+2h=Y{! zn6w3m0>uwSfw{Rs5Urs`G|2_=_HGn67nAYD^W-ze$5)ic?57~UrPsrudNNiN>gT(B z_YmStIyDSP-VdV<9bqgLfi|q%Vz+TF#h3k9p-gfENa4mUYgQd|(9ia=r+_MbKS^cQ z*7H97uNU2Loqzl4#yWhyV$y6~HovXeqaQIYgA3>T-6dG4kub#ZdmCCS29jE*;rxY) z4OT>l;M3pkM*M_{KEqVlfcYK4XeI!me#6L(^Rf&5bc%*aB@Exe^KCleA!IIeI!vn$ zX)w0Tuq`of>pZX9(6U`m7$oSH>1~!lBFe^*uoLPw4%?08#qEeLoL@*Sk?2bR^MRYU z?A&<4)(bat^Ri-26c21)}aD#mbq zsnu0tZna)_r`2hLQ5v*qwfJc5$D~S;FU6<93|pH+c4lIh7B3=SX6Y7{m$VK>6iNcq zPPkHnwYe7+nI!1qpv#Z#Va1CIDpJ1Ud3>r&KX}Q@A&i{)7Z@)04NO})kih|0(@!7M zO=s!nIwz8=8~7k#7c_Xyo@|2!SiE%MJS`tGoiKYXJt(||s*BlI6qV<;Mth^y)$|*2 zb+favg{75H!X(X2@|8M*Z!=%LgPt6eYx>p(RHdAP^=57Z5I{O8EC=77^pB)-GPeIJN?4BP9Fm7JlQ__C0GCR{oiDkik(%T zd-HqV#>Z>Ts*)w0+o!BB`1zGkvaZ(@W&*xc;slb)mv#&QKC~EVr%vG#zwx}6!xZMQ zYZ8FDhMpQ-BP6~bsFQDEGDl%DeQ2R&m`T(e1Uf!c`gRwmr?e56fKcc7*Jk(?db4Tx zDSET1(;0pa4pdJXenAy3b`R7Wen(ZI#5#&z@Kb?7#mvv{6Y@)Ymgc|QCcYYWf$ zh3fEIG%LAqDZb+)bGm)jDTTSi=Mp|N7gzhx^tyrgTwN}X3l)Ol7+6XUzBwtAEp;$q z_hKuuxu^ypbch6ACgbcI1+Jghdbk27EA~uB?IXMt=Gs*3kDgWMmN*5l388Hbn8Yd^VnKPHw1DF#;K$?bvEdpV z6!w!Z0!3>>eV_5><%aJ3>V2l)8m2?ZvFL)asLMg%gNBI_9$C&(NEl(Vb2&p6LvV2EsDfP%3g~z0oaH88 zMXxxjHuI)S*8j+(C|mm*M-|Wht^1LOa%jyz?1eX-`C%&dRgbvuw&(qxjlrzw3n)oI*!+bd69W{1o+Agk14fAhXGX$`{28o#{#wq-$OMC~BCXp}?C=IX;h zAvmQk2bd8CI?F)@GZQ91ru?OlGvX&u$iEDDo;co+E(br*nlt0F91e}Bvx)vl&}huT zmSNHe``nC3_ERGnbHs=6$#~AQf3@t^WdzNk%Mncu9U}~NN?Q&akEuS31$7x@Opx># z@|Hry2$Me}ksbLM{mB@EnneQG zQWAbfh5I|4ap!_atZ)pEyN!V{Ovx#H@pf(Ht1*6AG9Uc&8-oqm7^~Q z&k<%-mV*pHCro}!`AdOxgfDPGIzwPOg3gsCxpCR^M?8zP98Dhmo|k+xvx7T~ykgl4tr2$6RH>B1$OxZ3PFRi~Bb+8M z(lX$f6x~r}EQN{@^f@7jA&eN|LW9v-9vs%v_sgMzS6#nj>?Ck7>JZ9sU<453&D}2m z7fw7TOlG>ftBo+z4j@UjG?ePH@aw8Lq6$<%)tj%pbW;>Y#1t$?8RB z6mdCbZCSrhLM6P~0;Ah5jCx>-N*lCe0Z|~ji5yN}p~%MWEUU#91h??Hl38SI?vj1f z%n7!m6R}g{VYGybe(*3gM`6Ydr*+?V)qmy>3D;6*Vp@$I8%}lZ z{mf18hU3{>YdUNPFwKCYcXO7&bOZ+6JaQQ<^12Z}j_Sc|lFuuu@gH1PA;PHl8 zY!&7oteEhI2c=5{4AW2A$$4R7!woh-@0iAMzxaK>v0B%7=a?gVCj$&KUJt)Xwc z4o*bRO1{pE({y=GciHGoCm43g6}Way2Xxih6?Q7+qciAe(O!r~=o8)ro2i*Hb!()Z zgf%@3bFP40_(F#|Hv*?=NHzNEPrSF^xox8+?1UtiS#VBR)-o#_9gb4Z+GDN9(edKq z;;yjML_E4V{!fejvp#*y->ze&&>kKfkp+=U92&lUO7{idefyt&gGh8&H`X!BF9egz z7ftMpkNnBa@BQPoFLP0JizwP{98N!g+@ACa3v+(ded+DjpSu7ij4!qN7S68Q>(j}9ADAyU&=Cq#1seL$u;&Llo8rI}lpE&NWN8kF+A2Vb|_oxp_ znM20FCnX6Eo2V|k|Ig#U^)H`2`=_fLu(3XH4jv_Yo6$b%3AGarZHS}Wr{BemssF^z zXqLq_rA>$T#G!NB$nJJGdD?HBpVKp;3d?+APEXpAP+)4+wr0?6ClBbbeUPAj9$dJA-r=y?zmyU`v+#+4=(&~q;EtY^ptV;qj~puF{l$pH z8!F>)2-SK+PQq7He*?O8fiEpKHv+E^L74d=Qm?_x?8WY3bF&BMo2+9R{27?vNg_L8 z?oQiH&B>wBvey)Di|?4RH$osKF*^DUce(XhbbKi=!@8ujXi$QXd->4`dVF!Vz%D#@ ze9vSHn1Bo@UPd8D?YtKm?Z+YidCyZ;u{C*)7@@+*(Q%ns2HckM2Nm7Uj1R(eA5j>e z12LW9s1k)N>h(sy3D6e)Vb~Nv`UCXC9tB=5G`N$HK7E}H^(5k0qf>M-Ewhyu9-VxP zeNi)Ng{-^So+6 z7itg12o|bs;Fj5MSo_=MtT!jd6Qh;TEAYp1&K9N1`Twx?rcY@E_|7hzj;!PW*`gj_ zx>BqJ&NxX*CoCV>foKvpm@Q$1o$>+;2To@KTLX|9gh0_uOmjr(pe|Z;Nx@YGc*hPc z^pqzHO!Vme5>V1yFwWLSYjMcL{JuE2@%94Bn2R4>U#AqI4huhlv6904n`iB4z89!< z+(3ncQn@DzslPe;{e#x`ufG1?M?H+HZeknH6uspAr#8Rj`Zs^#3nBG#OL%Sna^qRTI!mq&`<&0xhQNRC`M1A4NnXLGYqIo zm&OvzJf}lOLzmEh10|qw=f%cn|Ce5NSTeYc#05po1q+CB;^#C26arSz$8b1Cv<-pM zK%!zfC_Wfp8q`4)!o*7O{j&L%Sey)7`EWkw=Li0R33p&md}ak@VbIv6L>+^&P&}R* zUX@hK2C^bjTDqCQY@uGDLPuI@50;!_EwBH9H1ixy!#m{FKfF$)L{}d^Xk2V`Sunj1 zj*(cbbfF>+Rk*1Qb+9>4=T5)j?bm|DO58^FM)R4f$({WVuX_Jx?1w}z7pJ@J_S_8p zF*Vo3H;f(v&*;<` zu{~7}G(E5!*N9_{7_Q?4A@MxZGy_YG3RJ)*Ggj1zJhjkY{og7UrZB=zmk68FUay?J=GBu}I&BDC-$CKCYK&OnfQ`q|R z%pWu9Z&QhscjL3*Vjii(f+D~D_Ae2YrMwF0A3024$c)i@bG-8}Ihox$qRi43DCuvx z=3};@`HH0nz8A%TZ5yHMM}FYyvFkY=aYACKp5gkTYT25$3>8c`P$`J=rN4jJk?88+ zqNYQT7limLwCIhW4`~nTi{ZgR!@Y@ApYb;UWaDCF8Xs1+kRY5WFH(+WGT;~ zm6XGMT`{9r#qu*PRdpQ4jiT5!d=INK)(y{fh#L{hGd+8V4&;Z`n5Zy%L4L@nF+H?2(~F=C5W|S|z;t5OwH?eTl^9{{d!kw?p1Uu;;YzgIN#{(^o(~pq z>pkDcIupN6#S1j_eh*Rrj!pT9sW-gf$bJ8M8IXIp7U*X`f`TZMP``0VmgbLczGY8N zRv)S+tCDVD?Ff#d8xY{28;W6Bp&e;~W%{ued0rR*u!tANp=)W86GZrA2CizC5Q0bt zgbGvXsykl43q5B?o4XO9eBUl8kx(4`g+8`?duYBKfE#8RH}{y))H0-h>tFs88pUzT zR092n;A0EUDg8vM>p8jGE_u&4bMm~cnmh}{k;SdF@e1drxE{jPS-NHTMAtOi&<#Tm zBj~0C5sQP!(p{S_*l0OAQ=CpglIt#+YM`eBjcgz`Y z=eoSN+ALvY75}O|KN9@ z{kQ1YBWcFBU1Sa^V|x7=@yirFH4!^fZQ2muFVWjqe)0B`A(XP>pm|7^W+Da{R~Uz$ z<31`Ug|}9dLYAyj#v5aAC{)#k76hSauBT!D=31djd`IFf9O#8jKM}sER~z@xb6-B z11o`Q8#2|{9KbtP?;}Tl=8|0ZpI5E>8M+E%26Yb2QG&n^9EVtO=t0koT^kbtqi=b3 zV8@mj$Ha_qzM=C<(A`j}umVm$`%bE}ol3t|y=NkkQnb*Sp?gmj$+ydPQ2eNh_9y|w ztAG4d#5g{9Pz)3f$x;~f9^2rHu08B?x!%8`TJN)j*)8ruqJitWU)X@wq%R6Vj> z%>3B%4HG9mR^NzRm`cJ?bU>emz7op}e9bfh z%Z(jOiy#h-*!B!NHarVDeo~1F!70e#(wWzM54~Vk9E-5yr030SGNgZ`Q$a}J%+KBS zQ4Btv3Zf8O{I5FVKhB@yRh%Vd3>3;8q5yd%FnwYf_#EgS2|QmXp{?nj zuZ4ye(X(JE)}|4~F{=YX&}g4|LHyu~Tc1^!C5YCzm*9ASCTgO#*?gl%_jy7bVwt@2 zw+B3u9SY=&g5KeomNR-xEOc(XX{Y=9@8l-Q^&?LbMj5;LJbQdRAsKA+iECnl;8Ph` zIR6b*7bn1uubP_U__3$@MnJ-$+E_?TQs{=+SEXzntE_w`W{NmQjpPv)tN2&>OSuS)}Th=rP z7Hk#EB!1+@*sJJ4;HjGDt2mMh0!@YfY6XEA*$%!{^n|LE3?w|Pqcp<@{x7=DBCXEi z0&~Hi_7@Q5GQtVpED{7nGhws0r`26x_a`&vv^P8*fAObP#{#vp1*tUIR4gMYq{)cA zcKd_B&PnseYSLVmi;``R!gwix??Y6!VMW;a*f?u2JS}iS)6g^*z;4-=V?y&Ixw_aB zq0@!+`^SeI<)f33H9pa0oy=^9d*x!g@3YPYQ1b>G(jNQP-O0p5f7}%)FZ*gvHaFBI zn+#JS8XR)kI867=*a%cri~SJC1-eHMKk*&32;CFl#5l7J?v+aBk|+J>)sV~?NL!CI zq5;i5f}6EP`r*}Q_`m$fvxsVce(=4BIK7@10fnQ>C@|qLO&Fh-A8vlfGjj5&s0)@c zP&j`8Js2oDK5RNBixv>y4e|X4#Ov4|syfcrAr)P-aoG^MNi9G<{p#hR{sr&;8ybpw znr?)IM6k>wGS{0Ce@}@A6a~{G1A$!Ye)qIYp!t+*vshRlNHv zp|2F%L4ki-S8&AS*=AtamSso28c~%Xwyi)5qS(=WoJ5(n1~CrRXV70fb-3+Cr+y3_ zWM_6_D*^HKyY0By*Xe;M42p4jH`NPB3qiRtr_5n!`mg)m|0kwM7fOTjv2^JUQx?)= zC|2*Pz5s_=P=L-i92gee2q~gNVfl6vYk`$M42@x2E zg^%YD0Zcp)C``Qh)21GZjxtSjxD}XtT$qrYH7vP*`N{$eMh_H)7&LurARN@V;b&L< zLryrat3^11BV+<53a;C6du*!)bO+rejtvFfF$3(xe0=nb*uhz`76b-n74Hs2fqDf| zy!6-qL1)vMxiN3=LHgm2F~k3zG3e3PkgoOo|9ZoFfl9m#NHFCym1aUBk;{5c;+p$= zAIJ%&;`u~bBNfg`;T&*VWydB_Fu8 z*`^8+og03DGg^yK)Ny0W(Y46OQD$V|3uZdR^8-INV-x61D^c}lcw)TzXJ32*`Y}au zZgstBRG%^rS!_b z)pz7%Gr}QfvB^rV9gq`cr1&numnyJb$Iv|kO9{t(xYpEhZ3i8aSiWxCmTuVj+7KA6 zU6?fbXFhr(`p1s-QtmlrN6VaTi7(jR5B^4_z5f)d9-0$PB9pbW*8jZEJT@nhS5`xm z9O0~@qEPCJr{Od&j3W)_7QPv&wh_T*0Gp90a$?u_J)+x=PH3_RaYxXbqBRR5c+68? zVxu3M={hCYiXiC*nNM;P%#rRMe4MD+4*hist`JkR@f`iWH}^#ST`-NB-8F-aF%C?M z3ea243x0qklCs)h&5i}iSSQk4&l#-IpD~k@=jW@*bGZ&ut#`!^DxAOKnNeuQI8hGi zvb1d*1}eC1!Cu++4Qy4SNcVAPtV;<_ae{?`IOn#Rb0G~L*=IioqR-r(ml=T*p8tlw z=R22T_jon-75pD2Wc*m$xa{l94|D);ADx_lc?*POV-E|KXjs&?jiXA;Wz`K`)x~jT zpy9|C%DNNyx>+V!PN`g^cm3O%??I&8#&TtmE+fO)$KP@%GrSU0q$sp!TzlGYaEj|F8jOzTmV0sqTyWsZ5;H=l}b zm^q*={aOm6pz@EV`n8Y4X7T9U$0}>t@&JoLDNFmz6cO@SWpmCO(!> zpJF22TuctXuYsnY?B#$nIQa>DFL?86)IDS(#* zOE(>)E(a*zI1Gl?`|EC(G?KgSByEJV(IJI4!oHjOgY@$*4RAr?6&Y9N1GI_T*rVyG z+4olXXD;PjA<*M|0l1r7f-{D!5q;8eSZOB$EWD)l_TT@wkz#3j;74u4r;#TMH|V|gjQ9l;A9tY!Jvlg^ zz=|7ng>w15mvxX-@X%aIP&~GrB6Xal*3rNd(0a)=&)P?ao~EjL((+J}rtO6-bjBt+ zfIWl{)j9HT1A=oOFTjPkY2ypy1yHRmg?c#jGl>zvrK0{?-U%hwS)doXqF^%&wM{eC z&~3f!|X}G0?Z$yRpiI*GCRADZgwW zw89P5h{FG0=?$bL=E=KiyyK=jO~)C%|jLM+V>=r?n4%|I3v30IwdFTk11i z761qP=@P{AzVSr(O0VZdQ1#GURfuZsnE*Ie)qKm7(rHm0;9&A(gt+k4q7cU=5z$S} zb7An}VLM3t5SzeZfP3NcVq4L#gyO!!y96zR0vfEdeOQzPrsd;U)KX*D4MR5wBW%$f z3)(97MX;D9NiC=q^&pwF*EJ)Vj9+e6RtIJodEC^O05bzI_Cu__>PRN#JOLz=@=THJ ztvf!wS@f+sl1cg0j$~4fH6oduR~eE${L8=iI^gKs6ppCB6?f92tD8EDWR2Oiq9$kl z{OnKSj+A+6B^8*WN8Pm6o{1l84*b%pPhBAftva4LBnrGp_cYt`VATjM4O?A13Ty;T z3pLX&!?Smeh-b7H+=(mc3coEAzKFQTFkn{cnT`i5V`32)N2oT8jvd^eY4AOXNNjo< zJe;!P;CE+&Mh#kP92^St$pq@DPfBxT` zz6mE_qA-Y_v;t8Eg;4o&BtLiG#kY##t&WPZ=LA}a+cML)RX4C~HS)a>#%lySS-?{n zD!#WGDz4BWMRc5ASPi74=w=wk0k+oglGR{b4P&u54lVd+z%N5LJ$kJdx{jLGhyItT zUjsHu?%J_|mjWY6+!$v9R31Fj?XNrx-{bbKQV)0bRMk$}#u~EvgMr@SxD#OMH zZaVusz!;0K(CY2p_pDth6t>!g#_*#}!~pbs(!~vlHSJFAxNz%*8+Tq<1V`omEpY8T zQDDSyb?|}z`rI_gdSZpMu$NM{!+~krOU!by%1K7j4xf&?J4Lda4>5y5$Fv>cFin4glc(3KVg< zm7!PzU`j<*GhoX2jR}}C@{JjNe_q*+VJ$L|$ zf2q}UdgCkb?#yTY^0^3Ok(5FG!;AG3tiv4$s=q0|Y_Ax$5n#^sVTh$#UL1HZriE#o z??b%`5rBb2uofwUxr$aP#nvlH&#)s#^OeBy;bv;X-x{8lFkwFL4_NH?T$(`V9ON`dX%H?%LtQJ^RU5=RV?V9-W?-1Dbj zoX`{FRvp)D75*lsYm&%t;Kr<}nh^y6xF|%N4?~N}aIK=L@le|lV35lpK{hxGhp0{r2oEX6B7>7t}1`Btn zLu*6ix=2T8Qp8|G)D}a9(^MJ8RrFp<<$!~>ayj7M7jjTS--+OQjLTjaTm$JeC#J#l z5HA83z`9G|T7gU8cv&*I`URO9v^uF!YKA@;zcHatMt*Y8C*?c==#%nHq3`DN&OS!0 zoa)dgl;oP#8p(|(*CB{M7xo|T3~wc@^*a9 zpj%>sOIkm&XcQzw=+&J#3=vsPha*$2Zf#g5?S0KyCgV3ImdVIZ4$GvRCxB&Ao++07 z(?2}0LoAW%SSICDJC;c~)`(?tUS(MJ;f0Sb0LwCgV-tuf*V-O)=GS-Q#4RaPM6kmy z`0X>r@Ki@I9pMlV@dlAwT)3^9xN3C}9T!)v)ZoL3OU+M44oREzAOSDaM0g6rg99`o zKbr7*gIX2^@VK<7Di+x=IDvz>9;M(_mkuWFbIrIV<2NR5$;eL*x1^jWfLl_YDQ?~L zy7||Lg;5>1qz#z^>89GUQpxO88{+0k^ZgRTjGPezDg)| z@iG*<)}Ajmm}@sa8MwHdfHS#gqaidxsT0N?!n2BMI6k8YR)e#b ztlu@`mrTxM;+Ks4?$)<(cBw@uy$+Rk1j#GBmGV+tdIw|J~V4aj_iggb<-bS%(s$-p$PwiMI zun?^u)ZtCusZZPB#3YqX~L-hQIKqcFz#XKBRF4(2#+dEX-ky38>(6Q7Fw

;Sh#4Q1>v{(?PRDglR+-hog$Ch6d6$88*y)k-2E7er*S9Qd!gtdNO`vf}V{0 zb@tP%9&yvjiDk}v-84q((Ng_WLwUOCjA zw)@=o!=Imn0afSL(WFA$wrz# z@0#&T#&1mgl98Vren~k`0KcR>Q~cVv%1q<;RL3tVpW5+D%CScLlJhFVuYEgyen4)6 z+KOgLur$N}nd&WcI_++MYOiMCw5`N8_dR<*awFUihKuJEH~w0H+}eBgKE3nu(Ls(l zMugZPhKJy;EPW zhS>?ygwO!b2quT~L6{I5K?#N0jN7F0s2TiZ{Kf=78TrY9pOo_iz)#9E1;6IsYX2w} zO?B{-@~IvCq#SDmKRK^5@O#Ei@AJT^fgcuM=0o6TmSbPL#>p7a70d3+Ber5Z0NsL7h|>HA9_@-kG1Z|?%BOaylX9#P>g2r2pll9omxF1G=+f^dXWQsabX;S)DIQ{S|Y!QfrJO7^je}~jFN&R zilCKrD?vUa=|Hl_*z@3i58qdKhq=f{kKmgKQwO)O2wI+jB$@g$RBFRNsa$HtKN-I< z@lQs6a`-3ZJOTWZ@=WpX?j!&8P_cNbTPM?u=N1PE!IVF#J~;JAgnkS_Ja*F1zGp?1dR=?xs9-3>fRvoW0?C=J z=n73R>3CjXI41JBgh(0f!Il`AU#W2(QY|4(USyky>{&)DXTGA>V5%n-Q_ZL-<2NQM z%E(U+6{VaffQnL{DJtG^jdinFOVv?P%BOZzlya;Q73I9jP;t+Z-=>FwXQ!yxA+t1u zG5=?3V6KOIkRk})y#5u>LnfPiQ3ii!r0{p<4ayr25kpoT{@j2mUA7B*V?9E`65lkKBf=l=hm!9OP!By-w8k}o&nrF|0Hb~P6 z#hO;A4V{aw8;i^WnM-=utM$2Td* z8u3les|?>h6KtcFDlGG9d3I)=+nT4dE`*$W#_1=)uXPQ~?}3W?;vnu)_pK5WD=)ga0Uov^wsYu@B2QiZr?!he2ffp=-gD zUsI99*bGW>@8)W_SJDw>&?kPNCpx289JBK{1GwCnP6*O6^Ls6RUKI)cdBM_Y^3{rzYbmHLv z17Wl)2p#@|yT>qXi6esCJRa_KBV=9;^}tZ!_23}jW?&;9cj=MdjU!^9=!TO1l9Px6 z-?JdVh8CB&#KNf}BIB9J9;|z29IIv=>LF~Ykt-vu5A@3jq6YMnN~31kirS!yF)M;DbT4DIlnD@(_(@WdBgCdR9}nupxugdo+n9T><&X49Knn34ox z=-B}RpOhZkjp~rWTdpMkux=|ZLAWS8h!F6EAlfG~pogk~<3ksb(qS#F2R__H;QO1@ zs_k-C+V8r-Od{uT!AwGaf?y`&JP9z9@l3&N^?`4Bj#wPkRk{6}Bz2~Tm2#{T%w$sR zl!4ii_iy+Y;E|JV-qKsc%;jvWxi<<)pR9Z}yW=P1#nd+=y}}gLiWjqwJmFSVjAC_& zQ{kZM8XgH8_^4V4njQwO={N*tdjS-u(#XOe9#M-+`;xg#6}>84%bKADoig%#Y-SB3 zwsE#-Ax(s?BaQ%$7X#0*Jv@cU-jIB1zm%1VsAe>j@f#BjW#lJ^hEmQGKtn0d6b-Na zyBDSFs5%--`P8o3NjcVthH_qIXy|<5$p--qAH82_I7O}1R))mQm%rNKfK*bO~9%nq?AwX2r1=QBSOk~l_BKmANcTbK*;G7AxSsbHO-KaE!3Rd z%2Zi8vEN>N^T~)Yl`YMHa7yff*G!-Ig+H$yT|u;r7=h~ynt$6x_8ODmG9ijw#Lz>O z71Js;V}8eoK$!Mk$@YiauCU%Kx`VqGD|8}wZiJ!b;}34L1Unh|$$_1e^8~<7$}J9iMeyJba&XV&|0+HAd*XNh4PbX@t|TZPo5E-AjX=P)_k5=N zz<0!0R^KA)DuSMPh-&AEm1{d1lnSF}^po)$6a8f5Cx?Dg&J#dCDbE!B zo^a1Q(%@{>(ND^!cJz~StP%a>yvopT^|#j0w6Ru-RcU(DLE6|U$iKbN4I=8mhUH$W z@m==eqdrLuUDE8RX(g)ot-U3My<0E)#CZpd0efDk`;kW?52tV%V%s^e^h3f5BxhA) zmF8z14wwAFQ58SYnM~5xv|F%s5wcJ;YPoDPmtsJlk9hEr>)AAI5b{~LfJB5swP62J zMh6%u=+vMF>N4@v4TKVY;{u_C`~-ne#(5GzDC3y|;hr0M^I{E+0E99=^#h@dW1T=K zH#jFX-+ho#&pqr!$3O5Ah5N_a%{&&EPDe{7P56~)BmKBs2TQT{KkYm8TrYT5doiB%7>l!VPkY`#8oYfVhE!7>9|4;5Lw07 z11MvrYO5jcaLcf9RM+02&f=V}AjL#m3Ly+PNFSxIyLBvQZdyGoHBl60;i1p=&G<(UHKC-xrkBe9mM>x)u8 zwF9S=V~xNm=T!!rUprBI4KQus+S~6E#5U+7y1`85SE?KhVdU>mIpIri5g8N%p@ECY z;BkVA>lhLBk6-(1F@)7sMc5nTQX+ETe@3rKsP(bxd!7l)}jJalj~fq;7m z0EpDGh^+#J4C%9RmIzBez!E9L!%vKehxuMA`9D)>WzQ2S3L+}26ClFAMLZi}5n!7c zBcBHbFpiLG(hg};m!nnhnW9uyHRGm?-W zbnPh5)KiNo(34b#3lY>7g=Lx`{lxGTm2cGf6yGMsV zDWBTmPs*`I_>=Q0gTF_7=-7_~{s!?;yF4Obmj(=&$^DT%_bZ+#UignkA|1#f+47(| zxLL`*5NLS78Nb{1sEfsLR^Kig@HzpoK;uHbG#5$5k-*Y~Pchuy;7V+%W$NLmv7)o> zS8{)3rJ^9~5w1`Iq+-I&3KI0jnoiw`bwtgIiJ>CnxC?XZAk2}d`?ydlmzuFq#&1k4 zl#!nt7D_o!01Kr&Q!KQ%J+2`ZPjyvL%BOZLlya;Q3+24ZuyAVezFz^g9+qxv=c2Gl zX82EbgIa{Wy|3N$X@tjOB~bIQd`$s#Yw!8$@9)1(j8%1@GYud}XhFk59Mr&%Lu`VP zgWQH4VF24|vkd629Z~ILT~YW?)@8+sJspREvF)g)=YS`IC0Oto(cn=Bi^d>|=;g5+ z@Jj3;u#R|t(oWZmVlsYXqL_^Q*XV<(Z<`Up0R{hU=V^Pwgls54)dc`}d>19>9j7&##c&h1Qk3})96;jbWs z98@Kae**3d7qRm#>^*TU;W_xEAb}jBoZ^rUL8Ng+XGS4XEm?6Hjrw2@N$XaYNzJe) z<2NSk$;eL*_N1IA0DDrNDeRqj<8>E`g;O2&qYPG|L!*qO3Q=Fk;7DkZnyTHfA)|5gBZK&poho-Nc4?xD+cj& zJJwvwf=-8nIiv+bYVuNF-`9+|M@_plh)IeI35Y<^Vo!|_l?IM>h_i+LDNf?>8yw#p zk60E>QyJPWLNKHxYTK_$1yD1>$@qb06MZl3Ls`6#h&9)41acpty7hM#am zG!Suyc(^8p_J^G0L4Yip4q_ifnyZHvqCOKKV`!6M0<|HdR4_Foqm18}$S5N}Ib@V_ zo&YjRd8WwthxR{QAXZOxWR&u$9T}w@YeYsluQFu(`Q0D;cVO4Rd^uR?_1kk)cR|R5 z^w&}>RKD`o`(eI3CsKnz-sNCiR+i3Vt>2x5RFaX7=%5YWI?aUts%i1cEb8sgZ)+0AnR z$abb?Z9pfLLCruX<2NSI$;eL*=%kz{0CZBGDbW4hU;K??p;QMtDWBSbPRg-Hpp)|| z1G*o5{6k*{J`MbONziZZZT6RD(qFil1!;A5mH4wc2mbj)gs~TeL23}jUOZ$#$5MF! zFGU#p?H~KtYsFAj$2<~+j<30)YQyY<22LTw*JCpX;l`#B+=!NhIT$sJz37IL{*sf3 zqFb;tv0`FVa~NAU9Yc$JI2hY%9OJ+b2a(vH69>@^643(nGJ>e#WJ4JaR7XE4pW4w+%CScDlk+M=zr()$Z#1fbo9Z{cea%kP zjbg}rm)HRhKPpxGx)01;jB~zW3Se;33JeBnpnJy;zAnbMIwblbqPzeIk*?Q*->esV zUaW?Q0gHQI4f$}(An~?QH^DcH`?ghFlVp;R_C1Eh@Km;fmwKRJMua-IM{N_nOLdH#R=`t@P~RR>5ZpV|RZ%CSa( zl=CVB$hEI|&d-5gGbw(N-qL))k+C@+x8TRtohf@(3XzX{!j1RRz3?y%@ObD-JO&`C z-S+Ya#TZuyNnC{@(kMbu#Xj<0B6GMN1rau!{x@=FbuM-GoQ+)ZHckoXdq#MT+7 zgD!QZu#t5g+0A3!LPJ&9GKaCR;`-Y3RD)h&50R)1C#B-487F1@#>7b(`N`p=l=B2| zQpz*M$xD8EPijk69VexHYR5?_#~N``&Z`V3e|^M#^t|x&6vNVJ(6}MafqCnnaq{NoyT`#i)wkdx=DVH|ddOmqb2x0CeWX@%Jd0Rmis5TV zR19fHSQKZVTBh3yu}$AW&Z966La2b21}O804vi2gObi#^#i8NAw~j}E&eg4Be;i9B zP&=%x%x`R1TbcYMVNJq$BCsamnZnxi_K$yCER#`SO~PjauqNSHE3Cj|P&;m=|3q(BNj3<9# z>l4LLSJwh<-8Ca@L;;IBu+T=15HGS|i>x8!K~QcnGisWUl5W5qcSvHuOL``l1i*52 zBOrRD*#^!zafw5nO>{&y2viGNss?`)3vO=M)0a?6P8Vwnfh84I&EP5HHzs(>$WIPD zrJN@Ko>HDEc>eV1CmbqPRCVx_@~Is>r5tMnPdTqL@O$LBfPk?MNsUP|Zjv<2NP}%E(U+38kDTfP_+>DH5La=C&eMQFSDg@~IsOr5tNS zLOHK8Bz)4*r@lstgoFHXgCjJ(xQl+_C$+P4NSM?rBH@o8xGHsr903UtU&?n7R}V>j zEhO;J5$g)ML@d=(b=M92va`cFkx+Ql<#Jyt)X9bFf`(xb8@7e9W*`GHd|hl@eZ$VGM*_Ce&mh+^vE%gP{yZzB$RQi z6A7if%8>A1uiHsYZw7{k&3W7S*YCmJh9v;L-v~R1j7Q*BX|IpK$;iz}P55!%-88WZSRg{$S!z5Tsg* z2^3SJ8^|l{B6(+KrER{sfuqWd;ChW<`PY(8^oF@Q# zQl2U7oo9V|j66zGKDEQ1lw*ysC+AfLd+++#n=RlJi={Bz?C)Cer~L&0VT26Av+%x) zW@ei)_Id3PhBfB2HykSFu8l8w9o$O>#hAu-r@**1cb)gRU;UN%R#nHi5Mic5OAjw^<4=~9U*H1-P65D58z^KX%Vt|ssX(- zju4H@h*iUg<4nydRa?esUNm<~`3VVGR3(jPIWqM3$vdq6Tp8p&` z+@LI|4Ls-uj~V8n;DFL8hi-eR7|iO}hfsTnr0ko%X&SbvAyF^Q)rM#aG<+y5smri$ zRIidjFOO0QCQlmR6nKn%uNvWcILK7z>Rnwa)1}g= z8UJMb#>77v`N`p*l=B4ePs%gJzdIlEsuRVMsg8eAKDFbYlw*zfC+Ag$fA@zkqejyM zuafk(Gjs7vU5V$Q<+WD6`u&scJrv-VQkY8X6%YDO{MA3S#5h)mJ~-{FM0Fyfl1SI# zt81GGZI6?`$cbEJt1N@QzpC-_H|J&+Zfs4kS)_7T7VY%B!qpm0b_36 zc1^>~9QCE7YCr6g3aMs9l<^xA5oP2jhloXZydi|B?g6$PIti9Kly6~WI;Knj`=mTm z>^t}R=RQgFtvdEe`P7bmQjRrZpPW}2_8l7kAG#YpCtdTU*hf0ea_IY;OOO6C^1YR< zZ`3Iw->a^=cMJD=KJ(h zIFtK>oq81wTt5DnQ|JY6wjf}1aKW2>AymJ$_x!+L$PtfhmEZjcxZ}?h^mP15b7|$LCip;1<`?k z8ty^#T;19(c%_o48TMrS#)Lf?`N_eal=B2&Ps%fez4K<=^TcwguI@?s)DC-6jy1xb zoL3p_UGwPsG~m=A8E~r|ke1(VlQ1B?{v4Snv$)zVe_9HJKY7JjPXq9k)&QqL&ZN>3 z1898U?r(ocjCFNrv~<{ht5N8wxD8QZYU1fo3^ktynL%)?(z}t74+zUdrj&LsiJqWi zj~qi?bPZjLaBmYKdAf>xBB5qF4l*_wM!-TnloP29HKjtT88v16#zajS`N^TCl=B2o zQ_3?%&6ob$ozD>~sXA&(`P7b@QjRsErkqz9YJO^Z_tSD%*6G4-ZHE6WMaAbF^u2c= z{~IfTnuGjr?8yN2u5SI$3&mJfM?EB5^J8SR3?0h}fPi|0D5oky?IV?vPs$@pkDC9D zHC*98xe7=FxvHLN!yLzSBR|rSwJGpSq)0+U{m8N424Wis9K$QshGNoA*NkE^eq*AT zjQr$KOv-rzC?@5ZqS(#rKKnOfWmHEoDWBR=Ov7cAxbK#3$bUyApma9Zh{??w6 z;@nx+{^bR$#AsH>Ib!HUixD~%9%X^;BH$FV!i74FO@M!~QyNe8!_`jy%7vmV*FS{` zMRB3G*%qAe3YIyGE?NJUgLD$4kciHb7v zlS4%*=Lw*qlxK>Hr+@SMXNh%G9TlZ~YDYyW#~M*l&Z`U+|9syo{vD`jrT`GM=Xy#hxJeRbDVGD2$=#AEaVT5qb zaoKgqTdINKNIFlRng8wC%Wqins?T`&PG(ExwH>jM|%kdGEEBH#1R`|-g$F_Grk&pH*QTLp{Hv^dbg_eiNGk`m6c~z6d z2-`|r!;Cay_=e?>4D!+1wIQEWC^aLWjNh2ZCnG;O%jLx^KMdP2A0N-Ce@uMc9;ty0llq}-jx!X>> zQH)-7+%sU-2d7#DSvFipMV4MWigDscLNzvEWL%mw>845SaHr5U0eeXJ;Y6X1pnk58 z#2+g1I?;^kwyq&F2oeT+z6;kBGXs05TpQ|1MN%{B$@q?y380>oXNr1_ z_KmL)>!v#DN%_={dQy%xqMn>r8R~uL=MQ}qQ1ATxM7`czyWQV~i;#%S;WoG&0U!L= z3%}5BoG?JZLaibiexUKD-C|U$qao61st7fY97L+4S(-^xw*?wf_tI$eu3x(U{rE)C zu+Yr}8Es2La6bnj@NE?)&TLJP*Tcy0w^ivnWE$?d&k}<)>Czql=7(^C8Zo|L`gZXGL$@^dBaYiq_LkUxj^0G zN>syBZ@q6Vyh8@SxWIhjvS)#>{latpT8v$FEOb;)gZD4;Zp2Z9q;a+xBVCe;4CaRB zhviuKj)`F50`-Z52oMZQg#{o~)z}E&|KUO(G=dPm$+}07LCLmA!X6F@vE&lK@q@MXO#R!w!plk%w@@uVDUL_9gKGQ>OTh9A8J zh<7$cJkp95_mW<-wWqyzW){|g3*Cr?bfG(7YkDZkbNJeC{0=+dTuIP^5lo)e;L;aF zzIWi4wu&LF4tziv&9!jZYf&RRk9t-Rm&8Hr8nBBAN|nGjRtLVUB$QnLfOhDFg5dim z34I%>N8oskjK;3v68!1Adf<5)64)UlCichq%78mmuHnL0Du$ZjPR4IcxRa5e9NbAc zPXO+uJX5&40MmS|~mqhvO>}&S>!LDe2 zhGhw#>MrUtDlF4dn`dF-_sh%P0H=;m!_3Z;C0pEt|$qf?VL(NVVzJ6Tyq45hA0Qfg2r2pzh$e?O{;YY)|79FX%V-MvK$k#oc5t(Pz4ggu8)2 zvx7TV(X8+2Pm|vO>e5p5ByY_E4Dos_RE&8!nHa?>NX@Sg1NP6 z`TC$D6gcYqHh#b=sR(LDH5tD#QB6jEa;PTdJONab@=Q_fOBa0POJbc=M>Q#*+EGo) zu|`yr^D0BN`!BxjRw!QQ?CwnOBR%3rQ9Q#!(@&)l%}5_ffP08fuMPuS@6)#+Zp$&H zH9&SlhOAKI7@fKQ{;xFZVs*fa95eJ|14(~W&+=k32%^CCa9LnG2vDGVWv0sStft0g z8m^S~4l(N?4}}D{pzvJPHBF*fh?QU>P#?mUM%2az7r43?;=Il>%ZVU-J&4qRe^QCm zjDIqIW8$BT{N(UY%6S6#C*_&q-`jt5#N$WDKPjKu@lVRJM*NfWD#O3Oy?6Bw0aW~k zf^R%~WWG;Y3p1qGiGu!Am*OA7l_HW04K_SO6_z2tjrCu6%g6hTW6P_6{*jrDZ9-q* zA*1)3e_Fj$3~Y5gMAEj1?qyvdBCZV70IAJm*w9%f)GwQqhHJUC8XgX}A0S&M9~Ps< zR%|PbbPJjwvQ*+C1!;WY(FPkEm^8bHvZ^7eFL8X8hMF#;!onNW;mRQuP0he4<2NQS z%E(U+7^R#i0E|+eDKH-S`d42l)=zcCP|BxvV3cyK5g6sX%7F2zQ}=!!z-4w?(=4$^ zuRTxmd-RaZC!R?*yHogmD(sSd#7C4r4M*|X5HkMlgD?It4))4wfc(*AZ@kO&{l`W00(KfM1ZRYwx59((#ure_e>+QEyFDLYO4s1WnECp`U_~J5>gBTlRjMO zx}Fgk1|sgOL4;?zW+3SY0?xp*ErQh_u#ulB5vmG(7uUP(LoNmMNfu*H9Q)v9y-DfQcKGmU7%BOZ{lya;Q z8s)sopz++Z?s9-#@JUNkn_U!jW766)vy+Ckk9J0+8|=E0YKt@;`%rL$r@r9tE!^uC z3m5dngr?9F8KvhPdHX?PFsp;1PaFb2iZF;QL{*7AIMb5IL2f(hTWjd0x4my$erlG5 zd>)pGQtT$~Kp+z(BDih#W7o$9S~p?N7a-WF=@EK%NF#1J0c>61r7~0>S0VL8I*^K^ zW&o7&8xsI!$m6n(PE$Nk&(f>cm;C!_h+Wy*Oo5`A_t{J5};dy%Bw$i?d@X7 zs>2-e8o8Q-bm5VwX}*dZ2Vb}2D6nh?x2|#NE$=IQ$O8c|KoE01bGo>eru-l{VYVHtSTLD2fmk-spTjPT`9 z+IO<(eN^JB|J3U?912^6>-E#f&b8;KXS*as;1`zcZF)-xGM#8XjOK%-i@T(= ztJmQFty z+q><(XhpcS>32zY@ao99rJZ}4olf!1BJJ%Vjl*6?FQJnxH}nyg0_)}P_Z@<^9{#xV zS&P?-xps91C=>DQ>@S4PHkz;-=cPSm%Y59NZ}yiI(&;GvLbDaZYHvQmIcgLtJP0CQ z^~LU%3ReLjF3jeT;w9tpAqcy84QF;ud!gT1=wA~yyPQvER1rq2bhJ03x`KMSCi&wv zDd{?s$fh=gG%FFo_2cpD(uvpY1zm*X7(*00GGtPbEV3!`(giv_kH-XA)o(mp4DvE7 zM@*o(QF_Jl+RsH{6O*WyOrne0E%fga*k9~OVr%x66KJ>b*!@|rt!Qu5(sRoeOKA(X zbZiYY8motwEml}EpR#Lj)%vZChs-U}#uXnQJ-4)t<;p3nWLgF9b}Y>In{&}+^R1;# zEz;{T2w1g#vGdF0X9Fg~V^XPK3LtuPwT|W5x|DQl&FaR{IW*eRSU4T_@v$Z$i!F+R21_V)NE9MW%B}7nWD-Al2 zC$!;I@IYd5I+GN_=mF7Y7f3hUK@%G#kJ0t*?BkKnx#R^My39(+wEzrJJogA<-MKX9 zw_BN>9}Y?Gr2P%}oLQoz593h1>DxEGk*~8WGwUb$+$aHo!DUZb=B!BSyF1T1@B{2H`r8m`&7Nw)H z8(;TEb)8dAmktGjCHLt#um!i40@ObCbFtqTA^o1r$2EaNvG(c7Y`^jJ`X@jqfs*O| zV!z*b>I4|18g0LEdHv+Oy?$c?GYNp#Z(LP>b9YcVv(xnr&u;EoxO`OP^pGK5jd3&M zguZ5kHZF{iHQupJi>QdtfCE#8oaYd}5m=mVMYAMWn&JOU^%gpvcDFyZ*JM@$%q$cj zxelfR)j?9;mXSeHO1ch^lrkYhAi3`DQ9x44Xt+1kr?#BQXdo%4TRTWfS=I!SQa=Ci@RA?iKPpJ-u=pm1W5qaV#U+xbMTntDV3A}-o*fzp ztHVIjN>Df!XhQciX>xRlb(!sWT2 z_{`o>;ZmAdn#1L}Y4YUK6w=hr0KP`J3Qth-ATkO{${RB>N=iu&<4SdulrkAc$%CR% zP*TchxHr{NQqE*Fl$6u09VMkKYeGpWpK(!A&R{H*l#(9}CFNvCLrE#!EJ`l^RJy5B$=t}hQH&#nT}h^yl1J3oUTnh; z+&Kzj${RK^VoFI5V@!3#lrkAc%mc3)1u>;TG387~Lrgi{+7VOAvL?io@);K~ za!oh)%rM%0Ltj9sV8kP$WHyc+jp z#Er<25!dTG8BvoykrB1ym5jInPh>>Z%aIXRD@R6DubqtHQ!jZ{mW)}|)B%Zk2&)AYnkyVlzQ_q+N>?xYcG|9LJCu6Nr87q)vknHKo;`PE@dr&P`N8!OwbH*J!4i+ba z$C6~Z%u{3BEyn|q;0eT|VRSC)2&6hMZU9zI(-u$aSx{Uf;V{)TB?{D{9AU z_lg_v)V-qW<+@i~tz7qt>a}w*a?W-4$Z`>87bMhF(MZAuY6;lE!YF1{SWeHyQwfLw z1<_dO#6xtiXQU~Ks&;b4Jta{iZ74ZYhLWfu=he8UByL2G zlDJ;qDT$i&iIS)tuav|Mc%me#UXGHuS~*IhdhL|FzUTJGWGR`=!WU`rJd7cWChTbj zu}Ae>Hk(T4;z|-W;ILjLYxCHzz6RpaOb(8gMn=ozvl*FBprX;G`$rbmM zM2$Ep8T>$olBgl))wri5ZbXifxL)5WiJJ6@lBgZ8l*A2qq9m$bj*_@qIZC2>?UY>g z^MRkrQc^FbAOy0JGxLU$fDLc+dM=SmWgxyD%&^sbx;d7#zPy_pA`3J_X1xlJ{pyv1 z^#|KoI0@g=S`YhzbI9VwZX|)vklhmpcg(q1GeoQ_}B(a+($(}Nc zHK=j6SOXC(+`qYv>b5tefvcbSm25+TpcYy@nN`Vpp8;=eCslZ9I|XS`Pn)SC?{4{G z4gJEbS}CjWYGPr^fqhca^NCD%i#sFT-J+_U9hCdVj~a1yx4qM4x?9wc^J?68x403x z?iSbUdv}YP^r^c=?Rf2OaRZ*ZTU5PVcZ;i)>uyoKc1m9O%V~qMltkknv85ZSAaKzC zgtn8RCGM0oEm74@zPP6)YQ#y)&}2z(=z{^dp?q-B^p+w`GyVoBES4U!XgneE|Vc6?tnBIQPobCxF;iO zqzxI5mLVf*$ayvH$%q?~BO|WYcQT?TeIg@j$153e1D?o;s+S`pu2znWs9rl6|8o7W zNthFe?)C9YPEl&D@iDHmP-?hj>23EK~5l%lSsi&{oYWDE%Pt($QO zMozYmiNgk`Yz%2dSf3nH;qf1Yr&$BR$V%fySe}Gew%f_3tWrV{6Zc2dO2p|YUP-T z>a{a-x6d5*Sy^VLlSQSNO_CS4a|zhlP)((#ufVx_5jH%;fMqX$ywT~}*zc0m2)IE7_Vyc~_k>Dm~ z#L3NG*!sx*_%e+da$b!DH&G*!+(h;I&rQsvU);p(c;+T*z#BI)^^)8~)k<;`(`)DE z(}$ie{b830kc`7ixJov!X{mTJkxIjBXu6uu!W+6K>{rdWxtHK3Y~!S_(P7WCvh~+s z8TJD=)P~AlJtJE=Sly}nZuHR%&IQ9E9#i5u`lO;o)cHF33a)I{~#sd>Z7H@_=8+APLlBAzs}86`s| z-C+Gs7ap)iQ4f>NZf!YLZa&B2#KqeBP6QVPRQkZ z&v-_bkU3LN8u@HGVH!C@h5ZiUdsqk|pyVOoj;a~fhp{4H0Qs1q0IQX-Sq|Mzmw&u4 zABK;?c_cYN=Hmt25$DGX2NG)s$$Y$kT5Ep1a9G=q7Y-(Nmy+ZNnU5Dxh|^PVW0!)QGdM?UMSE0X5{j8uxuIZbYuH#r68$ z*PT6LuUi(_yfTz9|RWH}q;%epkT2!wcnV0@H`(IgPreQmNYL>)lR~==Ot>y$;+M%GIJBu zkn?KX^Aa~A$4gwV@4Q4!`ov4rj#pmd20ZZ+RWHX&T&)~0QN4Cv{^#e%4$1N|WuzfG zsG3aWl(?GIbNRfc=(?Iq!LvgnZCLS@KhJroS76JI(m44%wi&s{DPdc8Xl6qM$?M)# z2AjBd(%3{*J3-?fo2U^dHoNzb!6s_Rc{T2_i5ro_Ca%|aY@#N8!X|3RD>iWhp0J6k zm%}EmRt}q}UOP4$jeXyd#io%?YspkTm4evHssSrHc_W`RGl@)G&m=R7(VUsn-J#3% z6{}Agh21;gmEDqBCgGMLlqmV(Nw5k{trg-!>7m@<;R_Zon7ed=6;<>C8DQdmNdpsA z?L>@wV4_Bxzzkk215DJA^J?4!6E`9UOkA(;z(h^@1WeS9S771>JOL9`F9%FqtsF2> zy>?*Ux&1>?Szy9WnZ>k`Nu-T@QBUfLVo^7XDr^^*N~IwJvo$Y=w{^#0*VmQi>QUH& z7oHGm6Ai%T%5iwVg1^6;fG34KpilQ7WjKkuBh5)vwUaFFIf)u^aUoV)yi=a)obVEaXTL=y(=7i$&k-z@ib5} zpG)fo1c}tL@Q^T}r&Tjiv<8+t@cB5rw!0eED+|`Y_V;sxQr|V;E=aQxRqdpSdp4p* zoNNqAeb;~*a$b#lHsVI)*of=(osFnTpV)}n@ybTrfG0Mh>gCvotCeFTs@KlOqtCrd z`c1QRLNT>$K3g>NT3R)-3hXMZD)6~%Iu2znh zs9rlSzqaoU+se+l^;9vDP3KeDoR)wEN|=4;l}y4^RNXM+s$#vF8z*z_kxFHxY+CVj zhs?=J6&~-vxKjM34CRNcXe@n_n=)VyNs|)2RwrBBlM*%JBxRrErVL0$Ij_b&DbcHe z_wyQo<-?n@QS~(i_RnB_qFSxg8uVk>!HE)l%^>z& z?|ejtl(<9Eq(oIa+2Wp*sF60Ld`yOvs3GUoxF;oUM2?iWUf)THn)Hd3s2#7Q#0_{N zC8}PIl(%G5w@AM8v(4 z#wDuS2^jadM2$Fc*(J3hB5KHaHSTeV85q9%R9C2GejE^z~%aEYpy!zHd( z4wtB2J1#ex?=F?aWj1ZZ)p!;n`KzX)-C+Os7arQiQ4f> zOx%DcVxsEhh>5F}BPOcXPRy$dpZS_JF(F!pqNVaW?6GY^u>DM`n91hj*2g#Tc z$Y^^29+6q6#2t_(BdXfT68B_8jX25JIYVZh5;f$!8uw(xjmQlnalO6|BT>Z%aIXRD@R6DubqrrZP@%=Su$#x7Kf=fgb>Qcir=1Yh&i&R*xHHm}L{&Sv;+~SIkv5e4f(#{5L(Z#l zPf6T}93^qRzEcu4=@TVUJ6+opNnEWQ zB~iV0O3pcD+nZ!5nN@XDF_lz~ENJI5YAT*K4DueOq2x{Y(7YK}Z4RGpPx%mMuvk;a z%+;0J%Bd@o<1&oIU6E!as@h2v_l!i1v|(gThLNZt=he7pByL2Gk+@#p8Ht+oiIJ!s zuZ+YEcw!`~UXGEtS~*6ddhLwVj+*dgw2qx&5s8;9qTG=*jaBtbl!sPPx_&v{eAM@gbXHeZ=^Aas&<0K zJtk2jPE7WuWiW{va$b#lOyWl5Fp2B+9h0a@pD>Bq@rp^@fG13%>g6zrtChnfs@IOm zZFgLrmc?YzRP%`pydkNY#eCXO^kh7hRkILm5`ytUz@X+JQY=Tp)Ouvh9B&l(9|_xT zV%B5rE?tI_xHHm}L{&Sv;+~SI5ho?PMr0_78ggEZdrIO)j^_`NaNuMZ*+VM(B z+<+%aqUz-+iK~^PB&yd=$#)mMzd)9fW;SJL#iVNF<9P_lo6>cYY>|`8X0pXNEJ-#g zx%-Oh&}y}=YNlB%jFd};ImlyUsbr($dLd;Ce9`y13?y-1q#=o_c4EanBvB(yNcO!Y z14-17^J?5f5;r0TNnEe*kVH-T1WDA6S4iRpJV6pwF9%6ntsEp#y>>|c^OrNWlZB*` z(v!t}Je^W=Y7(}@fq;|1LD&^1l`Iy;yFc4F-W{L%kY*V#GZZQ6o+$ zcJ3wvMbwbd*L~)yR(Ok5W{qspZ5mY-0$P++t!x(B z$=d9#*mH#pI&lxB(TS>d!p1#1Q6o-t_NTq9%PpCu+wl zI&lM@(21&-Lnp3Q4xOl8J393QyeW_OvklMUTrQ>?#*er%G6=+Zlk8IZjLeShwxauL^i55oB`FkkCovj z?w&L^QPob;xaTHn#L3O>;_1v~h&DG%ET8d4-Z}l~e$< z*LPl`CVk>1YR4-taRZ)siK>_5C9YPEm#AJlFMHJO50m9(I+IMKA<~7C%;hsmGLy(= z6{VOlGdV@itGYGo7LnBSiF%_lM#J#h{pLM)lRgm=wd0kLxB*XuMAgd?5?3onNK~(#kl(%i`sK2ORC7vF z&t?*F*r!`F5{bN?G4py#$*SqNk>u-=N!5C_vV9~q5*1@`qERZ7&BJWF(!MMMOWY@E zSfZ+(cySL))QA(7ov+Ej5;f$!8uzfojmW_g*XuhhQIkHw61C$Mmbd{=ute3%!4g+1 z2TN419hQgv=azG1VVTUDdNHkL4Yg=wHC;)ja}YQvnTV%y`M9Q7uLte!_&8^9v@up5 zgqP9lW^GWdlHG5_9uK{1WFU$AA`MAYwG%7uA&DAsLbCT18AzgroLA!>lDH8$NaA{Z zha_s!CrF}pyh0K;;0cnbdO1kqYULn_>a|01=MA}sWFe_#;jKv}tL5NBZ#ApOb@)i9 zsATnYDy_sbsueScZ538(j814nb#=Up-jIc5A`#b$nwB=Q>8!433B^pp!yR}_D51jFI!UAX*n3+( z{jS#F%bWsB?KAD(`((I?o0sMys@h2s_gqAcIJwySfD9K=L(Z#l&qdsb92arDzH<>Z z=@S=GJ6^en8}P(MRJ|M*akX+>MD^OaI4x})A4+PV zqa&`@cRHdbeWD|3$15Fi1D@!Js+Xf9u2znYs9rlA&-~^A&&twKS2L+}DjtXTB@O8B#TLMNF%V!^{&vUak}|* z=YfsDQU2?;x17TMU%W-O%_h`$l}z7?J0jh;qN<&}k^6>^8gcfmeb>tL zt*9aA)wsX0a3gYkE3Vh~z7;j;Q{Rf(@!GfI20ZnxsCv1+6;~_Qx1xIOggk1)8DEhl zq@GB@dQ3tuYPt#wF&exVVZ=3akZGv zG#6)v{s$sUMZ?r927KLW=VY(cF2%Sz(wsz9JIUgnlc*6VCwrxKDMk%Buf{zmaU*h^ z#P#~lNz|lIoJ8$-x z2t5ZYHhCkLG?lpZx)_~oH;0nd)ul#5A2r7d_0^@SIar%i3h|*NA4&GXXGcf7US7Z* zktQUn+Q}66ghY)v3E6kI%t#V7yN>bQ7(;-41%;W0Rf*2N%CoHbMoE$3@rKfK24J6WR|#bA012Fz0VVC zf0bF{My;_W?%r41Ephk$o!EViB>$9I;zo_rCGKAMsKfmdH>%s-ri|I!yeiwKG&QRx z;ME!3Oe=;4;T-dM)y(Gd=|n!IBo%9kd(bvJ+25=c)$+>1($ZM9Y%Vn+X!z)nu+R-% zuLyM;D#&!bxHr;WFRI$vS-J0eQ6tW-H?+4**NYl*UXA;%7dIl;_2PPc?|M;_K6SmQ z9j{$4ZopI5i>jCFdU3UKT`#KFj>!`*@4rMAlf`^iPZ%0(>#AiSXk!|-bcKmYCI!y} z<2iUT*j&WPP)t@TBV}`_*$WSmn6|Z&S}yQE*ggtuE9_je-wm#k;U(^tG%r!rPQtk7 zC2GXU%iu{eyhIH-uf{zuaU*iP#P#~lOVp%KyhQDIg6bjtCgc9s@G1*PhJ^2QI?YNL?W3>LTH_ATur9)@T!@fOJ%bv>|hAN!42!Z?QC-> zIXP4=6-|AO4lx}0UxQ@`4{oRpwQYp5u8U=cmAGHhz(iF$5#t`1s1YYHyDpO%R-%TS zSK}U-xDh#E;(C1tCTh|rV4`-s0uwjj37DvQIbh;y<$#ImwF5JC{-O8C0#i-HZV5^; zrzNyhzL-qIZV5^%m&~M-X?R%3KL8XF9qX_oHmr45)p6L@a7|^RQE*D^pT6{T%kUC+ zOPZIcYA0db^Aa`U*-Fq&9bFAS*Zdt z;hi)77d!;2nJ~=E^Y{{dJImk__evU2a&92s1qhMZU99+$WgIb7m; zea9tg(kEP^cD&*eH{c1EsCqeE;%en^iR!iEa@yB7e?%6SN<5cH?W0>WgaJ9cfOYs-0wU&q>sX zlapOiUsR)poLA$XleiH%PU3of=Ok*a}z7-J!cq zmgOXT-lggZ2*abpCth**nmS_^VW(`>h!>OKgtcy&`jo@UQHX;(WmI{j%%~D~N}86a zYA0XZ(-Jk}q-EbRGNVe=kn?KX(-Jo#M@w9<@3cfs`b10Aj#paZ20YOcRWC>|c?yGOilZ9k1o6KoBh~t=2;6?Nt>}06w@O;PA zav9k9HJxw1V7W6HQm#-}nyW|ETB9;v&?Xu%^Tc~)ynY^ z)obVD*Uq}`_p*FU!V5yMgJChAhh4C9IW?Js00s#~)iQb(BCy1pd=xv+)YywcH5%q| z$^jcnYGy;_gURl5WnhW>Bn?YcwG%JyVTl@P1Ir6!V2K)XUX6QL;zs0PiR<+pmZ(Xe zV2RrC3QOF8Cs?BD8I8Tbs~a_4$2kSD{w=KOf5WSAsa3Iu2z z8i8jo@Ttuh#6~F(mCaRVSs7Yrn2Xd^>f(}CQ)_EL0r{_^BM@8|=o?#epjscD2iX?} zy2jQlTT?X`2WE_|nOkd=ity(7T*DyW$`aFkivv+{Vt?2-n@FRRkWLGq_3l`aXl(>i zmD*mkjn-v$U4z)^UtUwaWU;B=?+eXR=a^bsSzt=YpM&OPV{oK6HrP0|{->tjX1^z`W0HO&)hbLzwTzhkBz{ zT4^>$Yn6$S(H2*xG0iD`ZH8%9h~`a9x(3B>1)JHi30Tv^gPES216M0d&k*^wYOo7) z172AM4@`Be4(*g3!_C43i6XV@%J;zZ+*UJ>m}6E9ElmSVQhg+n-bJ@GV*C>_;1(XQk6k>bHOQ z9j=X#)lMqjbTUj;?UsYOnJQ?iMy*mZCWpuu>u{4o_0ydgxfb{_2I&%OvoeR7ijCj; z+UZOM4bp|&=Ph?rgz4y88*l2^p?wRc?%0}dg_XPJ+6(Vzw#8Qf@C(4J1~n75wh(^~ zvIf=MQF5?3yl-B}0;cT8qr3c_DWms7liG$lG6LO9^B-VR)@qUGuwpNsJ(6f%Kd(a3 zTa1+~)Y^Xr3vAPSnT}sx@tbCcF-WfefA^SEyUOYRVk$QL;GSPHH#S=_0b|($OH;s6 z%i&{L&TYQjy${Q|jo4fcb^)o6rB;A$+dcPrR^WxbW|UZg0djj!4wc4NKue{)FhAgz zbRH|TvM}#jR%jPqEmd^{UNYb( zuax1=rxnO4`va!%q~n&K&J=D>e%_IqX^z(_TBT8dLD_gio2WyS5vcj*4;9>;75mo- zAAf@tqYHbSHkFm5jYc&Id?x>rqBhLFNQPiL(S$_Eo~Bf9)b6@uT9v4r62`g_*cSTS z8X4DBSJwBh)aIKoFqz9Junc-27(I=Zhm492qdT=+E{&)V@f&`77{b7(h{X!rV}?;` z43Ri0#L{3Ru!S};4nxjXP1Lp+vv$zq8I8b^w&+t$!%G_zMyYaWtwLH@eRyHh+Auup z8P+CBWn*~695-R~Vj9CRtQoG=hnv3vX8lOmQVgtZ!c;Ag zAkDOSc9TPJ7<(^-RsG*KP>rgnsewK8(Xt zaD$A)Z)h5=tpVCf$8TGj#59=3?DZ+@u-Q_qS;>-#Ms=b=E0b2|^eHo$#etbHPl1(| zF&I@WQ|l`aQOD?91!geeu{Er)sK8o)zLxPRe#s+M2wO1TXtmxw#rncPWNgimW~~mr zI+<53CdXh6s+P>INF_|`S{&%LgqEOxY|X*I8sQz>tc#&~tjcfR3gY~pwyPnU$;}Q| z2#Q%ArkG97KEL~V^Aq@w7$=~BALG+EU|~|!c+Zq;mcB-CrN3yq4*sjyWShP=YSvcO zPqVe5%3|T8l)JqMpWe75aey%7{P<* zE6r9WG+pA*k}4T#*2RxF z{g}XJaHovJR*Ce?{8F6^#Eq8U7T~mC($ryl?#lRr@rkiUAmMD7W^I@*It<$^&F01S zWWP#am$$!t_Nlc19miW~9X)>*FDxk^0OlRGnrJYo475eTeCKo}zqaf5c z`Bxv-$(-D*^A5A)gL@yp?yD^g@3ZupHom)h`!3S*rq85l2l;c>Zx-oWk}Li#Iik~( zj*X9hZtEv$maRp`Z7waYIFo0jD+C=IpRFza3C$7~86(5Tyu1g`NY_(3HlF?O)MYfw z4kF`@H-2^dZ}W_F+}N@4ezVO2^TS=d6BX3uJOScJR=<>cWlg^dGj+g%f2Gx+^4R(>usKqPBS_-9`%Fk z-=J9z6d4z;Uv$TjJR@Bi=-Ak~Xx`a0%b_CUVc+=NnTvQv+U7epK6%950h;A%k#XJ9 zeBT#%Mml-!*!ceSOP-}!){Bhad+COiojfBQuy$-Lncb(-EVqh`KRoZSFj<>pzcn3V zcWitww%aQ-%g;o{pXYwtAbh6#CaeT*l>u8ogiHuKN_P6mP zct*PJ2hHrCA*S&!BIC2mUtSyM8DC_#!iw_>C(|r{7a3owUzmECXQb;S9UK3BdzxiD zLuCB&PFGgl zYh?`51*(pXyRSd=M=PM7Cw!?u#`N^J4$?__ z$HvEg_njKm*e^297{34bl|19-@Yi(Gj;AwO3rO}S$H9Tc(~h`?>Zu4l)xLvHdVyx2 z0eNC<2v2ga62ei6DIz>c2v=A_>S}XbNp+0VGi=^N1vMs655D5RqC6X}g3@U_31Nli z6vtJ592_Y09Xmn2|ElnQ?XP=Oih%$z6n>dzCyrjgb%bBx!i$CQAC|Dy`|um|jPO4E zFD7{5>WEGFx>erhefUi(6h_|S$H9SLfBU6{)O-31OeYWzUc1xmOJ3&LV^3H*gEtD{ zlU#VS5I$uITfL7xOV0>LV=pqnW53+ueNp}ytGvzo*mG1UGCj|ag9C}z4)`ba{uiR| z@BYgl&bXClk91o)gZBwx4;MZlgngE<)%!@4o)O+hW-`GRd!0xDK!4>(*eY-HJ`$rs zVWgiQ2M4a0^{-v1_fH7#pPYZ#V#-{qGy0yTGx!&-BlpS$V;n~BY?%x$cQTKFp zh20^Wtov|l-G`fX|LXO}E)h!G)qS|7?!)%F-{Zg)I}yJ-d${+Vy`?XozZKUR`KDDP zos@U%N4|^;XNa7aTf)}5k6b~|h`NugV}hOb-0@sd{ySEATir*lq(YJDDt;Usc>noV zZlT_9C%oVOsGDbhpJ$KmV(IJ@9E931%G-Q|tcd)k{)Vs`%cttG)M&mKD8(%Jb_ zA-sSK=?I86r_e=~u+{s}rSy#OKExVXRjohqpip|TRo>=(h&5c1iM3gB92{8k^CLE= z-ajbn{&)X;?l~I=53qE0KEicG4&*{Qh+;RxB1_onedG{&MtC1NoC$)bZgzlBy4Wgj z^FFeK3Pq+v`EhVy!`p8T6TiCzF}t4Zes;FFL1RC)ban}1#(u_yf|#*8EMcqnvAgLR z;eG5^OmNvAf1nc(diAlptnxPRWA{)Y_da$nKZbG6UK!fgb_rs3z5T5n$LI3wkr7L0 zmmp?jlnVthBP%RntM`#{dPaC3sWHLr)30AIES0VDHt!=9DioQj{5Uue*lf2ONZoe} zVs`hw@b4cU%(I7hZ`Cbsun_O9x@U@vzyYJflt>}q=nR*iJgIU)Ozx8uU3$hm_hY_0p)&h(6^`xt|3^{oRR zy+@RvZI!pxeT)HHWMZr)$H9U1_dIk2@w@Xw?tSNffBgLF5uQEF+kNLJLMYn(bRpbi zyAQXv`*5?}|L4I`IwPW05^mS-!!7MTY;X6M{`8yOwC?xg-gnLW?&RJH;S;;*$(_AW z2-%%agrbdw8Aw3bTKC~2Tk1Z13=`~g`_-c5gqO9c`|wdzC@de%kAnk;TyxL}^`6bg z$OyUX_+#e1DR>|4wsdysTt~Er3&pP#?X!ff-bbVKjA%L0nM`o{+;g53O2bxpTg!>Y zs8D3;=f}Z;$1ZyQY2tnN_Pp-9cR1>-7sq(^@DrBK?p=lONiN(&2%oZqt=@;9rDufq z;TM@;+6xOd6Xl<=%GZZ$i46U>xz%h7GtldX!kF39Z}xy zJ6{vRO}6`JYrBs&+kJ7y1;>c;?b>~`rQJvE?SAvKjQeTb@5#OI-s>dolh?V<@Re4L zbnhpGS8*YoAhWw}oh5YC{q^*Wt?qARf|s8)*vcK9gI;Tux7Ym*R46R3=f}Z;6<0m+ z0rj4ehmLc)k38|sS+;6sw+(4s^hq*xG|KKBB3#ZDN7=0i!dCC2Uu4dTtQr%%x$3&@ zgzz{jgz`4;qszIs%<>8RI5-f$^teAz@5e>mSGL&ZKf?QvsQWrM6cTm6S_n5;_o3Fh z4>jxlunWVY0}r*U`%p{WhwOEK+o_#&jM>GO$S8AWy>R(&M0<$vcHgxncQnG=eb+WZ zxXE@OX>IqBX1o8zV>gKYBGRtiM_Sr_#NO`9TP=K>);(LTB;I$Qv**u_{}T5p_MY{7 zc8h6H?0qi0K;-<;61KLS*vIsYX!rdcOmN!IY6VgLBdffv<-|UrLY}EVz>k9itNykb zof&ptDO%1|n=jv*t}@bw7JAvz*-h6`neY`Z{2o^v`iCWK^*;0lJtMpi{fh}c{Nun1 zQT}zSyv_U2n^Y(=y~U4VZuPT`r_s6>>#yBE-)pNw{>-z-g!jJ?LgD={g>aMJ$6CFQ zHN9VVasOgbzMc267Vl$r?-!o=&~obiqoVHraL^y8|C;LziU^ndf*t*G~G1)R3~S9f~oz&O_#U2XlI-ERotBp1?G zcNol0vV^TICweM9BU(=M3?}$O#)TmvyxbDDdLO%jo)O;1)-l08Pj{Rw%74cyZ}UEOB^8QH zSMlTE!0^uh*oFArBc3t!Y@^(<{#Bkm%79Dq*g6(QT_T(V59|iRiyWk61dpL^XvT z<-*gs_0R@O*y?@gPxOqa`_NNNa8UihpNR60Tjg!uhn}E9k?Bc(92}Uv!;5s3)|2Gk z_oOc0{?!L~_84#XJvKD+cHgtN$hpaOA8T#*v1Yq}dY-;PlyBGWV=e7IW^eaL@BKMi z_dWD6IvwZq9CF51VbR1x_gFR3vy>YO-OGhX3E{6Sp`-49L(kai{y`>Kd%}QiJ?B2F zyuI%4r$S-m0e&1DIQacr2WY!5in<^9f3xlqQ`qowOJ`4+>jz+M}CcN+Y)-}VYeU0mk zX000Op)U-xJ3q&T>qO3iC2Xzx=-%{_c!&z#-yw2tlK0V8-bdFl?{B^Em`g?ZcD#>X$-QOu zb`?Jk4lKBA%P&#ye=EFyFwwi)_qon6yKTsi@~{xHdxr=GGs5gv1Yv94haYCnit-Gu zRdd?9k`Vr$=7RFJx(_p8i%g8w&)+O`x@678@6=zin&!R&V^!b6;mu>tM{=CJtOKq z#%}QHb?0^8DlDa}@;2{d3>qR6;{`bm4lH~1#^Xtw={%IToX*37^M82(&mOtK(%E^0 z5U%IKF9_j{max_PNb5K!@*|qHy7#)W80SRVjdLQm(44}^t^7DR@ZdF9(Wm5{qr&^r ze|t(|RXy^AvC7-(KJpwDicHV* z$vH36x~Jr!?Y{GjC+~dV>mob*>B#SMwh*%4j|kTaA!`mGba>y&`^bLG`?ckf zABytrcpuq^drRAWWM6(9960Xqedz3@>wI4KT^H2Od`iqVW9QK9;8T})B_Z||F1(Ce zkFB+Yt=`AZqi00j$1Y-m-^G7ovvjUi-d6Xq^Qll6xqu%B2fj3X?mXgm7bOp^`>ypL zE?N8z&mLyQNuHa8km(>oao2^JOCW6ZKHU1$Eqpoie#b4#BSLArr*7eIa&H-PF5}0+ zf$_~>JdApOkEr{5jrgz__l7GpJ8@LJrx31kp%_btYnIUA{VIA!)P49QCb+rlv>k-^ z4XeDZ?!&98P-L3q$I#d2XVEc2uXuLSyL)N!^m}>s$a|K~Ua_bjd7lf@BIk#eu+{s> z$MlTwKH9+qAFaQ8nJE8}Ro>=(bRa~kFbk} zy6;^mgscXLP&|EzunKL{aw4ZPXGQrlm|)KIPtFm-lc^BO+r2-Hd&} z(^*xoc>2(L{58jZRg4@%47kKml^Y5%>Jp(Tgbd!33)Uw_YTKw^89# z??XT3-cs*FKjX*2fg?BUz*>Q>-$`F!COKnCuXmxrYI+7uWf|8 zNn%D@i5X>hs-Ah>$_Zhq9WkQ}c_I^|9XW<)hU;goB!2f^C%nJDuuG@t0mH1}kvz6x zGi!ZBcnen?W{nwyt#@tsY*y7GE4$F@qer|XCJo^;X)Y*lYxiMRd7>n%H|G8HZ+-Wh z)O+!IXzxAOJgMBpvqxXHboL5jMqlAVLCoksEMcqn(KqNB8*~1}1g}>A^&esBb*sG1 z`{ z&HKZdV8hm55PXO(w#wVRUqXe#`$PG0aNy|;J*$b|ecjyqzMjYp%Z}mMBfD5S`^1y} z$gW&CQ{f`-s8>cfGb`NR;2hDsS^XGE9XcQ=A_I@86q4-(~FEUUiiX+EZ!dCAiU!-S*_YsW=zW3bT z;uvR_|jE(=)>R*ajw8_|!w#&r`P^GJ&bfde2M3N1M*cv(|CXrx%LnTJ6^_PYmd?Jbxb;{+7m8mgHq#QedLP?@ zp0Tx@t(oAx*x$tpdTcYRyv_UAmQ*M#e}*3i2QErJK-U!dek{DdZL1^Cx>#i2$I{t% zhY;?|g?9_#ewNVT{r>cf&HF`6Q2f*DyNdGjt@3v751>Mk=|FxAYYJUgFz+7{-amZX zIbR*%*`p(t&b|#oILd{862cXhu+{tMI6Wi0kJgxA#t;71A;CfeBt(F#il8 z{45ntZTHau?kyW*ZpV*<1K|TRvxwh)pK$L(f!zLSv8E7x!qOS)5{91S!agB<$`U&2 z{#km)R`)M5!Lk3nM?CS2K4X=)*Zp%;D2zPMkAnkOoqOX9;&+IyEKuHuwm$E@wO8}( z;bBW>XgeW{bKz_uR4ieu_u&jZBfJk6m>{t8F+UdNQ&xGK_u(uRicC3v92}Uq=;afs z_u{!#D0TlS&&}i6V@Fv!Lj@r`nhQk-96QDmwt63H?Q3Hi&077+wA+srO563dvE?+U z$aDff4i4%WxhTFx) z7@itUYK5^fJDh;HGugy&N;mV#BJA*FDv4yWn1H?U5)f8e$tTo&B2mmGQ}MW(hIJXI zib19V;`%UZSq^{8Z-*^kjeItd%_wP2OX}HVBArPnX>idn6g`tw6Y)gC$Ye7qy~Wo} zxOs!$ZZ?B;Sl()CBB!emk2Y?m;-;17(N8HyeP_eG4*3!=E?q*vSHT9hq{NGOj2)k zjMxmVKI!IvLz`5Q^zfg~Ix$!AGIzPt_ZMUurN zIgTV{lAKJE?~vqNlH5j;`$+OQNrnNN~sBr!5Xj*c4vWHc{9gB1wcK zXJ&0h65`SH4@hq^O|5RLMtiNcYY&#v z!efXOGhQd(yiY}PMoA^&W-^tI=L|KYCk!K>j2F|zq+urXd>S@8VK?Fwl6Jgy^V1!4 zxvAw=4#21Kktv_bTb@4(SzDkm{B>5Ui$ZgaAb&{M%lJiM&0ZA?-$wegj21!W6>%W8~my+b0B)N6T;$i3)@qC)Qa{wqnco+Ljc$sHv5HA#L?l0TBCmHXc!3Hc;=26>%f25G}H zHX{jXuQPTg32BxyawH+GZwC4Le8y6e97ht9B;zDmO%ej>8RXJukV~3DT%B<(Nq#_* zpOEApk~~0?Kak`plKhnzzqj{mi3D zqLPHf#h6K2&CHWYLVlW=q{?TKs+@ThNxnytACcrvlH5mmoZ70TuM2E;UbP*HD)``&|Bzy!(qMbHiFRV%^!G&62Mn|arlSVh4b!0m?ThL7plX#Y$H8=LH;#VCY! z*DXU4(ROC$u9PZG*_oY7;~bOm&vM|spM9_b3Kw2fgk zi*(Z+Fd7u3SE((r9mDM;%e3bbVaCRb?v&N*w~d^;j~?8eUQGMMLis>{^jl~ z*TG@ODOGyvG+d-8vGsH58w?#{a@R#pkReP58NGFo(OU-@y>*b$ zTL&3RbX-7^Z;<3-lDr5>vua`d+Q}Nqv}uzhJXN5l5$Lg^7}7dtgYB+naH#O=9{9of z$&a?G7T6Pp4Lposqf#l?NiadxisTIe*GX8!W^^nvZatW;l0a&fK?V75dPg99Oki6Q z%8SNxWjRR5C-~8tLF*u-U}$X3ek7bCiDtDpu(gQgUEgmF>s}{Vh-h*R9W)F$&Ce#K zhpLTHaw57o0HNyUu{cw;B{VKtBT!fj3pK+$+~#n#JOOb(>%%M_c{4QFg2@I%-cqNQ zg)nwhAL-tk_Gz6>qv6KEF9;9ZIJ{D65GjeA_nEOZF!gRmGoNo(Nq;=9m*|QCKW|l2 zoAVIPY_U2H(T7LO#UwyFxhNJHkk#ANXn{-DjOz>Qb%+E>%}>$>Ijb57K&-JX$@F3f z;-Zy@7MI3Xng)rbez00i-FwJ!{pEZA+Yy)swGJEQLIm|CH5g{l)?qb+0B;6?$pF1% zz}N7n#}@?$9d5B@(;#UIt7$q3&g~$ao5#Zp*Jm$px$+*WC|&rE3FJ@Ueku1cHGr zCaV**KrY<2cUyJ9n#lt8Vv`d+XLa`k~WZbovQz@P88%wTZ2@Bj%RQT4*%g?X1&lIE^-&?{#~% z!?x~Xdzi4$Ycz$ejc)IZt+gZPmcrs^@qZVZ-UV#V>(vfTUAc|5&sc2ZUXS3V>%4S* zL#M-*xQNB8zIFUt?`1bm)>dt)t?o9S?=80ZjqF{`e=efb;r&wQvhFOTt=aE~pZmg5 z&;6&#+Qiwl1DY-7p3R(ItFxuHe{Z(qb!S^mcd`A{Gr5G?L3`KX=VAD7qF0+_ZGI!? zj$*X1ni-p|4r~TfoD*0*HpoRwZSQ%tE4V!m3e1$4XMJd%CYzrTcJ?}WBHTj!+O@;C zy{A)q%D&z39Dk7Y4Pk3Y-6yvL{)ys0nc^bkADi?IJS9@pDU? z7keFcjyLahSkH5JwiY^$cQziI*FiH&H=dmyZ)F+taVZCEtsOhJbm1Pa)4@G;x3T$# z?{$0InX{YCp#2?@GVodG6&{<1n4{*FP%(GG>7CtVds?0BZ5_*eW1&^3p+UYf+(Q~5*5t|7WJY;Su^<)Hd=LF&DB%y*?h>s5Bx8B_}1F$HVl!JpAu$UbDqGO-l7n-pPju0x6z7j ztSfAp_Z#z#-jaZhyLX}{a3BN~j9MgzT|I1(G4jHy4YkNEbM0nS!8H@LM{VJ4YD2qm z30hpEHGf&{Kr~m@^>((Kjoy~p0dq?nHXG5QF01W72UOV|)>+!ZA8B-Ryj=&6cmr$q zE^PN81#S0nnf_vPhI*Z-fut_Pvp*CH(Kt3XS+^TDkE6oo5#V)WtI691gof=XpmEqk zxcS!i5q%MdepHRXvO#wVt`E8%|LlZ7-Nx2j8xQ0n)}_np)-%1D zyh067^?vU`fgWq13*!#acQ!4}v$=+Iw#Rx4fN-Q16bSp;rpBB%&rKbF16-bm_d#@1 zi2>^?s2{#QG|pBu_e8)-Pat(6N}^cTe-Rd^*npzUV-V&+BjX=rv=E6*4J|ZHllttJU0B9yKG!UJ6 z2=U$E^BrC{;OO>_=QkFk=ZnvGHfH9*`tbS2*Q51w=5OhC7m{bi-wgA3bgkwd&)wvK zb*?w>G?MRgfP{vHt`Y+&c;<_p+Ue+#$)IF~9vWD#Pn}xu>YrTop>N)FV(=+CyS$I0 zQhn=+PyO`l>#wnIpQx?D+s$aH#LA{!idCtpr^iw#{qe6Jn2h6v4gNKpB2N67` zQ)BKE|kTo?nl1Q>o%4{j>@;*DQ_`b~#*AK#q7P4l7ODhxV?-wVP{ zcel`PvYrpU-FQGUC0p^Y^KSFy!l4| z>)?}Z7zFrBo9FrUZZL%1!Qs^DI-N$l*S~lRAKj+E;%|kyt==B5c^Q94UDjxCXrgOJ zlF&&qoouCwU~CZ5qhFK#Gq)a$<~Fo3esJ)@Xw7eNcP{vS5I=Hm3FW&Bb6y7zX=Z_S zTs}GqF%Ue)WDwhAj>qRP(PPB)0k^&luV|QMF}ii$G7sBY%f75&yFA%wWq3DS!kQ84 z!}(qG`r&*^-Dvofzx?gnj}GS}{XS5`W7qb96PTbai;0P6)>iNKmV!zP&#bN8liZU4 zKE%DP*8dHlTI2Gj!oNEccW^=gwO|g}A0l;6**w?oEkW}$^dqmn?7j!T8Nj5y>a*9q z`)%R#np~CBr8Cp26&`-JC*<_&$$^%DH{}LQoPA77xqbP~;{`I*8Tsc?zq;X!S2~y= zTpo>UFYjSCb9rp>eHiR!Z!v14n9CnLaA#;q8yapCQxZVA)#<<7G2;*4cEewxHXDaO zMQt{=+rytj10Saif58WQ^9_uoyTjk{p;$DBpmviwTFe^j?m7BKL;Z5 zd4R#3Z*f~YXBqEogC)bhaEku869?K(*p~33Ij7i*rrUAi*VRRMz5%xchQ|?3ZFsHw z{Vh?lr3xj%KxRcXXIG$R*L>suTt^kpghOVp_FMqyo9oOgipQ^~Jfc zePR7B0!h;NmTT9WE4YnLs%AN@x{Bu3@mAKcwTf!QL~Il`ixchNOmWAvvEYb z41wmtQ3NhenEjKsv|Rgq$|#Bnri}D}DVUUCVqy#d!o%@Lzjxrtxq_*}JCDFgC%Z?Mxz}L}L%_3|kE0;QX?NT@D5OJ$3eS zjc>ZFHlqKReu`Az-%$F7_o?5Pew0If-g?PRr`{Qu{mJ*=cEtm2{us{WKQ>|}y>haD>_O%>O?k;jVBjx#j$h>8DkVZg1t#p zlxX}ZiwuoVwv{*Va){vXwC^rQh7!ZJ`1T1ZjPN`uB9xduBsaZJV45E#Ruclz z6gb8ux2%mxRFoLc#fBJSM2QWJK-ThbSk1p*jtW-s@m-*fz(LtZNO7P9#KPO%CjgXv zj+vg{si|d#RejHaLk2ttFkZ@dw{W6xuQ>Sf#IBvuN4RnuTZF?_%CYj~zylS2JpGS* zwNqCZG4*|OG1>~edcqa-&>N)th@?ycV;koS} zfBL3(^=hZgHS2E6foleXBm4}5>j-?zL*Hz8I^O!#82HL}XyNp7Ki0$1XOZ!v^F%qV~vN{-IZ!kfpG4fiKglx8j@QYe%n{RU(rE-As#vs2SaS)ZqmKTF$WI+ zaLlY||Jlv&`O{UeFmdUY_|i`8F#ZAzT}Llin6tgk%WuE-_yhmu{@0{DM<=Da7<8!% zPVId9sO8=^CEmciSBzzp6AB*7C?^m-hEdKw$t`Q+ag1`}8?IuM6UbU_l!KnL>MhH) zx)NiYKw0%;oKP&`JX2zf6U*I)t?m+IoIrYdjKet?7YcA3ei@Dk}T9Jie)kfSr_wC0;H&;T_#U zC6Zt|Ue$@@Rl20|7v&nIuGZxwfb!7+iu1j2d7QxWKmN#%Jn7bV{3IYVs>fqs@&ZEo zF){T_Ow6u-Klh*hveO8XxY>7_VP%qoru3ffM<`t7dIsF8#}$3AoPIW zI-)lYp4-NDwK~zKz1o?XaV8vnshFHoq9IfyAsAL|YdD=&^Z|ctzYO#=5GIoS@Sym1 zd-giZL3$fX+}?LW7J?G1dg`Ar`XM!nYf@4PiH=b5~m!3J)4)84Nhe$M&Y zI}ypZ1zxm)nys}pa~B~Du&)l|pjAPn!>V7QF(Ev5mCV@{{Iwc?;mPwqe;RyvJ1$wp z|9oK3F?<#7cVFiknW1;og5jmScA&AM`^tzY z8Y>m>h@tg?84F*=!$$bj1);x~+{C;>kWVHgh2JY|kJ-bfMi;?1>A*O|GX!xbk?mr4 z_u#$}c!Cja@HNNn;CF$ucVj;OxK}fm>z{*xF9XWZFS#ra@r-U5Wyl+-GT2(MR-akE z5AG3|fDJe=JvXFwHj0hc{glmL_}AwLeG+b%;S(Boa{ReWF9Wym=A($MElGrQTpeA-QCH|FPMqvO=;tx|8R}&qnZOM(JlCmB!Q>uzP932sWT9QWb9-6;ji!f#&c+<@dV2y{nil#7^j{I zS`VPeV?E}u%rHtcNgl4b_aMBX4vSJ&)E0ZSqw)3)+Ewr_jd0D|dtgMoPOnbAPNT2M&`g16Gw95D zZUf08x&ps(Cwv8`6!0Nk*gz32minAOvP&DiS^lphI6T@up7`v0*GoT^6t^dbM=t0< zT+<+hzzY5`0-lirB&IY-G23gNzon$hB*1}_l<1x}onHj=b#|m@Ce-Ir+jwTr> zvaK9nM^@s703brM@oo`}`w$q3&dNI~k7VE2!f>!L&)ZI~X6;jlL{Hqt_IUHDqS2oH z4=#P*Cd`N8S}xW*t=8N$|1mY!z&ngD0#D0zxh_tzW_y;2(wPWM4%Z*w&sV$lmG*=B zmme(iL>5u7VPY?Q7H~Y6azsXg)z0a(7TU>0+>A(=(x2VpgVd7!0bv8Xbn7S9BQh~t zMVR1V7VZOwCcxAX^~9%{y8r33wU0pist4lk|E^T`j}mqWJSP#l^<3CDrewkAaj{c! zU5bO{LKQ;x7KDr@L2^t(Qe>uEqU=brqZy{+`w~-3!*E;s%$gQ^<>cqjT4Gk z(J~M3J>W`M=Cs5zQMv%$`cuD3b*#q*9e~#|GRswO-|sVU0qS1{K}X~W3e1FYcOc{+ z&f9uT#!_!AX{o+iyfNY&D?*?{kbK#YWzkj*UAGKVQZ>W%L{}F@Q?;0e-#yc^L@QNt zDkwS7ZvOfB)jLorC8-pq{+_esG`;EMx2ed=yYN~t(T>DnL$Tj|>sP(nQTat6fBmrh z*k*ye>-?R6&DiYLk~T~3KuCVe+&)?xZeP%3$F@A*(RIZ&ZO?X0**7i2Vus5U(Nav? z6*XOwmXU%62Pp%leEAXeJRMKRjY$2l@W`YVqRt%;vUty+c%aZM?hUCgjbC|ZEZ)K$552JCWy~|xaiW(IuVB;{U-Y7v{Q`(eU7TrG ziMYr}2Lv|}Nc!pmp^|q3hN_3!CCAS=!Do`ZYiloVCRjMkRjs;vPs%pEYWvZs< zxUM5ww(g4tU(`#=ht>+p4>YJNH!gh-`L zk-ZL1zg^@P9kTtA8IygWq{$MULp>?OeOXXFUqts)HBmGS!}L7gRBQ{q(w7y>G??iz z%~CCWNDl0W-WUyGN?U(i5Py7Z1W&Z6eQ(&jF<+uJ*fK_tcy_CgO+ zzTG^lAK->o7P@;(OJW}B-}=}8!ieIL%M^nAL-DeO=0tvE)wQ9x+s=FUH#7FUt(ZLr zgd?9&?#&CKHo>%zNl%kC#b&Z3>58le-+963QL)FjIy3cIHs`=?tv4P2GR0R-;u)z_ zSK{|qT-#UQd;9S)O5Wv=c~DwrWCm+yd70{8QLOqY zxk8`}!#UiJ;5fEp7)1tdW?d|%aEi+Q5#X(n2}Z`q296(7yBZBNu3MRY7(Pn8TN z0n&gW{_xQg{umn~@|Sbj43cY3NB>}oW5leCM{OV7@5VZE1BO?i^x^zoGo>R-tmdU} zc+Ejy&luum#SM`WE`*A?B@96Z`XtnqX{uvOs^Vy-Z=hK?zN`4UrRct5X&B>2g}4!n z0UMk@{krd>7J(PXBK$b{dUMbil0TBB5L@8X&))V?Jbd01;){aLe`{3nRno1uzr)GY zI=$4t4{LpC(ZNHE^$2+QmZ4z{0aF=ZPSy+?!+BShn5;;)p*xnOnTG5tW~Lm-mtD^L zy7|C~sP^Mi4-d{gUL9_%E;bFi)4RGIMbyw2Fv^UZK-?GBzI6J>XaeCSkaF~LQX+$Z z2$15uV(R4?qr9$kQ^?$^5Z(t`1e6Gxq&uR5#RM0FNX(O6yb16I^+iRu9G$-~EWAQ} zF)D>7!H3aV5_?zwvFhJrLp!AV>rTYd!`QJ?b zB)g7Ru$AN~5V&@j0^$WnwV9^ibs$^Jv22;Sx+Gh+1lbz*Ff0$iS0G418BX;0JTEp!+)du`yZs&?EDB^Vg}lR3cOJ+K%);Bo zojc7xd^^)ft}We20?C-oXVv573Cm!j&rB5!1g}a*!}_l)npgogY*CdA!}cxFRvhLI zl}0}rw9$XwVm%#oIwL)kgdaS7WP9)uX)OfP;>-tA!Cp)UHcO4NVym6J<%Vx!{)Rbd zUKuDlW?4mX;|k>d^45!9oH68G#SFQu7Cx)ZyEPaV)e$t6*`DQNt|B{*B}$epVoAzz zBoX6R&2dyuH}J0FD^$5+VBz60O2d8VKT-7{)9MU1Fc<8)y?`{A9#;5fn%L@^b{pN@ z&CWuwe=@Dst>NbQ%RjF=3e-+t$gLSP#XOO*H3MO<-~RA#GSG z+Fu@i4>De_4KIO&Bl9H0Z6{bc{K2LhpPR8y!LeYT0wL57(Bu6j$at~IXe^S$Y}3X2 zABdMRJrrfEt-~s^q+_$eHKS5MJ%8(EQGeyT{*E7GQ0Eh&*dplW9-He<$A3@7A8-mL zO9nBy*8Kk2r-SW-7enX~IYMI-1)}ad|EZ75n5f|1UygiX@IE;B>#~3)CQDZxMb|Xl zvqg^&34C31B**g&*~Utgs!K5AQ27A;gR2g=z4WAyp@PAhT|AY5`Ffp}-{{GFK@<+f zm{Ux39o9rrZnPfM{#(M88-T{YIa6o5o z9<2>GFPNBnn6m9S29_msPsE0)fgz~|OL8t@6T(px4KL3j0cdy-FwpSkPo8=dDjJML zhwlPyFEl1Brwv=~U%tEmhtYNMMFE;PsQF42Mx7{e{R5YNBV(L5RAQW1BWwaC0=C<+ zd#sBJ#tyQ|3>^b>Lv=6{v+>eXd;@F6lH(|7Rbh2t3X~f##mj&5AG|f4ntA4}-Lt)3 zTbU03omTkL*U(t&#sB@L_kc>_H4qUDJ`-z3A|ku24Mkl3VE6qQ!xUVf$h%1))Fgx& zuv?}3DihIMU<%(BF=O>HHBm*$aed!(G5C_OuBS%Drov(aM%nfHlaonmsz!|#EP@{x zF66X}&#c=15QgIX3RokUqGrm*rU*-SuQ`EbOi^Nznh}o*;b5CkxL`Y2qtzIvj_GTL zEO|DTGCc)vFx6m|?byERtDrM4#D_n_4db;B+=U7r$!?3s#v+c{9lq*tZRr^y<&cJ2JK@vB)`i%R=TpU?;9f zuuX{@^}p{`kIGo&)y0UC5u6^V2wb{gNm$KueNV!= zg{^v`u6Xbnz+}Yp4BxbEi^;knGk(}ZyhqTT;w1-6@Z@J+t)m{Bct2&Bir~->HXog6 zF~>T)@p9sBJN(xvghEWs_;dXI-q`Ko;IP)h%ECGTpKEwl%G4DvF8_x*>kxH@=@=K6%<1Kf~9({>SIOO<=s-(bvUSCw*_-$-BvJF z@jThap0P{{oC*aFJcuXWHhns*5oY$;#|IIdGSXe<2^{m{H~m96a~Z5&Sd6~~Cyxz` z%zr!X!mkB!pncD(kB-m4;T^=5^(}N*CZSX7I+iNYmPOMwMH9=Fj)Wy!4Au?DmeoAV zhLZA4`jLN~{4Puy`dF@P(q(KobM7r44jixICNgNW=U#R4Z!@j(EtMNBwvq+IXz1G( zvt>h(e3Kcng5_OV_g##wd=J~qA{IE)R?2N@-~P(gzkyj!;)I#$c;0-cWw(0MZ~&k0 z*$Z7hb{Ou@4`27;FJTB3Uxf09WXlH)3B#$Nv~cg)zsQ*76~)Yw6)nVC`G|op-Z`!% z`K~CbzGlPy3<$*ft)ZHZEHW7*bR5rx!KRy(<3k4gKRcCq#IwKoEL20yfHwDS89N2# zzcj_K-VL9{BQr0nlxNH2fq`Z4WAdO)U%lzDj9Ci0m*w5+znYJA@qLT8txtT zeW%w9#A3jwmIrN~$AYX7IMjlBeYY?(!Y6@OEP@W;G!B2};7phuv41$OM3lt#1smtd zBq0a5>DqcYTJLMPU38OS=uUKx2sS!s;2z=M&Er9O*^mZ=AcX}3tw9XX#?Z$ex1P9t zZ$*6OQYKggHO^ju@Qw4Z#*lWR=OR&Ycxgul9Q+dg<#6hb&oJoULFD%x1v&7~;r<smp^}R@aPc_@$}_Ug7wt-ZgAXH z#wXf=KZK2;vu9xk1nWMQgAH+2#~a3SFtpYL9^ueS9gF}i1;?-Xl@KzO1-(!e0h3`2 z+ay(VO%rRMwxyYpgk2i=GOBQJ!DI&$0XPa}3j<*&T!&2(Z)<*TmtDOvcA=NWQ6Cv( za((GUXahS`C5``oQXMqQRSyI|;#TEVZ^#HGagR*0zJ<}iFy_V8>qKu14BCF)`49MU z-7c?QPtZs(t?VT&1lB|xHvfs5J*Rq&?Fjev-eND)W}Y<$UBNpfqiJ&beXkJS4PKp) z>FU#+AOQ~M(>cVmzWy}CO0NwsLD7RVMPaJR4FFtFRDH|SlV(vIaBz82Tx|GCo{QxY zkIAZJnQ(ZqFdbyJi%H-x;9j!4*;b4z;oKL(Dq)ntfd=nv8y+Q&s@Yf;)kNPkUDtG6 z4^wnQ!)O)rB6!TQs1$}3)sT#=b;Ts3^krIQaWGTju~VM|<^W>BkGSs@CmE@E3?w6U zCM0|7j!$ih>sFj(q@K!2Mry2(WVEh4l0Et#fB7}w==20fJl-k{(&D|F2aBYg*`>je zocfE?K7l>bAWADL5DfHqnAYS5{FpfTORGM4as1GV^UPqLV|lVA>6!(vMvT%h)zv*m zN76J`QuREZy`v=0crC&puBa;EZdn|Qhl!2X$p*b|TW zswE-9DQ%8$?<|&4!KjV2NG=@WCs2IUM(G=ob(Hw=v5wR{2G)@}6V{!6?_Gb1A6jwN zk$Ng;9jUQG*3r81ST}LqV{qPW=D6kvd-XZQH}kWZr;}g!B2gT|W5(2rm;GP-cc*N` z3RrwGgdT^*me{9pP-uWc4EZu5KYRZ z58ZUy8NgVOU!mFEwfFh62@0Dn#&h`bTf_tC+N^^e60L4d?by6^^M;+92jM6@xCNn| z$Ht5pE)G42U!SXodSW_eWG>xU4-a?10zz>*VpSUsgYfAWCB|G#fi2fkJRLqwj;`pk zn@7jHi_#u``QnEU z1<3l@O<21Ps3EQCbpN+-coU=!h;~5Y5#(Vnn!EXOwfWDj`eZsyY zevrk%C^89N!0@UPF%IL7c=$~>L_|OsnufscJTMmA#f}EQi}j=uLjSjZJp^60u=j}g zaRgzh8g~0t%&tY3=^g@Bk)l9E%&4Tw7|F(VjRuR{niYVLG)2YWqx6jkK1%%fz(;Bx z1Ncat3HV-p@y|aU_m|=$MN&`Y;3G9w2tHa@9{7HB<&hr-tsawfbi32q+eHLm{4e*K zPIi1_-ktiqU%d!vETU^r{;I5g`7yTY9hwPMvS54 zseW7xY(udsutrtAYOE3ZM#UN-evDY7G>-#ol+FZeU;U@2+!ptb5?G`3RF5@EW0hDV zb>(60qT4?GZ@|(iNym0r$K`p`r;}fD!FKwaTIXOXFun*P4j&Q`ppE~y@6W$HrW-%E z;#|{3#G9z5$~?tD7_%fwist}uo{Kymisa>St)Q#%(7hwUU}%SkYzP*1;hzo%SL9rg z;WcI=4T~jVTUS+e+w_sX%#ln34w_N9%FssEzGAdd`bI<>C4PKpBQ=i!ZKTcwZIAo# za}JNYNO820dMZa7sj)(|(Yo@`cFxB>`cZJ{^d!p{mi9Wk_qOJzx=T2DYjJ9}F*A#E zsb+iF>xG-};DX-zJ=@p7H-EW8!G7|m zsY#K84Ov?h5kXUVj4K$ume>IcZTWVImOXO>Zu%k zq{a%-N9)Q%-_L%m{~G8!G3oLN`huZdF77V5^!s0iOH0fKe&HbEPCWXV{}Ml_;)v62 z_~P4$92OZfEgtTI*jE!SdZMG6wqoQVuHY~(sc*t2UX2KAj%p#w+pr~tPl*{eX>CvA zS&)#SS2ldtMP@Y_flQgQm9dPheZ?%J^o__eO8od(Mrs}d%SfFG%YO8YhjzqWq&Uk+ zJ(aVJ)L0?QXkB?MyK~{A3t(9)acqRB{88JJPyO01thhzj3=-^+vwruy`0*4cn2dA? z$asUyEhfU&Rcy5y$c~GxR_^d&__^*UrBl*IHHhG)sz^_vSO|bd=0_D#Zy1(&4k9i! zJ{0qGIGi9rT=o)pRW$}9>s&FnD19SxixNLRZjqYDz%5c|!mXR$F#o!^V-)8Wsi$&o zks2%H7Og9fTL;TOJ{;V7G>cEX;Lf$v2t;n+__zFMi4V+vg>iO;*Kl@CJ~N(RPCo0I z=N|vb_z@Ln7Xr0aO%;(Jz?E#tcYI_<)qE52kjVPxxi~gsI6$Icc85$&aWqFz(Cj2`3lxw~ccaGxxBK1_xFH&QL{GxT`@$0}V_MXg_&yrr<50OCZ6F)mJ zKSUzl`h3+X7ym8}k%$Teqp?(o#3z67`b*-6R-9kK#2*8pQ zi=XC`N3_vHB%-Pegh;3s@{X8_q`0=L7)W@Jcym?6ToY+*e2fk?(L^FGNen|IA{mv3 zNRSq(n01uC5m`rxA0O*T&0}C4sWV~S!-f?e1`99I;;bX}RL(k5V}-1vb>*?{Dsv7e za@L-Zu&(<&9MSDfhyP6Z9X99TeBj;rQ_dHkpj{8oj=_r|@X!H)@nCM^t`FU)eWyJ7 z4CZ*)i&PO*fGkKlLmGG2wUM09MTSQauCzIWx$BF0`VQQ=Fj%{2UW$M)+yf5}gFhWc zmdG%Ttl|h%F-2Fwu}z8&cVC=bG*rH_g*DO^6+@5GHzM>X@#BLYsd)_0BXuUw+j8MU zAB;Opap;kHDu*7au|nw4y7HiR-o1ai1B^Oxpr=RB%SYYGyH0-};`u`u@ZsEQo~b;H zc)jZl+ppajKcW)DIZ5S*3%VYhU>)S*hW{9RWs#GdXY9ezQ+Z4)J3$TaKVniuGGF&R zBqMQc%S2XT)5N(6m>fG;*Tb2RSmKj#@(xb-Gh>ofwZMjS{43YHVt!HjM&uVIeti5Q zHIIQ`q|St28&;`F{+{CeBK1_xFH&QL{GxT`@oVpnU+kBepfDnu-ca6oBQrPcin*SgW=0F1Gn(&7;=;M?Rif7mE|GF48=ok5XC}rR}(3f;S8(T z9{z9wAGh2{gn}ua6P$;4E)3T%a%qFZ8r*ZSi{Tm;vX$6KRSdTi923G5JR_ML)(7E2 ztT;ImDsyfl?NKrOD19Tsj}kvV_>r2&06$V^0>8%RrGJh)O>y{sj))%(Yo^B z_uQS<7r?2099G!Phv28?v#)#cYwv=~?jRe~U`Tg&pLVzW{G0z1Ke*yUI?KmVnLa#a z4Ht`Yh|`yShK*8eMBtE1-OL@*mCZW04DHkycAg{~SR6!xC}c0ekx!Cs`L2PZZd_eA zapE^(!A##9Vx3wU>PTZ$j5A`X5Db7DqPv!h0HCD(!T30Urbd%?*QwDl{KL2`+W;Y*!2k%~gAd=zdB9NCFq~J+! z-toQoK^CVVGiAjwbi`^g96g0lDP*p*9971FqJa=JRGD6N9=4q2)UrjSV&r@Vir>RMr0u+etaw>HIIRX zq|StekGkdAC&pc94L&S8UO+*V|PA24ZHmZKOd&U0~bWV8ieVx0WS zo%3+i5{}99bQPIB^JHb*SL6y@^++>SOhroHh*YG+kB^F^<}px_)R|E6j?1;1gA-&po=;0m@FY!ku!Ow@2{PwtHPZ%X1XtcQ@T4ycEk z3$iS_vIZwXqzXkA0h~f8x)OqGWq!_{h0!2CPRN&}fzsd{-#;4N6`8a{#eAdmjmS4j z{P_4rY90gMNSz7adb8bsj5|wlzL9z==NqZ9LcYP*Bd;LZA^7t(FWJ} z$#^(6KF?$2wZ*s=WFyWyk6H-o6Cd`h;FM=3Viqeh5y?JfrsJe`cpYO-t9v?JY4BcA zm>Cv|j(HxPXJq{=<{71LM4nON$Hy~L^B8zW>P&cc%a3ooI_@OJc}D7~oM)uQ3VBBB z%H!F#tqxz&>+fg;!S-y%>&VloUjwg|=mZ6QaNKtI{pVrac0m7f2s|Pg0QNr)U>9Uz zhYL(B?4pAY_*48yi*rx)ZFt6U(#WFkI-YL3riMss*}sTn~QNTry@eXPT_)H zTp2;LaEdnK$&f?%L>FHSQT;@8@rQi|!f7`ablCUr8Ns#1_ZZIRv9Pb} z;pA0Ub`%j&4+au$Iy%nd&Rx>Gp(F$2Y6!_M8H)&rJ#!pPXt9aQG^{EjGoFgmgJnzg zeNpvY*@Z7P&dNy2gMKMPR6sw{8Wq!z(l;XgDDmT?AE|i^^dog9^wYn4(L2i1kJM8+ z{YZ@!(vQ}aN55}>;7xNtRzC)VpQeDM!qGp$2yk%ZxAV}?-isKF@Ddd62bqN*#nao# z`~LW}mtGh@uj0czoITDMj@s581t*c|eCHOfB#!G^x`V_gxyyEC12V!p7ovZHY6~Vq zx+vZ8knn^d+b2#ycSQxuhbA(m!&_Q*Y=ns*_BSe3+2$-+@2X)&*m+c#5#q-PGfML~ zU`FXoU^cPtEia5aNAaQDzBQ66kB22SRtYo8itRj@t$*;qe*uq-Wb&5m8m2a9n~go5 z%X)0(t=SzvV=v>e8OauATx@V-_VLHuD#lN-IO0SEsG5q!90M_`8j_~Fj;R_3gWH~i zfm3c~;X6x?;*z?gHdEtT4Q$J*u7)wCXW5v{DvGaTZBfH95weUt0$5&jEJe5QDO~o3 z>{I!sENP;OX-MfCk%pA`@zIdfJO&z)IujaR_4hAL`cZKjl6op1+L0P7q#>;(Ll0S2R4vzy`NonUOlmKr>l6B}1hp4r1A8r+ zYj}v!H(2C z2H2506WF|XWqdmhff&ROVmTOA}1ZsQE@>Fi&* z>wZuB&c6b72WPH?#G?{?X1<9DICN-3 zvE6}PhuooH*%;nT1%&Kh;hLZUS3T9@zAQL&2VR7Zrzt9if~sd=tx}ONL-w&1EoTc? zwlqi@qhk6|`bMN5C4PMLBQ=kKex%NXeiwZ1#w0mgar%*ZDyJW*u|oRMy7K5Z@lTWd z*jO!LRdT#(|Jc|m*uS;VaXcQthVGs_;=Az9BR;_$U6RvLlR|vpH~F~)d!N7X<7ezQ z0`@Fdwmpk^7FOXT5>4yU=a5$^zi~M}n;dIF#C_C_rE0a3(HK`VSU1D1Z68Buz zgOFmN&qh9Y&$M)YY!J?~Fo8s*Le=2^k|zfYjOA1?43sJJR1HEx->4uY#E%h#l;&}O zkkXleaQF4y`M3|203oHPdJs|?s{|pbD-VPpyX}vB!?*A5;&#|xuhV2pt%crn=8s^+ zGr0NtmyfL54>R8Mg%J0MgsbT<5*FTf{VT6HB7Tm=hk)4abu<|X@vu{(N=PAqSXm|` zalEKXNMvQ@vGBT*EKJ|OkohAphv2%R>|pbmpNXdPoG!AhC^(MMadgSk4BgO?%U(g2 zg>>1<#($(GD#jkAZ$#`-;>U+QQu7$FN9s(l_lT3fHG-EPsi$)6ks2$+9<3`6d#`@n z9q$CEo}6&XX|+0TW1itGjEH^1pM)b8+v_1))F1~JpZ6#cu6{#>pyb%)l>|ftKGTv9 zIrdJaJR7l93#S-{Y<@DfkR4=Jv1JE?F;&z>7kjvQY%CkvJ5*V$^9@)r8ZCx46Aa74 zZiwVMmWevMqQ>e&uS0 zYTyjDRLNkFSjDNeqzx)&9i?wX)=}ce$2wB;7+6Q@Oj!4hu9P^}7H1u)r*hVj8Y^TS ztt*dpCu#5b3=s8{Wc;?rb1**SGdX4>!%OzhDK_7jV?EDZVYTp2cdgq7pP6L}Lf0dg z(UnY{KY!Xw@4urw4-M>0AmJVo0ODv_(sM!6!ccEnr!Hb0ypL2e`QcF3(wd z+Zo6OlP%8oRdC=(lrv%S^IyH|3nKs#%Z3(HaPp*P%ZjW3I7m9hfJJapca_}v@-5>4 zVw!_CPAcNZDapuJt=L#g#7S+osmd0T;QL4#gHyv5Rr8!d4pzIRLRqF_{83M0MEp_W z$A>>s^BC|)>P+yr?y*0(r#${hJ(c5+)L0?@XkB^ud&~!qx*PcG=SS^?838*yVZe0e zkMz3V;ELkre_oH{Kn_Y@52^i~mGl=e4cDIe`)yA+Cw`p8r^^bWP5>5+xNu&Yi9^M4 zfTfCjI3EcQ$(CN zZo=K#aWf*SUM?i*>eYVrPGgIXsf)7m-DZLsO^XRw1hh`l|p-}ot{#|o}M$wRUwW6(|B_mw|9cuoAQ zii1v7KoD2M2n%^o9ou&?3C0=ZI{XM7_*ScVpu4K%urH{J5dI9REEv8eV=>Uz4N(iKyT(l;W-DDmT?7^!&-6eD#e6#G!) zHzS13k$Nhp7^$&BiqX3AD7JUomp6k&r}FG~yV!1T?=0)|u;F1Z^x!MKdme#Z(-Jm3 zhO?Qz{n^T+d$j{o7Y6Yle$26nncsi#xSPsz%rq1nlqNBz%9`w&*imH&LDP_X3OgRi z9-qgtg8Lf-l@?NU5yDCf9*)EGL>=4Wt}ntv5$EgTC}0y{m3;UJBFjB;*<)!hU3Mxg zTftr~X@iQfM(G<7Yn1r$VU5&02CR`f6RbVsv>&gJJ4*4v8L6jotdSZk#2T$D4{Nn! zZg?!Ph6uN1v6kd&&c|Ep51NWS+!PYx0)v>FXngZk@zX0YT+?t|k*njJ44j97b0U2o zXF@Wp+o^mROs^ut-+&P^sEPvrV%#Yva_4K9dtzI{GVn^l0dmN4ibXmkk;W38>bW>- zN%Qk$REIqrTDP)ID#jkAZ$#`-;>U+QQu7$FN9s(lcj^t-Y>qolaqN+LD#sqFu|n+8 zy7I7h@99tHX<<%HW|m1J&wjE~Y)a&u(EGX5F8iNeZU5wYNLfEDB_7*N-glpULyY!BqA!CuaX9+m~fQ75eY|$A0OdJ&0`=OsWTzm z8*UQ69`};sgd_D-PB>Cyg@mJZUN=36BQ*rZV zx9=@Uz@bVA!=HpiRFH9oS=c7V=nrR-I}T3KG?4qilT6vwkoB2?jIPdx1yn{x(l8a1 zklOd#{l5zr?u?&bar$YxB56qLA}a{0 zmEjVCFbN#i=3yt)!8S$i_^;sFUh;zI-#s!F#Ab*_fQpDD1~?=RYj_e88kizBWDNzG zUQ|^=9(x44Sq6Ztr%F}^I?@IegO1WSBIqdb;{zS3c?_TBxziYlPULSXv;`Af+R8BuqV}-3TkZ=7f&uU;M zwLo!py0R_6!eFI<{jVvTKs&ABhhw|N|L7t6T^@M}8Z7way~J0Tex^L`U?Y@O-6&vFs@)C+F-F`o+$%YcqY zt)!z5N$Iv%J{&*e;*i8vC^C&A1(k2(+)JDsE_;rL$tg0V0z-DL<8tZrSi{u>gNMu) zVG>hktPYwym_o;?>p0!qmo?m|2w!H`w?%AUtCpznE$kr?m2r|ZPsN<1^o__#O8odZ zNopPgCrO(sLH;3QP*9%Wc7?xy%#tw1n%(6i* z=J($7>*IR0)%RF_86!d*VWOCbE_M|Iv2|ev=uFuv z=Epu^fy%MAvc8eAwzBwfVvW!|7OW9E6Rg#@-~Fw)o0P#Cp=S(OBQ#cuHA+_=*1q`d z|3;eU+J=Nnd%R8;DO^0ajjZq3BM#FW41bmm%^GCh_V4`;GLOg+g^&BAz?|=6BCb92 z8DHG`wD?gM9|h{Nsd|`*0*f+OsN;+f%hTYCEFtBAlkYK8_Lz{IY9JhU$YS6nUlWWH zV41SwFxiuI1?!yH#NojvGBO)DqJ~kbgm@GUVQ!ey=SYfH7b{DFMH;JOcvAXCgeN6_ zeDEYSj{%;f&IF!6f6g%n$33bzJV`y3!;{olAv|eadGLJROP_oXh}QS6Ne=c&9V>^s zMB?b~%10>Ov-e&J8!Jiqsi;)oJZ;8QoY;QPA8&YO{0xgz5qlO0!oaSDsF^Mf3Go<` zHA|L)JTS;!s^q4QzN6$gF{w)Gw445nkknH-2}z9= zl91MwN5a3H{=hjT3A-K=A2`Hea%a5wcTdcaFe)`j!Uu2s8xR51xDeIt^P59ER!Blx zR~`wUe&k87BT3jlKd!%oCJ)Y{U-Aj*vMZ!o>^(3SWR5b|+eWQ|)5I;r|Qkus>LP}>s!n@x5qsNaxLP}5dB&0M}NkURr z9tnSX%}(xm(|0^<%wsRP-NKe~t23SXBX=)(;+?x*fwWiY3n8wb_A32FJVTzm@8*M^ zon-DQPD9huY>WySHZ5?73erkpTSHUv(|6zl=qq_NEPJ3x`u>H?AAvapB&n8shJh)Q z6`U(g4u}A3}5qp&Q@nMhDJO=EMIuq=j zp?zwEbCgIum1B?8SRwXkU3u7h=f|$oz^NdY!c3z#yI|Mt1%S}Q3BogozVoJM8b0QE zEf2S5#QHi#!Ywo-Y*|-#6 zR21J&m7EGnRJ zzxHb)AYYenc@|Q|XqN3E)J4^G2Pb**1gGFJ=Dnha?O`WXJRIItb!0kejf(k4=^K%M zl=$)SkJLN{{*gKp{(bn#uQ@jEGR65v>ZzQ6q{a&QN9)St--GTexYKk$swCO%Ol|z~ zP~tg^@|r7e{r*|D9tHR%5~h-JgA0Af{`wou_&F9wAA)v8CK?_SnJ3GL)zwv`w#Uk! zXLu$~tIR{+hbr9sO{z7p>ESaK!#)r5TOX&v;j~PJNe=GNW-k1r6*zOtx~VE^YN;;~ zRrz8cX{3sYNa-7qh?My85s}n91|pI=6C&P!{a3feJ*hYmNj;SlkPhqe&6)LKNTZC(G)$N%Gy{?Ol907ZBjA!D19Sxj}kw=F(0XU4BR7i zCfs}Uv4{V>JoiXFm2;2OSRwalU3uJl*Y?Y^8@z7IS(x+Yd;C>6o%thJ^%`_=x%;mt z@(tefg}`WkgE##}JoKBq?~mHEKNdg7;zK`Kv{eIBOV{*8$3=R4B$Z*Jf^_*vGlO69 zX2E4Qc+>YUWc~=uA?R4)!^Bo|EZmBTjH<}*;L32nLC!!N3nGJn681slOxemdcu7lC zj6F)x1#LE{;Y` zhVQrNxt56C5D~5>mW+X+Wb-65NN$z8H&S|mFwbN{ZuO$<2{Pu$K8A~?B1<0jZ9E*F zF5)~9S5gfFCpIaH6Qp{`7g8BDNh4KEO-kR0)TG3ZkD8?BF;J7#nNaiP|N7w<#yzPx zHAy{{QBOA%%$QB_y6vVIR7oU0ww$BzXhN4sdriP ze_s+mtK!tdforyp6D?gsGaL|5_K@XNM5=uprDU`G%+h7ge+zD02!Dn{K%U4|v{W7L zII8K{o{UqQ981L!Nyw=085+VsbOniH!a|i%jI4CU6r=QwNHI$M_$Wqd9s|Wloe9Nm zUh|p1i+e_KijjIMrx>ZRLWjDt?;9ImZ;4 zNj_4iBBIREO(dMcsc^0gXA|(xH*)i--dSwrFW)G_a`h7eqX;I(ZMudaJjK9iN*L66 zu88#cwu@mMvi`f+lF^tc>C4KQ3glF<0YaLnVk%PlMx-Joetc9UHIIRcq|Stjr+o9; z=g0l1I2B1fl~a+_SRoZ@U3pae%l)tVH&9Vc0N}LdyVxAV053|hI`jcghN8qkT=kzJ z5Z`cu2b^NxFo%4~E2i zGRp#&=o5p8hgNH*>D40&*1g468~DRgVE;E6@gDjh_9j0v1MKaeTm^ZLT1j3&Ld=W< zVPAaGNhg+vp`-c|W|=CE=#^B<#lf05U=FERnB#g#=j`WghrFd23|Fd&kklEQ!mx~h z{DqpY=(en3HqM8AmI_B`B)ZlV%ToD=GMu&zvtJO~z$jP&0!dR;j6h1?hzO*_j}L*Q z<}o0U)R`c#d*yNe5%-tk2qg7XjzCglg$Sf|4?MUqe<5WUj`xhT<8HiY=Le(v^{q zG)l$fqx6kPK1%%f$VX}(1Nlgu3Hct_t2`m@ImO9G>ZzQ3q{a%#N9)QX-vf>BTv&j7 zF6++11u$m>_=nl|pPeBezjTm%FFxZZ-;1ALaq=-+K?-K1m(t*CqWY$1*g7(y0)(n- zic%HR-hCt=uUjD!LIA%1$rxu?Lb4?(p^vaFbfh*NrX&&P@% zb46c)lX32$NjHsShC79-#n{7vABN}3Na|Jr)`cR5K!@u1QGlXCMW>F2V&G$xnU9Fz}Aj zbjA=VEX$JWTe_VhCVoFl_Mx-PqeteW9HIIRkq|StrukIdof83vnQ+zsFJaA=&a`Zz90#0ln#WV`t+ym2fnT;MTrFaeTbiSPi#P}Nr)#DAC= z4=Rp}*ksvaI6+C*m}iP`-bvwap-~y}NP|>NJWAh)#G}NIk9ef!F%XZ`nGo;Ff0R3M zuPIJEQcvZ?BQ;h?JX%*C@s7Cuhi?J#PUFO5O>c1z>o%IZTYIKw;2pTo@q&~tdo|G@f!8?E*i=l0KW$TXEK9-xb~q6e^W$t` z;0}c=*zhIIP%-W(eIw$I5fF4b7U}3 z3^S!Ba$?*CLca0q9hb$AusH5i2RjOyf`DIJHzXf17Pf;^cx}ry6;Bp(a~`~*IPL~5 z5uSF=Eg=Mz5EN{4IEsWU2RO+?QbiL>kyzw&M1&+ONc@MnFGF~n)h{>|6s!PsqzNiU z9i?wX)KTKchdNU87*I#*Oi*|H?vMXA?kB}jN9w5@b)?1$QAg{_L)`&y+Z~{;(W+w= z&*?Sxc#HMU;x4v_$eQI8<7YToIcqSWuK1 z(|p}B;lHfOB0{TO9NmTki{NgpYPQ@jhyffAej7bu6={NssYdA=k!qCq@llP`JO-+f zIuojW>8!iH6!(+jR3r6NPBl_vg;b+;*%Oi42K+J z4P4oBv0kUC`9hGs9zrVMA8C<_`A6v+k$;r<@$rw;JO=)eIuriA{fCF2Tb_TUp33=0 zYOIidw5~kz5Z+|qgGk&ned5A;XJU*8-K}2jBhz^c6_u)gQsTh9g zEH_=tt;KjaeE)!Ko_&HGExMpL7JvwFjD$P1S2JWd|)Isj{%IN&IF9>-}u_iasMekFeLR<4n|UAg|illFWM;8NSodT_8uw>8ht_vqp`vkLDYwJ+G8#_Ze#NepC<`foNES^ZO85U;^kk)$uumRSen$Cpz&k( zJZ>r0Qyh(?p32ckYOD~Aw5~ifp8mLx7+@D-(vqXi&h|P!Ywn)j$8 zoNdQrYZWvXKyy_9p_9t3*BC8uIDZGf;loy@E+U(IqZAWQ;2KJUI-!k zCqg37O``C`$F90Peq_ZlhjWcg$-r^po+U}Ph#d!8)_u>>bOXDte(o;stBYeUsJW1> z5OzXj!Ip4*h+*(;We4kkE<);D)sYMv=UBQ1&QeG4o$Y(b;gYc$HbbiLWg%-{G1Vx2 zBT|hLKR&9Fn#VvjQfET7*Zl534vD)+ajKDeDyJH$u|lfRy0TOQd1^enUJW_;P5_VE zNLs(ivlnKfCwvhG?K^|)eca*`kLY%42FDf)$Mtob&-h$=X6+mwp$DTw`!ucW=rjWxutUv!@3bC!)>iSVs2?;tU4-#vy=E;tqQ)} z&Yay?gG>bWzdT}YX?v%&2Y2CaZP*>w>3_9;ZfWQ4M!P-u%_5h3O6`z0d=9@vr`+(5 zLMsHdJY?@dxYxs;dS-CPtK+tISqhYqd3N>|+(rwxunX&@U17_--B4Jo-orYo=L%sGM10kYXSdwA0)V(MlOe^`qv>HtyLfr1?DEz^uf5Q_+--D1J*lUP zG+Mb&djpCKD3`eZfRR^R?c8g zMiG3sV`0A6nDZ{2Z!T?YvTip-zzK`(UmZQ;1U9TERzDvgdQ!29W$tw;s@CL0?Z^y` zw$#?nEnT$K29^#&{m>agWAn#-z}DK~_^i`w`0#?+;JSDv1^0z74(We!HW#j-3Bfg6dD3}&65Kcp4-&_#GtotOdLY`&0_(Ut_`yce$Ef=D;N_9Dx#$c2 z=u$l;a|cj}%QGLrtUH(H>{c^X^TS}toxHwI*k+cv==CA0H-77;H;4V~l2reRUN?fn z;BeU$mRTzzV|O?#D~M&p?e71oUak0moxZ`K`SfaO0#{V`U1$V?6ZW(^{^-@%7!2HR z$o1!ku}iP}|EV^`mlnyVu?uhaTJbR_EtfwEBunn`=MZ$b)f`ZJgP)7NT8ZQLs2JA> zhjHKME3>`YbEkBaB94vs~QuLp8*S|0Xd(@!im6Qz3I&`XK6b8 zXR5onsaY-I59pduzX0b-4?6&_J?-3!Z5lD?VJlq5wDbEP;X zNhQOSTz6#|N|K6(Yg3$(w32d^q~%slNm6A+lqB_xN=aJ5NR%YSm!l*twj3o%xoJu+ z{_OY9C`(Bj{^7DI<5U)$c7k*9;Hres9ufQbCNehK@u1R729-e=dB^jyq%a$uG?ViY zceanG;rq>(AtrrerHM(39%f8&VvGM=80vD0eJP4gd9{7ly{UoYm`Q>@vZ#l}xG>AUzHMAiz`2w!(iZXj~q&Dp8a^Wu<+IZ!kUdeyFod0-bnf*mld9d9(`I0i5 zfu!toGy2lb*MFdFGg1{3XEJKo15{Mov3(b3^&nFoQnVvuonxp`Gddw@MuET5boev< zdR_b3GOt%!ed*ULDSG&YRQ&ZyDj9ygu0=ZR;u8;2(Qs{wzg}r2`esT~k`z76mEx2nmE=$oaW%y$Nh%ty zO>s)nO3G1^mRmU`NtG2*lGHOQC20jCQIZs2j*_(4a+D$4P(c+8Sq@v;46elCCq#PM(xs{WVR9O)jNj;;IkybDg8AI4Nl* zKT=kw1SaHNs2E=N?L3=Qj&7hq&)A2hd)%7lsJA+mwm_9d|S6A z-9@Tz#}ko^oF5+};(*g|3>jxwU#v51{~;wK3^Q}T*OXxrl{N!gYx(Zi{Tx`>kqJ=>BM zNkkfQL{2k9#xY=lBkog@S$LCY!L&Pw19VuoH^=7rjC?x()Aaaq-9MD#CV6}1xk-s0 zCQS)$Qc8xox$euQxJfA*u1yJUl1fT)layOMHz}1>ag)+BGB-&Dqj8fGUy_@o*pl3& zn>fbFS#ogZSu_4^ zs)_T!UDjiv>lr`FA&wUej>6z8nfI2VCVg|IsY!|+=1g&Fl1hfDx#lZns7Wdsu1#@j z(n`uvla^aKHA$5fQIpg&Dm7^ZBT+XNQvFvEm7cmi6JVTdt zJ{cEP-^EGTmMY53w-nuvsCimK%^*8@gC8b7o%)rJE8~djwa+d?Ncu)f6Ot4?%#`AU zB$W&kaxE)ENK(;oZHg0;R#J|TwA{)GNvf=fkffeb2}vs$iIAlDa)hMCmLnu7H%-XP zpK|zpWeI6|j^bK|CV8&uGMsmacvz$mkS!$KVYV9w#`Y5i@L+~%tXAT%oZvLwBzWO+ z3?C<-!++Rif*0r;84g}>xHi8`@B*nV3SMaD1~1HVz5icpX96cjQ8n<{ojvE;92@}z zB;3dD&V6x)Bpe|jKnNhGJ>5N<$;Y>u2z!t%J6#9=I%~?ZhMhvZD8Dd+Iz+Qaj zcojz5D%|*Puo_YNk^%Qjd8|cMyGN(y$6C~gd#vqN`jP=PUBQqgE4Y4A7Dl50g~)vT;2=w?G+_P(yNHo@Ie<|V4yO_=6+i5hY9viB{OwFzp- zU7O~4i5pSlC9b#ayhKg5iI=FIR(XjVXo;7odNp3+YSnm&>b3LozqcPTq{_>wZgR^%SHgl*lCGix$PUe8<= zY~tQ2V-r>F22JzWM2)zy*|WC_Hc>vYtAs9)$0e3-}ji_ojO`2yT zYQ)V(uhMr7s3CW4nr96994}u;v|Gg~k zmNG9<)o#Kx&r8&Zo0omvDsxHHkh?a`^Ab0r#!Fmp+j)taY!fe0JFW5(H_#FsYE88O6MYQgA!KXnP@U%Mm60q!&;QTnHwf+?vYYy zq-gSZxCyk7m%H)l79v0oPWFi-VPrDMaXk63yH?cCJU(p=V^i^5*&tP?;TrO2=^kdk; zi2{7hAopGGdP9YjxI@aML{+=l(mW|qBMnITwhAdxL+;u%PfFZ~8YywTZ6_savQ4B! z?X*ft+(1jDMAfU25?8B6N>s0%l&P^>f2c}IEf+K4gDzczr#9($K5eFQ$%LLvrZcdQ zO*q1%Qzh1IwLNHP)n)Jkx^2n*H5FXqUMb@eRqX~$^SDHfxN+GJUk^7QDjGH9u1)i} z#Eq!o64%>yT%so1giF*;tGL7sw1i7ky&5iYwQ9IT_1bay_y4UqN)?w;*p4Y@W;7Gt zIER~E;Y2Ezh(r?bJSQH`hogLAnb5|KN~vH#0Mv3B&{@`MS@G8(yg*r+sOV-DCYCU@ zw8!-8QQ8m@_evR;sA@N0n#Uz-#Er`yr412LL+;u%k4xN$8ZL3YZO0{QvQ4-|?X-$Z z+(1jXMAfU|5?8B+OH{8NmtUA4E>Xp0Dq)1Ra0(*%Yi2Z>jwF(CGY+frl$kQq(G{E)ck2|JJOjNa-G0hVbHR2{_pHhT<)R4P2%@Y$hqDD+y zZ`+B9nrss>Q9G>?6F1NjF;Vqu#KhIA5fjyGC+20@S!XB{6QX5AbMcH0du*E!Y(E*# zCsUblDwc>vaz>6n(}}I)dK_+E)~&{s9`mG7pVVQAsdnQ<0hX8%H!S;=9`m3L<*tna zEV0@sJ^)`g=ZmnpEPU!fdqsQLH6G%$3!>UJ|Ef9ej4~xr)o!jd zPf65B14`CZD2WA2D567dCNHU$sr=up^os7ivT-uDKv~a>qOU2A|+K6Qgh_z-WqY*P6%b9SX!-gZdIDb7z&LbPY zNVy^stAB~|4i!q`&L~q7Rqf_V^OQu5xGC9nj|wGGL+;u%Pf6T}8YOYPZKot^vQ3mk z?X*fs+(1i|MAfTN5?8B6NmQ?$k~ zXC!V!jgh$Cwlfkn*(OG!c3Nd5ZlEPbqUzNciK|s(B&yfW$lRfG{-nxCEg#M$qWNep zoq=sdV5yzRq*A#E1Py}c+X*dUF>))xNU;Ml+e~CoE0&kZ$h^Ims?ZU4LYa=JYBx`s zrz2{_O~>9VRp^Ksa@VGLI^ssu=!olWI~`GzZK5M;r&T)Q23n#cs$PwbxLP$jqI&Ig zJn-%PH&>-&PRr+`upN9Z9*-qq+liPSOTrDwC~Spn!e+>P^W#B5$EpS!c2;W;oi}Uy zlYXdZf1kW>p$aB(Z$0Tk<4U@Ruwqp`C*(OY) zc3Q}0@6@Nr*yNU6~+TACpP!e}WnUbh#H&>dcBx=M>$?nxEltc}= zYtuX>aU*J!#PznFlBmfxQ4+P&DkX6PEm0CxuSQ8+tr{g!y>?1|xZvaYs+2TSaU++H zX+|cTfsnj$T{p=VIq6g~l@G%$NsE#@E-w$Q)T&y}H1pY!V!<#6MQkjMY;;`B#%+Nw ze7!1=#C=hQB&yntmF6Ld8gWC?=U0IwYRFxi<{^n2QG+C|x9yNbO|}V=sGU|Ji5qAM zlBjw$NaAYMAc^X=L-MU(PyebaB%^UXmd}I}aV@RIU`rebI0+ntU2)>Ed|tl$vx)27 z@%o1}d#FGWx2+6CRJ9u;%|j72;)Y_^JQXOShTOGj9*VdTH7MeG+YUw4WSgLf+G!Pv zxPg|Sh^kkEBCb{qil|;Y6koXQKbNaQF&RzAO*2QH)I{O&Ofnx2XUv2aPe<~wtwWN( z?lVW@;Vo8}6|zaUX_PexXi?O1MKjw-)?jbN-rH5siF>GwPE@rUHqE0GHR48R@7*fs zL=CxX(>ywHBWmcx^|l?IsL3{=6SdPSI&lLnp%YcFhE80q8ah$Ec692igFC3AGiv1Z zgb|0W6r)Kkr-e-&UM!Df5;-lBfvsveI^zPJIxMhZy$#>fiXCYk0s_sLwXtIVfC?>f zr<7@ls&@0Gd0L`I+_dbUsX|NCkh?a`(-JqLMoV08+i8iKY!fX}JFU_ZH_#F-QT1xH z#MP?N64h&`);OlA!Bd=EBA*E7k{QjqMY)@xXnL{+;<(>ym(BW`Z?9H+uf)R4P2&2tks zqQ*^JZ`-+vnrss{Q9G@26F1NjH&OL!+{D$YaTC>R=jPtMZ{DHG%|zPFLj*P0Vj`T@ z^_Y>$#B+(bp(mngGZ8cS<~Z9GN<$S>(`$tl=HyUia=Erbi)Jg67Ea+7ru<^D|1A|l z;*Ka25>@SHO7nz7jkpQf|DFmVQA6(9G*3v}h#Dbry=^BXYO+m)MD4UnNZde6ghbV= z5fWFcMo3hzosh||9(;l-A$2no%NwzLG6vBvlKDtF0dG-iW;$$W3D_=&ufw;IGfM~s z1Rr$6reP!~5c`Y1M`^9Rd;3-Rh`XW8M^v?&D9!T`HR9%DZ%~Dgs3CW4n&%^KM2(NQ z-nR1*HQ6RUqIO#4BW|E2KBDT?_=u}j<0Goq&c}mCwp^{s$7nbgPvtZN_QeV7MglhK zj^?#+OwU79-X#3tdWF&`=@aA?O0rd6w(h`A$-Wy@D2Y3xOi5I=n=8#z5;fwcWZ%sy zltc}=YtuX>aU*J!#PznFlBmfxQ4+P&DkX6PEm0CxuSQ8+tr{g!y>?1of7|8XQl(@r zl8NZ)B<$&sNE^9$0@l(wJ(7vRJxjv~$9QC*wQt%Dzdda7P=(dDd(-aT$5nWVyQR!a zRJEHh&GQm9;^t-VQ!2bf4Y_O6JTGx0YP`htww;%#$u{v4wbLpuaRV*!5>>CpOI)oQ zFHyaAUiN8Q9H`36L^2jhK%|RkES*V4W64M=6^-VTW-=YsGn&p<-7=DzK2fce#%LH` z+n@FsW$(@^gv1?DCM2rb&6MT|i5h7@$lX;4i5ha(rg=i*M$`z2>uozBQIl;VBxOHa|01nyG3BWke3^|l?BsL3|L61CGREO7%Z!4g%k21{J68Z1%0c32+p>?Uuk z!ZH#G=kmE+!bl}jdNdb_nlX5|18)gMH27L4W>}BCHxtY6as|H3$+FbG((Zd+g^Rd( zWiFzs-6UzAi>MJd7yDjP;Ua3tU7O~)h#OJkBCfaXTtrQ_iHoS6R=J29Xo-ucdNnTM zYSp-i>a}yRBVjC62tzxjpHvA7e z9lal`&=Ge+nU1JxH&2?UBWlD=NAKq>dDa{k`WsnSu`lJP`59ESHLBe_Uk&uh69>=l+WB5A`k4Zg(Q zT+AA4P@(Kt2`-RQg~ctmmeXB_9qT!v>rj#$QS&s97~GR_*y5IjZ5ukSP$q_sB*`%~ zPxA;st-&7CM7ddov~C+{BGpJTLXtwwb8yqULZim%=F?qz&2wn`b=!MRcCVvvQtdfL zJPe;67)COYGg7HcG!-L(rl1F;_Joil?DlnTVys*<^<_geS}BWJ3NcDELtzV%-3wF@iF=}qNK~~O zD$OGjHR48O_x>t~L=CxX(>x+^BWj4m^|l?6sL3`V61CGRB5?yPAre)uhDcnk8X{4> zc0?ZcPS@6|h%~f}W+Y(0_OzZzWHM1B9*-DWG@i-i!dgC&v~JD}tp$;VykY7k1HNvx zbFxoqmtx!oyaT2xDDkpIR zEpZZ6uf|DStr{m$y>?Dk?mKn^RZhnBIN&e_U$o|usYsr@6rrc#j!ni$$INJ$zb-}> z+tyUFys}WM>C4RVY;|R!Yz|f?quKCKOw1(v;j^Q|n!de&JEBZTRJEHa%@Yze;wEJO z(<(Db)R4P2%@YzgqDDwuZ`%opnrssxQ9G>?5;xEiAyM^egv8aV5fasFC*;4oE)A&? zQj0~kNIn|TGReH2OdI)JQiJ`Iv}77yi^!+=_gNW@e|z9mKiEDBY%A=vHST)PQQ;--mNG9<)o#Kx&r8&Zo0s16RCtLR za@VGLUgAd7c!}$6J1FXh&faLnD)e^-G#BRpcJ8G|X+Gwkj+Buv3!n@!G32tHhmArX;G` z&6VaUi5hWJvR7$Vi5ha(rg=)@M${;Y>uozFQIl<=Bx&d@KRG zB}C)tSTYeyz{5iE0icZNScM(2;a+!H8;5-jSCuAeS+~Ug=}Yfy6<*?QDf1Fl?Iuj~ zyhM$-dD**-3NKMZ?%FiZOWcSWFLAwX=Ot>gO}s?yw8~4|Kuf$t)vNImSF6TLRIiyM5BWk$B^|l?CsL3|r z61CGRE^z}b;SyD^hD%(n8ZJ@2c3gIxwfl6_bub=IIUa;ad7KqmB*^gDsiWjX^Ej8&QKKuD9)wL`}8{lBk_l zA&DDk36iLKHAv!W)gX!LwL|ie)8C$}3dwXTmd>Rij$=FuFQTVmCqqq#=R0ODorIlV z6B+9T%WcS%a=A8Yu3V;7YNhdPZlVTD@6mC1FrJN&7tr~K3_X8S;Un&bG9OXZZlW~L zN7RU$k3D}^;Uj9uU7P0lh#OJkBd)jYd_+yQiI1qAR{4kb3Ln zj8m`rgDM|m@PZKRV3-eQU>EFkT8pJ2fI%dx<&t^|BCv!lKFXbED(pp}3JvpEcfh8S zIkTpT$z;zpDzLMu+w_%mvyCZDAo-(JHGz0r{`9)6=!D$2YcWAFaAI^Tj&YN6MMnF*+e>HlB8Rm`r%lfXsvnTrOL?A za(qE@XIv~jC!Fs~UOsFzI6XO3nI!!IE-(5o{3PVld8@+Dv7+0rJbV!= z%EI2UYhz>r%0cg{*35Cz0rC?hLMYk)j~Bm>6+h*nJI-Xqhe^9Pj+$q0bruuK^5HK` z$w#^K$R>x-Ew-deY}e;V6|M@JM2FJS`t7XX(YJ5-7gmt|>J7l6m&R9^6#&y&B#6MZ-ghl6qQP2UB-!-FFQucg2A z;Hb6#3><8oTQMEKzT|h-fH6qwzxEN+F;oVbiYIQk_t(sg^_EY-TsF(nIB=9Zyn^N2 z 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 diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index 7df67fd1..efb651a4 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -37,7 +37,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import pl.droidsonroids.gif.GifImageView; import retrofit2.Retrofit; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity implements SortTypeBottomSheetFragment.SortTypeSelectionCallback { private static final String FRAGMENT_OUT_STATE = "FOS"; private static final String FETCH_USER_INFO_STATE = "FUIS"; @@ -52,8 +52,6 @@ public class MainActivity extends AppCompatActivity { @BindView(R.id.settings_linear_layout_main_activity) LinearLayout settingsLinearLayout; @BindView(R.id.fab_main_activity) FloatingActionButton fab; - private BottomSheetDialog dialog; - private TextView mNameTextView; private TextView mKarmaTextView; private GifImageView mProfileImageView; @@ -62,6 +60,8 @@ public class MainActivity extends AppCompatActivity { private Fragment mFragment; private RequestManager glide; private AppBarLayout.LayoutParams params; + private BottomSheetDialog postTypedialog; + private SortTypeBottomSheetFragment sortTypeBottomSheetFragment; private String mName; private String mProfileImageUrl; @@ -92,17 +92,19 @@ public class MainActivity extends AppCompatActivity { ButterKnife.bind(this); - View dialogView = View.inflate(this, R.layout.post_type_bottom_sheet, null); - LinearLayout textTypeLinearLayout = dialogView.findViewById(R.id.text_type_linear_layout_post_type_bottom_sheet); - LinearLayout linkTypeLinearLayout = dialogView.findViewById(R.id.link_type_linear_layout_post_type_bottom_sheet); - LinearLayout imageTypeLinearLayout = dialogView.findViewById(R.id.image_type_linear_layout_post_type_bottom_sheet); - LinearLayout videoTypeLinearLayout = dialogView.findViewById(R.id.video_type_linear_layout_post_type_bottom_sheet); - - dialog = new BottomSheetDialog(this); - dialog.setContentView(dialogView); - ((Infinity) getApplication()).getmAppComponent().inject(this); + View postTypeDialogView = View.inflate(this, R.layout.post_type_bottom_sheet, null); + LinearLayout textTypeLinearLayout = postTypeDialogView.findViewById(R.id.text_type_linear_layout_post_type_bottom_sheet); + LinearLayout linkTypeLinearLayout = postTypeDialogView.findViewById(R.id.link_type_linear_layout_post_type_bottom_sheet); + LinearLayout imageTypeLinearLayout = postTypeDialogView.findViewById(R.id.image_type_linear_layout_post_type_bottom_sheet); + LinearLayout videoTypeLinearLayout = postTypeDialogView.findViewById(R.id.video_type_linear_layout_post_type_bottom_sheet); + + postTypedialog = new BottomSheetDialog(this); + postTypedialog.setContentView(postTypeDialogView); + + sortTypeBottomSheetFragment = new SortTypeBottomSheetFragment(); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -120,11 +122,7 @@ public class MainActivity extends AppCompatActivity { startActivityForResult(loginIntent, LOGIN_ACTIVITY_REQUEST_CODE); } else { if (savedInstanceState == null) { - mFragment = new PostFragment(); - Bundle bundle = new Bundle(); - bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE); - mFragment.setArguments(bundle); - getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit(); + replaceFragment(PostDataSource.SORT_TYPE_BEST); } else { mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit(); @@ -186,30 +184,37 @@ public class MainActivity extends AppCompatActivity { textTypeLinearLayout.setOnClickListener(view -> { Intent intent = new Intent(MainActivity.this, PostTextActivity.class); startActivity(intent); - dialog.dismiss(); + postTypedialog.dismiss(); }); linkTypeLinearLayout.setOnClickListener(view -> { Intent intent = new Intent(MainActivity.this, PostLinkActivity.class); startActivity(intent); - dialog.dismiss(); + postTypedialog.dismiss(); }); imageTypeLinearLayout.setOnClickListener(view -> { Intent intent = new Intent(MainActivity.this, PostImageActivity.class); startActivity(intent); - dialog.dismiss(); + postTypedialog.dismiss(); }); videoTypeLinearLayout.setOnClickListener(view -> { Intent intent = new Intent(MainActivity.this, PostVideoActivity.class); startActivity(intent); - dialog.dismiss(); + postTypedialog.dismiss(); }); - fab.setOnClickListener(view -> { - dialog.show(); - }); + fab.setOnClickListener(view -> postTypedialog.show()); + } + + private void replaceFragment(String sortType) { + mFragment = new PostFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE); + bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType); + mFragment.setArguments(bundle); + getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit(); } private void loadUserData() { @@ -301,6 +306,9 @@ public class MainActivity extends AppCompatActivity { public boolean onOptionsItemSelected(MenuItem item) { if (mFragment instanceof FragmentCommunicator) { switch (item.getItemId()) { + case R.id.action_sort_main_activity: + sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag()); + return true; case R.id.action_search_main_activity: Intent intent = new Intent(this, SearchActivity.class); startActivity(intent); @@ -351,4 +359,9 @@ public class MainActivity extends AppCompatActivity { outState.putBoolean(FETCH_USER_INFO_STATE, mFetchUserInfoSuccess); outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode); } + + @Override + public void sortTypeSelected(String sortType) { + replaceFragment(sortType); + } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java index 2edb526e..1a9bfe93 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java @@ -1,6 +1,7 @@ package ml.docilealligator.infinityforreddit; import android.os.AsyncTask; +import android.text.Html; import android.util.Log; import androidx.annotation.Nullable; @@ -223,7 +224,7 @@ class ParseComment { if(!singleCommentData.isNull(JSONUtils.BODY_HTML_KEY)) { commentContent = singleCommentData.getString(JSONUtils.BODY_HTML_KEY).trim(); } - String permalink = singleCommentData.getString(JSONUtils.PERMALINK_KEY); + String permalink = Html.fromHtml(singleCommentData.getString(JSONUtils.PERMALINK_KEY)).toString(); int score = singleCommentData.getInt(JSONUtils.SCORE_KEY); long submitTime = singleCommentData.getLong(JSONUtils.CREATED_UTC_KEY) * 1000; boolean scoreHidden = singleCommentData.getBoolean(JSONUtils.SCORE_HIDDEN_KEY); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java index a2146668..a1f614ce 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java @@ -1,6 +1,7 @@ package ml.docilealligator.infinityforreddit; import android.os.AsyncTask; +import android.text.Html; import android.util.Log; import org.json.JSONArray; @@ -122,7 +123,7 @@ class ParsePost { parsePostListener.onParsePostSuccess(post); } } else { - if(newPosts != null) { + if(parsePostsListingListener != null) { parsePostsListingListener.onParsePostsListingFail(); } else { parsePostListener.onParsePostFail(); @@ -160,7 +161,7 @@ class ParsePost { postTimeCalendar.setTimeInMillis(postTime); String formattedPostTime = new SimpleDateFormat("MMM d, YYYY, HH:mm", locale).format(postTimeCalendar.getTime()); - String permalink = data.getString(JSONUtils.PERMALINK_KEY); + String permalink = Html.fromHtml(data.getString(JSONUtils.PERMALINK_KEY)).toString(); String previewUrl = ""; int previewWidth = -1; @@ -194,7 +195,7 @@ class ParsePost { Post post; boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY); - String url = data.getString(JSONUtils.URL_KEY); + String url = Html.fromHtml(data.getString(JSONUtils.URL_KEY)).toString(); if(!data.has(JSONUtils.PREVIEW_KEY) && previewUrl.equals("")) { if(url.contains(permalink)) { @@ -224,8 +225,8 @@ class ParsePost { } } else { if(previewUrl.equals("")) { - previewUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0) - .getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); + previewUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0) + .getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY)).toString(); } if(isVideo) { @@ -233,7 +234,7 @@ class ParsePost { Log.i("video", Integer.toString(i)); JSONObject redditVideoObject = data.getJSONObject(JSONUtils.MEDIA_KEY).getJSONObject(JSONUtils.REDDIT_VIDEO_KEY); int postType = Post.VIDEO_TYPE; - String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY); + String videoUrl = Html.fromHtml(redditVideoObject.getString(JSONUtils.DASH_URL_KEY)).toString(); post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, @@ -249,8 +250,8 @@ class ParsePost { //Gif video post (MP4) Log.i("gif video mp4", Integer.toString(i)); int postType = Post.GIF_VIDEO_TYPE; - String videoUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); - String gifDownloadUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); + String videoUrl = Html.fromHtml(variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY)).toString(); + String gifDownloadUrl = Html.fromHtml(variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY)).toString(); post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, @@ -264,8 +265,8 @@ class ParsePost { //Gif video post (Dash) Log.i("gif video dash", Integer.toString(i)); int postType = Post.GIF_VIDEO_TYPE; - String videoUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY) - .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY); + String videoUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY) + .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY)).toString(); post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java index 09d5451a..2a96524e 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java @@ -24,12 +24,21 @@ class PostDataSource extends PageKeyedDataSource { static final int TYPE_USER = 2; static final int TYPE_SEARCH = 3; + static final String SORT_TYPE_BEST = "best"; + static final String SORT_TYPE_HOT = "hot"; + static final String SORT_TYPE_NEW = "new"; + static final String SORT_TYPE_RANDOM = "random"; + static final String SORT_TYPE_RISING = "rising"; + static final String SORT_TYPE_TOP = "top"; + static final String SORT_TYPE_CONTROVERSIAL = "controversial"; + private Retrofit retrofit; private String accessToken; private Locale locale; private String subredditName; private String query; private int postType; + private String sortType; private OnPostFetchedCallback onPostFetchedCallback; private MutableLiveData paginationNetworkStateLiveData; @@ -40,17 +49,33 @@ class PostDataSource extends PageKeyedDataSource { private LoadParams params; private LoadCallback callback; - PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, OnPostFetchedCallback onPostFetchedCallback) { + PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, + OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; paginationNetworkStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData(); this.postType = postType; + this.sortType = sortType; this.onPostFetchedCallback = onPostFetchedCallback; } - PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, OnPostFetchedCallback onPostFetchedCallback) { + PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, + String sortType, OnPostFetchedCallback onPostFetchedCallback) { + this.retrofit = retrofit; + this.accessToken = accessToken; + this.locale = locale; + this.subredditName = subredditName; + paginationNetworkStateLiveData = new MutableLiveData(); + initialLoadStateLiveData = new MutableLiveData(); + this.postType = postType; + this.sortType = sortType; + this.onPostFetchedCallback = onPostFetchedCallback; + } + + PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, + OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; @@ -62,7 +87,7 @@ class PostDataSource extends PageKeyedDataSource { } PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query, - int postType, OnPostFetchedCallback onPostFetchedCallback) { + int postType, String sortType, OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; @@ -71,6 +96,7 @@ class PostDataSource extends PageKeyedDataSource { paginationNetworkStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData(); this.postType = postType; + this.sortType = sortType; this.onPostFetchedCallback = onPostFetchedCallback; } @@ -140,35 +166,54 @@ class PostDataSource extends PageKeyedDataSource { private void loadBestPostsInitial(@NonNull final LoadInitialCallback callback) { RedditAPI api = retrofit.create(RedditAPI.class); - Call bestPost = api.getBestPosts(null, RedditUtils.getOAuthHeader(accessToken)); + Call bestPost = api.getBestPosts(sortType, null, RedditUtils.getOAuthHeader(accessToken)); bestPost.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if (response.isSuccessful()) { - ParsePost.parsePosts(response.body(), locale, -1, - new ParsePost.ParsePostsListingListener() { - @Override - public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) { - if(newPosts.size() == 0) { - onPostFetchedCallback.noPost(); - } else { - onPostFetchedCallback.hasPost(); + if(sortType.equals(SORT_TYPE_RANDOM)) { + ParsePost.parsePost(response.body(), locale, new ParsePost.ParsePostListener() { + @Override + public void onParsePostSuccess(Post post) { + ArrayList singlePostList = new ArrayList<>(); + singlePostList.add(post); + onPostFetchedCallback.hasPost(); + callback.onResult(singlePostList, null, null); + initialLoadStateLiveData.postValue(NetworkState.LOADED); + } + + @Override + public void onParsePostFail() { + Log.i("Post fetch error", "Error parsing data"); + initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); + } + }); + } else { + ParsePost.parsePosts(response.body(), locale, -1, + new ParsePost.ParsePostsListingListener() { + @Override + public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) { + if(newPosts.size() == 0) { + onPostFetchedCallback.noPost(); + } else { + onPostFetchedCallback.hasPost(); + } + + if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { + callback.onResult(newPosts, null, null); + } else { + callback.onResult(newPosts, null, lastItem); + } + initialLoadStateLiveData.postValue(NetworkState.LOADED); } - if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { - callback.onResult(newPosts, null, null); - } else { - callback.onResult(newPosts, null, lastItem); + @Override + public void onParsePostsListingFail() { + Log.i("Post fetch error", "Error parsing data"); + initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); } - initialLoadStateLiveData.postValue(NetworkState.LOADED); - } - - @Override - public void onParsePostsListingFail() { - Log.i("Post fetch error", "Error parsing data"); - initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); - } - }); + }); + } } else { Log.i("Post fetch error", response.message()); initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message())); @@ -185,7 +230,7 @@ class PostDataSource extends PageKeyedDataSource { private void loadBestPostsAfter(@NonNull LoadParams params, @NonNull final LoadCallback callback) { RedditAPI api = retrofit.create(RedditAPI.class); - Call bestPost = api.getBestPosts(params.key, RedditUtils.getOAuthHeader(accessToken)); + Call bestPost = api.getBestPosts(sortType, params.key, RedditUtils.getOAuthHeader(accessToken)); bestPost.enqueue(new Callback() { @Override @@ -224,35 +269,54 @@ class PostDataSource extends PageKeyedDataSource { private void loadSubredditPostsInitial(@NonNull final LoadInitialCallback callback) { RedditAPI api = retrofit.create(RedditAPI.class); - Call getPost = api.getSubredditBestPosts(subredditName, null, RedditUtils.getOAuthHeader(accessToken)); + Call getPost = api.getSubredditBestPosts(subredditName, sortType, null, RedditUtils.getOAuthHeader(accessToken)); getPost.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if(response.isSuccessful()) { - ParsePost.parsePosts(response.body(), locale, -1, - new ParsePost.ParsePostsListingListener() { - @Override - public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) { - if(newPosts.size() == 0) { - onPostFetchedCallback.noPost(); - } else { - onPostFetchedCallback.hasPost(); + if(sortType.equals(SORT_TYPE_RANDOM)) { + ParsePost.parsePost(response.body(), locale, new ParsePost.ParsePostListener() { + @Override + public void onParsePostSuccess(Post post) { + ArrayList singlePostList = new ArrayList<>(); + singlePostList.add(post); + onPostFetchedCallback.hasPost(); + callback.onResult(singlePostList, null, null); + initialLoadStateLiveData.postValue(NetworkState.LOADED); + } + + @Override + public void onParsePostFail() { + Log.i("Post fetch error", "Error parsing data"); + initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); + } + }); + } else { + ParsePost.parsePosts(response.body(), locale, -1, + new ParsePost.ParsePostsListingListener() { + @Override + public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) { + if(newPosts.size() == 0) { + onPostFetchedCallback.noPost(); + } else { + onPostFetchedCallback.hasPost(); + } + + if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { + callback.onResult(newPosts, null, null); + } else { + callback.onResult(newPosts, null, lastItem); + } + initialLoadStateLiveData.postValue(NetworkState.LOADED); } - if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { - callback.onResult(newPosts, null, null); - } else { - callback.onResult(newPosts, null, lastItem); + @Override + public void onParsePostsListingFail() { + Log.i("Post fetch error", "Error parsing data"); + initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); } - initialLoadStateLiveData.postValue(NetworkState.LOADED); - } - - @Override - public void onParsePostsListingFail() { - Log.i("Post fetch error", "Error parsing data"); - initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); - } - }); + }); + } } else { Log.i("Post fetch error", response.message()); initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message())); @@ -269,7 +333,7 @@ class PostDataSource extends PageKeyedDataSource { private void loadSubredditPostsAfter(@NonNull LoadParams params, @NonNull final LoadCallback callback) { RedditAPI api = retrofit.create(RedditAPI.class); - Call getPost = api.getSubredditBestPosts(subredditName, params.key, RedditUtils.getOAuthHeader(accessToken)); + Call getPost = api.getSubredditBestPosts(subredditName, sortType, params.key, RedditUtils.getOAuthHeader(accessToken)); getPost.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java index 117f3cad..31e91c54 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java @@ -14,18 +14,32 @@ class PostDataSourceFactory extends DataSource.Factory { private String subredditName; private String query; private int postType; + private String sortType; private PostDataSource.OnPostFetchedCallback onPostFetchedCallback; private PostDataSource postDataSource; private MutableLiveData postDataSourceLiveData; - PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, + PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; postDataSourceLiveData = new MutableLiveData<>(); this.postType = postType; + this.sortType = sortType; + this.onPostFetchedCallback = onPostFetchedCallback; + } + + PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, + int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + this.retrofit = retrofit; + this.accessToken = accessToken; + this.locale = locale; + this.subredditName = subredditName; + postDataSourceLiveData = new MutableLiveData<>(); + this.postType = postType; + this.sortType = sortType; this.onPostFetchedCallback = onPostFetchedCallback; } @@ -41,7 +55,7 @@ class PostDataSourceFactory extends DataSource.Factory { } PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, - String query, int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + String query, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; @@ -49,15 +63,18 @@ class PostDataSourceFactory extends DataSource.Factory { this.query = query; postDataSourceLiveData = new MutableLiveData<>(); this.postType = postType; + this.sortType = sortType; this.onPostFetchedCallback = onPostFetchedCallback; } @Override public DataSource create() { if(postType == PostDataSource.TYPE_FRONT_PAGE) { - postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, onPostFetchedCallback); + postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback); } else if(postType == PostDataSource.TYPE_SEARCH) { - postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query, postType, onPostFetchedCallback); + postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query, postType, sortType, onPostFetchedCallback); + } else if(postType == PostDataSource.TYPE_SUBREDDIT) { + postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback); } else { postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java index 3fde7f58..7196e640 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java @@ -48,6 +48,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { static final String EXTRA_SUBREDDIT_NAME = "EN"; static final String EXTRA_QUERY = "EQ"; static final String EXTRA_POST_TYPE = "EPT"; + static final String EXTRA_SORT_TYPE = "EST"; private static final String IS_IN_LAZY_MODE_STATE = "IILMS"; @@ -166,6 +167,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { }); int postType = getArguments().getInt(EXTRA_POST_TYPE); + String sortType = getArguments().getString(EXTRA_SORT_TYPE); String accessToken = activity.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE) .getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); @@ -178,9 +180,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { mAdapter = new PostRecyclerViewAdapter(activity, mRetrofit, mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore()); - factory = new PostViewModel.Factory(mOauthRetrofit, accessToken, - getResources().getConfiguration().locale, subredditName, query, postType, new PostDataSource.OnPostFetchedCallback() { + getResources().getConfiguration().locale, subredditName, query, postType, sortType, new PostDataSource.OnPostFetchedCallback() { @Override public void hasPost() { mFetchPostInfoLinearLayout.setVisibility(View.GONE); @@ -194,12 +195,31 @@ public class PostFragment extends Fragment implements FragmentCommunicator { showErrorView(R.string.no_posts); } }); - } else if(postType != PostDataSource.TYPE_FRONT_PAGE) { - if(postType == PostDataSource.TYPE_USER) { - CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mFetchPostInfoLinearLayout.getLayoutParams(); - params.height = ViewGroup.LayoutParams.WRAP_CONTENT; - mFetchPostInfoLinearLayout.setLayoutParams(params); - } + } else if(postType == PostDataSource.TYPE_SUBREDDIT) { + String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME); + + mAdapter = new PostRecyclerViewAdapter(activity, mRetrofit, + mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore()); + + factory = new PostViewModel.Factory(mOauthRetrofit, accessToken, + getResources().getConfiguration().locale, subredditName, postType, sortType, new PostDataSource.OnPostFetchedCallback() { + @Override + public void hasPost() { + mFetchPostInfoLinearLayout.setVisibility(View.GONE); + } + + @Override + public void noPost() { + mFetchPostInfoLinearLayout.setOnClickListener(view -> { + //Do nothing + }); + showErrorView(R.string.no_posts); + } + }); + } else if(postType == PostDataSource.TYPE_USER) { + CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mFetchPostInfoLinearLayout.getLayoutParams(); + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + mFetchPostInfoLinearLayout.setLayoutParams(params); String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME); @@ -207,7 +227,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore()); factory = new PostViewModel.Factory(mOauthRetrofit, accessToken, - getResources().getConfiguration().locale, subredditName, postType, new PostDataSource.OnPostFetchedCallback() { + getResources().getConfiguration().locale, subredditName, postType, sortType, + new PostDataSource.OnPostFetchedCallback() { @Override public void hasPost() { mFetchPostInfoLinearLayout.setVisibility(View.GONE); @@ -226,7 +247,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore()); factory = new PostViewModel.Factory(mOauthRetrofit, accessToken, - getResources().getConfiguration().locale, postType, new PostDataSource.OnPostFetchedCallback() { + getResources().getConfiguration().locale, postType, sortType, new PostDataSource.OnPostFetchedCallback() { @Override public void hasPost() { mFetchPostInfoLinearLayout.setVisibility(View.GONE); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java index 4aec1ddc..bc750c2a 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java @@ -260,6 +260,7 @@ public class PostImageActivity extends AppCompatActivity implements FlairBottomS imageUri = null; selectAgainTextView.setVisibility(View.GONE); mGlide.clear(imageView); + imageView.setVisibility(View.GONE); constraintLayout.setVisibility(View.VISIBLE); }); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java index b4c266eb..81553663 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java @@ -13,9 +13,9 @@ import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; -import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import android.widget.VideoView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -77,7 +77,7 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS @BindView(R.id.capture_fab_post_video_activity) FloatingActionButton captureFab; @BindView(R.id.select_from_library_fab_post_video_activity) FloatingActionButton selectFromLibraryFab; @BindView(R.id.select_again_text_view_post_video_activity) TextView selectAgainTextView; - @BindView(R.id.image_view_post_video_activity) ImageView imageView; + @BindView(R.id.video_view_post_video_activity) VideoView videoView; private String iconUrl; private String subredditName; @@ -248,19 +248,26 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS startActivityForResult(Intent.createChooser(intent,getResources().getString(R.string.select_from_gallery)), PICK_VIDEO_REQUEST_CODE); }); + videoView.setOnPreparedListener(mediaPlayer -> { + mediaPlayer.setLooping(true); + mediaPlayer.setVolume(0, 0); + }); + selectAgainTextView.setOnClickListener(view -> { videoUri = null; selectAgainTextView.setVisibility(View.GONE); - mGlide.clear(imageView); + videoView.stopPlayback(); + videoView.setVisibility(View.GONE); constraintLayout.setVisibility(View.VISIBLE); }); } private void loadImage() { constraintLayout.setVisibility(View.GONE); - imageView.setVisibility(View.VISIBLE); + videoView.setVisibility(View.VISIBLE); selectAgainTextView.setVisibility(View.VISIBLE); - mGlide.asBitmap().load(videoUri).into(imageView); + videoView.setVideoURI(videoUri); + videoView.start(); } private void displaySubredditIcon() { @@ -376,6 +383,12 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS return false; } + @Override + protected void onStop() { + super.onStop(); + videoView.stopPlayback(); + } + @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java index 21e7d03d..3c5548f8 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java @@ -19,9 +19,9 @@ public class PostViewModel extends ViewModel { private LiveData initialLoadingState; private LiveData> posts; - public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, + public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { - postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, onPostFetchedCallback); + postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback); initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), (Function>) PostDataSource::getInitialLoadStateLiveData); @@ -36,6 +36,24 @@ public class PostViewModel extends ViewModel { posts = (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build(); } + public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, + String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback); + + initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), + dataSource -> dataSource.getInitialLoadStateLiveData()); + paginationNetworkState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), + dataSource -> dataSource.getPaginationNetworkStateLiveData()); + + PagedList.Config pagedListConfig = + (new PagedList.Config.Builder()) + .setEnablePlaceholders(false) + .setPageSize(25) + .build(); + + posts = (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build(); + } + public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback); @@ -55,9 +73,9 @@ public class PostViewModel extends ViewModel { } public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query, - int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, - query, postType, onPostFetchedCallback); + query, postType, sortType, onPostFetchedCallback); initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), dataSource -> dataSource.getInitialLoadStateLiveData()); @@ -104,14 +122,27 @@ public class PostViewModel extends ViewModel { private String subredditName; private String query; private int postType; + private String sortType; private PostDataSource.OnPostFetchedCallback onPostFetchedCallback; - public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, + public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; this.postType = postType; + this.sortType = sortType; + this.onPostFetchedCallback = onPostFetchedCallback; + } + + public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, + String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + this.retrofit = retrofit; + this.accessToken = accessToken; + this.locale = locale; + this.subredditName = subredditName; + this.postType = postType; + this.sortType = sortType; this.onPostFetchedCallback = onPostFetchedCallback; } @@ -126,13 +157,14 @@ public class PostViewModel extends ViewModel { } public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query, - int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; this.subredditName = subredditName; this.query = query; this.postType = postType; + this.sortType = sortType; this.onPostFetchedCallback = onPostFetchedCallback; } @@ -140,9 +172,11 @@ public class PostViewModel extends ViewModel { @Override public T create(@NonNull Class modelClass) { if(postType == PostDataSource.TYPE_FRONT_PAGE) { - return (T) new PostViewModel(retrofit, accessToken, locale, postType, onPostFetchedCallback); + return (T) new PostViewModel(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback); } else if(postType == PostDataSource.TYPE_SEARCH){ - return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, onPostFetchedCallback); + return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, sortType, onPostFetchedCallback); + } else if(postType == PostDataSource.TYPE_SUBREDDIT) { + return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback); } else { return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java index 9ad7d23d..0aba1d50 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java @@ -41,12 +41,12 @@ public interface RedditAPI { @GET("comments/{id}.json?raw_json=1") Call getPost(@Path("id") String id, @HeaderMap Map headers); - @GET("best?raw_json=1") - Call getBestPosts(@Query("after") String lastItem, @HeaderMap Map headers); + @GET("{sortType}?raw_json=1") + Call getBestPosts(@Path("sortType") String sortType, @Query("after") String lastItem, @HeaderMap Map headers); - @GET("r/{subredditName}.json?raw_json=1&limit=25") - Call getSubredditBestPosts(@Path("subredditName") String subredditName, @Query("after") String lastItem, - @HeaderMap Map headers); + @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=25") + Call getSubredditBestPosts(@Path("subredditName") String subredditName, @Path("sortType") String sortType, + @Query("after") String lastItem, @HeaderMap Map headers); @GET("user/{username}/submitted.json?raw_json=1&limit=25") Call getUserBestPosts(@Path("username") String username, @Query("after") String lastItem, diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java index a677b058..b8f304bd 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java @@ -102,6 +102,7 @@ public class SearchResultActivity extends AppCompatActivity { PostFragment mFragment = new PostFragment(); Bundle bundle = new Bundle(); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SEARCH); + bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, mSubredditName); bundle.putString(PostFragment.EXTRA_QUERY, mQuery); mFragment.setArguments(bundle); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java new file mode 100644 index 00000000..1af128a0 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java @@ -0,0 +1,88 @@ +package ml.docilealligator.infinityforreddit; + + +import android.app.Activity; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import butterknife.BindView; +import butterknife.ButterKnife; + + +/** + * A simple {@link Fragment} subclass. + */ +public class SortTypeBottomSheetFragment extends BottomSheetDialogFragment { + + interface SortTypeSelectionCallback { + void sortTypeSelected(String sortType); + } + + @BindView(R.id.best_type_text_view_sort_type_bottom_sheet_fragment) TextView bestTypeTextView; + @BindView(R.id.hot_type_text_view_sort_type_bottom_sheet_fragment) TextView hotTypeTextView; + @BindView(R.id.new_type_text_view_sort_type_bottom_sheet_fragment) TextView newTypeTextView; + @BindView(R.id.random_type_text_view_sort_type_bottom_sheet_fragment) TextView randomTypeTextView; + @BindView(R.id.rising_type_text_view_sort_type_bottom_sheet_fragment) TextView risingTypeTextView; + @BindView(R.id.top_type_text_view_sort_type_bottom_sheet_fragment) TextView topTypeTextView; + @BindView(R.id.controversial_type_text_view_sort_type_bottom_sheet_fragment) TextView controversialTypeTextView; + + public SortTypeBottomSheetFragment() { + // Required empty public constructor + } + + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_sort_type_bottom_sheet, container, false); + ButterKnife.bind(this, rootView); + + Activity activity = getActivity(); + + bestTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_BEST); + dismiss(); + }); + + hotTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_HOT); + dismiss(); + }); + + newTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_NEW); + dismiss(); + }); + + randomTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_RANDOM); + dismiss(); + }); + + risingTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_RISING); + dismiss(); + }); + + topTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_TOP); + dismiss(); + }); + + controversialTypeTextView.setOnClickListener(view -> { + ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_BEST); + dismiss(); + }); + + return rootView; + } + +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java index 4c6abc3e..e6ff9bfe 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java @@ -43,7 +43,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import pl.droidsonroids.gif.GifImageView; import retrofit2.Retrofit; -public class ViewSubredditDetailActivity extends AppCompatActivity { +public class ViewSubredditDetailActivity extends AppCompatActivity implements SortTypeBottomSheetFragment.SortTypeSelectionCallback { public static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN"; @@ -72,6 +72,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { private Menu mMenu; private AppBarLayout.LayoutParams params; private BottomSheetDialog dialog; + private SortTypeBottomSheetFragment sortTypeBottomSheetFragment; private SubscribedSubredditDao subscribedSubredditDao; private SubredditViewModel mSubredditViewModel; @@ -95,6 +96,8 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { ButterKnife.bind(this); + ((Infinity) getApplication()).getmAppComponent().inject(this); + View dialogView = View.inflate(this, R.layout.post_type_bottom_sheet, null); LinearLayout textTypeLinearLayout = dialogView.findViewById(R.id.text_type_linear_layout_post_type_bottom_sheet); LinearLayout linkTypeLinearLayout = dialogView.findViewById(R.id.link_type_linear_layout_post_type_bottom_sheet); @@ -104,7 +107,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { dialog = new BottomSheetDialog(this); dialog.setContentView(dialogView); - ((Infinity) getApplication()).getmAppComponent().inject(this); + sortTypeBottomSheetFragment = new SortTypeBottomSheetFragment(); params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams(); @@ -259,12 +262,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { }); if(savedInstanceState == null) { - mFragment = new PostFragment(); - Bundle bundle = new Bundle(); - bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName); - bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); - mFragment.setArguments(bundle); - getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit(); + replaceFragment(PostDataSource.SORT_TYPE_BEST); } else { mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY); if(mFragment == null) { @@ -272,6 +270,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { Bundle bundle = new Bundle(); bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); + bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); mFragment.setArguments(bundle); } isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); @@ -335,6 +334,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { case android.R.id.home: finish(); return true; + case R.id.action_sort_view_subreddit_detail_activity: + sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag()); + return true; case R.id.action_search_view_subreddit_detail_activity: Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, subredditName); @@ -367,6 +369,16 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { return false; } + private void replaceFragment(String sortType) { + mFragment = new PostFragment(); + Bundle bundle = new Bundle(); + bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName); + bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); + bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType); + mFragment.setArguments(bundle); + getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit(); + } + @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); @@ -378,6 +390,11 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { Snackbar.make(coordinatorLayout, resId, Snackbar.LENGTH_SHORT).show(); } + @Override + public void sortTypeSelected(String sortType) { + replaceFragment(sortType); + } + private static class InsertSubredditDataAsyncTask extends AsyncTask { private SubredditDao mSubredditDao; diff --git a/app/src/main/res/drawable/ic_outline_sort_24px.xml b/app/src/main/res/drawable/ic_outline_sort_24px.xml new file mode 100644 index 00000000..e795d2a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_sort_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_post_video.xml b/app/src/main/res/layout/activity_post_video.xml index f0df4eea..d1c3ed58 100644 --- a/app/src/main/res/layout/activity_post_video.xml +++ b/app/src/main/res/layout/activity_post_video.xml @@ -166,13 +166,11 @@ android:textColor="@color/colorAccent" android:visibility="gone" /> - + android:visibility="gone"/> diff --git a/app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml b/app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml new file mode 100644 index 00000000..bdf38858 --- /dev/null +++ b/app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sort_type_bottom_sheet.xml b/app/src/main/res/layout/sort_type_bottom_sheet.xml new file mode 100644 index 00000000..5951b431 --- /dev/null +++ b/app/src/main/res/layout/sort_type_bottom_sheet.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/main_activity.xml index 2d4d02ad..43cb0785 100644 --- a/app/src/main/res/menu/main_activity.xml +++ b/app/src/main/res/menu/main_activity.xml @@ -4,21 +4,28 @@ xmlns:tools="http://schemas.android.com/tools" tools:context="ml.docilealligator.infinityforreddit.MainActivity"> + + \ No newline at end of file diff --git a/app/src/main/res/menu/view_subreddit_detail_activity.xml b/app/src/main/res/menu/view_subreddit_detail_activity.xml index 41e83e7d..9dcdb633 100644 --- a/app/src/main/res/menu/view_subreddit_detail_activity.xml +++ b/app/src/main/res/menu/view_subreddit_detail_activity.xml @@ -4,21 +4,28 @@ xmlns:tools="http://schemas.android.com/tools" tools:context="ml.docilealligator.infinityforreddit.ViewSubredditDetailActivity"> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c7c521ad..80775602 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,4 +133,16 @@ All subreddits Error loading this post.\nTap to retry. + + Sort + Best + Hot + New + Random + Rising + Top + Controversial + + + Hello blank fragment