From f94b827056861da000c5c5c7f60edfd1b198ae0f Mon Sep 17 00:00:00 2001 From: Eshlender <35057681+e-shl@users.noreply.github.com> Date: Tue, 17 Dec 2024 10:37:19 +0500 Subject: [PATCH] [RU]NewManga(Newbie) closed (#6620) --- src/ru/newbie/build.gradle | 11 - src/ru/newbie/res/mipmap-hdpi/ic_launcher.png | Bin 3599 -> 0 bytes src/ru/newbie/res/mipmap-mdpi/ic_launcher.png | Bin 2263 -> 0 bytes .../newbie/res/mipmap-xhdpi/ic_launcher.png | Bin 5435 -> 0 bytes .../newbie/res/mipmap-xxhdpi/ic_launcher.png | Bin 8388 -> 0 bytes .../newbie/res/mipmap-xxxhdpi/ic_launcher.png | Bin 13017 -> 0 bytes .../tachiyomi/extension/ru/newbie/Newbie.kt | 678 ------------------ .../tachiyomi/extension/ru/newbie/dto/Dto.kt | 109 --- 8 files changed, 798 deletions(-) delete mode 100644 src/ru/newbie/build.gradle delete mode 100644 src/ru/newbie/res/mipmap-hdpi/ic_launcher.png delete mode 100644 src/ru/newbie/res/mipmap-mdpi/ic_launcher.png delete mode 100644 src/ru/newbie/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 src/ru/newbie/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src/ru/newbie/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/Newbie.kt delete mode 100644 src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/dto/Dto.kt diff --git a/src/ru/newbie/build.gradle b/src/ru/newbie/build.gradle deleted file mode 100644 index 597fbd110..000000000 --- a/src/ru/newbie/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ -ext { - extName = 'NewManga(Newbie)' - extClass = '.Newbie' - extVersionCode = 19 -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation project(':lib:dataimage') -} diff --git a/src/ru/newbie/res/mipmap-hdpi/ic_launcher.png b/src/ru/newbie/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 64feb487fd8a5ef4fa384a127d86fbd200bbffb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3599 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 diff --git a/src/ru/newbie/res/mipmap-xhdpi/ic_launcher.png b/src/ru/newbie/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 9f7365d6cf0ecf2d3e8b1f3f869e3170d8fb0008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5435 zcmYj#c|26_`@R|5*ay>)EMp1DmV`1GV~Z3;lE{)o_9&BehOuvXOK7pAtSKV0j|@rH z5VFl=4;ds&gYPq+-#@?C>&%?j*`DXV&wbt3bv-BE@{$P;rwAt#6BCc=dBZDU@5K1Q z*uekKtRO8WrXx^OLw#%9^VJs*t<$efefG^DtQQ>2^Zh0joSDw=7==gsJeNIBS(JhO=%*1Pw44L{YIIxtcu{tE?miSEZwfeT2?-zt3Y30UlR(2 zQr6ZE&FOUdUiae@R$1mb=rNh*=4RQ;@(9`W_4QNnwY9aTjg5_2opblnalyfVwbin_ zWv-MA$%u=KKQep04X&l^?(Dp}Z~AapMBt_@k!~iH=J(ia?v#Xt1P+HI_4M#4D=Ygw zc%TuVo}O+hDkhd29~H$cSZV7ekapfxAm7qmfPirl(9P{5zLZa=;n3-Rb@sBNyhVK# zV_xZ_G=q!J9q8~AQM@YGr3BvgLB{;&y+ck*&OfS*pA)ZU8PDE`hWt-eoIdY-|j;A zJfkn0t|UoJT6WPaUKdzW-wpBgU9({0JbXB;Hv|p-6p@2JsFnzT+A1RL9USx|iH-V- zs$7hG`6S6U3K<%ISq~TN_nD877B(Yfh~|r6oDURGi)A9b#!%`goStU0{~ggU7#;+Z zTv2`yb=TnCqh8kN@nbm8R*5grz0z=GVl;=KEFS&|#NZBTIZm{UA{;h;KRq<;+jB5& zz%<E?ziJbhF5uTxLOrby`)o*-Bnj_f zJsD^>K|*;)x_qx(!6}cT#1kQ38ezz}$kX_m(&9cX5kKtf>8Y&_W#bG-(PB%tlFmWG z^lN29J*&kpkR;R~Q4n9Ao$u~ClTa;D-q5hHQ=Z=y&7Z1scxn8r8=l?|^7i(Qy@_$8 z#Bw&jF3s(6n`z_IGYkkgZD(iaw>f{Yc=)a{RudNz5(10H$|E=xufJzGbLPy>VnM2^ z|4(whU_a03@R*qX%>m0`qtoQ7C~) zQc@De#nslHDCAG0=noAKQ+r=%s|s`Hd591Qgzrb3-hL_yHp<6UiW?4t|NJn@ zrrabeNDXJ-Y*c!(zBQhep<8`<1u@b=%hx@ceN3XUX2CLituBQsfZjkM>hsZEHx%%1Y9cC&((O`_qne zISVIsk?iSX+-%h!KIG@;LqHumySgH66~)CNAanVfZ$9@vzK|u@_`?u0|2%@Ezd{5d z^n3VFQ>!kZ1hn*J{30K%!6c{oL(O39X$G2%g%h;Y*CXw#qzPCL0Urt`S0&)+n01X|HFf@z`#KCX|5mR2mh`gLOY1_{Aszo(G{1Ih&WnNok^b6 zh|78sly*Xrj1_Y2SdF!@;ws-mqU}RlXV&3Ab@E(C&Y%k*LCe1A%?En{= z3#i7)LYIN0ayQmS?Xu1{OuCME)FhzCojbyIQe{E;GX*XPL@HIk^7yCJ>PVaCCk3XGH|Eb8| zuHrASCy1GzNy7JVT_Sv)qbj}I?Jx1H4E;N;`em$kn$f)S36bWq2KM%%4^~DA`~SA3 zrKOp3a&r3J)%z6R4i67!X?Q=qz9Vgdc`B}*-eMSx^v;I&k%1r8>eTC)Gw-w z&KQtr9rsoc1m&-y>|NqCN;6Is`*J3Zn=U=%yGGRbfV?4;6J_I&$S0tJ=?v)5)-3^X zoC^Ati+UyckHz9LLR3`r(SQF%zIr8NUmwVE{P^*>xHvp0d1z=T<=3yS?wH6(C_0=j z3>xR!TYG&h7Q}w3r7WV8B~TB2Lg!9_{KZrNbokK6N0~Tr@m@}^=RuZYg5gY$ev` zD5oU?XysBQ(VZezuZw8r>Aw9|u3e6~@OF7*mR!iB(vLnlCfudXH&i7Ya5ax;@b(?<92 zpV8f&6?Fe#C#n;S08L_B>m$Yjh5TAxUI*8yzlO{D?|zV1P{2Akh;g$qE1W#pI(N_6 z*Eh9xDwykVe=TBt_KTp~KyqB1(~paewA^d^2C{h}>;;eaWiaF*V`8odYstt_h^O@t zIEPq;s||mR%AROI(V_3V*t=3`Ftu#%%aRKx`7gB*N2I;yp;m7pH%Ww9s9WuR#w4|gs_i>#TO zMh3o=V0J{oQ79A>P%?RCbd(Z0Q;}e&ZM2=$TqtU1a=+GTF zJD)g9Y@5En|0(yU#^7cUp}1Z+LnmBaT~(p4uAGRBjD#Z)EE>;v5?*E*)EdO{QWpmb zfS6@xXH)LgMZFCN&gGCYbUd$tRY{8(V!58~62&a^&nl*6dH_@N2niJ|`41 zILF4uii?X$A!|*si;M2n)zy@;cg+l%?eFi$gBV{G6-BjCQL?gZtE;QsB{O$&!`NP5 z8B>8+w7B~F`H?mYwY|>0CADcmIBS`HfnjpOKG{C&z8?}kruejk;BEs@?MkmM=~-pic3mbn?kl3F34-N0s_Qs zYirB4%8h4JYHnwJ1{e@<2WV^)BO_Lz&wp3PsVghpFdU5nF*7q`%w=y+Ps0EG`@k4; z@1B~7h)DmpZ=Z-?=de;~d3AM1FJ8Q8Tj|33{hebfC@INF6(gH|igsNQdF9F#zkh$d zCz`_;VmDeBAP2g`ADo$;on=7fbBdS&@FVx`-9sTb%jGCbFA^~*r<=W6T3RSMId(aV z9CGq8O+Vn3p6i4lL63EIc9LFb2U%Xb#;&KQ$4C#5^D|9fx9^0G4rAeDW9zF|^%arQ zCr@&zU!3VolcsHL-DaUL=pD9pXP?#|R0q5ze0iP)m_fIq!KTUCdv#gr9s)mp{P5fQ zb=A<&5G5%I32qWszbGvuLoC6?8%BDM*ElbIdp%lti~Wg;W6H+HJpfLOa%MqkDW^y> z8&GS|hJc%645cbl@V^gMfB)tMu>prk{`{HYB|sL2rluSkUZeQJLfPkM1K2?OwdLr9 zWR>g#1^_OwwY{D7?Afyb)lR3c05b~5HiMic_{{T%q%R#l1Lc)MjUwl7WGqf z5|gH;CLm1xf&r9@3g6MAN99#iKG)x0&a+myeEm8{vN3bHO(Gu8G_T)#7YbHYX^$Th zfkYP+7sEggfgXl)MpM>tw$<+Z;X73J=h{KM&d$!AU%wi7dY-fj18DOL40NRc+7-H2 zCknX0oJ%WoM->n=WB8|q>!9}m)jWgIHa0%R3(94k-kV|xRH=`Sj>i32~1a;R97QjzkaP1FwgC( zmc7Li*cbVG)xB?D+vu`wQ}7u8=emFeRqr3_4EncvR_FnsM`~?_thF5Kf{P#mI2_LO z!7f=Me5ZBgMll#2_`~mpOu2oZ6ONoT*VTkW97ETQ-uX5uJJkQNhX8);m}&~CygRHQ zBO{YnQ2__<1yBL)&!6fPrhsWI&W;3B1~aH$T3V|5aKp9JRn7jRAE9I@FAo*h?()W= z;mN}>F%gmf(MVI1*mT&oShbxJ*t)v9@K9lwBjozDo{*VDOg9_^x`WQu0 zROHT7aSS)c+_-U!5v8477dmittcqPsOl;@xxNj@fk2aI4_p-TJd}(Q^+sCIp;fTAB z58K5-OL;`r={vkXXJ$^_|7Gp!=H}A#^vt8Lb8#st#uyBfe8Q*3hnv6@rw$ESgV%^0 z7#IK|&?b%lJVPZBn7ey#|0KtQGqMe`ys^v#3_dA|yI(zdZ!h>&Vd2lNjFa7O3m5!1 z-a0f0=imMC1Gq`Wj@(1~!X1{Op&`|2ORf9A5TIy4510xD;sDQl8X3tRD67V_W}+rUgJB>`?PRiXoz_G>yvDlQ`K0v z-8U;dHXn2Amh|A?dZDF0y+cvXXz23ya^{PJAA`3PCMG6?A@<6dCx~0iBiqZ)W$$e5 zNrR-G<6xc1!NCFJ<^8?2ipcyL4SaTJDB8uvCC^e`6)czmCmEpNS)n%hmYCO9Btb2K z@wP0n2FmPOY9*U43FHsp`R2`=-HAskZIe1X&xg`l**klBjI6B@WS3JbD=Ul&eEg_I zjE*MsxIIHJ#Sn=ou%rqP4==F7M6@6`q*VGsv`3a!FH|!>tlW??;gQDTU*q}M=;w*P zM<7pPCLL)7{0GGXst8J~$U&SCtuaAjm1gpW$&(=AK{I)bKfpwY?+BIbQHgph&^@j& zRf^Kpt?zg}MJO9Itb$^4jxNcsYDw8A=nB)MIhwDsG{R^H*jnTcHS&KCH0e>49JUM~ z5wob0ShKev)*cxbwZJ1p>)5t z+ETm_K?lAV#i}PjxnYF=kiX4NKmRV+lam5W#F^{Ndwo2i*TlErPTBvMKidCxzCZ#a z4}9~%yCR=pxAC%qoinUDa*a3h>o7mpWZt^kQseXP82Halm&#_* zON-KCjmgP8Uf$j+EeCtcQ)FyVXW+EtUu`TbXyT*4m966UIq>numSv}pgASzH+0!#* zE?IL5CjDana2wnme}DRwdJbGlhKK{+f1%3uO<7G%jd#>8`?ehLx$|+o;HhyhFR!=n zZQs!SXF6EnSVJQGhD&}38MfWxq!t>WxT~Ny|Qm7X+ zM>%A()%zl%CQS0dtAMBRFv%1myvWgAv_aUC2oJ$_K66OAc^uhz;eANpbm5-e2;Z*K z(&Kg6B`=E>a^qM#CCI`2=CX_H@Ja8GDLJ~rlD&KQ(!&hy*04_&snq7yV42(h-&e;1 cZ@M0=x-9>Z&uwY&QIyHl=#t@EtW)Iw0k`s9MgRZ+ diff --git a/src/ru/newbie/res/mipmap-xxhdpi/ic_launcher.png b/src/ru/newbie/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index aee834a2742c9267aabb84556890400035fe8984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8388 zcmaiacQ~70_z_sjXIOrop zR*Uixdwq}J@9*#R&6RLnZ{GJk&pGe&+|PaAC-J7Y^=PR$sUQ#t?Ja$6Gw?t4@Rj4h6^9P!V4VqCCa_3I;o)$jSn-Q88XMn*}!j66I)IPcuKBdmu+7HVp1Yk$&3q3R{Kbai!Y6H-zn6TnM|)50We zybLL;k4+ml+w*sIEm><=&9UO+tZCC=^OTL4j^*(QrRJI;xDRsE~3$ zJUsjqQ&*?xj(YmEGN!n=SQE}nHNL&QeVrmGC}=#jZ@CQiqSxZ4Sb7#WQ+y|Xr=zsH zDKlw8K7X1%e`epp=4SHzyuG%L&PNfJeZP=3oCn(Z}bgKgr^E$%lLZUyvkG=V+xlOB_V>kZy$w@`}p}4L=CLogfmCx z!$C|iRn=23ZS78m{9fJ0sz>tL$Ic(>wDMA~iip_V7favX-IY})_GdK-B0-AfloJh; zV)0Q3ezb*nj9KXyLyDtfUV#rtfiP8*D_ZBj>b&O`LA2vC|G`m>g1GWWe16~xojY-H zafccb`L>hFpOpk`)`Jrm{yV6zuP4OCQ52}f6}aT~6IIl5QWbdQNL=_six$K1U^pvU{C+o~@23VO>=cK?QJF9JWAL+8CP9BA zlAuf!B;X|IgUw>T`%j%LjFW} z(CTkdpuVSvaYF~e5%9eNIg*Oo@TH{7{yG`DkqV!MdW+tmNL8*%QF|%rw^%8H;Mvnq zAVs>X&M2Q)I2~;QHt`mMYX?j@P4H`B3si*jN5Rb^8R|2BBFcSr@?v(`bV7G&zZ+?-nV9WYzgxE z+FuJUlb{}TI@+GQN-M2SKbrBJzwn&PeO}N2vJ{D(S55xPmiv`A5VdHh&EYYgDy$8- zMb=gVKI7NwoxV(C=tHL4Cfx<}`d67?p!}S=liEt|6fm%}Q>5t=^q2d7{Gesld4^w7 z7Unl!m|((wHpmqHr6-myprOHc@7_Jv$B#7)4XNM1fBz|X&n?OWNkgAI5SyFJ$Hc_6 zy%5W{INuiaN-ad;Ftm9IGK}+yZEDhU@1fOf=$nCMHr$j9inSh3h--dF``XBh-AuXA zOhPRF?ygI`Ft7YcoG4|dBW34H5@w-Vw|&NVZMdjt-a<|C>1ikh2@x5uO&}!&1;Wcq z^7)GwckbPb{?~j$H&y3doNHxclME2$guD1K$WVPva!y2d5Qy*ExDYMR%j1< z4J${~IKR^%XD4~F=2e*iy>#PV^|O-${Es(^$wY1*9@>_coC1P^j7&_CY<8iHAqQJJ zuCDOgIjZp)8LS?YHIzSo{3t0e@6L@l??r{XxxEh~lDYp}S9rxSEF~-DK=yV=UkCk@ zhVrYul}ce62~S4h-|jfA^a%7IpJ0yh4qc;8S$}_R;th%KYl<@phP67DRE@#E-!Hh{ zM03+g_QuRXk^zeNy^%bXEI2H7(_oDx4x^R0I7D9actp4W zfaiAqqot0Wx0lzWFk3%A+2j39cMY`B`r}C=%iIE8w@#9;Il3u97SJxou9r?R_EoR) z@}YOwIWtM`)n=uz<%WD1Q5&dv_Q4h5UTlXj8Z`YN->;STX=Yag zbBy!op-WnB0INCK7wUNJNX)zg4dU0$@yEd&WZdt05RTu&&z+bbz0dn5-tkSem|-Oo znLgaLx|^1oYA?fUzSI^)?&{^G`}C=@qm$F76U#mvoj{N=b?6s5431_ey_)`w9i31$ z_DbEA1!-o|Q^cEkYkED^U>cU*151lr_{TwYFHrREq>;P}p*VF7`rH7yeL$mwexP*v zwS9hxk*3lj|Dp38=Btj%v!M=(cV9c3I%hbncXoiYstwi`caPX*kouWzs-cGr56Z3E za@0aTdHj+oEG`yQRh_n{{KtSs%5dmj{XM*Vi@XG`mpocRnc7=ug!tw5oxP3DbrQGC zBRNv!$T5!0i7~L6&A5GRJ4O7s>Ne6o;>*P_M_Jz~2kC1Kr=ynz+q*PSop{6@X4U0p zl*_4RiAgU_gaN?KYSTU*}oa+^d(LEYAY0s4xTa}`P3FRn6K)h+{z za~J1|L_|dFeMhyf{%s3B8*HiPIkeYs*7Cyi7DNr-zp|JH;?XLNbwX+S+mqWr{3BlG z`tr(DiqN{+6Yer2PifL?wOJme3y2;*ZNwY}W9-*4-s?1S-WzmrI%bK^e0ipEXfy;9 z9SyoR=Z4DeQK+__p3_`&7|r#)y}gM_CvsLP+oVb-eEYz_Kw-8^6B*KD1WP-3%q_o? ze8x-_PQ``gQ3}Y1o z;&1Hr<6=dLo3%P%khI)ftX;&}7*6wiF;R-2fkGu{`cR1+xt`AP7CePrlofem#`X>Hthp%m8;Dajel)V zFsF+8Oh8zcGX%UB>HY7o^T}6+Azs`d8x4HCB}(7g_?>!^rm*|k<1U6f0;U3#8AW{Z zkh`z$#V9#*Y6~zr62;nY5~$^H%??iA6YzLExu9N(Hh`GGf3wMrjVjhnfwVUQH(G!9 zzF7G84-1&V%Zv<8Qvba__v)LPf|O5`cyS)`2~Wbilk&LMi;h}!y`4#~rs*?ouysIQ zDj$ZS8csU;X0UW74Ha!NHj=xY&nf2y(X-j7YVb4?Xo5cTqjb&m((cAg$%5FDSv`7V;wdQQbW-Cc2L zMMG2duabQoINVwCJv$DF(miUArjCn`mp0t@Wk+;ed19#u^$YLbrS!(Zn`m@?xiKT{ zFco^&X-nW%$(ed37SNABR1;auQ!atYLVB4!!$du1**ryHR3itfFYJq-md?$G8&-4F zOa7H%ma$7ph)C~O*~M?P|9LF3Ha6a(>ltg5-@09It#ZPQ%pvc}45Xsdx${ciowXaw zho$9Gz?GNNxeVm!`1(rgVtJEWTM>XzUFUq{gqLsc=&1CZQkZV=BOe2F0#H=Zvd>8EW7EhQx-L%ep*nqb^uaT!=0l=|g$3OQHc@1>?Olm% zJ0Nfw0SSp8W%zqH+MWCmo7ugO=~J!C5VtL%*}f~-Bbuk?a%zb~Oc_Pp&*NiLZx}^S zJ4Am>yAO$|V2HB1LR|1}*nFIBz}(l?A<{K&R%|7cQ}-9p>5a6VHw5 zhATosLM0zQ+yo)?=W1Ymm%3r%;xrY_$6{X7^_m5x@87q7w5l7Nn21|hd8CTkhDbvOe`!c zN@2%xk&%)7=?0a4tG7qT#uoasZ@9X;wmz^6iyr&%KoBrNda4(syye82TXYH7p;$n&?0mM!ZaLcOd>N{3eiMy)< zOK-fJ+uj+!@!6b|*S#%7;%k1z~4@{;G1OJ_`aY8U};4m7z9xQ$-aOf61nj zP{JPf4Ai^&AUwLa1po~WWq!uan474*OaTvD!ucF{vY7xK4w%g)$`H{}9 z!OQf)gV<8@VgZmpW~IyqMNFBJHdhii?0bTN>03_!qXsk;#!Mycw_?=2RY8|} z4wFC>#x9;F-u>X0W)%4Hz3h%wRrYDJlAfhKBkl%T!r!-VBY7V!WG= z$oy8mJ0LTAUxiz_Ly|E#bp=CZYsla~i$d^AK)Hr-P3o>e_=XgS;Gij0aH8XQE} zh3t(z_-NM1O>G*fjx*EOej-6d`Mfd)g!Jsp569}EjT#7!sE5_4bL)gU96KvnbVlcSI#;lxr zE=8}w2-~m0pSvJo|MiLx{7iDyX-!N_P6;C>gwNnI%OZbeW?Y-J`A&Z#`OXtdMzSuW zSR*&?1fb`&1)iCeYFk*aKY#xGQvNuu4;M`|1xcMB|CPD~LyLwdLcnQQW4Y((C?Iz2 z+NErH|6UB~;sVTz#k#rh0+H30i!-UO_z~7Y&@IQW<7vq@@udP)Gz=Ck~brLd?-`u@X_cg8o(&98umSf8T|5e*Jrh#r?J6UU;jFUnVZ{#+4SQ4%=d8HVSI2VfBWD-4b&_lxww3P_b{HGpZxPz z&XRT_)4F++gX7U+XMB>-ag}r5+ARQ32y1I@c!DD`1E{Y{%Zey?A)4*7dXIM&yAmHl zNl8d>Wo6$XgVa)A>QDW{+1HuJkjO5vwU>SqLVOiWCEVIc`QJugVdPinZ7Pd&>| zFtM?MU@`c@2#i2l#6^+Q=QlU!*xt{*5k#l1uFfv+#vFdKsi@KcxXNW;IrulH7Z#>Q zs}o_yDsF+WdjMxn>eUGN!#pG2vOnpLI^2exeQxkuts*ioFlYzKvW^EjO4HUhrx#5| z!;Y49>7W1pS{5{GB&nSHxOjJfhK9yAN)^Ph^k?h?A;2cXl?xD0(B~nUeO+KZcjnuO zkP>6;n}lcHr0=4kN5uK*W&$Yy>H#3^qTz=-`%bI7CZ@CTU#8Q3b@D4#uuQY73ZxT zzyaPBR>Vd}OB=KT3UNK+JoJ062H%GV6^|g3pWWGPZch<0QAH~SZm@@Kg7_Yh62>0b z4gLJq*C!pcWvxPZ;8Ijnw7tKt0J&>nF(HY=svlD{1^v?ne!_T#9ld0xA+co@k}@kR z%hb}6Dk37{gs5K$64yCeh{}1?J$G)rbj%lA1C@p_GNPf?xe#6fhQa#Z z$YnRB;Z>bLBJ%R` z{3+ik`w4H&wO|hqQDpq!A%P5wObl2u~Km%4dJv~h#qN1jD+SpwqHWN$VBpP<+ zR6qb4EpT=SVkRRWA{@l>s)xpbd~65iDInLcKq$;qq(F+A-oH-;8#2!F$%jhelpPB3U{Q80flC%4jXJy9$V7zJ?*_um(k~ zV;5Do-&0jy;(Je@HnicfHa0dx6BGIo1E78u!1w^pm(I^lUa5zv00WPM`Z7rYeYy_u zRpMr5W}XM90cYQ$&WmU1bLjceDkuRzBLpKOW0KtYa;BXO6_QxHJTaTXyeLu-HjNz@1Lw%JGCg4GCES$U)cx6t#V1_6i%Z+y|=J6RYz|v$p$88(daKqL`=M}vJwNhxx?7|dlp|% z(o9#b0KbI)MeirqApw9rK1$qRUqalvo&g{>$g}E4KiWh7eT`N2TWRg<>r>Cz$?g(l zif7>B>VwpT9C(r8Qo^I(o~sGYwA6#!4q@NCd6Slw))vfe8s|dSJ=3?5|4IQN3Z~au0Q#$e;*M`$CKYu zQC3!Fg8&r6H`bbuA$I@|L^=n@4~xrY3&>$yLW1LTJ19)zzq)znGZ!GSLD%TWM{Q7< z>OIuH%H#kPMUo=eny5E#IWpuk1U4fXEhh%6asDdY8nn(5_`b>WaKeyYlCT0W!{C=& z5JH9-z?5U4xDKRNw{lMHWh(_{SrmTBp)-y#>0cO7C>Bs!9+j6nkCPWVVy&35#=vZU z=Sleclm6246%-LE2E#c5o|m*LA}s89etJY$x@^2nP1Wi_?HJ05T2C&X%F0T(q~trk zx-)`yXsBwf*Nj2LR~!yK^cU>w6ux_xkHbO8>9|`#uyIcKl!ex3#Q%@72@0+YAA!xP z4p1rEy&}2uFHF=mpFEMdh67tQ9@F)VR&`!o;~%YPA+Ncx9nj%y;Zd+f=+c^q7p3SwEB-gn^7P~kzJ6jVN7N#myp(2W!MHNytnTgWrKk;})P_ob(qxGRB>~9e&yA-IT*YH2#xiC{vFA>$y96(T2ZpGIQdCSs(QI5wf1 z5)TE_Gkh?pO7%7;37>&R?qj+si~G>^8Ds36i?{h`1$ox1iz^j zSCae!fkf3>vMzx^V61;#cATgahSA4pEwH*jTc_d_;a&m=urC4A&d)Yagbu@wxnPBC zu+C@(Eue9dfA63k#X3sL-B#L+O-!UFA!?)1qA1E9nH`4^=$7T5p$IsRHu zu>RP`zis)+0fW{T3YgaB+kLP@o0sjLm?RSSF6k`Fm1`aF2)s|jw3}7rI+#NOzN@RK zGU(r|G=@PLhAGY-DUK69v7i}T(tZ)01H%wtm^ccUEjOJDcV^$mK%jxe*hSvzMMkNI z9ZxU$C{|RmY)o~iCc3S!rnSI%P3qEupN=`O5wpX$> z-mQXN)dT8Nf(1Y`9avjiyMa$iV}1R1Aq>WCr-u?2y2))Rbh0Kmyr(s=27AtAe3Mn5 zf)a+&X3)x~gh^vkEj&AwI~Ex~ut`rU$MJJ2J<~R?MQT@5{3*!pD2`*P!k(k7Pl$5` zKE|Q6%}r+F$)5AUuA&*3v?=bWbO*{;O$6Zcf3qip@&i~}*fUDhfwRTjz zpQJ-ZOj4$}XF1S;>}ARvD3zMCP%HjBkagD0`30?5!xu9&wP7o$UGC z=lA>r&(lj1=X^fz_xp3-*LB_3eTy-;rAbE2M2tWn$h5W8jo{x_>|a8B_-r)oN`OFc zAhgw0Onl#Nyz{X#c09S*n*Fy?T6Bf-Dv>sWZ5TgSH2NmVRa%eOV!85B!-E<(7Scy+ zStVH|MGw0y){3iNUm?C_;IhGOY^cmgeERR`jOuYeClT{inXxtRCN>hz%M@D&-lZpU z2eO>uM7*gsq5uD%Vx+n+>??I2q>$-dun%OrW#5aKXFkynJ5}OsaFx2R^4^bIRc&R_ z{Zv@Bck0RxEAO77>DjMY-mAPbTu;QGnBi({UkVA1qTCVT{C!=u_hj!V8|}EhR2uJiHnEwr|_h9@Q_&Z?=Zx=;SN*;M0mp7Ae=%Nm5c$R|y;x%HrMm`T2|7j123dpJQXSKX(8A zbv7esmD}wa{GjIU=kK5A@8=if=Ircz^ZwOd4JTjq!Br>1^M>%m16CH6aTOI6=eD*s zQHAT*=P($Ayu7@*g++URKdFO*L!#DYyIp4pZEk#B~Rv;lI6{*aDR_6+7 zYP#Oo*ogV_=gkrZ!@*O@-O&&(5<03gSiblyg>omPr6t(L!(%%(1c%@!+C7z3SXr}u zfN;)eD(CV1f=o=5?wvUGHK*yuzW5SV|?Dxhq?U2BRS zZJ&LGc+ob?f`ntTv9UooIy(CL`rhOWe^TVABgm6@aJuvLf{pXHnzi+80s#fvw7_<4 z_3_%nlc84#R?{Yu)X>!r4!+oXhZlUCPMQAXVwAAet^%{Pw2#A? z&6iX{G{b4ZrP48)$DA=B%_`wE*td_iW-bi2#B(AI(%Zk7{ERT;L5GAO`}_Mj=wew3 zIe*1G7R-kG6-=x6va-Uw;Q{LRO9mU%J4o#65j)R< zeN?sB>FHCfckzPm{%;+*xaF0VavFqxbZ1!bBqs5{Ol8z+2X5&Tia+u2sGDNkUh~@< z8`;-1M(u7)(Q_rO@NjlUH{Ky}Dkd`;IS)`L6tAhM_%cRt=v{y8;&L&YhFAU(apT4f zQ6f&)om?`%s7B{72`+TN?!*hqpHYzG%&3o%&m1;cf zcJ=qRhVl|N2?r-I*S6OV=5IUVItd7wFvSq6yW~_O2_RdDacaqE!j5PiEceg;ftmCz>^SATx;F_e^ z4ay=XagImPW!i^(C3}W^h^USbWe!9_&)V>684b#bIv_B_+7j1^uvzPJXhsHm?#(x$ z8nJY?OZ{&MDJY__A{KBFl z!`ru`K7W>@rKPnw*!;Eq@1M(SL}X;7n6z|MQWBMwm6e#+(oNTyM#iY@$>p`RJ&n)) zmHTYn0|c@e%GJv+E>^#Lm-SwgUjz-`Et|nim1AKvS1;EG#{RC+J!c%R3bKCnWHCu` zQ=;ZKz0^xwf~n~iZT%+1#x&x1^@Hk{Pu};YB|GGrtr|PwCB?`d2HXi2q)t`idiC|E zI&nn|53Yi(eCt32S}-))ohYf*Xul;u*F#pJ{6)3Prn{?aoUGRp=IGz@mAMp0Q`1Yp z6}Wfl@8TnJ>|a}=h4roq6%1S7V^ADtgpPD|BPGrz`wBWiDNZ{NT3czfJWfhWjQt%hpUU!zm`!sq zw|Vya^rhIWTO2$h1OlG*S}(q-{LH?YO2XRa;9`c3e3=1kBN{_}kW}sYPNzQ03SW1$UAR}TUvR8dFSEH;cLf$N1Hfng> zD!Y4;3)V%VnXBf?HBz`LN=axz77S^0MNrVxY(KXW0`$Ry2jk_oIN_=v+=vEOo#Tm- zzctZ&G#AR4Rt7>`-fwgq_qR>b5CwmI${pr4gjl?3V{fp2SZvRimTmLl$)+aQuCwyp zi*1cu5hO?1QXZ?cYSA z$rYnWkOR2XA1+;16^xEBijFW7yObK%v)IDuIjWDgdK8*S9ZXQ*DQj|T_YMwCbDbK- zy#!%vYs*R;aPJ;lWo4zuQa|JRcm+;I;6CH&>FKM&pcE>b(AmeXF~)Q@Q+)NQRL5lN z!UU36l*5jTRnk=XEX5$9mGwO$Bo` zjm$lsdw3$wdsy0yJ3EqUp23Yj5c;|^h8K|_h<3mDt7V8*g6H>PGb3bx=3(P82`;Mc z^Jlxm?YY!zj^wxA%7nN#AK}jiUtAZt`#HR^QQ`Ga+LBP>znz`Lq@)m#y;SMa?lHD3!H2 zfmazKIga6~alu{;#rTdxAx%oyt3wvo=5BF{$sx4{LD6vrxO>r}HxL>8_U5MjP zVkEU?V-u&-AZ>Q%q5&$qYuV;&k3eFog<(R{^LOQvo4NlX3IHug&zX!WaCp!})^X-7 zdJ;&p7iVPqOPdxy4vMBW`xpL--S4FgIR2A&xIg9ow}(AAGdo-T4~vSK8QqOI2Bb)e z?mIHKFPE%ew3WR?N%$w+x`u0hbyenVHd|$roG>LvNd$_&MjGc4iit2W_6_G=mXQd( zD>=cvTZUTk-wZjG$;}cj$l{aPh85Y3L+~6T*FO-Ii_J5*UOtml+?)G%7g#&a1du zy1hv%RtaiBUq)GNH&(#XZw^FDhnq z*XXOiYNB5q%2%D=6Dn_Sk6w^K=8~Tyw5k>V6-UXOAo6DkbB}<`5Ma^~(Ig;RDofoA$wx;pn01 zPP(F=yV*pP8x8n&G|o|NqAlo%zC~<|f*|QU{JVe+n6s0Etm0zQuC6YuRC>BG8F6^% zJ3cjKZ22KYUl)8Q$GC;rhahr1UFJm~W!YFN9gK|5faA4_i{o#|tTg2zXhgPnszL$_96&Q~? zN}}Qlzjk-6_y)~)BfpsZEp0j9hDA{IaEe#pr+?b6OT#%txif9<9lpV7dxR=aTn|NLb3!fvw4*~7;tPdMljeG?S9 zhno#s24-ft)aSsabL|l%9^T#?gR8TWxY122Dou9lWrQB_YLBPM9*U>adTG>>A(E-5o@<6 z_hq3Wtvq93=5;V=<jj5;mDQsnI`5pZ{EmwuhQ1I&&K~5%IoOqAqY@xnHW2g zlab*N7ABLGmE{)|)zs4?yVo2L0~Ia?(-y`c;bf35>a$*n>ZPj=xVfD}QtrAt;89K9 z{ngWvR;qXrV?XAbx~={S;Y?JorR`*e9zJeTC?N6yr4aTCccNI4N0C5)$fqKpU$ngT z$%jXdi5ZJ~f0U9#treFuF#qt>dFcqf(?h=f7!yDy#~P{ zkf%qr?c1i(RpHn-CUbfyE8tI%MQPa(*)Qbcd3brLJ$WL*#m!B{$QT2#vQXA?-u~q! zpXcGW?fP^*O<%IG+RdA!z{56=gk2g;^Z>d`C#S|dWZsfD4K`JeSTEx_?NX~tqO@?O zqIcd#RfR*drfkIAJU4<5F#l!iaoU2FH3*Yea?tt zM;C4Mq)P8lN+Kt({^7mxOgN;zfOQ@vWxtSpQ|S549=;F(LM9nTS8{sl50b?^-zj&# zwMs2X5I5G>%XY`J#zLXMAtgnZF7-(D)-7_knZ}s@{+qv-m$Ry>XaN^`zkXGH`0&c~ zuV2oCMa=#pR&|tox853j-Q9fx6@(Fej*AY$bbBou@vZ6H>>YyF>e}Hxd#v}5VE!t3 zpE+Ch`0VjM5M`2z1YbO*D`Yo6f3;FL<}**156gNie~q4mD`8}7=GEfP4@XKVU%KQM z=cc2poy#_XyO$34G7xNIxa4%39u?%_C2vUj^&W9zVr*Qeccr3K!tgmE1E65*`TAPW z^ZfJ~EgjwbR?9^^L?%ZJnG{)}CbD_H+BBNuDLrKZH1Tj`-9rfvxSKjn;9?!OqEM(+4 zBPyN{D#vJ&X>}T#y}H>X+Q90+lFI9>5B)v`&07p69u>X=z zle*Ht^gf{`TEe41$|S%fy8C{CG{2XC*^1PzPDITI}lSDc)&Up@WPhW&F5LPJyjy_SYG~-YYgO z(Wj^8NDsB(MKdUfu+N1lbtI3kk&E4BcPZ+-dh6@&5JQGHV%7p&9U(9&doFl z?Twq(?>~I_P!*GyYsub3kM3EtZ5+5NiQ2}@F~l!s=@&F5-xfinaLZ>+86ndetts~0 zrO1Mg?%apt0xZWRAm|tvpa5pq0PzFz!*lsNt3u#0t*CW#=fo#RDkdiQCJC&O8;Fcv z^qx9IC^0dyfw{RB5oUfqlv^_%v$r-@^(&eCMqFmKG?18its84e;n?WtJdpPlJo5@W zyp7P^$w`Zx>*rp}-*cp@oOSocTc#wfW%RAx#VxMxL0PE&hpOm5C85^hM*)iJ zTvUevieP6_v9i9vDx~Q;&+%G!cJDjZP&|D7`qco$W1fD7(HS_(a&^=caKYi$C)h z&)RaoX^no;DT1<~EDOBm>S{^XM~^sZiK!SEwDg>6Tqi=OYTdc7U86bK-%xw}_-eAy zoltDjK(<_=FRpc;jf{;Y;Zass$94PlS)*DMs&A|ouBZ?{Jv;Nsa{vt#~=4C`mp9ZLije}n;!R%4wtRK(b!{G{StPV?@$_Xg{D{FpegFMJtofLjfSjfE`#X88X<=ewg6WE-_dP$A#qO!RTueq@K5SrFjVsCK?|heuuCa-U zx}MX$M&FS6c{{AMeuaRCfmM(ttcJ9ibC0x#iCP^#{V20m^7Zqx>rLcjxO$%upPVJ% zePrFV5tt{)v84d*>1R`cTgOg!-T$y+&ZVhD;Z zNE*;qk#I_LW7fer-{we&iNzj#r3H`ap&pcRkpL9N8#lp)0yj+KuB_?ZyD#8THIJaO zb8@Qxpi;KCJx))yT896_h~*6z1A*ZLTDu`%Ifk>N$76fB()P|5Qj-RTZHYq_ z8%oX>J3EgHgGEI|Zut7j*xB1BrKD)OIFFWC5>y<1`^5sq)M)V?wFVOds$xhftA?j! zqobo6BFbK+n`z?q_)z)hFAE9?w1GAebLeN799vsm6??jF4tdprhxse^o+<2WX{&|Y zs^fN?-lZD8Z5sj4(1>1gIKprgm9Ik3CpQD0BrQrdws?J|Gg?DKL-Xo~m(I@)tg)~F z0ox4?5wYO&fPmA#J>xZxm;nu(_}&BXMUt~Vzc||p_TBkSgiX*pcd$A`?aFH-zPiiQ zF-G!9FJG!P7O?;;dx`9n1_ehhBp{wwi}bxafo*Ut+=y` zF(~+oK}Kkv+yx-Fz-zfj(z@s|$InVC z?UlHOKFR90H)9TY}D*F4+KgR9Oc1 zIqvfE@;=0~sW5**Yy%)iKtK@3DsT2EG9uy!CPgPl1}?pE1Tu*T+==n=aT{2Mj{Ptk zx|0*3v9WP#dU^+R))d$h{)2`eA~!deGDh9xYfsU08)gOuWqw+0-;FDYkcC_`=dvF+ zdbN*Yv6j)9#Sd;o%6Ju5L_~y;l(Z8HE|1+6L)Y16*4w34Di0p;fCpxH?_RupPkh_N z1mnM@Z&{{$Acfn1{4o4eya|x(d9weAiLl751OCPnXvJQ_a5wNTDX5zV_#jwtq9E!TM}V#^;eQ z$-m57wsw02H#QB7^`q=23Q;WDrRKP9!-z zIpLO&phY5)T6%h2K!TpD!va{afndfa^X9LHq<8OLeEi5oy!-6mQd?&yE|zBv4XNHM zJX6(sj8DptS(RhE^ZSdAbO4i5P~&>&(+URg>kLqjj(7jOC`B%Pe;1pd&u_5?AP@y6 z_YJ)5{e82^>Iowx?ZHkQyAm4(n?k0Z9~Lv;t*0pkD|)vCJ;TStle9S7SYJxlY3U7!^oK4kbE~U5 zVHpF<_J4lnRFx2b2xAblK~!)2-@^&h(b0KmgeWk14r1BBx~Q;F6_~X91#_Mm8se{z zRyl~|Wiqjt<9C+H>}7ZmsS?iAc)nIvETE;G2E_gM*KeGhhlk@14-aF&XNN<)5fGr@ zHeDA2I-uhhi-_cX1cLe%b{62*JL=4jA5nnrYFb)^a9-G0hIkC?S+E@`G|ew8Y;O)c z!OYEt!1eAsI@&{8L04r=7->P$XmX_s>iq34dTSd1>G5h8dN{_v2eZN4e0&5N8XCRd zzF}X00Rb|Ur$1zohIPL{U-$O+t2;Xjcz^ub-i~4+C!pcIX@I&9_OS#~NLV;2Ir)Zv zKfIxB`JX^5H#fI4#~Abw@-l)@Q60`Eh!ABoSdvNmd)TW%G6_?2NJ?IUMkwa5Zz@m% zU~#@{T}IvqgtoSJ74gODh+thqgE1;RB4Q4BrD_@6LH(@QU%>ARaCqaNy#*os!T{#y zQ>=qjpx6os2;fHox2x>!LXI55hAO<*%u>_RxS+Hd85v2v?l0wcuu1m8AR0IlG^H9p z?P?wZm>7}+dkoFz$1Yf>7p#vCxW(Vui*tG?I6FjJPXAW`)zvY8AgX)vhq|$;scp`q z-026`q{x?(gRKP!uin1CtSbSaPe&GtsBL~`Ygf@ZwW5(Se!KZbW#1S6=Cdhra3Cfo zCaQX-KYPdWwx&tCm=IGkGwYrlLvSbk_utPe$ltLT!>k*IZ<3Nem?4t1!nc}F;`h(K ze$@d~(LsQvnxpX;5Di~@GHfsCpvv;c0BPNJEZ%g#x zput+==3J2%)@8+i)Odqqd3gTj7+Tg{`2?d3Pp;1wq>39Gq z-SFhgAN0}Pzkfdy^dyiEPHfjl+(hdWD?`JO=g*0;dx3R*76$no0Tyg~d%IY`p+~g( zN8VZi4;dCv#7*}-hpmituAi^;wLhfm_3 z^PLXC99A7~#cWkS;hNXDGH&>ThS#y=u@Gzp0hMir)_%z=c}L7-5lC?R3tvXn9YoiG z1$evG!Dp9BOG{UNHArs|4uUYo@)H1ht9#2CJ_QBEFZxVbe=ifF#MiGiPVBSu@`iAo z#*GD+n*0xJ?CezASZQg)Aw!1P{_Txf8>4#5zC9v4_4cmRHt@n_kbB~k#V+<^n8D;7 zwuStHSj>Ol^;Jqr?O|XO$OxCQQd9q$S^;dIHJ^D^#Jn5~BiY&- zf`fI(S5gqd^(*0^rGQNe>{yk8-lqNPs}<&V6F2CG($r{(xgG%tV(b@Zg@EpDz}end z2^};cnzWJTLUh?i0w6;svaz!n-{_Rd>*bKp6#(QJD?BiTa{z~?+LAR*5FJ1U(>O7( z4sPgQ08t+cDC^qZehpcv^Lhu?;_=w;Uy>Si3~tN$anV<$>Hm0ioz4Q4mC-+=w|?g6 z4u|Jiw*=|LPC-(?N=}}Ku5uLwagK1!qUPIfT+F{C5KCf`l3jpm6Z{^4WUv~~{(@Tw z(^57JWQ*os0aouUTjzUTUjrxwtOe=(>^}V0Kr-3F^2*I zL4t1ML4qiU&U+*%&(7}dc2HATlgis$(yYV+4+>0Qe}8Uyd1knL1eBc64rJT*l3{_? zzd+mHk=xd7qoc{8lQ76ske94ROHHksz70qr(Dv%h8*L&;%3Jcf7BCoK9dv{Tbk*}w zBi5Vyq!N@cw!S=pS!) z;^BL!!^1=VHY{VTb};{LkZx*hEcZWfTc7w8^_5lrsX;B?tGtGWhMzZTz_A#JD+A-}#O*o>JG;7Ufv<<_ESGPES6>Q{E&uW3hmOZ( z9-g-L_K$a@GamZ#N!`AEJBLOEv>IdEbWFH+oft}_wnaB zPjGN>wSNGBzOzq!QGR|aueO_rPIovKvovW=ajKJBt#c%J*^z`&FF}5)Ny|nZ*=*IbxxgHVlO&rvF zf<(gx2)fva@o{s7pi}cdo;wNRg~i1t_3yFr4~@jJfuyUF{sXcQCOypLr&9DE(pnEe z=R^KCioU6VBe%L$y8rj@`#DOh5W`L{-z}j<^(`$e!Dl!ABiqr@Ve9N%P?dijxcKec zx5J7V@aN~fGjNKeb>YT%04h2D=MuE7Ft`J7C;xQaX@~nc?I#fIfB<qXh>a6z zw`nwt012YOA^Mp%2kM}_qT&ZX*8b6*y7WwH`t=>a4X7LF!bJ58ObVYE>cETwv;d%q zTvSC71d$4(MYm4^$jQldrtqPVhmv*de>h!URb}#Q<^wzl2&C*6a*teH%K-;qGD*UZ zx}>m>7}RW)%QNipUbX-OE?m_%D}6fXWJ7xL^2+|k)b`)M*oAN^yM(x>0@-LdIPePh z#4!$WtuW8H1cPOyGr-8i^c;zUj{%IS0*O`ml_*hR!c_`-Eb1q3z@=%MnqtlfIu_Vi zgW$tFuCH42xg$h3KR*vm_z$}cXD~6qdmS_;{1l`hKh*P{TQk>B!ENk3C zDG45I!sn8YR_LI!<2k5AhP|wz90H+)pVIfp1PzwY0(Ly-@gi}lRedNZXl{P~XsXOl zxDY__aC3it{rY@za*%rak}*H6(HKRalKQO~qc0bh?|1&@7n)f0TUb~aIlH;tdY55v zDwon{S|12wHf@k};HOpH|1|MX>1}A2-3MSMLUQtM08y$-mm+LCBC)8C->d*T0;|)z zsr1boMj4h{FX^kjWGcyG;Hkq06y-o!Oc5=*M1w!+@~&0NW;9JDTPEkrw~d%cc^}j) z&3yU59gdWbU*`XzIknWs2`Qb5ca0;dJP^L@aDolqN!swr`e^{BYaDrlc z89mC0$@LK`BgA?DZ&0Ftl2j3=Q@JHe487yY|2B(q(dIVsF71 zq}TD4Ff*dHmVWmg5%%VkncN{`_}g!iqo^{CZQb2h#*Wn z>=YplQjTVSKm6WH>_lQFA`NlZvdytDh@M87Jriy+b02qw12aY9m;39F9O^XhJf+22 z6b+M}U~112-wl0_w5~N$LBF5mN5>>38J5=I%)TG2y#yz;w5-VM$%693iSJTRb%YATnNe|O> zad5&+RHHNBSF=rCR+d)PvQ{PB3Zqb583QtWfu2bkyoPa+QaWDY-d&#4cx}7Z@#)sg84IVnD&gGdr_qx4*Xt4Q*mew8 z2Vcf13_1{~K08d<)C)}L!&V{?y{j-*CUgaI9aeQy?@Lk^U zaw1MH)o4@DoiF_k+@_K;vqIeU;hplh=UarFqkA_!d(-zd?ax~5PNVoUsH84eMm!Iv zv>Ph1tkqY9ok}b_4KkL)zJo_aeFYo5*J|EU+UXLCb60+EPwbt{pdf5I`;m$$%vEWM zaTT^vB^2iiA8$U{Y*4xGw|jU;MAb2D#t_b}R&*D3rwWSa2VA=NV8-8_l(RFw*Mgmf zYwgVcrSyn()<%NDZ&WXR$IeT;!02_nbjmllQsI<6wKIM$PPJ~oYWAU3RfP4Zu~%}u z57(NK^xs`+yD$F$z7~Wp4X3de2j|~o8N|o+c*=S8`>$t1d%vGn#<=bZY@IERSTCR` zRh5W)`BbmNJ^FYODOHQ3`~o%^J9l#DdD z!YTc^?7QN6$CEl{U-ph0u>?M32~wTewYkuo5sF@<-sP-(8m)PsTj-i<^s8Pv$*1c3 z4lo5CzxSszdnPYSRgRJo=c)QAk5)_^l`+@a(Tgw4hf0^P*3eqAmryFR6~^QKidjEJ zBa@mK*^=%Eb5&-A$|kWc30*S!nmv>IAgqexD*k14Xq6|4xAR_g@S|Z=d;Z#bfyCPT z$F>%SHO&+5t6}~$6X{pEDy4gQDy93%^pP*`URezGVN0rL<*js6ArI2$vR@9|$=wm$ zKeOONE6~z+yVFd>250n=+rrIX?7>?nqI$_a1K~f{CcKT#eYVu@3&DiC>l41KW>3fi zp7mO1TcM7AD2uccsPE%9P)($7wB1knzNy~b9;MzL$#Uw`o1Uym6;whGTT=IJP+U~) z{db+W;r^AY+vLwWqHcxFiqUE$_HodMYV$4%EYB+u7Yt#f<1WTHE;=s1B%Vm5XbQD9 r&G+xP`SjcU|CiqciFq1*K`|poTp2%1*A2h2g3#8urCzFP6Z(Gu#@g~e diff --git a/src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/Newbie.kt b/src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/Newbie.kt deleted file mode 100644 index dcc8e5f86..000000000 --- a/src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/Newbie.kt +++ /dev/null @@ -1,678 +0,0 @@ -package eu.kanade.tachiyomi.extension.ru.newbie - -import android.annotation.SuppressLint -import android.annotation.TargetApi -import android.app.Application -import android.content.SharedPreferences -import android.os.Build -import android.widget.Toast -import androidx.preference.ListPreference -import eu.kanade.tachiyomi.extension.ru.newbie.dto.BookDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.BranchesDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.LibraryDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.MangaDetDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.PageDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.PageWrapperDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.SearchLibraryDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.SearchWrapperDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.SeriesWrapperDto -import eu.kanade.tachiyomi.extension.ru.newbie.dto.SubSearchDto -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.POST -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.network.interceptor.rateLimitHost -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.HttpSource -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json -import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Interceptor -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.MediaType.Companion.toMediaTypeOrNull -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody.Companion.toRequestBody -import okhttp3.Response -import okhttp3.ResponseBody.Companion.toResponseBody -import org.jsoup.Jsoup -import rx.Observable -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import uy.kohesive.injekt.injectLazy -import java.text.DecimalFormat -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import kotlin.math.absoluteValue -import kotlin.random.Random - -class Newbie : ConfigurableSource, HttpSource() { - override val name = "NewManga(Newbie)" - - override val id: Long = 8033757373676218584 - - override val baseUrl = "https://newmanga.org" - - override val lang = "ru" - - private val preferences: SharedPreferences by lazy { - Injekt.get().getSharedPreferences("source_$id", 0x0000) - } - - override val supportsLatest = true - - private var branches = mutableMapOf>() - - private val userAgentRandomizer = "${Random.nextInt().absoluteValue}" - - override fun headersBuilder(): Headers.Builder = Headers.Builder() - .add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.$userAgentRandomizer") - .add("Referer", baseUrl) - - private fun imageContentTypeIntercept(chain: Interceptor.Chain): Response { - if (chain.request().url.queryParameter("slice").isNullOrEmpty()) { - return chain.proceed(chain.request()) - } - - val response = chain.proceed(chain.request()) - val image = response.body.byteString().toResponseBody("image/*".toMediaType()) - return response.newBuilder().body(image).build() - } - - override val client: OkHttpClient = - network.cloudflareClient.newBuilder() - .rateLimitHost(API_URL.toHttpUrl(), 2) - .addInterceptor { imageContentTypeIntercept(it) } - .build() - - private val count = 30 - - override fun popularMangaRequest(page: Int) = GET("$API_URL/projects/popular?scale=month&size=$count&page=$page", headers) - - override fun popularMangaParse(response: Response): MangasPage { - val page = json.decodeFromString>(response.body.string()) - val mangas = page.items.map { - it.toSManga() - } - return MangasPage(mangas, mangas.isNotEmpty()) - } - - private fun LibraryDto.toSManga(): SManga { - val o = this - return SManga.create().apply { - // Do not change the title name to ensure work with a multilingual catalog! - title = if (isEng.equals("rus")) o.title.ru else o.title.en - url = "$id" - thumbnail_url = "$IMAGE_URL/${image.name}" - } - } - - override fun latestUpdatesRequest(page: Int): Request = GET("$API_URL/projects/updates?only_bookmarks=false&size=$count&page=$page", headers) - - override fun latestUpdatesParse(response: Response): MangasPage = popularMangaParse(response) - - override fun searchMangaParse(response: Response): MangasPage { - val page = json.decodeFromString>>(response.body.string()) - val mangas = page.result.hits.map { - it.toSearchManga() - } - return MangasPage(mangas, mangas.isNotEmpty()) - } - - private fun SearchLibraryDto.toSearchManga(): SManga { - return SManga.create().apply { - // Do not change the title name to ensure work with a multilingual catalog! - title = if (isEng.equals("rus")) document.title_ru else document.title_en - url = document.id - thumbnail_url = if (document.image_large.isNotEmpty()) { - "$IMAGE_URL/${document.image_large}" - } else { - "$IMAGE_URL/${document.image_small}" - } - } - } - - private val simpleDateFormat by lazy { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) } - - private fun parseDate(date: String?): Long { - date ?: return 0L - return try { - simpleDateFormat.parse(date)!!.time - } catch (_: Exception) { - Date().time - } - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val mutableGenre = mutableListOf() - val mutableExGenre = mutableListOf() - val mutableTag = mutableListOf() - val mutableExTag = mutableListOf() - val mutableType = mutableListOf() - val mutableStatus = mutableListOf() - val mutableTitleStatus = mutableListOf() - val mutableAge = mutableListOf() - var orderBy = "MATCH" - var ascEnd = "DESC" - var requireChapters = true - (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> - when (filter) { - is OrderBy -> { - if (query.isEmpty()) { - orderBy = arrayOf("RATING", "VIEWS", "HEARTS", "COUNT_CHAPTERS", "CREATED_AT", "UPDATED_AT")[filter.state!!.index] - ascEnd = if (filter.state!!.ascending) "ASC" else "DESC" - } - } - is GenreList -> filter.state.forEach { genre -> - if (genre.state != Filter.TriState.STATE_IGNORE) { - if (genre.isIncluded()) mutableGenre += '"' + genre.name + '"' else mutableExGenre += '"' + genre.name + '"' - } - } - is TagsList -> filter.state.forEach { tag -> - if (tag.state != Filter.TriState.STATE_IGNORE) { - if (tag.isIncluded()) mutableTag += '"' + tag.name + '"' else mutableExTag += '"' + tag.name + '"' - } - } - is TypeList -> filter.state.forEach { type -> - if (type.state) { - mutableType += '"' + type.id + '"' - } - } - is StatusList -> filter.state.forEach { status -> - if (status.state) { - mutableStatus += '"' + status.id + '"' - } - } - is StatusTitleList -> filter.state.forEach { status -> - if (status.state) { - mutableTitleStatus += '"' + status.id + '"' - } - } - is AgeList -> filter.state.forEach { age -> - if (age.state) { - mutableAge += '"' + age.id + '"' - } - } - is RequireChapters -> { - if (filter.state == 1) { - requireChapters = false - } - } - else -> {} - } - } - - return POST( - "https://neo.newmanga.org/catalogue", - body = """{"query":"$query","sort":{"kind":"$orderBy","dir":"$ascEnd"},"filter":{"hidden_projects":[],"genres":{"excluded":$mutableExGenre,"included":$mutableGenre},"tags":{"excluded":$mutableExTag,"included":$mutableTag},"type":{"allowed":$mutableType},"translation_status":{"allowed":$mutableStatus},"released_year":{"min":null,"max":null},"require_chapters":$requireChapters,"original_status":{"allowed":$mutableTitleStatus},"adult":{"allowed":$mutableAge}},"pagination":{"page":$page,"size":$count}}""".toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()), - headers = headers, - ) - } - - private fun parseStatus(status: String): Int { - return when (status) { - "completed" -> SManga.COMPLETED - "on_going" -> SManga.ONGOING - else -> SManga.UNKNOWN - } - } - - private fun parseType(type: String): String { - return when (type) { - "manga" -> "Манга" - "manhwa" -> "Манхва" - "manhya" -> "Маньхуа" - "single" -> "Сингл" - "comics" -> "Комикс" - "russian" -> "Руманга" - else -> type - } - } - private fun parseAge(adult: String): String { - return when (adult) { - "" -> "0+" - else -> "$adult+" - } - } - - private fun MangaDetDto.toSManga(): SManga { - val ratingValue = DecimalFormat("#,###.##").format(rating * 2).replace(",", ".").toFloat() - val ratingStar = when { - ratingValue > 9.5 -> "★★★★★" - ratingValue > 8.5 -> "★★★★✬" - ratingValue > 7.5 -> "★★★★☆" - ratingValue > 6.5 -> "★★★✬☆" - ratingValue > 5.5 -> "★★★☆☆" - ratingValue > 4.5 -> "★★✬☆☆" - ratingValue > 3.5 -> "★★☆☆☆" - ratingValue > 2.5 -> "★✬☆☆☆" - ratingValue > 1.5 -> "★☆☆☆☆" - ratingValue > 0.5 -> "✬☆☆☆☆" - else -> "☆☆☆☆☆" - } - val o = this - return SManga.create().apply { - // Do not change the title name to ensure work with a multilingual catalog! - title = if (isEng.equals("rus")) o.title.ru else o.title.en - url = "$id" - thumbnail_url = "$IMAGE_URL/${image.name}" - author = o.author?.name - artist = o.artist?.name - val mediaNameLanguage = if (isEng.equals("rus")) o.title.en else o.title.ru - description = mediaNameLanguage + "\n" + ratingStar + " " + ratingValue + " [♡" + hearts + "]\n" + Jsoup.parse(o.description).text() - genre = parseType(type) + ", " + adult?.let { parseAge(it) } + ", " + genres.joinToString { it.title.ru.capitalize() } - status = parseStatus(o.status) - } - } - - private fun titleDetailsRequest(manga: SManga): Request { - return GET(API_URL + "/projects/" + manga.url, headers) - } - - // Workaround to allow "Open in browser" use the real URL. - override fun fetchMangaDetails(manga: SManga): Observable { - return client.newCall(titleDetailsRequest(manga)) - .asObservableSuccess() - .map { response -> - mangaDetailsParse(response).apply { initialized = true } - } - } - - override fun mangaDetailsRequest(manga: SManga): Request { - return GET(baseUrl + "/p/" + manga.url, headers) - } - - override fun mangaDetailsParse(response: Response): SManga { - val series = json.decodeFromString(response.body.string()) - branches[series.id.toString()] = series.branches - return series.toSManga() - } - - @SuppressLint("DefaultLocale") - private fun chapterName(book: BookDto): String { - var chapterName = "${book.tom}. Глава ${DecimalFormat("#,###.##").format(book.number).replace(",", ".")}" - if (!book.is_available) { - chapterName += " \uD83D\uDCB2 " - } - if (book.name?.isNotBlank() == true) { - chapterName += " ${book.name.capitalize()}" - } - return chapterName - } - - private fun mangaBranches(manga: SManga): List { - val response = client.newCall(titleDetailsRequest(manga)).execute() - val series = json.decodeFromString(response.body.string()) - branches[series.id.toString()] = series.branches - return series.branches - } - - private fun selector(b: BranchesDto): Boolean = b.is_default - override fun fetchChapterList(manga: SManga): Observable> { - val branch = branches.getOrElse(manga.url) { mangaBranches(manga) } - return when { - branch.isEmpty() -> { - return Observable.just(listOf()) - } - manga.status == SManga.LICENSED -> { - Observable.error(Exception("Лицензировано - Нет глав")) - } - else -> { - val branchId = branch.first { selector(it) }.id - client.newCall(chapterListRequest(branchId)) - .asObservableSuccess() - .map { response -> - chapterListParse(response, manga, branchId) - } - } - } - } - - override fun chapterListParse(response: Response) = throw UnsupportedOperationException() - - private fun chapterListParse(response: Response, manga: SManga, branch: Long): List { - var chapters = json.decodeFromString>>(response.body.string()).items - if (!preferences.getBoolean(PAID_PREF, false)) { - chapters = chapters.filter { it.is_available } - } - return chapters.map { chapter -> - SChapter.create().apply { - chapter_number = chapter.number - name = chapterName(chapter) - url = "/p/${manga.url}/$branch/r/${chapter.id}" - date_upload = parseDate(chapter.created_at) - scanlator = chapter.translator - } - } - } - override fun chapterListRequest(manga: SManga): Request = throw UnsupportedOperationException() - private fun chapterListRequest(branch: Long): Request { - return GET( - "$API_URL/branches/$branch/chapters?reverse=true&size=1000000", - headers, - ) - } - - @TargetApi(Build.VERSION_CODES.N) - override fun pageListRequest(chapter: SChapter): Request { - return GET(API_URL + "/chapters/${chapter.url.substringAfterLast("/")}/pages", headers) - } - - override fun getChapterUrl(chapter: SChapter): String { - return baseUrl + chapter.url - } - - private fun pageListParse(response: Response, urlRequest: String): List { - val pages = json.decodeFromString>(response.body.string()) - val result = mutableListOf() - pages.forEach { page -> - (1..page.slices!!).map { i -> - result.add(Page(result.size, urlRequest + "/${page.id}?slice=$i")) - } - } - return result - } - - override fun pageListParse(response: Response): List = throw UnsupportedOperationException() - override fun fetchPageList(chapter: SChapter): Observable> { - return client.newCall(pageListRequest(chapter)) - .asObservableSuccess() - .map { response -> - pageListParse(response, pageListRequest(chapter).url.toString()) - } - } - - override fun fetchImageUrl(page: Page): Observable { - return Observable.just(page.url) - } - - override fun imageUrlRequest(page: Page): Request = throw NotImplementedError("Unused") - - override fun imageUrlParse(response: Response): String = throw NotImplementedError("Unused") - - override fun imageRequest(page: Page): Request { - val refererHeaders = headersBuilder().build() - return GET(page.imageUrl!!, refererHeaders) - } - - private class CheckFilter(name: String, val id: String) : Filter.CheckBox(name) - private class SearchFilter(name: String) : Filter.TriState(name) - - private class TypeList(types: List) : Filter.Group("Типы", types) - private class StatusList(statuses: List) : Filter.Group("Статус перевода", statuses) - private class StatusTitleList(titles: List) : Filter.Group("Статус оригинала", titles) - private class GenreList(genres: List) : Filter.Group("Жанры", genres) - private class TagsList(tags: List) : Filter.Group("Теги", tags) - private class AgeList(ages: List) : Filter.Group("Возрастное ограничение", ages) - - override fun getFilterList() = FilterList( - OrderBy(), - GenreList(getGenreList()), - TagsList(getTagsList()), - TypeList(getTypeList()), - StatusList(getStatusList()), - StatusTitleList(getStatusTitleList()), - AgeList(getAgeList()), - RequireChapters(), - ) - - private class OrderBy : Filter.Sort( - "Сортировка", - arrayOf("По рейтингу", "По просмотрам", "По лайкам", "По кол-ву глав", "По дате создания", "По дате обновления"), - Selection(0, false), - ) - - private class RequireChapters : Filter.Select( - "Только проекты с главами", - arrayOf("Да", "Все"), - ) - - private fun getTypeList() = listOf( - CheckFilter("Манга", "MANGA"), - CheckFilter("Манхва", "MANHWA"), - CheckFilter("Маньхуа", "MANHYA"), - CheckFilter("Сингл", "SINGLE"), - CheckFilter("OEL-манга", "OEL"), - CheckFilter("Комикс", "COMICS"), - CheckFilter("Руманга", "RUSSIAN"), - ) - - private fun getStatusList() = listOf( - CheckFilter("Выпускается", "ON_GOING"), - CheckFilter("Заброшен", "ABANDONED"), - CheckFilter("Завершён", "COMPLETED"), - ) - - private fun getStatusTitleList() = listOf( - CheckFilter("Выпускается", "ON_GOING"), - CheckFilter("Приостановлен", "SUSPENDED"), - CheckFilter("Завершён", "COMPLETED"), - CheckFilter("Анонс", "ANNOUNCEMENT"), - ) - - private fun getGenreList() = listOf( - SearchFilter("cёнэн-ай"), - SearchFilter("боевик"), - SearchFilter("боевые искусства"), - SearchFilter("гарем"), - SearchFilter("гендерная интрига"), - SearchFilter("героическое фэнтези"), - SearchFilter("детектив"), - SearchFilter("дзёсэй"), - SearchFilter("додзинси"), - SearchFilter("драма"), - SearchFilter("ёнкома"), - SearchFilter("игра"), - SearchFilter("драма"), - SearchFilter("ёнкома"), - SearchFilter("игра"), - SearchFilter("исекай"), - SearchFilter("история"), - SearchFilter("киберпанк"), - SearchFilter("кодомо"), - SearchFilter("комедия"), - SearchFilter("махо-сёдзё"), - SearchFilter("меха"), - SearchFilter("мистика"), - SearchFilter("научная фантастика"), - SearchFilter("омегаверс"), - SearchFilter("повседневность"), - SearchFilter("постапокалиптика"), - SearchFilter("приключения"), - SearchFilter("психология"), - SearchFilter("романтика"), - SearchFilter("самурайский боевик"), - SearchFilter("сверхъестественное"), - SearchFilter("сёдзё"), - SearchFilter("сёдзё-ай"), - SearchFilter("сёнэн"), - SearchFilter("спорт"), - SearchFilter("сэйнэн"), - SearchFilter("трагедия"), - SearchFilter("триллер"), - SearchFilter("ужасы"), - SearchFilter("фантастика"), - SearchFilter("фэнтези"), - SearchFilter("школа"), - SearchFilter("элементы юмора"), - SearchFilter("эротика"), - SearchFilter("этти"), - SearchFilter("юри"), - SearchFilter("яой"), - ) - - private fun getTagsList() = listOf( - SearchFilter("веб"), - SearchFilter("в цвете"), - SearchFilter("сборник"), - SearchFilter("хентай"), - SearchFilter("азартные игры"), - SearchFilter("алхимия"), - SearchFilter("амнезия"), - SearchFilter("ангелы"), - SearchFilter("антигерой"), - SearchFilter("антиутопия"), - SearchFilter("апокалипсис"), - SearchFilter("аристократия"), - SearchFilter("армия"), - SearchFilter("артефакты"), - SearchFilter("боги"), - SearchFilter("бои на мечах"), - SearchFilter("борьба за власть"), - SearchFilter("брат и сестра"), - SearchFilter("будущее"), - SearchFilter("вампиры"), - SearchFilter("ведьма"), - SearchFilter("вестерн"), - SearchFilter("видеоигры"), - SearchFilter("виртуальная реальность"), - SearchFilter("военные"), - SearchFilter("война"), - SearchFilter("волшебники"), - SearchFilter("волшебные существа"), - SearchFilter("воспоминания из другого мира"), - SearchFilter("врачи / доктора"), - SearchFilter("выживание"), - SearchFilter("гг женщина"), - SearchFilter("гг имба"), - SearchFilter("гг мужчина"), - SearchFilter("гг не человек"), - SearchFilter("геймеры"), - SearchFilter("гильдии"), - SearchFilter("глупый гг"), - SearchFilter("гоблины"), - SearchFilter("горничные"), - SearchFilter("грузовик-сан"), - SearchFilter("гяру"), - SearchFilter("демоны"), - SearchFilter("драконы"), - SearchFilter("дружба"), - SearchFilter("ёнкома"), - SearchFilter("жестокий мир"), - SearchFilter("животные компаньоны"), - SearchFilter("завоевание мира"), - SearchFilter("зверолюди"), - SearchFilter("злые духи"), - SearchFilter("зомби"), - SearchFilter("игровые элементы"), - SearchFilter("империи"), - SearchFilter("исекай"), - SearchFilter("квесты"), - SearchFilter("космос"), - SearchFilter("кулинария"), - SearchFilter("культивация"), - SearchFilter("лгбт"), - SearchFilter("легендарное оружие"), - SearchFilter("лоли"), - SearchFilter("магическая академия"), - SearchFilter("магия"), - SearchFilter("мафия"), - SearchFilter("медицина"), - SearchFilter("месть"), - SearchFilter("монстродевушки"), - SearchFilter("монстры"), - SearchFilter("музыка"), - SearchFilter("навыки / способности"), - SearchFilter("наёмники"), - SearchFilter("насилие / жестокость"), - SearchFilter("нежить"), - SearchFilter("ниндзя"), - SearchFilter("обмен телами"), - SearchFilter("оборотни"), - SearchFilter("обратный гарем"), - SearchFilter("огнестрельное оружие"), - SearchFilter("офисные работники"), - SearchFilter("пародия"), - SearchFilter("пираты"), - SearchFilter("подземелье"), - SearchFilter("политика"), - SearchFilter("полиция"), - SearchFilter("преступники / криминал"), - SearchFilter("призраки / духи"), - SearchFilter("прокачка"), - SearchFilter("психодел"), - SearchFilter("путешествия во времени"), - SearchFilter("рабы"), - SearchFilter("разумные расы"), - SearchFilter("ранги силы"), - SearchFilter("реинкарнация"), - SearchFilter("роботы"), - SearchFilter("рыцари"), - SearchFilter("самураи"), - SearchFilter("система"), - SearchFilter("скрытие личности"), - SearchFilter("спасение мира"), - SearchFilter("спортивное тело"), - SearchFilter("средневековье"), - SearchFilter("стимпанк"), - SearchFilter("супергерои"), - SearchFilter("традиционные игры"), - SearchFilter("умный гг"), - SearchFilter("управление территорией"), - SearchFilter("учитель / ученик"), - SearchFilter("философия"), - SearchFilter("хикикомори"), - SearchFilter("холодное оружие"), - SearchFilter("шантаж"), - SearchFilter("эльфы"), - SearchFilter("якудза"), - SearchFilter("япония"), - ) - - private fun getAgeList() = listOf( - CheckFilter("13+", "ADULT_13"), - CheckFilter("16+", "ADULT_16"), - CheckFilter("18+", "ADULT_18"), - ) - - private var isEng: String? = preferences.getString(LANGUAGE_PREF, "eng") - override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { - val titleLanguagePref = ListPreference(screen.context).apply { - key = LANGUAGE_PREF - title = LANGUAGE_PREF_Title - entries = arrayOf("Английский", "Русский") - entryValues = arrayOf("eng", "rus") - summary = "%s" - setDefaultValue("eng") - setOnPreferenceChangeListener { _, newValue -> - val titleLanguage = preferences.edit().putString(LANGUAGE_PREF, newValue as String).commit() - val warning = "Если язык обложки не изменился очистите базу данных в приложении (Настройки -> Дополнительно -> Очистить базу данных)" - Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show() - titleLanguage - } - } - val paidChapterShow = androidx.preference.CheckBoxPreference(screen.context).apply { - key = PAID_PREF - title = PAID_PREF_Title - summary = "Показывает не купленные\uD83D\uDCB2 главы(может вызвать ошибки при обновлении/автозагрузке)" - setDefaultValue(false) - - setOnPreferenceChangeListener { _, newValue -> - val checkValue = newValue as Boolean - preferences.edit().putBoolean(key, checkValue).commit() - } - } - screen.addPreference(titleLanguagePref) - screen.addPreference(paidChapterShow) - } - - companion object { - private const val API_URL = "https://api.newmanga.org/v2" - private const val IMAGE_URL = "https://storage.newmanga.org" - - private const val LANGUAGE_PREF = "NewMangaTitleLanguage" - private const val LANGUAGE_PREF_Title = "Выбор языка на обложке" - - private const val PAID_PREF = "PaidChapter" - private const val PAID_PREF_Title = "Показывать платные главы" - } - - private val json: Json by injectLazy() -} diff --git a/src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/dto/Dto.kt b/src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/dto/Dto.kt deleted file mode 100644 index 97060c473..000000000 --- a/src/ru/newbie/src/eu/kanade/tachiyomi/extension/ru/newbie/dto/Dto.kt +++ /dev/null @@ -1,109 +0,0 @@ -package eu.kanade.tachiyomi.extension.ru.newbie.dto - -import kotlinx.serialization.Serializable - -// Catalog API -@Serializable -data class PageWrapperDto( - val items: List, -) - -@Serializable -data class LibraryDto( - val id: Long, - val title: TitleDto, - val image: ImgDto, -) - -// Manga Details -@Serializable -data class MangaDetDto( - val id: Long, - val title: TitleDto, - val author: AuthorDto?, - val artist: AuthorDto?, - val description: String, - val image: ImgDto, - val genres: List, - val type: String, - val status: String, - val rating: Float, - val hearts: Long, - val adult: String?, - val branches: List, -) - -@Serializable -data class TitleDto( - val en: String, - val ru: String, -) - -@Serializable -data class AuthorDto( - val name: String?, -) - -@Serializable -data class ImgDto( - val name: String, -) - -@Serializable -data class TagsDto( - val title: TitleDto, -) - -@Serializable -data class BranchesDto( - val id: Long, - val is_default: Boolean, -) - -// Chapters -@Serializable -data class SeriesWrapperDto( - val items: T, -) - -@Serializable -data class BookDto( - val id: Long, - val tom: Int?, - val name: String?, - val number: Float, - val created_at: String, - val translator: String?, - val is_available: Boolean, -) - -@Serializable -data class PageDto( - val id: Int, - val slices: Int?, -) - -// Search NEO in POST Request -@Serializable -data class SearchWrapperDto( - val result: T, -) - -@Serializable -data class SubSearchDto( - val hits: List, -) - -@Serializable -data class SearchLibraryDto( - val document: DocElementsDto, -) - -@Serializable -data class DocElementsDto( - val id: String, - val title_en: String, - val title_ru: String, - val image_large: String, - val image_small: String, -)