From 84da2bf59f0d59e0fa3edc6aaf6e25fce870dc17 Mon Sep 17 00:00:00 2001 From: manti <133025162+manti-X@users.noreply.github.com> Date: Sat, 20 Sep 2025 10:43:14 +0200 Subject: [PATCH] Add Azuki (#10543) * Add Azuki * nsfw * lint * improvements * rm null * simplify --- src/en/azuki/build.gradle | 8 + src/en/azuki/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5639 bytes src/en/azuki/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3127 bytes src/en/azuki/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7437 bytes .../azuki/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 13930 bytes .../azuki/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 21959 bytes .../tachiyomi/extension/en/azuki/Azuki.kt | 220 ++++++++++++++++++ .../tachiyomi/extension/en/azuki/Dto.kt | 39 ++++ .../tachiyomi/extension/en/azuki/Genres.kt | 87 +++++++ .../extension/en/azuki/ImageInterceptor.kt | 34 +++ 10 files changed, 388 insertions(+) create mode 100644 src/en/azuki/build.gradle create mode 100644 src/en/azuki/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/azuki/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/azuki/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/azuki/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/azuki/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Azuki.kt create mode 100644 src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Dto.kt create mode 100644 src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Genres.kt create mode 100644 src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/ImageInterceptor.kt diff --git a/src/en/azuki/build.gradle b/src/en/azuki/build.gradle new file mode 100644 index 000000000..45c8850f2 --- /dev/null +++ b/src/en/azuki/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Azuki' + extClass = '.Azuki' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/azuki/res/mipmap-hdpi/ic_launcher.png b/src/en/azuki/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb86b1b7cab017d0b2eb88da53efcb3f8567da0 GIT binary patch literal 5639 zcmV+i7WnCjP)~_#@2j%cU4)N{?+U=km9>^i?Yy>IFq3+)c&>onS`=Y^dS}Z8B zaN)upjg5_G?%1*8X29*u&CQ(#SASRWO!Z_d!|GB_AkCCO+ydyEVar(9R0+d#*`IS3 zOU#=$ug}PlBWIVCl>BFLaq-lmqN1w8!op4i^7y(g?v~@?u1;QFUe)^b>#IKc=%cEq zo_eb4uDkB4;&0ltX;n`?`DE4n`SYuO{`u!B>e)6iKY=vMwK!=4=&7`YHqkaXDG!kK zit}LN*=L`vJo3mRUqAy!p@gofR4Sp$paK=SAoDq$!BvBDR6U&e@TBGY@4uI)pMF|S zKKW!h=9pt-!h{I|=Lno6FTVJqk&zxhe!Lug^wCD|nP;An>gsA~YHIS^q3V_EGdzSg zcco3VjW&W!9+Hk%HUUe{L*tH5BoYVOY^r2iDx9hYGS%F8IJXF$vuM#Gx%=+B<-!Xu zl-qB=UB3C|8)BdH(t5rLC=vqO3sM%F4=yK_MTI(H9w+Q0A47r&EH8Lpq=-`>VmtPkhUkEppp! zx5@PB(*@&=aSZvaAWu}vHD7w?mB>Mb-Q}N4ddsO@`pOAN4+h-_{PIM;LtfB*ebTU$%E54LPFfG6O@65w?;$>e{GAQoo9Er7fzt(v(qSJ&bQYkBOk$K>62 z-!+j#K6CGtS1dPm9c~=6XI_!0;}NSP_z_29F5>y9yC?FVS2n;zS!JS7$fp7a`Ps8) z%L^~OVCqt3O_X#FVjaXHR8>@!s1K?E&4#FkX=|H7_h8BilJsDp{17zuvrqa2Gym-IAF>Iny10lOOq?`6xDSyrdhSO=*Fm1ioE z2C9a2RKs*M9|z(`9(lwMdCK?1)4v#F%Ygh+l7AB51z!{`nc_thKqRg2yN7z`(nJ0m6bXu3ag-)t#Ymw$uyQKJ+ zf`Cc@>LD>#XK;8y4k+j<|5DOh*!`H1`53uxzx_7ELD`hWL9BypM%BO(*?6iQb*!#U zIWXh3L0Vc`EK3TIZ)r=7Jg|MaJXo_rl69-(?Z)-8sjb=9aZ84}&lg0Cq<^jsS^1hU z%YlKI4M|(zdW-F_bgnekL8{Sea}^gaU%7IneDTE>A*Cin%!204@^#C0SpxWA#|C+( zu3DyUUn+B(Hb$Oy@Z_BU<1#!b(-BlAiZCPgH*RDEQHkTwr=NaGv{Ml4AX}(Sqa|kJ zQ!gqb{mCbv2;a4$a>~df5N}Df$Ad+rR-Z! z?sK^&!kfGw#jMX4Wi#frhTRbLSd5Dpys(YmMM-+sN&0 zM|-QxYWP9^yJZVlfg43xj=MfWo2c;DSskf zQil&8E(acXpm{ZzGG&T%>EgXQP=7tT+iMN$h=v@@vej_CTNn?hu89H}>U1-%i@0;3 z8t8Z>biBtp$f~Ob1+h_?_?8z1f_DW5x*fWI|c;^Yi7r^UgE-K(1g>^A;=t z+Q9P40}{U6eixQVF|oqXQD`o(l4^CzoDT)uwCov z#oRmPAk~fruuN6&-D=~;jq==c&&hSyT_@+9bB@^+v{QO2m7=NvHq0QnF-rRM=@W7e z*gmbQ!tO>MfqC1B5FEqF_gm*Whk6e5goD`CEQ{kIH|Ch%@-n5Ja*&%*)o+e@JLVfX zBjj#um9i`0#K2dNtNf5d4hap!ex@|SCu}#nSWcd(lw$KNE%uY3HHbdEqWFRcQju36 zWr_R{cf*DaAvzNg>mWAFLNqhG(?btEB$Fmh63$R|0Z6?}c{t|mwbx!UaNs~W?X=T` zGZl3S)Msje^jmMeWgY-=^1Hw|^M)RY9?A&RQ#g^hfry@h+0EGo0V%)y@{6caLMk)F zI!IMb0jlcfWZzxiZubmM9$tIxHJLGEhIH@V9a8U7 z4az5n&gUMETh>6l>36|wM7f1+feNGi2Z#+3~e zyV=D&lwE%L<#PJzr;9rqkx#HX#9jE|hab$0$1%wAS?-9!9+pIv@Q6=^5p_szoA@NM zaM9`MQHG}F8eumS>FDnqdoczw71()(9 zIpq{!-leJ@lD?~kX|fseciwrYEMB~rq=5>og3rNTv#agmPJm#Ph8IjOpdo?Bbc2qZ zxJag)5bGc+Sl}Bl-S{@f)msac}`(TyYj@ox(tzu=I#@%-+%g>f_rG4X#H=2EF z>*R!}90kYkhs`fPAL`0?y(b zQ;s7uv>Rq=XEnCBA?VWt+E7tZfqVQF>mXGXRh2bs*2w$szi$d>m+CrV1oz9i7S(&P=n# zW}K+<0|dUw&!0cvILj1-+uk@ay#~=axS$LaF4s9AqgPO4Wb8q(Xu3T>r50nPoA+;a z5FNsie&)=XCVE&nH^F~fyoYqpD1?2;!JEnco1kQeZqvxud?`hl| z<0_f!DatKy4RtsiJQ*`0r*-maq!MvJMSY5LpCA&5pyd#7;?}li;R`R-2&yW*di5e2 z3$YGjPQFIaNH&I0p#?HHKOOp1uz*G=;J||Ja!uDE!jn;on1?{zLX_qQ3Ky0QGG|%+ z(S3~`%5qFJ5vefS$ass&`LxItDwH;l|U50S{abI`*JP{;k1g%}WHk5_i27bjbL_<=xhYd;z2iPe% zO8)n5!-Qw%C*lzAI5>l!uAEugPkvXvkMIi(H`+{5DAT0r8=awWXqsdNE`_*ZeQBwK zra6AH4Fhxwv@PS{gAbNOBB%N39VDA8Lt0;74}ahpq2X+75vKDDYG8Rf=-R-&i{lET zi4K`iK3INNv9DZ$h2_6uoI0*#FX3#JaLq*>UQX}M`l8P9B;Fl0dPt5tkBxW`+2$-{ zM~oPeBbO&mcuDqqbT#aTDGeatv6=#0=g?Nlm?q$a0!>H}fXje9JZUvKyc_lK6g+}= z$oa4p`A8Cs4v{p3oRij1i%=98tT@eR#O$@Ut${@v4kL$$1cu0QOXQGCzkdCE6*h8H zTN7wB0M*eU1Tg%IIzihs#7D~=lhYz72U_5#|3Q)^dQ6qivyv_ z117Fad{1oe#xcn2lnB=#pRWMKAwhZN5{badopm^PZ1cIph7A)&k`Y~n`@;FjTd3_3F7~#gO(aPECI{p5tB>ok46$K%@lgkyog~+Jc#Op%X*`E zz&6(coT(WEHy#AgrY_FGB-mN6SO>9E7IfyBXToN$Ra|WSrFpY3Y(u5OC@6)Ew+d;Q zCH>SZ(kF?qPNpt|oZ|{Cj`FiPryc|JvX&aFX}$p%G-!};p!S(DNUVcYy=qT7=_IpN zYRg&CQY#CZHVgNFj6rCimH8=n*<>Ey*EER7ONAUvUdTBqs1lIai#it1lz!h*Cv=jP zaf^dnzn0FG#yZGmrpJ#z{&?T(?HCQ7udkLRE!(V$pPB~4O6PRT000HBNklnw3c{@V6ddAxR|Z~$aA)-kS4#w@i66y zf+LPNLO2c)?+kRxL8>Z;AAY!8aKQzk!q>Gn%A+;k$tr|#2cu9sokl>wfeK$9Kd_wn z$zvMQ3{(u8Ivnc^k>j?uwIMWC(lIBVcw&xRVR5X3Ok<#L(<`sMQpS!QYr2}{amt@w zvrOJ;TrYK);S8Tf0Tf+{fFit$PdyFlam?L!N|?z-kCF4natW>q`I(>r(amv^pYzoN zw>td1hU+>@cP5Q>kS##fYZhlTZmjbuxU&F1mwT#il{`?hLcYVA1HQ3YgOrX5C?E5k z<8y#yD1a>>K$__?pT>NAk~gd>e;iW zOq({%e7eGr?Mu05`!e~ed7Es;YspS*lxOM^%olYIdC~6Z@dA%= zg5b{JW^8~}qYM4HX_MSnvs}h+S}2pY{Ey6P_))5{kmZ8bUGa1F;zYx??h3>@h>at- z1(N0&`@;`EEbMa8UAflwcKHlXj!$sfwy)*s`qlEM9qVN=W;{k(3*L)T^n&Yq+7D24 zNw=<6ynWLVjEuivS@Cw`&+^B*HS+tKZ{?P4OJwqv#dsLs$h;jJg|8AQ!p-jEjQsP@ zKVJq67~u0di^MvJg{UeMA5=Y>2ZKC~c=XXng?lS>9D#~#XcHW<5>N7t#-Ge=Hyu%R z)3&ehlo!jb+m_117~G$(TWt)US-(bJ06d4K1HWv2fVx}0l&d!{lF3^a%N=m^L+HMb z*R7P94Qu5SM9msR57#%Wi*-hULjYeX_;Cflf8>7^Wjf)F=8Mv?4#K8;3ycn*wxvq| zUkb2odDKxy$?LDbZvI1%3ot${s!&egVzL>|;*|Rfx*WrwUGYzdhL`JqkUtv7tdZxD z&a7W6ucC{5h=^dsQFjCKFgoar7DQAghtL_Um(hIap@+)VS6?kW$KyxqH{X1-j2t;K z7Jh)q4;)^8`DOF(mHdE#Q!AaQ z>N(Uci_UTBOgJ6QL6*_MagPU*jM`bVW(m9a9mligOT8*&64}nX`KQ`0I^XC2GSp+0f9C#Oq2D#wEv$8Iv40Zd?)(k-X-b zYm!%8byf0`OD;)bA(|XLdUO&|m&8PnY-(ys;^;fMaN$BzZ?^h6%bz=U?jL9iZK7>( zMlm#-n(Z-(?6(9cjxhY&2PTn z%sF#r=4Rk0{`da?uJi={PtSni=w>pvxx!f(goQ9#rl=V(FTeb9UTtmdnnWT|*3{G# zPb3mQID30v`?mG<_3>lJj>SLv=%aW^NlARurcLpE`}V~vD=S<0PHS5xEW*?hJ`fc^ z=G3WEU&zVHd5{hAjWMi#crwP>8{_JuM~`CBqD3e!F2?xr<3Zn;GiMHF&YX$cZo3VG z2M@-5_uYpNKl~5`ZaXr@wY3b8FDz{L0(m_RteR6sGifQcY|FpjSnfY4II>u{a3OBJ z^;W$8`s*kwD+6bvg~xb24$g`VZ1UvEIC0`c3mXXnOl?UEBP*BE1CTV^7?UUB$7T=k zixVGIeBflT!7Y@Yig8rD){wiFZ+0N?KcE^q#HsH;h zH(Ob95n#$rmWhrEfVL??$}Y_6C}h$IHpH1TXK?r3cSAu)E#R~Auf^KVzrZ7f{qd{Z z9vIWM3vSNsimCa1@M7m;JX;h)->iI@Lo;{({r6+rwr$X#?@zwT8|IW06+q-vtCgGu zj>M*9>FVq2?X!L1!UgN2KS8Z58irfibw?&r`%WZ$^8^NGcfj*SLvb@_NYc8xIz05y zLpXc(EL!VNcFK_f_(lRHBW2NEEL_$l&#CBKVMExaH zG{r3-s|bhP4SzH1ctgQ&3$DdgZQOhD@y8!y%a$$8?X8p4;(G(|rpCBHJRen;l$4;l zy4rTeg&iv@j^cM^2QcmHop`qVA2{Dw6VJ`Knc`LOP20K>+bf zYP1Z$`|i7;Z!1hHS`EO1HO7SI#zfN^A+12(aLJM-SiXEYX3w6D4?g$+H{N)oRh@}f zwTdjT0aawIY{GgC%vz<>eB&CQhw&NX~zYY?P7 ztBq$uAXpbli((9nRFUU~_mM~}wh#f$CoR#jCcmCfER7K>Rv zxzK*cKVsP?Gg$=>-nUm^GDvVbdS|sKONzn%r~pD|^kj^I9+NxnxC1LztgxSYimhYS z%3Zs5#e@kH@Z^(EV#<^$5~b+3ZrutEfc*C1>Y_R@3aSJH@u66eEjscsvIL9L(o&W! zQ{)U7)9mbvFTTKCcin|UhYs1+8b1#}tIZQnJORCA+^=KCj2Xzz&bHuqUoV6CgLFoDF|aLlc)ozW)|)?Y&VNEF(PeVw{9J@#EKb^Req^mf-o#+3k{YfSolYfWJ-z* zz!(Q$*|KGJSE)|4Fga`50my#4muwnYa%iwg^{M=rr@d6Q5!e&Z%S zIZLOrz^qxb?6WW3)VynOEqAA!O0h0GY!o@dK03y!RMsRKRN0)L@3z~PNh%@(Fvj53 zS6{VjufW{fzBdXp+z4ow**;iFbkg$scJK46bLa5z!w+Nb+_})|Bl(2fp7=EnFQUWj zFl&g@=71J~PG4_wHg)XS(bnljWB@!wwrgS{9-On&Cx0~g)JZcqMyLPSpVk#&p6!?-3gD@qpH``Le zb}Vh+#!2kxTbV{i1aqh(eYT;7C7=&umo8l_onEvWfFFtL+7#F}mJdK=5Wph^*FpK} zHtlVI(r0k$ujXEUT3#Ql?mQgDIh`EHpq*?C+XfDUij6GA!jpmhg8vWdznUZ|FJ-FLo-%L_Y7@*Q>p6 zCfcNf*T|c|A`N_Pq7fGx>#R~&FUEL7D+-Iq0C*1*8t8B$MgRm}wD;v?KmlLy&Y3yL zW3WaB%+h(<;S4wq2GtaK#N<2~=qSPG@k%t(O7y^i164)l$N+lx?rld|AilDjuLPPw zGYodbM28NP?AU;Okf?MT@(E_2C>QBpSkVDSOC}e`;#DE583>s)A~Jyf{rf}P1lfL8 zS8A~dWY9mw4xVIEI?e?qo(8OloJlkpDFf0A$tIE3h9aMi)Vr;NF$UVFp^u)1Z!y)0STKbq!(HjOl#Jx!Jt8dtXlH= zrbZm+to*I!9RA36WO?~vJY9AOPZ8|zng76RMFB0TK7&vBP0^!L$7Rww2#W6AyTi}4 z&LNvNZNdW&JOI6ifeCmb6Q&j~PE-K#Q>RY7;~T0r#;CF%H%+U4QPEFA`l)F6@ZsS( z*ct_ef(yv7GR8m$lMy3EVEXjw&?2#O=T00raKK&+>+G!yg0Mjn5nyV5UISfv0E)1V zzpgyBXV0Fuc*XtQCEf$+UPiUgy2S0%r;k0jy!qyv*t>Tx6wqt0y=HIZ7V$T+1q&9~ zTMFIKtzW+$8dcqM@`pY9%Z+X@G#CObf8KX`Eeve)mM{@>9kVd9aw$CkN$dH;+*zJ? zALSvUnA_M`VPRoRb$TugY&c-Bjdjk7H3kzbfx(1>F;TF<0w#!zfCX%W$>E42 zf-#uI*vAVdNaP?af`pJPA&deFqd3yc-mm)Ad)3wbX8Mf|)(`ZiZ&%$|)%R9aS67Fr zleND!>VdTZSflP2SsQ@00a(KxSi{Ay?Ez~8u!cRbhKpa@1J(v$4SQe>7vI?)pjPj- zAQJjOI`gYF02GK0(8UUDFlhXS13thP_2visf{!d)Y(t@lBu0^~zw55M`Yv9)_<~id zR=wHU+S+WetgWrB(-7;gF5X^U%C<}Ojqy-7=Eb;|HF`6?z$f^|oaqB$*^W1y+Od?l zu2%ojOD}CPa^%PfJ$m%GysoZp2UR8dvN}Jrky4NG6f+0Olb<_xu1uIPK^}hiVY&M1 ztL605PnTnkIYy2=@<{pF&weInpMAF6eDlrnhd=y5CQh6v%a$$6SkAMX5i)|wHQ)<; zf^YDVkqZZ*NB~^xKj)lt`VAdA^l2+>ODn)_)(XTb;PTaW$b`IF@z{QdhqiF~_jClk&m~FUZR;zbt?K>tAK;*s*f$wb#mNr=2E0 z_`wfk_uY4Qvah}Nnygr{!c{l44IwNSJOnR`Z}1VmGCsb=cb2WbAyl0!f&pY2>|jo% z011BWRmzLSGPUB~PF{+w&p-cMF1+wUIq<*(g(? z=E(yOJRrk|50^s@IYh>d8z(I-EwBrLw}mi1I``ajPqjRw1HQ9t^{qnzQ$?oHy4a5` z@3y>y%cD8rU>D1*4vvE^zx;CNum>M}Q0C8{ACx4S0CZFq$~KlMLip*VfSh!HYn%9K=9^7J|K{&kJAO+#tzpf@-KQ1mOBUTDR&RrOGfwKNiOKSt(@0q z8@Z_Oc5>r@UF4y4hRXE=c9tW0ZY*0iGzkY8nJS~>$B%a>^*HDVv{P?<+n!m}3*QgO z7>XnBtl2K6$GC|U8lS@hqb1^aT0i=E(92r%upS%8ZwKx!=bNLy-+et9Sl`u&#&rO% zQ~1=a&hU3<0QMRdR)d z@^n=zl??f+`SkW=RMR@DX?)C>F>?R?_lG9R`8spi-rWYuEdzFykxiRR@45z~r1i_f zrA%br$#2)#S1z|8oNqm)PjGpoTCp`_#tb?3*kgq$Z^=|9QLV^lm^p;H99mTp(FXDa z^61c1+piEZp}iRAV(IqVZ!e3$2Ou=LO5b0On2r0LBg*EWHPS|!KUT>k` zTrtLmsBP`MVeE{(k3arce)-E^%F2~1VT)>L-H~eA6%GIuRn^=AJufUdOOwpOAg`(< zx$wmoU&yb2{cB+eiUpdqi(KAsN7>g-tko^VTE*}IHgsLqZwDFLbwI8H7jt*teRnRe zR$}1*sAdlnCsUwmng?CAV;Z_4gnG<)F1X-=-0t4PPPCVrg9h6eo-Rd1?N5TA26?hk zwTzUO@K{$XyY>UEFeRV6`YIN1K zEOHgCB&S-D;fj{!gM?GrH`uUqo{iI+HT0?wzowi`{p1`wp>N(LTNdj_S6+E#s#mL4 z>R+@df=9xbP;wbNdI{dJi% zX;RsS&kU$<6k6lB#na`%MW4wNi)YAtE9T3B))r~AKNa<&E=^-1*{Y-^(wLNgn|A3b zBYJIK#>uEA(zo7vtHmkZ5a1Vu!U0fC3XBc=z!ar-B!|6w@4Yv5P|(nuyK048w_uVy z+&oPlvmo5xJXJ3F>U}wN&Kq*g{7EunZgug4yM0SGu|Sw9w|RSSzWJv7 z?Qegx;O6_s3AeK=9Dr&zRPzf~&8Nq9RMT>-Zql`5x%TiSZ7XH`vN>|rytm{&3ref& z4QY+27-Oc(O=BW4&Xo5AyUvK|1mey+@04)3lp20D2Y>?Gv!BPWg~pAPaM~H`f&;z| z~>K{TL8sPclfzIMPH1u`7Al7H8V)pFWn065J9kI%;Z~(kf)wm5L zmfPd2=IbPymA$IEJ6RP<=W-L4&yiaeeq{Y1(KoY6ro1m!pR#x_ z15nMFs*0*+*i=L{OIOugc~upVp$cEEUyNg-+J1#bURzLi!E>?=gTj@jLFgwq2>VKSfH9=&r?kwsHewzA>ChD zhBPnVwQE;lc67oCCkTOPXlRh$y?e{aC!Z`&J@u4qu)zir>n*TZ)41m8-b99ve7cq* zSv*Yv+o$UwiGR(_&F%)jDiSfbI$l?umF7@cD5@%|N;U(?sOIxjJEqh6u@M`FcH)UA z${u^{QD&)D>}|5iCN4NVdh{sseTLali=CVkyrPrf(LTDci@0TUPg^5msiI6MWw_~I z$`(!v2S7Ey@;C>eMAfW}=fMvlkDhmX5xKs7`^u@Oa-Tb~04>QSd+;GchRCpC!xDn+ zp;;ocRxOoztt&cg{azlOGQ`(cr2uuaVQAAXJu)^~J}K)K%oGklHG8UBwMU?%sw64! z2g}n73_E}N)1Tav2u$Zvf+d6-aSwKGX!DB{`7|H{8&jA3_?unJtS+$^bvK65~#g$hk~uS8Dww zOg5=c4|mw$R_Ux+v%E;5wB`V)hE>m&p{l7K!9~^EZ@=vxeA;u*J%zFScfb3c(DJD? zkhPMgY`^{Xj-aY84R@*)T0`l?9P+W>5;?D;5lYsU-z;Z^l$$hM$=713<^aUTIY1z$ zGbiS`8XgDa@eZCwqlJWWd3w+QFIQh*FPm+)nMccMDC3E&qB0xtxKFzTL5lUj!+?O7 zui(6aD1gXp-q2IL9=I1}DjMRRUM*ei0H~^{YRW#d8HN=e=U~oGFj4}B6s_dJ2Olg1 z!BkS4YPw9AjKATD+?TO#eRtRnVyzf=LLKc)smU(Jde~jLSd?oSRTGFARq(Pl0NgyGiAP~LFefQhv&3p z_#Ti^QI95RJ33quqmu|G`#E#wB$utRy9>scat2wScnI+{NpJxPh&z6JW%Rwy&zVh z_s6vM@WKJ8W(4Q)L@_tddE}cDQ7nrL5YxdKUXDNhc;RtF9zWrnvDaRENxy#mT)>g> zfDKjks7s-d;Ub8eIN)tTtEKgKl{!glNx7$>3!tZg6u1e&DubhyF%j-f2dIg+$$|w7 zLQ;qMx(+2e5TH`rKD_U~`*J1W(^d1BET-|W)uoqSD%I9=ydHK`)uZK9Rb|PNC2puf zrpzd1zTad0z^x^sC9x&Vl`_F_(-0BqD)niCVbsNv!du}0aBv<%>)ecpAJOn~^){F0 z9_~@SHZ7}o9w{$Q@L0KLLi2f_LIYIOM-R=*PzM&nLK-|;|F;|aku8Ih33><&McBq(z}{08~{}6Y$1gc;N-P;f5PL>QY~k?piMw^xaNIG;J=^ zTACd%+%d$A967Q~LQhr8c$iVm(p3{07jM^Jf4%Gep$_>U_uSY9A958)v?{nOSJKop zmUTYb8tFjm3=|GPY@Ek3F1qL<_n<5X;X&-zRF^z7wR6{`_027<#UNvBw{5xQmcrth zr>Ux=`&~zLC>CvTQF0yURq zc5*_~7A{}j*|3wbSaM)l#xfZhqgC5hWbQSHFq^9;pGPko0GtS5`mM;@8`$Re6Nzq4nzfr(;i551Hv zCn{RbSItBslpo4Ax2+6Om+#Z3k4ua03J1U&WVO%Vw}nQffIfCvKC;(lxreob-NNf) z9OTgPz@vQx!qZiwBQ6Q5sxZ`?d+xdJLXY5kosx*1Dcj_rZr_ss=oQ^G&ui5|D@Gq% zamj6dphv(Ukx5G}Y|XyNH(P0jHV2OrV&hFV>lxOw((;f6a6YniR{dk`S|B_G z_yEt_vv$Ori3~6FFwQZ&Hp+FvezqPoYSbuq!yb9;g#hia?(54LeYTc*>nWZG-RDWc z0rDv@M}~MT0}jM83v6b$ynL&(!tLmSvLcz}>XM}6y{ftwWnu+X000cONklQCyuWvb<4AD*#On_9g>0&*el^6K`fokn_U+!-s=H+hWYwt)lF=O0IG zXID4?*!b|n4>K|MOuS~~ z>0yd45Yiegcm(>U0lUg+y|gixKE+0x!>cY&`3jYGz}?9;6jR%3Cj4_ zs%0VD<(Y!=1cyTk?rQ1*oE&4j>vic~Az1~fD8~X+80nn0i5zYx?b`Dx$l?kEV&H>ReL`B=F%_@x3fr#l)HD?Vl z2XE2PBtsf{%hm>)*;*0-LO|I?Kpm>nBM#+9`VNi6psCe`Gz1M1%YR|c&$|ZLVTT=z zTiaGs02&(`GuBr|b736gLFmh-k>_|XW4;~VuR>mFBf!Ha~C{7~{M~}=yvu2T^ zLPI|!CN%5aA<^>huJ|ezmAbk*89aEfackRZ3cxz+tdp^xz8r58ob4eaTp}b+SHl2H zqKyO3=ZHWDB>Ji2L_{k{Ba%aNh?=9XPB^>!uw`L}$O*W}{p(nE+H(pK?dRxY&(2KTwWXlF~GSjWcFV0zp<{73O@eWBf1%QWXc~K&^I$_yd=f|Y- zINL)kS;9*#8mST`owUQJ49&PWQP(6%?UBzD*Bm0Un$pf9Z`%ntrZPFAYd1q&r%6fQb`ByT>re>0JP*VDNSr@4iEl!ZB#!q-+C1hQc@Y*E)IeH}SXjxG! zw#{tE7Sec|p|3BWYy0%J>86`Xt@i=Eg~9=#;;Jg#3MB6hkS=dqh{-_(}HveX(|EWQ8!`^Tihc;Ntei`?Ww%)aJ)`FZxuNE0@US1Ub$%f?oYHj%)HG-TXWa`Rh;bp&=$AiQ%trooI0C?la9e14jT(HM|iX-`&$vq3F z2nSllolYECfU#N4^^O?r5`J4m#k9HIf@1qz9yVh}HCwS<9{&D{`FSSgd*AzBo_Jwe zrvsp>a@}>;$;KORY<@O3;0yy_^5aWp$kp@zA?dZE5*L3O;B=rwO(ou0nxZC%l_oA; zIZX7_F(vg&=qXZ7$cxJ=ALH%w`v>a!zm9t=i(vI()Tu zZ`sV2@X}+KYUm2mIWWnh4bE(6RdR~_2tWQnT_X< zE&iwb*x%gN0)oSUYC7gK znQaSsuP&P-kJ$CY6*fd2H+#Gs@voQV7uGue%bYjbW>YuWRram(KbG6AwcfVyW4YBF z3k}}ICUg4i*X0;<@bEAHF2~QAV2++>J?v9?cIoHxmaSlNA9p2@t5%VA=u9&B?;3m| z@xAxnlQCn)xND(yR0^|-2B59Qe(hPs$sUm7UxD!WId9Q$w+LDYUe>1}k31(tzJka~ z>)&mi>G>sJIA=by%kQeRhl;LBt4Q0HE!!U>b>Hzn5x88bd;acaOd+u@H z0pjxtym(&Z!7FnWk4@9II;=+F04!Lrz^<&a_HZCn)oc&pZ4n-@edU!`gf}61Zia*N zI_OmcWPr}{tLf#@sS_W3I_RK-+!wfbyPwxyZ@lqFVV#Fpsq*xy(MrA|06;Y{NAD;A z7-%)gRTC#pe8$qurm7iQOyDLC>qqp6XPcpM(!@y?_;l#e{& z+|i>)yZ^4l*BW{9n|IFOb;hpODfx!wX+; z;a)fIEUQ*8yXY~Si>Bc#lV53o@7fJQM*%P3ZM<`Dm&?Y#5ObN?R<$Kq&$%x7`zKiLil9Llqu8k z5xz3D76W{T4=tO&6$t=cX@!U^89R3DC&Pvf`^mU*<8HG9n>=I2jFr4l!J96m0Qn+- ztOw-h%$Xxx*5g?I5!>+L!`(kx<6oEj<~P4_|9tI_fBd5`gaLf0&*~$b92rLV?|4iP zdD(-j^NlvzNC>ix$3i)j@pZt=nKM`73w&Zj+E1)bpO~wc7_2bBcdHcuv*G4$bSEB& zUo>gbq**o_xZQ5U9bpH#kG003-(;|J**^FJpWqvF*dhabh0oe`zR5{PJpdVu5J@7s z*a!;@<{8W}V2KbQ|4jsr9pKpU3BJKc_zIulJ9AU@tw;dS#t;TEO!uOo`Np779uxQ` z13thP_yphJBYcI=%th^QMFW5p402MTYw?e~=w=j1#Q7M+HxW2?0AJvEe1nhh6+Y__ zY6$?wFiZgeQKrCeI(R>j;um~`uL?n}0SJv!&{}YJBSN>-mS3F!)K=13>0A%24M472 z{(Z!?0r>a%I=7^?0myYrh4^*n{vQAU|NkBqBqsm>00v1!K~w_(F-w&mBT3}!>U}Pk|0o^~G zWg%vgfReAKJUUH}75S+?VKrf-1YoF3ep69N`e2k4JNWGz945~E(-M4~DMBP{7y~~N zT?RWse@tN1(JKr9Qy1aeM|cFpU>J&*+2g;@S?`r@o9)&5pw3F7xa#)PdA^5Cr>Rbt z%d&QL$k?BeO=(0<<&TtT^P=0)5;z17xtJ^#rJtmTOY?S!!UcCkDTSw%5u>92WnHLlR*Ru09@(lT|C|ho;+@V=yZD&_{Qmzt651ayFKhluVk5$o zT>KwT5*juOt4*wb%XxmYDqkrdreW!I5VG|=((hhHgbA~G@yHoT41&DPCHAYkX_LFS zv7l;>n%WZ)R?VL_SS&qFt9Gm2n?4T;zUPgLZf~iPvw)ci@UuuR6(FgjkU>;$d5o84S*xuUS-rid05naSdwDcT4oKM4 zF%NZ$WDE>)oZZ|aK}muyXZ1IayRl;hvBLDRLicH}`z(I(-T%&iD*i%iQ(vamid_9G z_UMnU(Z{x4tjo-k#h+(aN_jGBvn4T)F1&R*x70`?QN<*slF=f1yE7OWyJV86P-Sgr zx3M{33m-!1$_DqAAz8Rj8=aG^M7(`ml9M8E(IU>=e#ZWEliJOg^Eg1e7e*Nq2OWU6 z@cYx$SZdc_YQXdrn!p(=-|JQX{=jFYBsrE&pk4bpcdwL^l9IY=cpd-EniPqO#{6%B zBCi6pfVRxAFtd{4pkV*C`7$+~gQ=YNcm`$NglDQHoIFFT4YPXmc3fugTsi9yYwH$FqfW^xe1NYLOf(CuWP}_U{%A zQmN%qMi{C)z98c=+Vewy9Q(Qj5W(2_ao7Wk?#yl3s$Q+nv~d1tLOm`XU@5`$s+`)! zPW#O5@|`68>&aXYT)Bvq3waL0b^0X#X+?C2{O=nOJ2s7_5#HY=xF02)%R1po`u=YL zA3P3zo9~^JSEu;>Tl7n&j1^Svdb_J0TWfVPJzr@Qd%$TI#G|UB{6YH&V?zu_wA6jo zhrFMd^I9mk`+QoBSH1;Y9k}Dp6_?%__E@M?$iFBRk37}+a$RhTai@Q;kvA! z627#vw)XOi|94-Y?{f!gJtNwToASAEx~cr>BX`mL?z@=I=~-kHxnTBQ701MX zIdYz&bbThc>Z~B(dG(RuN`RW1*JbB}KJKDGT)b-H=WPTDFkD#wR{3&URsVRsPWbqs z*O_G>MGruX)ESFq@4F)}=3~t;X0vIIGsCQdd&g&kn9>?DnvuN)&Iml5MY5_YA^tTjZto_`N*{XNPhl z@_s845`o0R>PzdTg|(@Xuz1~~E_}UEp+zb3?^tR5Ec!PQtmk92SQlC+tV;8|1H>#` zxzSNS{!`eZNeFz)0V@lGcyS_KXe>Lve@s8oAT0@e#bKsX%$oC@f?d?EP8O@uQHYU} zmoVI1J|97W0=w|y7ovS_)7@efG@64I;-696a`mVj)5%-tM4~;8CL@$e<1p{%n{NtL zEjvhBmKT<#8r5DFCMr74U1?vQ(K!7=b4nqo+}+O^vY{DnQcA6kdI9itI{nIA z=Tn2tL z;QSZ23Fcd_bO|J$t8E-luc>#6nM%9$b{+?MOqI&isg1cW7Z>R@S&^O^dOEeAnJ6~7 zty1w>jAK7l3<}I;Mzt)7E>vi%vx4^plkk=6{r|Lt{r=LSE!sH1{2>?jvtqM8;ESVG zAZIL$tYsWcDEh#zNA|Gg4VAAdac1Z_9KC-?H>-YvupVo3abFkhXv9%r= zp%AEv?J#!?iKJ&4zX3sl(|#MKIStk|z0#KHVtCk&8PD~C@i0Sy*s{XKNj1u&SqOPa|Fx<%NIX4NK_=vHHNT5Je{z#WlD$~ z$^9q{$-n-NBb&{uI`kqQ70jX;+oAoll=yt%*3IB>_-!#rsa^)SvCOS9N!(m;2H{tc z(qh;vr>r{NogaRvrOd2%9@gSUTzMq1LE#$WjYoOG1bLbnKMWE5#J*p$FzVz~ z5Q)Cr1w}eR=*^DHz@=9C5mp1V{b0$d{l+(tbro%-eO%^k)%0j8`17Lr|{6D!nhXu z`epN7|Mjkn=1_|3_oeOs{*vanOg#q?;;aX8CO8J0jm?AyS$SlJlKE;@b>6S^*)T*E zXwUzwPdS)o(;1;%ZBCeJEmp1+Eyuk>mZt=UW_Kq~94HbuXW5wVGDB=$&N6)Z?=O}j zYR^z!X5wIr_G55i381kf2s(eMpA{29(D@@^baJcv6?o43$jggvjK1KUDa8i9s zC8i7)7}f6IwZU|hI^{*&2OCKTAOF*HTi?H*==%$#6oMdx)_EQqIgmp}34oOqiLNT( z#=(6|MAv!(i{jU|gsq9E>!%Y7I|%-Y5l@Kv*m2Qzx~3K=^E~i@yAg@c;xBe{tmM)$JaRy= z(ErU7=vPLu+aI7=La--P=obLHFNMsG1eZue*pq{&lzBvX99FO@gJ7A(_d2rApHMhX zg9vLr4mKV(hXRBH3Q0x+pEv^>^A&Z!aYYmmZntFCShYqS^RMIGaN-+tR22vmBL+cy z%M0~&;4g@XYn&`mAR}E7DG0ywJRxN zWP2paFt2!j92RNQEt6V2{V48iH4-p;v&9iBScpjbfnQV?_eP9=J_tQn(8Aq@{U%p{ zvjb!6!_~oERs89~cB{2skmXQ*TQ2aU-4eK<;gmd6f9lFM@v52H7& zD?eWgx(f)OISjBo@IJEn*{f^`d~ucC{h4W<=(9qTS{0?UrkrzFdD(iHZREx1s!1%} zcytVwT&ZHZR)!3u$b*od!IEt~oMNEQyQ*Oi>uxz$bl@^m(tVIFSaIxD_TBTzWs$-0 z54fZPq)mtX(q<8xncwF0^rudJ(m8VvAG&Edee2JYeeD05Gz(LG^-F?PBCc_$NH_aR z?TB+`yI!s*;ezbHE23)&B09`iJ7nXIqHR?2x<{Ih00GgX}Wh{;?` z65{h*948{yWy(Co^o17vSpbi_w%_BneHH$4LBW_wW5ZW}>kdWa@3c7esUdUMwGek* zRRIOyi)7A+|E*EPJl}+TD-&@L$9b8RmNO)*1bk5>{NAAddk2FR2*TGiFjD-RaaSEd zhFA71m_(CLcr7W2`%t1y=sF&iXw~Z5Zrf4kxItVWO#qS3`Mp%__s=>!wcCp7do!uU zNB|H7Y&>xWHPZa!><6dQ&|i7zrF}37Pzg|0Xevt|A0|$o;aZ{yMDf<&bNz1h@hpX(&57t`8cZJVYltS$8+neCEiRy)s|P>Cl13TwC0%(zr0>| zkqsULqlkDWGn58k*)8T?2kS<(^Qb}^7)xmm6&ksPGrCu`@fPfM^H_Z#`6OnAjEr_m zHQ#`dugcx(Z4`j~E1$q=QbCrOcrQ}Ut$rDNzBsDe4yvb|_gC{puG}DEf5kv3(cJK% z-i0M&RT-!Ge_Ft!zf(eSF^xt`tL~(Wxz5kdMlb82*st1_&g{+i)cy_ZL>2Fet~oFo5TFqmsA!I)0I6~9F0%H9o>2~ z=__0pEikf;<=*wrt&eq_4hlkr<#sF6|ezEwIgjr+#Gz& zpXW=R&dG3GI0`x)3%2sPR^`A#uqP)iRISV$BK10>xb*Y8Bg5l6$_?6^7DsnsQj063 zbdV0a3;NeYQpdc)6BPfUj8ERGiv27&KTBJnsJ@KLBzamcmD$BWmcfV{1G*W&GO2-g zamBG~V`3|}JG=@2VRSV%P)N)$B?_70wD(2pAyPfl6grzT!hofMRk|{8dkg`G z*~rVrgRo|}XmY0+>@lem6=rfnH>V7i0arLfzV_r)IMV62{e=8CvbQUMktmb+RVvX( zqMxORkWvc^OLzNMzxM~fkVC&GFgzIvj7ECj-1AxcWf%36dh}Te>*tRsRk3^r_$msE zet)>N7neU8i#ZRgD#VnhkGsWR$$uYEL{wNiXsR?)3rPEcy(hIxncJ~}?La8NvnOgY zM2n94Xiptg70Ri{VlLk=S>HD9C>T=*W$k0xUKhv0U4Jj%-!2^|xE4qJ-VXgnp-c6m ziA^kH0}cOe?@waLaw>Yz2NMVBou3`oL$fn8+ig`XnO6~Sq{kPRENpOOzxolA(a1z; z(Hd_`xT6yao3%Shw2xEuJ-=ql>uvvnCLH(SQmX?!f~hR4!fLRC3dJ}Pc85cF&=uUg zajeh+bQfRlF*f$*YW#)U?N4Sk#$Rv&7BqmkxGurkW--Yp3f#+uQI`aQ6PhQ&sx=07 z3P^sI>^MwE!4m8mg&d3YSqe;fR)`9x6V}s>DLUct-nkTj(N%oa0rJ>blIi@bUYV}U z-Z6i_=ee9vBaHm_sn@u|Z$^q{Ts!jR=^{f1`G< zhUmPMQgt1}tu5*GG^sr-kp?m5T#2Q*M%7eQ3xSEI;FF{!q!Gg4CdzC6Ql3?vU~x7fF)lz>fr(}dEltR) z>55OMt7VX!ub6$W_rFXbd=nqbX_AWmi=!r%C{Jw5*2Ybw62@6lx=a)j6%pMiER1SB zMqGB_PSQl1!f}R=SYkSsf}>sX$pKQK3rRRw}kN1i3aq>eIy==gJ&m+pp={H#64v#tfZ7;DanDVbI zj!V~3j=a4DTd>8duE4QFP?4FF*x!H_iYAVuh}~E1epJ3V@RKJBy{W%?C>hCikn|>W zqpq!fOx~fw5mhJ7KK{+`0zPZmjj6lrdTHCNosOpL)jq+2ugda z)5@^uN#j%bZNj81_vXXIrT?lN-7>?+9NlN-`UU*AqNw)=9nF?_&bHI6Sxod^`#GjN2qYe+m;pkUQZF-@)}^46OH%`%?OO9bu{fJNWA-ytFTl zHjoivPhP}TJdwBSSW_sxZ2sXy59Q7ns!X%NySeGi8cd^0;yb$vg+$HU{TZCi|8ZvU5W}*R;SeY1mj!Nr(v=^eLH4qg zpd61uYJ~-?o1`C^m;H=1UB^Kd^lYDUS}{2Ke=vNx5F8LkKMOF+sW!>vwewo8Wb%AQ zC+RtL9~UDppTG26Y?t7oH#Es(b|#*_{vV)H3Tjn*0!DPh@4?hzm^H_VBLiFq*?gze_1O1Rcg*T5^441^O;&N;3JdFE<(350u4$oQRwx`mzUTTpyoeRQ~k~D zB+K^1kocR1UD|;F^gRetY0sFzg#Y%3L{DLS))WCCC_N*CWPQX^lQ>MzX~FQQua15A zd!xv5S2D5Lq&UN#iXxnMiC-&~TW4uV0rF(IsEq*mimr}Jt`E+RdF z=M|?*wJw?7U>~^*53W3IG{j2jZ-2DIKk8BE$s!if0q&n|i2QnBCJJA7MQypUMK=(j z%+`eQ6MLV0h+9qlkdPHxT?uMZEOC2s17S4kA?s70T{Ck)vhJCOJwGlCM^}D=1C=oj znu##RY&HPxi6R=sOE6MmtUtfx(l>rEpv8OZ`0?I07|_x|EX?_zDzXbmKHtCkpn;oh zxpaNQYkRiqB0oVQ1Pi+mk>T1UPr|`l%QK=(ZU~X&hH`9ruw*Xi@jr}zU7*N#N473J z!56FD^g%o%sCpoli2`vrok!V0-nqUiPX_o{I_J9pH>@MOGo*ttT)tDNJ+7v^zLLOO zj-fuLL=i{ZW=pe5_JVDozlZVi>*rU%kIvv6Ou z3um+5mMLk$?lDF`;HEzzaO9eC&tBGT*QEHf2(d^J!x`a`8^^LcG1)=9KCZD(i@rPw zgs7Q{RPL4YpR+MS3opzHY$bY#67sHxLj^d7tFuh6c%`ZdxiE8y;LwdC?e2d{Ua?ht zHQ`K$z>p5H!RroQ2!Zi}`!JDh?Hw3>De81=w@FT)l@kzF@q#Z|f%OlM53>jy6E+#c zC{ly~u}NWwbO5=FbC)9SV?r07=Y65O&9n(Epoc2%oTuyRSd!dj14&=p3m?#zFxuJ4U|gRkC+_IRX`m*g>~Mon6$#=hr4 z*>DJ9k1Ykc51>oV+k1;qGvQYdD869M!K!`(&<*&dEt#&75s~*?1_j7aK`;bed&BSj zUsi=;~R{#<*QBi`{G5d-_&SijfZz8B-y zOlo5yVQiPZ`0t~`!uM=X2Rz+hV+C)d6{_!cSVNb%p*r%a^wJ#|JofP^oDPps!1C>R z^wZEtRCzHBegs*%p&BTQ@Q^ekfQf8rtIv{_SQ_V?Gy3Eaiky@JCsZ>>LU&ta9B&j? zY3T*^Y^^aaOl%*lwHY-}sztX%NM41Fgv`TDf6S;%j6Fe}cd6$Z~Wkmj_r$CZ>; z#3*9JXpYVIWx3?&58zdAbF7*aQ0|w`tS$Z8V9UT)u9a4%I!j}Lx+yh;1a6pP|A3i` zp?I^OE0#B#TE%rEttNL(Wq3)O^)l9D*A#!+@$fKqZ?y;;k^kWqG$BQx{g%k~o>wH! zoKcfevvsT^YK(_wquH&3;MI4{v}HfqC{^c}xBGb!CkYcVbTK@VSVZJt*$}PaM=ouZ zDndQ{Kt>~Ye_u-(oM5pO&{FRqEu2k?_bG1hTzdtMHsX{j1Qc$B#ehNwL;D;t;l0F7 zZZq4LN9Z73-ecpRTlAFXqE!;JsnS&IO`AS?$fN>4=Pk~$f+tA}#}1eva23z626&oQ zqUNh5#HFO*_6E%EHC_?9k{5S7V^Yadf1CymB^>=fEr8TfJ#Mb@j=+>D{17yt{>>q) zvJ&n&fp6ww0Y{rJC2ZF+1tCZ@h4g99ym_iF;6{ae>9Ci(u>&we$xiVzo}9njN}@1} zW2f9~Alkq=-Dmff%ZIx#T3*m1z`d1SMU#?4qrf+uAE&R6B1bEL8S?-ZMUZwC?9^e= zA-oiHiZzS0^r*uf9bfG-iIGjRGlQ5>shzZ!Fi4{X<3+Cf5w~$-!POlz&OF}CWim<6 z2CSIfN$QZ-3*$^IxM@^Rkoq~sWM6EU2hLvmG-w<+iuUM_BNlG+N3{8`jz= zX}zjTeETZZ(ieU09p_T)^Ia)rYT4{a^0RBQA7Q=L&S;%g60>>FFiZadQTqIkeH^aX z#5ku+6gY+2ax)ZGpkv2IbMJvsN*KO{Xt4=d3 zGT&0%GR0b~ekhkJZT#D4Y*dRmPh-ZjZK&_}PPP`S0;Nk9P|!sLtaC5UMkSo<@bB?v zBp7te*g5t+p6`lXu`6P}H+)G>yZraX07db5?b~F7-OmMRnXE3neXOYX!C`K*!?Gc&&O=Z2 zLmW+bz=tDV_pW|dA1F?eR%dqhR)c|+N+F3cAcc6AhY|dtPCi<*F0cl}6Wch~vuG!FED|Uw&Ca zx(}7I{X$0CS$1aqDAbfP@Hq%tKxN`7wvCa8*7Oo$!OjC!4C}J#5?m}FKB&Hxn6+jy ztJNq<5W zz)iCqGuP&V#r@F-0IV_Q5r#b@^SiYdre*A(yq$m0k?!{3PS?O*>&m2juC3TeWx<5( z=phpT*puMFgDqdCNvW=ta9UdnK{VKLrD^709^%ZCDH@#v*uV8m`=iM~IzD|0?h~y1 zdJlqF+QaLTZ_f)Yu}s}n%EU=jK$XBeI6^Q1zB)8UEPQrvLp7H1hjmG=h*%*>cPpj( z_enp%w9C-Voe}cRC|^9r9(r!+3NIY%LZ^Dul>xB)~%P zN%OP9mxifN4WX#68jNm4UJyRC>x464DG^>s3+b#NYO7jPVgVb9ChxH*VC3dWdh#w= z+uqwa-~;6t+M}rCiz(X}f!uSuY0!C4vfLLm9)2_lIjFKE0#%m4^q*-JvDLZ%Ai;eQ z_1X&5Z%$Srs|p4ca8uU7p698`*P`VjB;1rl2z^eU+xv=KNM@xTz=?WO_Eqe^d7wJ7 zgnL;-NXKBA{E_(wePd>4*i?AjzF=ij6sv9Bf3Z`{F9b|~ph*hs+LMsncr+qt^ zm3Gk}h1%cgBKgw7NzvsHrk}vkGxbqZ@pW}At7DWV=ErcjQ2_<(*T?I+y9J$+@Y5Zh zGf_tQ^O}CN-{B&2^(&pHlj|oqd2#_Cety!Y9XNVsbw*e#(oYF4pOFl0F(faObMRLC z2rF~U?^|l@{3;5NmhC^4x}g{3B@0M-Gi_IS;fT8VN0l8i`JDiZlM1b2PEkN+q2~;w zqirzVtOzW4f#Af5hQ|2_fsds4l_@0F{yIV0)D5hjJ|_aNRlEhGAH_xNl7Vk68m7M}SF zdt8z{d$p_&g#H%Tn{Acsn&5QWa;K@e)~ufv!Uu~;+s2}u`$JrrM zWG4-{5;tVKj=w0Xs}uS6l@D)5ae!kF%>uouy;Rxb2n!RXg_l(ohJ^g)%!HbjC%*sd zv4EETaHFu)FuF5Ls=96(`gccb_}gvm=}R8Qly|O{aq3s5#Pu#eUn01N= zf?7KgT9ppqj+ugTIr-X=3fZ#KY-vdPd(Q~Nf={QqQCaYJ-jUDe)nsS74Ay^rv&fN?&0B4*jUTYAQ zF+Q8UBQa&a*32K-;c=kg!Rl5kgE4IK_0*)mrS6QP5R&+TsI$SVKhtl8G3o9~M4_cl ziR?42uWJnyg@ZCsZ7?^{dDLA!+^X!ODZ6ngI7>?kpOeXfT+6Q%mVn<%-JcUD^ZQ&d z=mwy0Ib|34(KH}4NDWe8gM}L;L}01~iVq-xleJ0k)-#878hGP3VDbnQ{nVhwu>SdJ z$};!u^F7#nuUe>Ft$+hp=&A>{NVT9^`zyv@jhz!O#>mNxB2?DOz8neS%}|37%)@&Q;+gNz#L49bTO$I7c~q&>ij3tD4WNl zroqMTwEi^{j)hB2WT7#;np=%G&_y$1*qECvlHgbVBo>Tfs?VL~sWik$!fr4Od3bux z@mum*-0NA^%{+>K0jr(w8{qCgu?xbd8=NEbj6V}2Zk@R_8-L;BXm`_f4ox+13X0sN zF*)frKJ)SUJncFjgIjN$oXGF7@K#zvnY&eGo%NvljwyBHuYJ@;QAlBo+LlCx>TP-8 z8cy)`Fh#?6pUOJBv+j2Ncqa|PubVntN}3MmqkixBp*Po-4#dIm9|?uXf?W+`B2b|v zEyq5?9w1_h|L!4Q%w)5-hq~mz9h+}2!6QC4`r3M}U3_M}cT8rJcayF~PHMsbrou?P|3Y+c4W|av+1Q&PdGjehmRo%=C{W)x<}VSE$yD9J zOK5pcvO%Sv{cjK%+HXrHy^*CvE!Lk#h1RIiCQBqx zs>}7U_%9>tO(U=iEZdSYrfC`T*Z=&$p#H$4)qc=mzhYmhC1fNysPn>zzWi3g2~7VZ z6!=sEq1U0dj!?J}E3fSxVija^Pn}4!PnxTcYwNjr^RZU>*-#Yu-juQZ)0N{&?+{y! ztA6u3#tng^CY^EtGmiqWa}gK_r2?kqo3?eb{)oBnYl^+$b=Yi{u3w5tmFD`ke6b8=Ua}1tKy^W5I9YgjL9VW(_uD)+91J1Y(`)0;X`a{7; zFZxgmacrj7MJu~*M#**5!A_KRA2i1mDcgEy#|Rvx83&V1tV7iRIbWZ+(GTESNw_QI zP$y6I(R1!!hWD=b5wv@m$xeH95T!AQ^}(3!0_e4w3H5aY{@{qM%DuK)PXE||1t>T< z^f|HT^xt~jfWKSC<0P8rln!$5XFtD{8eLM&_w-k=b?sW+g=8M}YZdC>sb<`L6ryJD ziP=t@{W-_Vq9-|PhohJp89CrY<2<;3LfVbXcnIYo>+C;gaaGr|)i!mgwk@Q5GY%G# zQ5rj(L44^k<+b*Z#nN%r_iIz@$9hSL68A>Pt9;R3dfM0 zaBH*XkPUkE7|U_~%ShDV8D`=XCGy=&YwTB$Zo|#jRvXBiV=Lb{4!63|%f2Gf-t5ja z7IUqG+@fgr(n)gkID9=JyWf+GF>$DQrjqcJN$Ux?e9v6u<+rZmAL^T__t&Wl$*DHf zMa)`#z|K(W#>U1#jxmBxEUyCZrI0!dLg;PM)5x3gW4{hjmB#K$Aax{8-77%+46=y;^1CEW1P$+yBQoY z!P@7(vRWWSXl(pDo7<`_58p{?!5-Aho(Ldy@A=m@9V+~n!l*e5R}Z9iUWgdTUvcVq z;zEAI(eh(3B9%g9uu>cb2JYp*9)X=)ZBGgyCqFoSd0$1Evwsa_6J*nV-X!6a3r1UX zQjOku_6FAFX=nISd)!zCG@SkR`Pqq+9R(BC^Bq%?l&IebK#JiXPT#w8C-G zOuaQMhk7u3dj})&-r*>0|9bEqa*Kr3>i?{6 z23Ig?%lCN~?YOS!)0xBE82&31I6W{pd&QZks+gP_wo~7gU)=VxhZYM2`Xe^i1Ay zadEj5eA-KVNGFv8&X>nGk~H#TEXbf7bsraJkn*7WMpZ*7OYwk_F}d2Z9EN*|HWk*a z#`T=*{_%&=!mr!tsnMyW-nkncC@zA;{?&mq5u~0+d5(REv@N*5a^OwJhusgLCS9yH zhRld6>(bjelURPQ5@JfkqD60MC3U&s5wV?Yak zYMTmrv(370>n<0Ifs?$uC=b?RyzdQ`bGng9W^TMs^8_vrQ13h=6cNA@9Mi;gWh0u4 zF`?~6^B=O6`>e083zcMho?Jrxc~x?_jG8rlQh&uvVQAa{oT4zqA3Ll9-1C^-xF^MU zYM|9lB;>@`y(FBlHSgOAJD>2;o#^F%_p3^-(53s(!L1~Bqr#Y-Vp1Eu5FJsXb1jN5 zTuql3DqM+BpGD%j^bJ4us`OLr1^beDoENlB11YAjnojs}E6C2%XU$=_l?PP(yP(E> zltVRY-%2kamEyG^2A5g4C6K?q%`1$b^VSDG@3U4-TLCVh?~CH6IQ;ON46*eE^G)N* z9==$Sw?|636vpF52TV2ZLwT?^zC^iHgHaQExY*#0O(b<$~d z_eONDeH_${uW`|FtJrHaz3V~in{(z5i)ODl8k@GYmXgJ@S4xBFI~C0D0li1hGRlmJ zEb%NY-4pa&<`*WxG=MndzeT4m6RaL4K_Kcze8tzz9^Z5xE`ba4|3_dPNUe8@1`75s0ib?TBs5iz#I& zuV;omsaj-pk;zhR_OAsC{2C2ttN5{yzT4rrpk@AV;bO?icJA*qbXXV0y9sRpk1*Ul z6g^O8Rsef1`uI+})mDal68yhwImO<=^I}Ac9*GV?wHZi2hg;yaX1Wl&sM*y~W6Ixj z7;k*Rk6(V85Cq?0%pU)h-;c+ z_Fo||-IyhPfOh4~+$fvRlSIR~Sb~5rDzUKfvTNa2KRSL#&0xjLuoHQ{LC=&*31IPK z70puSna6aI%nF&@JxzM9B!tFItSiL8YeV+n?}>aJ8Bw$J9^|)_m>01blgPn z7hDJ`mvD(wqDlM^c3>swEBKQMU_a$R75d+>AL}0OJ``ueOIYc!7S<)^ssL`d9mxGz z)8u#LMWsKJeu(D*qtJQz|Ly6r>w&q0V4x(!KFPDd`4in%hr#`l+R19sOx-6;MNZ=!J$Za-h>`3MSr8i>&=$T^U zm7}RycSN~xm%=cB=n)thNkxe&F~h+B E50!{A82|tP literal 0 HcmV?d00001 diff --git a/src/en/azuki/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/azuki/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b5918e0b95165cf4327c7e4b336a7c18e85dff03 GIT binary patch literal 21959 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 e!zspC$_#o_&e3gGn + when (filter) { + is SortFilter -> url.addQueryParameter("sort", filter.toUriPart()) + is AccessTypeFilter -> filter.toUriPart().takeIf { it.isNotEmpty() }?.let { url.addQueryParameter("access_type", it) } + is GenreFilter -> + filter.state + .filter { it.state } + .forEach { url.addQueryParameter("tags[]", it.value) } + is PublisherFilter -> filter.toUriPart().takeIf { it.isNotEmpty() }?.let { url.addQueryParameter("publisher_slug", it) } + else -> {} + } + } + return GET(url.build(), headers) + } + + override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response) + + // Details + override fun mangaDetailsParse(response: Response): SManga { + val document = response.asJsoup() + return SManga.create().apply { + title = document.selectFirst("h1")!!.text() + author = document.selectFirst(".o-series-summary__byline p")?.text()?.substringAfter("By ")?.substringBefore(" Published by") + artist = author + description = document.selectFirst(".o-series-summary__description")?.text() + genre = document.select(".o-series-summary__genres a").joinToString { it.text() } + thumbnail_url = document.selectFirst(".o-series-summary__cover img")?.absUrl("src") + } + } + + // Chapters + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val seriesSlug = response.request.url.pathSegments.lastOrNull() ?: return emptyList() + val mangaUuid = document.selectFirst("azuki-chapter-row-list[series-uuid]")?.attr("series-uuid") + + val unlockedChapterIds = if (mangaUuid != null) { + try { + val apiResponse = client.newCall(GET("$apiUrl/user/mangas/$mangaUuid/v0", apiHeaders())).execute() + if (apiResponse.isSuccessful) { + val result = apiResponse.parseAs() + (result.purchasedChapterUuids + result.unlockedChapterUuids).toSet() + } else { + emptySet() + } + } catch (e: Exception) { + emptySet() + } + } else { + emptySet() + } + + return document.select(".m-chapter-row-list .m-chapter-row").mapNotNull { chapterRow -> + val link = chapterRow.selectFirst("a.a-card-link") ?: return@mapNotNull null + val href = link.absUrl("href").toHttpUrl() + + val chapterId = if ("/checkout/" in href.encodedPath) { + href.queryParameter("chapter_uuids[]") + } else { + href.pathSegments.lastOrNull() + } + + if (chapterId.isNullOrEmpty()) return@mapNotNull null + + SChapter.create().apply { + url = "/series/$seriesSlug/read/$chapterId" + name = link.selectFirst(".m-chapter-row__title-cluster span")?.text() ?: link.text() + date_upload = dateFormat.tryParse(chapterRow.selectFirst(".m-chapter-row__date time")?.attr("datetime")) + + val isPremium = chapterRow.selectFirst(".m-chapter-row__premium-badge") != null || + chapterRow.parent()?.hasClass("m-chapter-card--secondary") == true + + if (isPremium && chapterId !in unlockedChapterIds) { + name = "🔒 $name" + } + } + }.reversed() + } + + // Pages + override fun pageListRequest(chapter: SChapter): Request { + val chapterId = chapter.url.substringAfter("/read/") + val apiUrl = "$apiUrl/chapters/$chapterId/pages/v1" + return GET(apiUrl, apiHeaders()) + } + + override fun fetchPageList(chapter: SChapter): Observable> { + return client.newCall(pageListRequest(chapter)) + .asObservable() + .map { response -> + if (!response.isSuccessful) { + if (response.code == 401 || response.code == 403) { + throw Exception("This chapter is locked. Log in via WebView and unlock the chapter to read.") + } + throw Exception("HTTP error ${response.code}") + } + pageListParse(response) + } + } + + override fun pageListParse(response: Response): List { + val result = response.parseAs() + return result.data.pages.mapIndexed { i, page -> + val imageList = page.image.webp ?: page.image.jpg + ?: throw Exception("No images found for page ${i + 1}") + + val bestAvailableUrl = imageList.maxByOrNull { it.width }?.url + ?: throw Exception("No image URL found for page ${i + 1}") + + val resolutionRegex = Regex("""/(\d+)\.(webp|jpg)$""") + val highResUrl = resolutionRegex.replace(bestAvailableUrl, "/2000.$2") + + Page(i, imageUrl = "$highResUrl?drm=1") + } + } + + private fun apiHeaders(): Headers { + val token = client.cookieJar.loadForRequest(baseUrl.toHttpUrl()) + .firstOrNull { it.name == "idToken" }?.value + + return headersBuilder() + .set("azuki-organization-key", organizationKey) + .apply { + if (token != null) { + set("x-user-token", token) + } + } + .build() + } + + // Filters + override fun getFilterList(): FilterList { + return FilterList( + SortFilter(), + AccessTypeFilter(), + PublisherFilter(), + GenreFilter(), + ) + } + + private fun mangaFromElement(element: Element): SManga { + return SManga.create().apply { + val link = element.selectFirst("a.a-card-link")!! + setUrlWithoutDomain(link.attr("href")) + title = link.text() + thumbnail_url = element.selectFirst("img")?.absUrl("src") + } + } + + // Unsupported + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() +} diff --git a/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Dto.kt b/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Dto.kt new file mode 100644 index 000000000..16aa14291 --- /dev/null +++ b/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Dto.kt @@ -0,0 +1,39 @@ +package eu.kanade.tachiyomi.extension.en.azuki + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class PageListDto( + val data: PageDataDto, +) + +@Serializable +class PageDataDto( + val pages: List, +) + +@Serializable +class PageDto( + val image: ImageDto, +) + +@Serializable +class ImageDto( + val webp: List?, + val jpg: List?, +) + +@Serializable +class ImageUrlDto( + val url: String, + val width: Int, +) + +@Serializable +class UserMangaStatusDto( + @SerialName("purchased_chapter_uuids") + val purchasedChapterUuids: List = emptyList(), + @SerialName("unlocked_chapter_uuids") + val unlockedChapterUuids: List = emptyList(), +) diff --git a/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Genres.kt b/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Genres.kt new file mode 100644 index 000000000..4fdcd7617 --- /dev/null +++ b/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/Genres.kt @@ -0,0 +1,87 @@ +package eu.kanade.tachiyomi.extension.en.azuki + +import eu.kanade.tachiyomi.source.model.Filter + +open class UriPartFilter(displayName: String, val vals: Array>) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + fun toUriPart() = vals[state].second +} + +class CheckBox(name: String, val value: String) : Filter.CheckBox(name) + +class SortFilter : UriPartFilter( + "Sort by", + arrayOf( + Pair("Popular", "popular"), + Pair("Recent Series", "recent_series"), + Pair("Alphabetical", "alphabetical"), + ), +) + +class AccessTypeFilter : UriPartFilter( + "Access Type", + arrayOf( + Pair("Any", ""), + Pair("Premium", "fully_premium"), + Pair("Ebook", "purchasable"), + ), +) + +class PublisherFilter : UriPartFilter( + "Publisher", + arrayOf( + Pair("Any", ""), + Pair("ABLAZE", "ablaze"), + Pair("Azuki", "azuki"), + Pair("CLLENN", "cllenn"), + Pair("Coamix Inc.", "coamix"), + Pair("CORK", "cork"), + Pair("Futabasha Publishers Ltd.", "futabasha-publishers-ltd"), + Pair("Glacier Bay Books", "glacier-bay-books"), + Pair("J-Novel Club", "j-novel-club"), + Pair("KADOKAWA", "kadokawa"), + Pair("Kaiten Books", "kaiten-books"), + Pair("Kodansha", "kodansha"), + Pair("Manga Mavericks Books", "manga-mavericks-books"), + Pair("Manga Up!", "manga-up"), + Pair("One Peace Books", "one-peace-books"), + Pair("SOZO Comics", "sozo-comics"), + Pair("Star Fruit Books", "star-fruit-books"), + Pair("Toii Games (MediBang!)", "toii-games-medibang"), + Pair("TORICO (MediBang!)", "torico-medibang"), + Pair("Unknown", "unknown"), + Pair("VAST Visual", "vast-visual"), + Pair("YUZU Comics", "yuzu-comics"), + ), +) + +class GenreFilter : Filter.Group( + "Genres", + listOf( + CheckBox("Action", "action"), + CheckBox("Adventure", "adventure"), + CheckBox("Comedy", "comedy"), + CheckBox("Drama", "drama"), + CheckBox("Ecchi", "ecchi"), + CheckBox("Fantasy", "fantasy"), + CheckBox("Harem", "harem"), + CheckBox("Historical", "historical"), + CheckBox("Horror", "horror"), + CheckBox("Josei", "josei"), + CheckBox("Martial Arts", "martial-arts"), + CheckBox("Mature", "mature"), + CheckBox("Mecha", "mecha"), + CheckBox("Mystery", "mystery"), + CheckBox("Psychological", "psychological"), + CheckBox("Romance", "romance"), + CheckBox("School Life", "school-life"), + CheckBox("Sci-Fi", "scifi"), + CheckBox("Seinen", "seinen"), + CheckBox("Shojo", "shoujo"), + CheckBox("Shonen", "shounen"), + CheckBox("Slice of Life", "slice-of-life"), + CheckBox("Sports", "sports"), + CheckBox("Supernatural", "supernatural"), + CheckBox("Tragedy", "tragedy"), + ), +) diff --git a/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/ImageInterceptor.kt b/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/ImageInterceptor.kt new file mode 100644 index 000000000..5f9da45a7 --- /dev/null +++ b/src/en/azuki/src/eu/kanade/tachiyomi/extension/en/azuki/ImageInterceptor.kt @@ -0,0 +1,34 @@ +package eu.kanade.tachiyomi.extension.en.azuki + +import okhttp3.Interceptor +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody + +class ImageInterceptor : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + if (!request.url.queryParameterNames.contains("drm")) { + return chain.proceed(request) + } + + val response = chain.proceed(request) + if (!response.isSuccessful) { + return response + } + + val encryptedBytes = response.body.bytes() + val decryptedBytes = decryptImage(encryptedBytes) + val decryptedBody = decryptedBytes.toResponseBody(response.body.contentType()) + + return response.newBuilder() + .body(decryptedBody) + .build() + } + +// https://www.azuki.co/assets/js/DecryptedImage.57631a1f.js + private fun decryptImage(encryptedData: ByteArray): ByteArray { + val keyByte = 174 + return encryptedData.map { (it.toInt() xor keyByte).toByte() }.toByteArray() + } +}