From 8874e85b92c76d5d8b6e81cdaefb63aa17ffb147 Mon Sep 17 00:00:00 2001 From: Alessandro Jean Date: Thu, 18 Jun 2020 23:53:30 -0300 Subject: [PATCH] Add Viz Shonen Jump (#3560) * Add Viz Shonen Jump. * Update User Agent. * Switch to AndroidX dependency. * Add support to premium chapters if logged in (#1) * Fix some parsing issues, works with premium chapters * Slight code reuse reduction * CacheControl force network and simplify parsing for Viz * Hide locked chapters when not logged in Co-authored-by: Unlocked <10186337+TheUnlocked@users.noreply.github.com> --- gradle.properties | 3 + src/en/vizshonenjump/build.gradle | 16 ++ .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2403 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1332 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3362 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6463 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8663 bytes src/en/vizshonenjump/res/web_hi_res_512.png | Bin 0 -> 38550 bytes .../en/vizshonenjump/VizImageInterceptor.kt | 99 +++++++ .../en/vizshonenjump/VizShonenJump.kt | 250 ++++++++++++++++++ 10 files changed, 368 insertions(+) create mode 100644 src/en/vizshonenjump/build.gradle create mode 100644 src/en/vizshonenjump/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/vizshonenjump/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/vizshonenjump/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/vizshonenjump/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/vizshonenjump/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/vizshonenjump/res/web_hi_res_512.png create mode 100644 src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt create mode 100644 src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt diff --git a/gradle.properties b/gradle.properties index c366242d2..a85c021b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,3 +17,6 @@ org.gradle.jvmargs=-Xmx2048m org.gradle.parallel=true org.gradle.caching=true + +# Enable AndroidX dependencies +android.useAndroidX=true diff --git a/src/en/vizshonenjump/build.gradle b/src/en/vizshonenjump/build.gradle new file mode 100644 index 000000000..5d84dcbd2 --- /dev/null +++ b/src/en/vizshonenjump/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: VIZ Shonen Jump' + pkgNameSuffix = 'en.vizshonenjump' + extClass = '.VizShonenJump' + extVersionCode = 1 + libVersion = '1.2' +} + +dependencies { + implementation 'androidx.exifinterface:exifinterface:1.2.0' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/vizshonenjump/res/mipmap-hdpi/ic_launcher.png b/src/en/vizshonenjump/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2733918dc602478f63747a420e36944139d4a75d GIT binary patch literal 2403 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 Vd9rm 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 literal 0 HcmV?d00001 diff --git a/src/en/vizshonenjump/res/mipmap-xxhdpi/ic_launcher.png b/src/en/vizshonenjump/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..33f1b25fadc2564a78f130e15cd95c4c03a6f75a GIT binary patch literal 6463 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 literal 0 HcmV?d00001 diff --git a/src/en/vizshonenjump/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/vizshonenjump/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4cfe7c8b965152bc0633e06a831d1c5bcc720b60 GIT binary patch literal 8663 zcmb_?`9Boi_y3(4jJ2UCp)s-~`z{#_Doe6v-^L75WZ&1ZC);ExUMQ_(9SPZo7+JC< z$u4`yzHcAz|KR(>_lJA#59e{u<38?v-t&B(^SE*Px*AOM9P|JHCN0fdhG#SRe}k6h z%o>imzyUx3ty`-1{cTpP8H%iLSD*Y+$eZ8#oc7WvA1(BLV~54nK$2DLybVqUr%h#` z(_(d=R98dNeSHrr7m-u>vIhYtpG%1krpz`fIuwIZW z84*5+ff2%$PaHRy00$?#6O#;JUzm22n*h0G;r~CJV*n#R=b~Gq%%Q1RJ)nE}t+HO; z+{!z#tm5a3d287~Lo{1nZfF0Y)<*JIEl+o- zL{)AZ>u*~pMPDbL4RuOjiSRw6YeCo*LhL7C&8ZOf{Y9rCr8 z{#@XL=iH0a0!)+49oJ+gkiH!~^*}{W%))yCGClnw$#pDH%4L+66d+BmT~(_IQRLHt z%0)XgzF5(M9)#b1ET3P5YHaq+;_2AWSxI_J+3LuVf3B>(nUnw$lGSf|3GiLGKze+z zrTEKrqG9=Kp{dFT{9g=8cSo$Q@xhc}WOqcYN(&ZB5=U=xF^FAO~GUQC$w}+Ow1m zZ92$YZ}jMryrfsRJ?OBu(MgHMf!s>G&aagnY-I0e4TnFd5B?pN0o~4%nRh+1}2uV^x1Z1BPDvM+z#aGJ>>(u%FG*r)wYi0`wn*ia7r2 z;gCkBK6 zJ+we)q|T|Y)Un9=(0t@KF6N3brFD*{A{N^6mHhE=H*qTH>C|?1@0(K5ST4`qu4}K* zFi`1?qNR_9(4cFli!Sc~UYpwl2v$E7t7sE0>(x(8HUDtEctHzly5QgUZ$oC=bxbpNecj z2xV2udrh^D^*h5XLeuz!ZtWDVT^cI|_EftviNU1y`O3Bpk@S+0NPUSz;!4)e=w_pD z$ZUEKggj_wgQ5ZU%PREXho6Yq+RWPA_u7wvm}js2D6FauHuQ(72T>#^Dg@ghv?xTN z_u@V8BhhGLk)C;*Edb1pTdm#@oEOV6@l z6lBM|k+S#Nw371a^1`k(?Vji5CAy5rA;5S$1a%%4AU|o$L=PbZQ#AZR(}^hP%Bf9i z9k^{erGt|o5HoHGOqT!&8dd#=2h(CoQ53z)S?I#EFsSOSc&2221} z%p%#i4E9!vR!&?XmIF#0w0sT0SKoH&iC#<`?lw1-lC6042XgD`=mo&chI$5@1i2mo zg_okst~i(!O!*4!lyaal8X|^a>|7&$6Ho%j+cw8glb^hkoDW6=ZorE-qP|Dk9V8AT ziIy#+e#K~TF>vAL>`ohdB0nPDjSfj?sb@M;c1->GPzpU4aL>~j0t%+6jidAByUe<- zpkg_ueWRLS>>Qm}NIMyfwj0624S!)kw@9yO2TNo6pOoRba7lRz!N+a&UHC62pwQla!d=)(T?ypFtzifYD<+PJl;nJ=T& zM(&Y|WC5ulO7uGAT!dv}(~N<-Xg@?_4V5k>Q>mN)(8C`ORxJTmQnpH@!y&ZG{bN@` z`{ga)t!yPBy^0O+x=gv9z~vL{n#qO_Er8?OJ0kY+*zbL#NNmM863GV$ykU)Wb}q zo$0+qz|eu&irKRDS6}+b)Cp?mb*qXsV77qc73~6vJWL&j+Og~joKwGfKZQb-G~YAY zOqHvO9d9+jGo<15a0w~tpCmLcG)qmA@~7kiOrlf$K6`EIR$uGBb@lDlAYcpJGwRY8 zU-L>tiqI_(W66U_0klO*BbPqBBKUfrfZrt*@d3_Ez}5IkC%HjVC647IlK!r?GyBL= z;H*g)E@_n;pFSF3y0iC|>f~$NC9K6tiYAnC#rM5}4ma;V#z7ld0%;%S6>kB_C7Ftdc?;4cKG-ZvZ#lZM#XO{}g>3!`7%uM@mJ+@Kb zGdI!cc0Sfdmw!CxBr-;=yBeGY6FB!>QUYrHN z3K~MOP}Jp^#PyFfUmfI1Mr}5k-)&=!3wn2+y2iwUz@uX3QRXKs(=TdpjML_9I7kX9 zv;dvpA*sObUgldc&s!XMd8Ba6dc%1ZQh*Cy1_{W>NBL2I87?||;b+Z^d340t0j?r- zXL`}@?+WBgLh*GvMJ!%d)!#m%BiIUY%UZm`mK6~$DSg{^NWo;th5>;|tj>8C{M&(u z43_vZ&Wo4c+v<|$`Q1=&e375aKW;zt2v2C&imc~NcAf}TB)f&;L#0RBufc-%JE=2Q z0z{p=hD#ff{cxnjKi>M;=Q#&<{$g3$noB$jXiUm(2ZK@h_lXxKu={GJbzHBpL=5pNr}Sybt+LO?%rW>bDK;6>HDu zqLDLCg^K{$Q>dc86kr+bKAG*l3<60v>GSyCYh;Bp1J-lhGLfw?Y`m5iV8{DJ!ZEXP z%nR9GAatDpZ%PMJxDa|z+xe^Jk)YF#K0ePxV=4>#)&vN*WVU5DM!;b7U zkO9O@-5Fq!J%KC)1Q9*&WdKOq`r-EJylAq+3%ehaRg1-M?j)ZjhL_gC!cpfrab-5D z>VBgT_fd~%Tf2mTf5E+~fK!gOP%`R4!tlnc0GgEg-Es4Z+?K!1kq?1j(QY%thywVl zwXu8n;FuMp?YOmjNhsN^1iB;_Uvk!qhJQKo6y`~P${e7VT0Z~^)6>Kf+f^R~(U_>Ka-~?26M_oeUoNKvfwVOd@Qrb& znPFu={H_EH4D?cu!OLKmQB0tV!^b50gC5+h5sCF@S337LyV?s<>FSeIVG=C@Fqh@d zBqNLi5ZXJ3dlcaPXLy`=Vu=PEsf7wL{h6PU8uhmD-0v_fOGIIPsS>7XHZj3IP9!1e z4Umv}^$lj@A1+hL8hI6v=w$=IZ-ofBU^-nUKwW?PR96f!nbDKRIluvQDe_948(q@f z`Yr8d^REzVKVDrNaL%6a1`5DssY1#n6oE~6d<98vAL@r?+?)mEj4Tcg19c8dm8F|9 zV6WxG6A=O-G>3m-*BFhk2`a9L-6XdtkwXt5%R_drnoQU>x*(sjCJRfX=8+IUQf6o= zf*LTP2k6q~Bm;o*q$KZ=B8vbK&`{`t5 zj{Y`ow{)ZHPcIoK$vS_^!Y&&@`JiB5Mvy|HR=51raw5XKeRz)HlG;YE`unFG>H0;- zm5*UJrWpwn$71-9A?&rcWkYO6B8PpSl$(y1f0dDZ`|x2iFAbKir!=f zHS=93Dy$&yaVc0jOM}f_B#3yba z6B94{#9j`4sNA&oYLAL+qzBQt_spx1z3dd@4}@V)w26B-T7G*e>w&r*i^8iiva`=o zOpjJ98ndu3;LJVH-^g?UXfDZLqBv}-q%agLp#{LV?l<)I>p)k1Kpo|s3Kqxw)IFQ&qFz2xA0eP$XP;MXma@vmeiOL6pe0cnkXFj9kcqnH|YdlZL0*{}uARNTKPM6K=e6dztqq;Pu0$v@95cb5VDc@pBH81WQ{w*Yi9{eC4&5FCsy?~h^<7t0c zL}N0bPlCqVhvY{=oO|2LS1w9faup3OtAV zhBa!y)7g^NqkQ+^PDZzPCY)p(*m7^J|9#P6g3EC~OrQPOwDHkO=SCA_W3hPCQP^H& z*8ay;9#5_mgz7ml@b0R3HPvMQUCEK2;T)c>=b|7l8@iUKlI{@gPY^DZDZRH2GI%Z$ z_+29&uTmR6I4`~tILkIaJv~%sUJFQ%5r2bO2S50W^lSZF9xw&&bMz$zWPCD&%OBOD zKNS7|+Hhd3>DGAVd__sl885kLg9}=uGo1#*GFlUt0H*fU7u5OWkl?>Y)O`b7AI4V8 z+E6S$q06C7p0GqV1(L7M#G5lF&2`IIKCg1(K{)(}4>2Wwv@(!Fuiw)ARqV{)b_<~o zHA8^}XI2G5E9~?9rP=NmHgATK%k>VPC1b93d>^_7J)9Tg$oe>7BMcU3{@4eX2z4tW z`U^{hS_b$irgPUN``JuEkr{*(Sh4x@iHYM+pucdHJ$_#+=9O{G5;yoXh25cpcPOMh+-A+aN<9n6}NP_*J*kr5pBVAtEh8bKz1qk z8PGSY`UC2m~b?7p{rHZy&9ek7wWLKhs3F>gqW*Q7@~* zS?`|nxRPhi09r6NJDfHoqSiH@gk7g?20#FTqQ0Ppn&!|!Vq|Z581UOr&8#n`eyA#f$>mxcA*Yk#A~-WfUFEtHAdW~$PR5VN41_oEf1Jlbhxf)|ioBNAV>n$TF2 zfZ_T@=j9;gjyIB#t!S!WMwRoN-eBQrJPQMTrXaDUv#eqB%F?dgN4Rb`%T-9O#Dw{S zOt*++rHlPRtHo3RX=TqPMFJS6)O@=~-IG)U&C$j3Eg=i)bB&kCnj8k?v&_DAI#_k& z8o>m<&Abc{c=u=By*b)CFJq$MRrm&wcJzOtDrv=fF2%@zode38tnj4pWZlDs!&%W$ z6T1m;#c$~O7@O85JE{T*vzi|giKSAb( zNN`p98Mzc1-+vlq+o@YOXGv7fjZ`dp$uH=~MLp7v^U& z1Z;i3NEfG=G!~{0!Qg@`<^0Z(D808(m)qj2^5d#{`M`@Zdbj&7Lb^heAQz~pNa?m0T;Yb?j&Ff8e zM=sQ#dx5dN1cY^`XF>1aoLG|)E}?syIZBjN%SZ*jND3Oqi_pl>@pCk+9#k*A-FdLh3;0L4 zjV=vHHy`|@2Z5eZl4uGh!&4}3{XM)%AP=3L*FGs#;1*U8OC~gL>rfc#L8yC02bgY&cqD4FL2$ISf5Xl4G8J;nRQD1Wh#!n>W`mEf6MC-nQ0qWw zqe8r9y_D!*xYOP}_s>xH>}0zWwIo-J*`|${Ue$7s1e*H<{k46>Gy1?C5}l*Lwo(Bl zh{nuI<&<9i7~`DU5I%r;^iFS7ZshP?h1erykKP9;-If1CjX(b_1}H< zX{i#oFc&4O>I`I|ODP+WXpI%>_=PRR1&c*`DJ7VOC8Y#q?9a-bm92REb{!mLWgi__ zDX0Lg2>d#RfD2kLE9wK%9P_h`r=9tf?LCgj9^?%?ZHW5rYV9`BBZQi;1DWBVb1>t? z;%4bbiNfACCEiJv>CS``0|05;LQWpA@n8VY5DpW7c?v&otD4e8qUh{S0 zhr3JFOl4WTh8tGEn+7l449kzTD=wv9S|)T^1QB#=ZRB_#!8Mt#XB+d!7`V?D)~MhY zuPj+G0Qbx;)1cRqa?ho)2^<{FJ~cwD+O!SxtX@`UDE5}IxXfx~<&xa&Fwo1zew)=wFNQ@=egr-YYjOOfD;?VI{)ADi&11J` zW#Zn~58Y#?AlD==_%dT^PkN`r(U1bPa=drjAd!@Hd~hC6$86F*&WE4xc=B3O(J!?ABpqs&C#4G$1_MYj_F$aW`k=kOLUkZt2e@oS%*z_44=6yvbSn z@PAD!O5N+21(9-^qucC7Nj=u`FPa_)7XHWnmn!9Kv-Y`HaAHa=^s?Czbp$2%aHC$^ zoT74=^GXOvNVso8Q#@Sme!12#xetObm}X@Hw-|H6^4s~gbMdWvstMdFy!!GM)1e{M zXFW^7fk{b3GgGD--Zup8cfv7Jw%Z@X2HpaRb3nQ>IRUNmr@sCVS^o~@ISYM$O0eTg z{p}Od@vq_#IM9I&AwVS{D*_S|XerHWnGoy>GaDJctVfE8t1_}zQ3t4HYk;i* z1y+qL1jr6E$0wNt?%ZJD?`uEPh!`%L{%k`Y0f4^gz%uX_0250*OQNeM5op_s6AR?YOVcsG;id$OQ{(O@CkjNijxMYO6s|6b1w; z)Sh2ZIQGQFX+iiJe|uw>(eoKgHhNi|>Zl>)JGu>Y(l%3IE%qc9 zm;}>dqj5){PPn;FW1$#CQhrjyX>RqC3?R&_< zpArqR{pgq{QM+M~NmYXLb8uvV4`n$lyo4Q}(h~s-?W8p*lnM&|JaB1WTZ_F26Ult_ zp-o4Cu1m)#y2)feFzOB?8vzuf zO%(c%21gj{&Y2oWy`-`328jy&B_hvfWfj@>NLLV?! zGEIK>12%zdlj|x_w7U}dbVfux!-k`weJ^rIMF7| zPjkxYBV;Z|t?QnU(;LAzLW9N^EM71r6&bn?wGMMEqK(OqfyXG^Pl+q zN0-Cq+Wb?`n~B7dN4ZjOP5pj8e!IMLWUVyixDi2f6Sr2=%?WcUa?h3R1=!r=#^1p( v0)>Xg0>%Vr4)(IX%L6AD?Ejnd=oFR~ym}{?X-xR+!v@g0t$V9P4IA-);=}I3 literal 0 HcmV?d00001 diff --git a/src/en/vizshonenjump/res/web_hi_res_512.png b/src/en/vizshonenjump/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf7def6260243dd4ab40387ed278c7e5cb7daf4 GIT binary patch literal 38550 zcmXtfcR1Vc7xpKD*n4kE5k&{3X6)4(tyR0#mfC9Xpf;gqhZ$|{y+=^9Xo*oH_Nr7U zV$}BL`+MK_uOwHJ&-Fadb?*Dz=RW6&Gt}3jrr@9e0DxLYTm3Nr5E0%I0c50vmqY)_ zGXUTNbktRh{cW~G$PX3FOn&cBy@*M zvVv7UTD0y6S_)c1nOIAI%Jao!Q-mFyX1}UqA8VKWEG2!uq{VNrVf1e~suLDaEL;AF zsE=95J%?9^ud5LpuqVqUyIt>zy+ZDPn(B1F2j8r@7uMA7Ipkap>EgMac@#B+%k=m& zikrO&a=dji`$N#MzQ0~WUuvwe)?QJoyI>4V$z%`wmZq*HDj^-<{CP&1n8Lq8zISuEYm>_i z>xu2Q02gD0XoZq^UQ7pQc;fe++SS>j%h!|VgYW~^1tYANqPG&UqqK`HyRYvzc7~Sv zm4LN73t(^J!UZG1IM;|d$|usPknv@nO!6EK3?0o9NSa-g-98E>id8ed3S8s(*f|tZ zG7q{<3@>|M-<4#Y>ubMy!CkN5-9crY`=-EkA=OdYRoO1AAt0u7riH>ZNKZx3fF9z8 zq6z7o=+8J{g%UnVEY*7!iyI_xI^=0C`a-&ZcJFv;I{O_FM-P=ZpBX*Y5%?M~o6t zX)2x~?pB-I6K>fi?8iJN)l(#v(me6)YfzxR6Ql5Zo3ma)jmz*{$I|EiHPdlYVA$i6 z!41wp#r%z<7M^@!xSm~Ep(S%~#`U+9n`ZiPrPx~!Z*9hA!G6WZ_^5beHsiP7ya9LW zBFQ8*JTIB1{4n!NmqT|2@h0aWmAz=5l5*Dl$t(_CeGcayx^{WX1|p< zAegL?&k{OCUHT%=n8)m!6FEiGRfBqCqk^a#GTtA1F8t|o4(wC`an1GENB1*}(&_?8 zvDS(d`P~OQpW6GQDY_(dbA7^1>}Q6LBc3HV>9gy_5Ut=|X}v<@=Z#R00ci3x1L(oD zhr1oVzcw#_wN$9u%E@9~g&bx=df%H=-ut}SWyq?E!!|!;3hYpRWg#Qt-Z#<^E6zFj z^#}Br9bZ`|@Z|fN91r27}EM9WTERAFTE?V>!V3m?kt8gORyydpI57<_%ek69VV zfOy&1ku(Cf`@;{+ptLB$fmB)oV~GkD9lmO-Z{DO1@K1(>+&Xzm-eoS&Gfo|!phVHs zA3Y>$Vx=_~)9tzwagck-!lWON1RfL>n~naP`9eX$0kwQd%*r^GJEma;r?>Qywu^6t{&ymG#ogww2?*&?!6udv2Oz}`Wed8y$sY4A!IO!^k zxYruqMm(udr1Mkd*?hZt#zaeE{sj?ZKwSTvckV1|H+kfII|{n_72B-3KV}4B0JhV|ERwQ2(s|(i)j=xzj zHy(9WzRbH{S@>5(WJ-;rG>pu!1a_~zKEE8aP8M$FHf594^TQn14UNlLKaGeKKgRlINB+8%-HG;%$dYkX}>{)b?t5{0oq z6FNX*>6Yhr2B0J|nrkb2oRrEH^0CJ40l2xU@z-6_2p63ciK8G6{+57gKdjz7wY9{F9Aeb;OxoO+WjNycN5LVvCX zjTye9UazndJu+LAA>94soi%D^)4X~%*!U!&-yMr@K0!{$nD98|{h6nw4!CO?K)@B$ zcPwzG=4eR_ge9I&*_%%nA>C9Y(<67WCL6;~$;y|-qA7&g|I|x<%Ckxptt`ZUrFW0I z8b9M~RhX1><4su%CePT6b@o+et5$I5!Voab!$*^QWRU@QFn9VrOIVi&s)mZGAEq7H zw$a@T`0$TO1Rv95pa=9zxDR#yT`y_v6v4kQt8Vz8pdi=fnf4sdH4q@6E`K`gu{Gf_ z9TtpnX}D+F*0r3VcN}APD&O5+-tsA65%(HhFF5d8THgu0it?=ooW-3wRX1vm;Tw(f zM&H-64Xv7b`O|?|HoE1U3ofv_kZN4`Q<=un#IP+9k<9Toj`x+EM9uWsJ}S6{I339S z7k{42>A!4^t;+sFq7^jz!sn_QJlPru$xH6iWQbA-$QF0h#7s@=n>#lEpL$4tH$Ux|`9I@^jVQq1SpXY%1$b_{4aow8B} z5Asj;D&XLAA10~)p_9v}Cl@WdpD?668G7&I5iU{9vCpmfXm-}~;H8WGeW-!LCjEa0 zrrV_$##DHV`#W|-!!@WPW~IYa_REQ*=Q@<4Ou<;`4bBIB%zl40b;-d`Hq#zNKTbAM<=fgXUW(z+wVgb=Veu4mo zwsLj6@oh83L>tT~%dqJj6pG%h|a73njo{E%t`q@u|OoEQ@sIR!>N=-v?1Fbhkrtn8`J zwoI-4Fic^aWtEI z1SZLv`cMis)QznU;uumJYc}E7_M{Q#eWjc#T}=Kaf4AK%`Sm-Z+~v9+%chQGHh}2EiNrvtW9!Yh8Ne9^92I0L1_xJOjjj zkAo)vlD*j3t61pUE~X*1kcf%#DJa}gH_YzQN|WABO|GzqAg z=lld3)=UUh4GV8MR)tYgpHhqWfp0oalx$P!(*<+Iu(}^2b1{zDzBW#XK9qR zxZrNy6`lQ^C%*wYe@t{pd~-8M{8Xe(jolljRB^y=C@!9GNKLf)=(kQT=QmLvC9;3a z%7>w{f&r9-vdnVVC%vbSrLB7PpWB{LcVy{j6Fjx^QzorQt4d^JW4mlnLx519nON2V zuec!vZWA;%Pv|zKfj9yp zsyKxhSg&$t!gP zdVU(hf{LqQKYwk=WX7WV`$mzejp#Lpul)TK3xA8t%8b0UkXpfyt9Ob%P?c^MLvcT! z*?yFBB^LJ7b^8B<(c`7yzJoMK>Yctnx^`UGAv04X#*QEC0xXESqQVHJtYC3mN0fLBEp>|co@H!MD;C6R8P^a@BU#gqAqhb;Xbyrb+c;WV}}Hga8>Ec%8)9nKGiuf+{KTk06(3=A&ZIjCGpmn3zRCus|~WflMZPW=zXG}hWs zrqf|+?$(gK?8V57NCx=x;oyv?0-EnjE>^-_XM0S%i+i(7v8G|pgOYt?PBJl_CY5Bg zZqvACM1Mi1g0s@Da||*)57WMm_e>SWiBKu>6#M+h$-)G)TR{L6A6L+6sfb0ROR4D( z*AN@w`@bFbsZ)|GgA4cEB}ICPFmERUt20$2`lU+?;doB&Je}NKp(@7Ewj^7O9|t$^ znq<_(h0ANDvQXxC1z2O^od?%@u5WQRb~dNbb81=7fMrE<*;9mjrHc9WpdBtf|_mERfUaA58!oe3NsNs$D}QeKpOwIRQ1T08CJARb^!WGKBD z-E7=2S{;f$RdfnaORoB+anG^)nwz77qfM{3IYaMo1GZFFbzhkEKAnD($$ms+99UQ|JhAbja`oWs zS5|P@0`f%OqsrnAo13V|m8IuSxgB_~9`iJQv}3T2p|14Q_4}v6jwD+nwmmUlpgD;L zRSjz_>w9r&sQ1o5#MiJZ!+M7T)B4ThyM~EN0dw_A{%@!qQ->q+(@zJ9;&_}$=N#^v zE`a$OvmxxL%$5*REW2yjhd@ZqfnefXeLVRbLnaE2{pRy@g3Q+{!my2JUe)o%?1$PL zmItbWOLl$^QLSU)V;J$;X%zr{Iyjqf%qvb{YmY074bM}-Bgoe7bMN^es4?b$Jnz+vNKZrpkr zLL{%JCVP&8cpGahJf$aHe%8l76gC;SI+gHix0IkrImJg+L<~JOeGI=Mv<`m8VTqo3 z6T>aVayY4E*ga6b1E61LX*@HF)U94B;JxHbTS|AP5$Yh&N%W8xm(>oqXx}|%Y4&J4 zCF|#C!7#Y@rI=Fw2>lssUM3(?7_jQ=GD+tb@A@$ifzB}7j5a+p0ofJ2@pq!VX>viu zSzz2TFeq1?OPH^B(hUHJ=ygQerJ);TRtTHZemT@W(n~MC{BMRCshy$3fSsW@q- zO0u=Ridh!rqe4>L+f!t)=xp()wa%61HOjd`(`j92P)n@207BnvC#L)P{y3W5)j*B+ zB=p6Udo{wby>t+=!oXvYlC#3inUZ6~4L4~ssFP;OoY?ZinGtPe&e8$hp8q*YugL+{ zc7l|4h47u_i#IqDOonMsx<8w>1|B)~y*AlKKXQ7+%CwflN{F_5m-u9$x!999IRJEJ zc|e8Y89TKw$z7RxXnd8w+PzVD-~ISe?u(LR3`m6JbNw?XumlKpkJJaP?ZdLKa_=BR z1xr!t-G%(%dEfRkpI_qeDs9SKBWuR=&c)$S#p<>B9`Q_^jV+-vdyDi!8Q>?`-`b2m z0CNz-0{If49DRzxQj8e_Kksxqwmm%iGV-$D^QwI34nv}KR+XaRm;GNu%oWONgvQ1M zW^izV;adlx-e1rQM(=A5-y=AZVfCJ~G6AV{G_~OT1vWv1Kz}~FjKhZs$Cw?&>!T5cLN*IUiKJ z<1tG_DR*5EI!~*5z(eI8X`SNGCI*WIZ+Uk9g z$%qVDEc*ma?EQR;1&!dbAKov`>%$s0EM-*bpN*5=yQjoy3!kqzf()@9%4uw>F)L`% z@lJLyakvABv=D&KQhhrPl zhAw%vX{A(H!yAobIXu{e-0RBu@;4z&gyizjcy(^39@Lo)9+HzRFJiFDu+9&w1m|17 zXXv@nuWrVa{nPbwthwSS9NIrZ9qqN~feJT+(>ewt*UA*DWxuOk(#Em|qTVhKhF3Q8 zu<#nXAh*@}gz8~Ny)~wgyG4*C5Fm?S;D3oOriiMud`T<((8Jnz1z=M)1LfcUtsh40 zpH8M*bV=I6#WO|yFkKmRY_Z15EIAptu~&a)EuE)H=PrgQmer~nD9?#*&Yw=`C6))J zX!D-DA1AeYWM0wMa8$^UVPBp^QbeM0N2#oRh?*SG6;V^8|QO*{<& zj6w#rg1+&9HrFCoWaanrv*`oakIXV`J!i~h)iF_{1aXGaAG>eOj^{m4U3UXAS`QA^AR8m zX?fd38b2{?vTT%y{+OEh|7QW(Ch?_}lE^>{rj`y?R}W7$zqhrg1MCIOJTE0nQ%g3K zow#FGOJc>E!qoc)66`bl!5##Y4Mkkq90u7b(pkzU2mIiEcTW&Y(?N{Zt*{5@?Y@rt zDt{92dK<~lZY*yfyOn1Li(frfsDINE-_!ce^U8T6emyBaV&Y6ZKKYwFje#qVC%!(^ z0RNE$!J^!gDeFRH=jrIB9|Zn&v)L>xZtNGC%lN{ca*BrLoh?iv8+R7=;(#G@>y&)t zTeW}qcH)-EtyR+6ns?y;>H+?JQa3!|{5H32ya81fJ<>Gp~R26i6Ck#ABviV}!&-*%Cm#wRFm?cx*zhtc!KtQ`8|D!`m z?8W!rGMKP>1v?v!l{gEtoy(C=TK4az&6N=saU;81-0;=#`j&zslJPT{0pk|jV($~z zuKBhLP{zg-X~j3nloYN-BTnr@(&Y@v?mkbz1K$uZGH6+4W{+!p(!o#rAV}@PY-W&| z&&c2Dl4YlgqBH27gSl42ffgrgeMmGN0>=)xeR~bI13kPq&<1k!{!-%_jNFesmc;OS zYnW`?vC$e=-iSa*#()2{1yAe_+Y$K7mTcpWy+}@Nf)m$AbL=5s(pcNvY|3u}0!vQ9 zDH9p{=u>VLuDyj;mK}<%zu~6!e(5mIicR+MqVMZ@Cd2WsWBX_|!NP2enRQ6NvRiX4 zF4I9M)#%hFwd{y9N7*qTvw~C?xJBwRLhowWl^Ix!vRR2Z)##3Tg%q>Ike6A*h_Wn* zLr&}7izpT_o4|54P0Ss+Fc3CqsMjP9q_VwP}rlC`(!Xl z=JrD#Il#`9#*>P=?^a9v`!X`axC*=(<*Qfi#(75o{h;5;x4~(QxKNix%lO3@fw-GY zBLsq|J=eB1&XY5X`s%8J#|fFHee5(c)9g<>t^v#^z(s23{3!0#MK-VNk_jXGft*TB2u@+v8%#qd+iPczfyj~TWC7+xMwf;N3Yx* zp;P(h(C4uG-S6h~I}VpwP@}{rE9EJ}K3uY>;uCe;ACnG#9^}Qn?@5)_avP8t=bxP; z!MA7PMyhO9-S<8X3wsAgON{FNK%Y92e<=m?mCoE##;q~*Q{?wO8_j;)RZd>o@Wpqa zfMrZ{1HxhEO@c<)I!1-=iP5@_lR=#(&zv{)v@eMM=bK4N<&K?0pvjnXkerfZfJo=q z>5Zq*|4g0P6dVICVjz~yug{&r(ewCb?NnI0(!0FqnX(Jd@0;6At8X*K`s^K#k5PDr06XBIzmZ%Pc%#5T93oG&KO^D#pIPh^3soS|iy?O8cxJf*L< z5)v9d9;mt&(O*~tiu^n0wxP`WqVGuL+9-f7$w6C5bdO-UdvIB5fw;3IviG?GiBd(I zth?$=J-=Fq?yMA3C)j^3e#>-PMB-}SF46&<8l8q`&WZ7mX184I{eEWJ@ol8|h=KV! z)k-|qO6m1RLqQco9)0gzLSes#A_%R`J3BK%y!(yyFk;#2``PHDH&)5VRgJ-i-5P#& z$Tdz4L!&oZJDv798Dt4EwsSa2p{i$+UAsnu;Hx1Gq6L>wEZXX>2bH}pM0Q|i?1yDM zv)R7!Q@ij{Sr2Bl^sojf&n`$jsnf@PW8Hb<4Za;B9mpNOogp!mWajGirlI-GIitm5 zcWBg7cF0t7q38Pg>r0+i1vRp!uiH$ZJ)#Jul>B4=DDvMyv{K>m{V9$i)I?{Z-!O5IxZm40Yx(fdknRu0`a>{57j2)0c1x;9U^^>4-SR-cgPKfQe@`5!JPS zUTXlgx~*Tz+pu>wo|RMv@Vb%7*{Yv-X!=+smln&5bpt^ar{7IHELuYP^qh-|pUd=$ zLh}r9PQt6Mu?Y@C`t$$|nH$KGm7~Zk5akOINQjvt|FTnbD#!#&)1 z?TURK=w4If%Inm??E_r#!d>o%f$^!VzxLB$vQVNf?qxzB^Ufpk>eq?GHYE%yBqF6` z0B7W&ZA>20KiRzFc$sl!CH9_hnDH?O9?5#m?5jJScV8cQsrJl45>FLiE5A6^%$9F! zz|IUp%MFRgDgjG}{H@6KJtr*0%>BWFYgpmFEp`pIX9cm3t}Mn>7Kj~T{gG=i{eJ0J zL3ot33}IiMv`b4}IORa)A5o!b;(Tv-0^5t_iJfujUV1ujy^{Ks!VkCRo?B64C&fsN z&?~W9+v;o4{aWenH1mFaHaJbrjj&%A)UnDO2K5SJ1#Fh>;sxANpk=Pd^u+q+QMepV zZ`(8Q5zAWStC0uY^vkTR5#=TYg<=i22&STS0-Yu8d;JJS*mWI_*3Lox%28nqUruc2 zvfudjembB{>*%hL{L1Mup9Zs;mM~Gqd(#U;%12*pDcoLhnY|05ZB_YB+pER7+p$kp zBLmo0%J zm^mG^T*FYrux*1EkjQ(go~ZCJ_)o|7vYE23WKNEau$gdR1XQ16J6b2PadA0 z_YnbM+g7zmEGRywkG=ZPVjTCJ%MA2ZygDOkEQjq~7)3iq?L2e$r>)c#@&eI4$Cs60 z%hX}oVzdt({Dqm-yP)>mgt}BLHEa~brIV_PfY2f%Nf`{W{I`YUsv2mnQpMHA+^ykU z{jS&OKwk|diY#n!yg;#IOAil=o7dE;Nr4NQQ3 zEUeKqFS6QMMTNgQw1PDp=X<7YHEl7Q@FC3hOV{N?wSJf|O(m7GTw&u=>*hX5iXgjZ zOOifGE%mPwj5ZMkqjNXg{jt^WIg}r9C||(%t=gK2fqlXid>5s&pk@YSFFI=4I?ZZ{ z=R01YnKf8=B^={%J10obX`bTjKV$op`%5q>4Q?3Ct#3z~7dMWjs(+*eGb{^oGoY@7 zd~cD#V?U4>&Y=V-wcNRxzbp^XBJP0Tt05hUa zrZ+4yXZ{RLsLL#upI6u2&;8GkD-Y$&hw7960rEevjX(Q*OX|ik=J&!L-x*3(?zh(3 z!c9I5$!Lp>Ug%_hMCM!W{?+d)J?e_STSg8RRk-IKDm>}99JW3R-aqqPr-xMd+KQZvYlf`Uni}rR% ztuC)a`*NUn_Jh+!>h!eacrDXpVCk67D46<9PzeCS(O8osDxPa>Ftdi?#L()VEZ z+$&XKCIZk4D$g>ZPRWY~+^xXNH+Z#ell3Sm-g@8osf2F*cM3gfAFYB}rkQ;a)CN(` zs|AGu!1F2!u(MgcNKixE&abvUxC}XquD_Bb2MH+1nwz{J z*}BL03Vftt)@;>hpOi-?3DLLGc-io&r>E8EUwjN`vtzHJpBkl)zVg~{I$QWq72WK0 zy4x`EY~cQNngMwlRfULu90cga|a_EVY0wqia9 zzeHD5v+~;GT@H~DP=5avJRO#QAE-iMPBpFt2nngVW2fY?XCrwLz>1^uj(Sq=4?AU8 z2zRP_vIFYt110?{-r4A4u&N@QqylW07kg5;L9SZNGtLKa-Qd9Z7z>mbIs4p}?N6?( z|9t#$Rfsv4UAR;P&dph&irlQdRw=wWGn4 zVP~2`UIWh+;B;F<;R~Ui)VSJ2YLTe92a~ct`e-?qi=`+uzf(k+U)n->5EZtV@BJe= zGr3>2wl3mh1J~yiaPxJ^x$XL4k4SENo=U?IF+cN z+DqoMr<%}L7TzkG3?*@YZf-;|f`(O+$);ha3G;JhMbQwAtCtK?+mkM59SfBDz5#Wq zzjh2*RPcfI>;GINas>aqY;t@?Rj<)4(0nJ~3*<;llJv8mUwgV1n>$f{h<1Q4rYhkg zem^XKyh5a;`UGE?c`0%+cbbse*3cOaT{4;*7V2CMWWFZx)sCS;74jXa-K*@Rf%gyT z+G|jmo|nCa&7qD1Wem$g%WTq=AXj6(CeS4d7440nweZT%E%BoScqGNJIJ`p{ow}wB z&(1Ynk6)@e7m3(X`%k@R7zf2x-f{x$$LN3hi{E!0sd39TMeUF{Serk-MEwDqB)TdW zu9;|bNcl&2j-AJ6I38i1(J$ZRju?sQ4@@+_VfVpkKY8)r=l!2a2Y!G826EqQh;HoR zG)3f~O)L-O<=lbh(lu(P&iNyxZ!ga^0d*8&n z_|=lS)BS*RnOgx zJ3#Bm%hA8QfIKITT|`oK(uN-R3uiKU*tJyS48}Bt+`OpQcT3#W%Oi7$w6zFphd?%C zOgn}`Axe&I^5j$ffsLzU2`Hlz=(_HKNYW%G++1hO4cOrq^2=` z0IG}$r3ourFgk^HgHt43t;%H&BX()dNBfpIgds1sO5_QSkyJB)q-7i7**OyU2D*2e zYTa=3?~5dq7J2zcqvL*@e19R0()}k%pT8|(O8GRVhph;NGTl%^u@OByB|i7u zI*fRWNex|o4)v02_ffc??2e#{_}LOLUv~Rj`*Q`AL~C^zv9CppafyeR0#m#Ia%^9d zKH+hDAyl`1{umUE(L$dpZ23Qxi5fZ}FzO+Umy3$ayO5=?%(sCs>y+Fx+ z+(Son5C*1bH+Wgi%6RlEWo$|LdFggjc`fG8`)~9viV!mTgW&UH+tx709Vr;eCk9=> z&Xj`0hg4g{Uc0CE>d=wz{x? zX^;_4D)3UPk8-2a;g9xaD;d0@yU8@0OD)ljT}S1m%=#}NL)m8I!|7v9&IbCDL-56} z9&ahpPo6HT&EfD*BFbO_<{nG^MXf&T`cUU*e1hmBsKgL`PkNw!<+1A6hZ)C0qK!D3 z&#=pEEaq(~TbPH?%*}kuYnrK;N(J4wn6__TZ*LeYWo1X>a2G^8okfU%Uf?1|<;E@=uh_r*eAmU#CIc(pkmtQK`8=D!Hkv z`DIe|rp}P;iwxKK*6G&jlz&Ut@>2Zd8jq^?N|eT_QK+klAxoD;Yb*Yq5$WIWs~2FD|; zZ)uLqdhanm{?{C1OI=*IE~75-?1UR=k;K1KK6;|gY6bJ&D#1U9c=uS-@_8x|vl&gm zZctqA=|iMJh_1pT=e&%7EGmXS%2)m$JFyy4LFmZd(3V42U#o16X;0L}n~ypE&pTB8 zu;y!iQ%}{a{55L8b|(Ds$@XeC-<5Y2kgOdZ&z}2on>y^U|lwl(StVoJ8 zMh6cV0DUElO-1{$|M!k&e&g-y7$tS@0r}eBb@+ZlW0xFpB?HM$IIVj&OhqODWQ(GS zW$57J5yNgC+4tbMS@7n`TGsmZW++X5foS(H&oT3Z>nq-|0yRqrSE6A98SFL6>ETEc z^*7wSR}UEwa&Sv0DYszs;aDsZHpR zr@r6w=VGJ-O1LdKg<=Ok9u`>wB`8-uVCuxY$M8^+P&z>eO{5%hb?VGI-h8r?_0e8? zY2t+jz0dQrX?#5GmY?Jg@diql$M&hJNBu7fs-$QSrxXy zj)NR-N*zNO&arQY6Rh2)_wv}~%|jNksn1I)0Kpa1jhaxapn)IT*>AAQ0ow{2aJu%p z-0-NUi}QL-2Nc}Em$}sy$KbDsD7L_fuIKG^+(4SfrNOu#aMm>I9-abtK$_D%3uWR- z0Cu8$AxG--%VIYj!xgXFb1FdnRgiV2FEAf7H-v8J$dv==+DGJ*Yq^0)kJpeczQ8`6 zOxl8sRhNvpn_VKO<43O=IA1!{UuR#4Uq=z=V>`3jEx<(YWj@)iad^SAJ>%#YfDzF@ z;XQ+QtYy4`T5^}iZlBWo%EX6M01Q%=$l(B~;GDGkTO6oQ6?C7L17fMY*H~cZ04&O` z6#YpXNy#bIv3eva2=rZ&yz49$G#Q$8Cc3S>k={T0@G~S(YJ#P254HQ{^j@w?ok3Wj zqLtG$#=v7$^-zoqE^Q+ad@r*1%#^sx@|1Po#Rq7=^6-ota`ywuyXQIuWOwRUtAKJS zy4izZ$w3LN9k8&w%Q4HPBppz5y&Pi9DLi_Dx(O`if#TV}3afr;LD0be+10jAm>UZ5 zQxJ8{t}Nuso_>k9%O&e7P{aJe@3&2YQi2u~?@oYVac+K0NIZo&tF;lUm>nH@?0-W} zQ{6Uh=&q_=X^@By@cBno)7wWn4Pzj~StR!;hDd18f8^)yfkfvYMrLT3m}ZL|uc^tKpeuf%4S8h3EXqk5QmS6obPCmqs*2R(n7iS(M#^-A^d;Kr`{vv6k16ni)}|u7>q#Q2RgB zYu}Y9Z#2QlcKaijgeKmXcL9NT8bAveGmJfACkL7eD)xy9!wQ^tDVlEC&=8^HMqd}X zqR7!W$QIuQ)Tt_Ghr+_@6v|wlAoo-ptotS03jQ3;WoR;#}+tVkVE}46j!~NYpp+rj^FG4eoY5g4 zI`{}!EQE47?8@Lv)Iv|8$1ElpW=i`N$#TZ%T7{+(AZ$(mP<>Is92ykv@xv%6=WodF z2J7bd*Ri#{bWfHKCxkr6qzz0q3-H7bdIO(*{nbj6w2TP5i@g{Ur6*igQns1@jPtoO zq5{O@_%?FF0rj<>zUc&c3nfB-G?sME2(18Krp9#rP9}6xgqUX4=ZKYj08$vxY-Pv# z@HXKFhm|EW)#|b`os&OVO3zqe&ajLm2wUzr(c>><6-5l=QWk^#Xt&^oljxHY8FJ=f zw@|6LE z{t9gFX12?8e!vEd-Z(p(ZYX`Y#!1;LsB&8e4cc?#A`)X!`$4$52FQs?03eaUtg~Hi z)&)YpP@9T4|Gv`iUsVK~_H<4aPW zpj!kH#IUf+!XvtE<*JcyF5TIDugs%kJWOh80hzm6PDjwJFTg+rL{@VQZH4A9rzFYV#a z4YxP}kr9MCD?QgR=Zw+;I})N~ctOOJg#vjFu8tG3{4{adwG&E=DF4@h=@lfJi410* zTXCqm?ng*37gjwE|HeUNCD;Zym<(?EQd`5L zNS;3AV$I@7?OMX|FP9LXb~3Wn7cq3^efEC<$81i2Nd5#f48o_EPD~7sWMc`_r^lYz ziETxMMK)xeGsAvf(x!7hzEi*rcxv2eV0rM@r|L#v7dW=^4RejLtH!_`mzvee@P93| zV|mvBr^5D}UJrsAd+O$!|Nkrii-_#L#>q>97RbI!d*tc={)j-CTRzXXf%li}k0JT% zZwWeO|Ck`&LYb~iThdUqH1NO>3-EZ4!UGWYTeD#XZO{zf8qne)e{w@^`Buf11f}hX zDl$Rx=Go%E$xv@hS?2G&>S~8b;6%t*kL=HP!HgejaER##`DfiUu!?v+9}lP;09A$Z z0Xr^if=cn9%~m8*EGcQjMUnisgWBW(0lj{C$NS2En@|0J`kCkQ1LNRq`;jj=8t36B zODFvslAy|Fh>rX}G+lQ*)!+YrUsn;iRw#Q$M$|{y z?!^_AS=l=kl9j#gy^>udp(tCFtPmOZDjAvA$j%J+W^ebpMlO?!9mKob#No zLt#04YKHBDjN=fbN|<*2!)GYRiJ}h-H9>%?^vP++oRLU(;B8Hwj>0j4-kA^3y!eHR z(=FW=?zA@p^0xg<=*dJ#pJ5+9=W+KFzMa!)64UE7-oy?%MJUY zL()g*=6J<218y=30r6BJlLGdUTeJc>;w^||VhIC#rKY!5_7WfJBxuDePi?+#xDCb< z=j>SbBt-Hj>M9jzRPQ~8l?7`}gcCh1ON&ZWhpXO?U9~@9_QS_N8eApisOY5U7urMY zQEGiKp~=L!U_G1T;N>^U;lIkpLkcO;%aQM)_;V^BxP?GRSg}a90Xkv#=J8V@DfFX| zr&HPCCtI`5NMzUFW<)%v$~o%15j zW66Zj*DUX6yEg;AB5zyyiJ*>i%1wV>)}3`PyY2bbC890YiK3r{TT+-}Y!&6ZQXKC# zrsco{iJy6)YCpQ|9t=nxR;kTrkFl~t9wH4p9y8jByLvv$gI3|ocq+gT%|7(f!~Lt+ zkf@JLu3&`+J)MFu7;lZe}*U0X%KbFM$DZ^#pbB%YN$T z>01FH)NcrNd@`7klA#hra#;#*G>76 z)^*QX<~M_JH}`5wI9rw!T(Ga#hHVQ)fuRsjW0~iC$GPf&^xHX0IdI|elr#Ebok;=s{lVKW3(#bA@6LqIKZyg>&~;;aTN6qQ3b|A8I@*{cnvmSZKbru^>;3d12rddt z1`ftPCKHipa>>jzU!TEZQ}G^-s#1_kI#;k6VQ`OKrHjYZB!oyl3E5h>e`Ve|$C7TF zn+nA5moo$1@QeMHS~g#c-GI|K_(M*q1GYR1A2$$)YR31VuR_iz2%R#3BraVea(|13Cp-Hc=q^AAz*+kN zlX;3hH;6?48;}h9RW|MYnB2^Q6awP7K&Jaqw^6uxr*MHo>acb8B}GQ_(_@?PVLeQ6 zL$nn|22>Wo6Q+!<^l;X`;9`Zrx9}13p2`6&%Dg#$;$yw5ukTPxR`|8a<_++63gV70 z(`ZltpxQhKt7m+?>Z&C;0+9)_9;yTY#=JW&`EunQG(7eMhGnut0W*a9VAu8g271P8CkBITe93-9R7 zc$6skK&Mxaq`4UAbhvw1Vdh5iTFGh7e_P=3>V`oL6a4jZeIrj_vRVhI|@n>=iVm@+_-&(g7Du-ghdg)ff-w09VT>%4tVTVOXNi@vvf{CtO@Ho zI^g;}+br1R8A%6cF>2(@2^%yeX_jnFJO$O4qPzGoYTdjN7}Ze4H;*5K87JcBtQ3vGHW^#NCQ=Z&CODidc*6)QHE@ z0t@zdM^Yl6$&|Ms87|@?Lg&yc8p`x#6+PU`k52>5+77|@C+;`y(z62Okb3W8idY$1 zs7!)hP4AGc=!Bu3&da$@UlJAi^fvX1sqFXb-Ko?zI0tpqhm%Um zRb;2uc2eh!`hjNu?^&-004i!dfSIeZvTYV2PMFobb6G|2?n!1T)NP$NH#$b{!~XS z#$HUvopm#eZEtRa6_Sj-b!${w5|-;&ha4h(lcj(Q3(Eo-A^WP)Yp(tVHwxB5|F5hSYj>siBQi@j0 zgHx;O+k%AGim7;wT)A_H^SKJu)Q)9?7Q8rj6Q1f z2s)Z?pUr2ND!O}(x~ww1cFJ^o$H3l?Ux;_A{#@K1hjUoMV6^Z(Fn_L`hU(Pnt6R1N zt6N4Re!ieY+FHR_g<3k3uK~c^kR+FM^xmK{`iF%3L9g3qA^kEIZW_ydizW0yjWQiX zDj6RsI7-j`Bqvhmq^H#58yX$T5hI{sR2#4KHuQX7F7;8?yMUpCs1Fv_p%H$1#~mu} zL7U;jltK{)T5okp4F2o9u=5E?K#;P|7A>HNtstGtvnF&PT$q60T+2p0^B+V3uSmO{ zZ=rA7ll;|#wX{t4jyk!u);*BYxy{02-#ZH`5nX}>pKlKy4B)6E^Yk_E2nBOWB3#mRXyn!ac>_;ziq|+#D`(ZK?~F8HM%!jS7RT9ykKFd zzx0n?!sD2svUG0x&#sN<4sopBIxbx-BesuQJsDY7ny zHhFMggA-irU)z_UDozm&JO3f7t9lWxOs$2tE(gnDzg{neVSb1%y)KVLsG+x$vd6F) zgo@z4exw!NORDaVr;Eok(@JU6EE4r6e_#t*1$Xz%ceW#x%nIQN{=o1%LdX}P`_Iv0Y z_C(Yxax$97+3tw&_w}9b-YkVoS9N&`Eek65qt3% zzMZgCmW8GtdeF*!2G_!8qv2_HKF^*pm56oCUKR%i`(rtnKMdxQj23C{0&M@N9-iDv zujJ4={EGC6^h{p?KC`}rcIf~&cv{m>bo|9Q)>Wz9?j36qW>9AR{kk-QnIr$QblV+2 zkZ4atFsa|3c2cf?FjW3z)jp1}r09eVz3qnycbGpgcoi}HEmz4%zjKxc z+=)KJHY+G8C3^9Eg(zUzJd(_J{>(n;Xw2NWSH9W%pU1&ptKEUKszSdOo2wsL zg&UVpZ%x>0o_>7j(G5=B8iMYKBHpvy=Kn21N?l@=Il0$4FL8MvP2XIK-TzY0Nu8z3 zWr+(hekcWX@|vEe`Num+W1#k4Q`L(E*V>26(mhWr>!2KF?Oqd=zfyCyOgGskLLx(y zmmQu8mQRh$lh)i4w0AfQRIsUp6nevO(H4t?fT=P@;)Tjz7^Ys_d2u)A@RJkEk7Sd5 zy#jy+7Vf}ztkb-^YjQ7wvHuM=&9py>=NGkAis$7|~TRP^GfWDbntS z=9+FvYqi!fx|dm8sEQGKsm&2UKUP8UGFRtX^qwY&0=Co5?*oL-I&5YdGR_?>{{EXp znbN_6yVgSiYN} zY>2K77Y z+&d{WcM`{N#Kk7J%nuRyp;bD-oo6CP4*Oh=Lm?Nj&L=_E2?HLsaUQRj%d7(-0iTv1 z(@J-)TI{G`FAe%oP7eN6$bTEL3He=5dBhCE4h5%#%QqD=Fr@CcaX1lCd5LA;k{z-x zXFIJw+;w=&ywQ^&&84*&iewLeZL4fGco?=N60$o$Z{Abb{c*8=PM0^U0E$;Z=~G1+ z@Fop)*ii)_@Ggt=(>XaJAgX@-oJc)oknnZzdAuX3d%=$OvJtc)c`7ok4Nq;1HryeW z+$GGjOOuyXVr&AIs_K68PoH2cG{<}>pWHmf4e64vx~40&j2;NTIJ0vF9$*+SVA?%h z$a}fIb&A#pCtc5?QU-=8|K+A0^Hq8Ch7^UblvP4TJ5nVy-)eapK4ZkB&4SJxNBn-2 zYD!Na zSX7GNfJ^ame7dFiDJEJ5Yl}aOpdbOsQ!h}P*&D%Hf5cu6+6f>%bjqIU!%T3DA)Oi- zn@onRk^7li91`n>pHHwuGS-r=mMh>4=fHPUBVr8vAR`!^^HWv<-)m|W*|K=oWU(6q z_C@RzNpbvky_^sxHt9kpoHD;OMWM~He-Yjre(D;P@_^yLAW!PK1POf6U_usi>$NU* zxmE+M#N`3Bc3%Z5a9aRZpu*_&C6Ijh+y_rtQY@Jem_Z~B1bo@t_e?+6A@Yy)I5w;q zhG5m*e&v$*?^nOPKvV*K*V#bIQxWKbD97p|DjG)6|Wg zQTl#`H0s*5!n^*TYM~a!G z7v@XzT5Q%yt)0{!OZg*H;{bW`O?HUwy-WUyN7n;|LL~?7W_0&%!_(iHce8&8@wVUG zfgkA%+&Y3K&?F41` zfi)o*Yo72^$Xc9EKk)HDjoK*R#!8tjM0a5qQ=}`PqJvWBBtA}{{u$5odn=@IX5qgH6FGkB&*(?zYv$pebEv%cL5{uO5abHq4mw}PrlC>5yb=B4A~}HpzPuHYO%3Q*T@F~5=@P{aQ1usb&h|e zU%t^km*cpRhFaY`@}F14Yj6S(!`>I>;QWc`QA=j=4$|8dJmr*Wo=w=zxmH>;?dtS( zQ_B0Xckk;XqiDzjkYbDO+ucQOe`$6?fKdi=y{wf4gku#7$@x_eTF+L06q=BvSMkpd z=Bv_7#K}`QsT**}%+cc3?)T9qiVr%RIzM+rQk@`>uszG=h-U| z{K?xl&Z_g>B_9Nb-E}+)b1r}0wOw#x#Db``YJ>c+n0hsq1nbaFh`Jg+FAix(BM%vaQ&1s&=u`GDf(#MC{PhNg|BYlWBU4 zUKFq$;ayBxHMrTzGFfx{`R9-(b=1$93heYf3;2AlA=b>&`>gcrq>bS)H-WPsZC!YmME6ZP5m~xCnWF0GWoH~^lR1(J#~gy zsY;0f5@N42UD?8SSbn@W&=JT5Yyb(3{g>c-fkAD3QtgEz#sS;y`NUf-3yPs>S7U3h zQ{w1(J5~ZE`hr7x7)8`2kkb?mNu86gGY~KHe^vq&HNPkc{GvEa$PbNei;MOL{tBCW zT31=p9KQTtg79I(H_iRZz}$mRSQHS@l$-&!u#T#7o~48x(q@Kq8Jh+79P2 zMGEXhH3-Jrc20540^vbAf1ZG`mgVuvY}ttG0mD|`w6`EXyVlMUA>Qq?kE}fwO0?@J z99^B-qvKVRtatAF*kyvs*Y?x-I&t8lVB@n396&nO_K-4#EAZt2QqdWrIYIn`Hyw3% zk7um*6iz24Ui^M*=VqBfIz7|jOGHop0>p`vmf_^^N$`0_WxKyf2m41T@ZrewnnH_! zW}UJK8J}f4)~MR7`;06?k0$V;q6lfZk~d~K%qR)6j7$)-*Ds}%CQ0qv-7rj6-V=2| z3C;RslJxcLGDzdD*zG8!yQo)f1gRA4**scSTxD0e?$?q?*+l0OaI~?dDM|RDT1+4X zPhg1@%T;mZ&qp{n3jr}{`Ffj=Gnb&sV~rWM&l9UNXUyD5?;0nEdY`&!MlbuI{_DGn zQatUl1!Hh-=Y|-(tRAf-0@klIGyvZ8uWAb+J|;mN7?ViLlA%UpQ(Ug!wYm}-yOF*H z%`5cX&hRnYkUxxg1=kH9B;V?u7VKY2%aYM}G?Dq?ISd@`V_WGT#bz^JC;l4Cd+=0R zezQ2r3HC#w!S>>V{fN!*p75{4Z>_&f8EwL)c(TB`+Uxh$6Bx{PIPwhYtDqQdXVtVR z^5;b%#=J95R`-wOaJsK(nIvvfThx%Bmb$hbiOx<()UYZ_lKW-@B7apPmGDe^ytJ3p zHqMmDx9agQK;7>n(`9M|p&-c}l|3cDA@=d?*SyauGx0Y<{Fn$7yV-(?GAH9*km)@j zdOj)MEb!#50KK#XDOq^pkv)pE6LXDO^KnN72)@ykvmB8u45Gi>e#4i?uvhzL4z&yR zP9s{IXcPOx-6{D0{k#W#&&IVqlHSGQ5R=09)&s>0F=TQc;n5Vo1ZD#XF6?%wtN*oJ z8#(G!U@jaV_aI6?p_AZ>SQ8aGWkrCotM-x{Gq7@Yta@QNyRzOJqRgCcL+C)dG6DIG zH?Ik7u33Xq57z=MXxBqN#^&x774WCR-=+$UmHjmR-FQ>cVZ*dFCF06KBopirq~L-m z!`k@$R4`FDd=lH^9!Lu6y`+pDOyZrbE@@+TdiKgvX}SR`y2Si*a$^&f`2bXCl+obW z>jR?cv9`n~Fd*+e_>S9)3HXxpN(i_^Gu+-7DFIC}ZN3~3VfN7pDeggkKY02NDuiy6 zZ2}pZ{bU!?)dLTkL+bdQ^j}#(t(pSCmTAyAajcxaSpRC=h>AK@(?WoYG1DGA;i!RCz?eF)w0cPDQ z8aLeD)kPc>Y(0Y{A|CG;lfX1w5&09(Jb&iY^n-2DX$pC4)4pT|pFq7N%k`7qGHZt# z@7j`n>GL97Ny--6R@?GMof8vpR#LwNMje(^((B|pm<1T_CCaVc;ru6rZK|Q>SsPWJ zL)3v%s2QtE6VzF&)Vjrp3G$%vd-oVSP!y@5oK`ipr&~?G)<}>$_rbF+#+{T|S4}qbo5Z6{VveZQ$|1|8$7uqfh6v zsJ~=pL;=}IexYKDIyE4xWhY%3w_mQeLA^<>ZWPa;gYjYzc_QgcxUHw*ZD*?^Bsh~Y zeA)wZSJux!;$cPc&Vpw_aTrN-DFkBxjcq~&#?f6X6n{C=MbjWHjso zm1&NsE`V}k3T(i5=U~LXvf&9&(3G{Kvl^sm1(7=X-QeM?ZjBE`pK%w&|BX`fBoY5x zBC5r0qQ=}kP?NS;FjvnaHDx~N@~Q42C@>Z)t5`BtgA?a0+734IqCELxPPW!J^1AiEF#Shm8^p% z?v<_P(K>g~&cLr>58J1^yT;q+SA6eZN>9Tz&<0a3I^E2f@hzor|Fi;62VsR-m&q9u zp(~KBYsNQ3zsQQPLA94&E%8CQImeIss>gzQB8U*zRIjWwZKIb}q%xc>HfN6sF50ch z2zu_uC$CB;tpDRNKk8^akU0<|C4qm9TmSx%lIE2VPyb^&L>aoN;q1M_b9kpE*x2}imC0xqRI?r44A7h1=B!GL3)Xm-}~I9>8)7zpLavw z((me+Lx*=EpkIqTY#dua5AwVkeSQ@MhCYb{9dgEC&=CN0LU0ww00%q-WA%hszXd{+ z{SjQ3W2dMe_H3Z?r~&!ItPiE*C4ixUwXVx5?Z_T>rO*}RRc0UD?S8@ffpZpKYWNCIB0>ia&h zlbo2BG<QC|utxgeNb;M12J1mmea2qBEP-xV$Z#`T)+ zkO;=M&7NRC($cOE(!A=vsI{h#B^{vWph)`itW2>N`|L~hkCdt7ecS)6u>u&aGfFeC z*74}TRl8w|MPd)@_ z(A7(RLzJTJwOdC~;FhTze%R!J8Zm#KOSiGOu{$M;(@IGi3!`Xl=>N$GdzqZw?H;8*V`vKwa(2*_Y39+W*MGVD`Pzdj2s+rqXRJG;EB{ z=AC!E@Ic4MRZGSz?Q}|pVzmqZFfwlphS)oa53ZVkZZ#~r2OUf(qu0Pi6>50>#@mOa zpX9cPTx?L%okWqh2+(J+q~C3pd=1*$zZA`XU%6Jai2*{={d_uZ`n)m%bwi=6i@8^4 zpFbQOMjq8^D6hOTc;#Kjj6IUh7~nKJ6-5Y9?5Ws1p3y8-a{?pW=aWOAWyE=Wpb%Pf zuu!;;^4N-OJJI1(tt;4QDt8>~4X4b(zzaXpl;};c_`T&$|A8f=T_>=} z;ei4zCXIDvocwYt>uo&O+vj6AYCUoj6&%+3&Fk78O-NyutyP%ibzh2FN3L2pvwi>l zjaE6X4`oj89uPg2_F`+>V65R*Usa4I6J;6~e2!h~29kP4BS15(C6pDM0n|`P;Uhx1 zK(tQm%LX;P)%~f-h@FM5`OI{BMKEXNZnpTZe{!J0OZJEkWMj-HOXaNxQxkEms}4aYM%aaQ(#de)VSZ>Sby2a*WTC=QH< z_vGFS=i|%`Al3V$X+gg~r!f~S$5RT({!Po8oY83vwR{%4mYuFNc!EzJjw`1OFK6DOjQXa+ zlf##9p+BLJJ@u2tIVzmMm3zZalLs7xF=-BSxBhrXdV*abA5v_kMDmONC&>a+42oW* zW@eJ#SwIoZj^_0)1_tmcCJ=KjiR*%bxRh?gfkvR^KYnP1eJPXbzU34kCHH+`{`MYu zjzuPpSbbZXfg{OBfoRY0SfJ=ts%PgL6>H1Ky}E0y}^ANS+e z?51iaAPDsc(VG*HcqK9E+X22{yvZ%NaK|*7UC5Sexl=nMTei_r1BX0HkRM>@Z;FUp z{r&Hwob)Pn_KtdZ?oy|_Mx{Ym78&9jANcUg;HKj-_*Acf&0~=CXu# zP6PuW9Xfx}C5|V+EpX~ihW6+5oOfRbB8@8i$ws;==lynCm})_(=6EsP$qQr+A9b{3 z^lvek+cpr`u-tDKlO;gR{FH_?Yjim+<^Hy%Ze4!a^zXl9h~KgjJEY@+_YLn#)>QD< zyZ1~DjnS^?hq+&+KI7f%efAU1$=svU9;q)@=qXc=iyHaV9&+mRq;Pd}0s!7V#Z@{Q zc)>qe*lNFZAV$*b5!e_CpplZCn0%QE_}I4@F2j%$K6eI8Y8DJc8O%n|pn@6R=lM}c z^p>DCVi*GhIcd$=G0Tk64p(8ly#>CcUV=KtoC$Xo*B;Av^2T<}--HaGx*jbbalo6| zKn!uidUUZFH0wJ4LPYWx-1 zePNe+wfSFGt!BUxyQ93z3h{=%lq>u1G2tLlMVkYR=v(iODqz$HAuZXCgCKi&(WL&E zScV3T(~B|>t^N%1_$#0bsJ_w`sJSiGB3| z+;WbBJ9Pc0+Zvz_S<>EmZ+Wtg=HPf&N#K?y40OBsJR|JGRG2a2PCo}84rkJ5jyg<+ zLB>e)*slGXYDt-iwn@yiO5tNVq=4})Zy<)@1}oBTK9jfA8WtvIzvH6Pa$#^d*JSs2 zHur(RI}CvZ;hpzLGE?O8g$DBn;r~p92%!NBCX7G|7B)cuGogcxCY#+MJ82FV^(d=V zqP8fzz*?+3slxf;`ArQ7{&EYpGwCX$F~jM5pT0bC|1tlA+k;kWFu3-0fQ|mF^vuOf zIFDmkQJ?FF*&!#0^|shzC#C`Vq)l%PJ%;dNLVVoQ+O)x5y6p>;X{hT8)NY?iRDdNV z^GTz{ff?olIBr|bxng1Pe1me-7ujE8+L5#9Pe-{_keexk?GjKZR4rI_tS4tf)#8gt zZ9hRxazc8P^)GN{ti4cJfA6nVQeQRfG*R?|FvA^As$7Lx)47G&Se|Lr$E&a3nDyko zQ#)ecdaDlX>aUK6IhQTx*PvQ=8rTpq*`nI3Y`Z1sunE||5T>I3&u_g#uWjl0eB?yQ zmofxkfAEOkMG~;2KBTj9^O6U^#LLRtwoMiOV(E9ty>>JlBbRVvAXz&s*&qNe^;n=Z z<6CA&l1i7SLlPn9P%^CFKYnPSs1*!z=O3KBTQ|VQ4N3veYEl9BZQn&amne9P(<@$P zOhAjxo%d>W+k%O3%jT0B;98Dm>oXB}KZ(#ZEV5$&OQ(ZS5kl(s{&aF1%SYur!>VR- zj1b18x$%(_sI(g2nSn;AWtdNTV@yAlGHD}5NcCrVm`*G&~k`6nQkz~DOb znPAhC^+3_HY4!eQu`hb5Ii;pT7|;z*$k}2nNHgUoIzV6<5+RP zGJL!NgdkT?$sEe>A5aywpmXNravx5i$XfEb^C{iRR{Tz7!XGF>ZwvQqmS8CGcsMCi z@J`7LDI>0>wPRQSnn(nFMR9VqNVMkyC0gzd%clpq)zDU93KNax6u`v(cW!P^xdK!s z?&5AHT7oM*j=kwu}eYdJzX$GZn{OL(0K9{pk+`zOPD0m|S);+n4H-KGfEnhXYx(fg8Q#E=d zj=U^@Ghbf+-K9+Ao4kovJnQMVY zdQ}av$cMGbFApze4zD#VS_}4(%tV36PU9jt)qY?rt;K#4bPysBcI?i^iS#e7TWffH z?1Fa+$k!dG4Zrh6Hy>DJ!#Obz%~EVrUpas3e7^KN7HmO-1sN{t^ne0RDP$pGLe-DP zuFz0-s(TXs9$Hn^1I?&`;;ru2C@y_M& z@@oPq1UB%F83bl|4G=XN{}f*=^rpSxU-Wv~U+ld67JU)^p7eX;T1^{F&a#%{{u3C+ zDy0@W_p30G@5aQ7B_l@XuEB&FHr=xey=50epBs>W&Y9Ac6|^niNzT4Z;fZQ}TT2*u0(ukjrR82YtJ+J{uN*cA(zgPJjfxg!BU}l2+K*|?#G+rT9ti%5o1hJ9^&NSRMzI;s}_mdG=)eHh8v4$PK z+ZkO1e(1N`E{rP!NZ^d~Mi+h}0s(r;vdqLl^MXx7z(wHM$rKT)c|n}kBU16Vf4SC& zR>Qr#De2xX?ncc;wMQ5Y0E{l5eRYmFM8|(C_}NE*Bi0mr^3h<;R{>oJyWx%2J06>n z9^5gI@R`*BW6r}{O;VT**sFqa)Ffl@_CL;!J zA-30iZU35{$=~iMocwn-ng#O_E8>!y$yxbiA zs>g}y2*y0?YOubRqnQ&+yII(Qc93=bkMeHuCieZ!>4jE($B(j;PlPo84YWISVbyZuq+0nuks0q~&kZQc#(^Zb*{YLK|kx^zFziv#e| z{Gx7W0$z==>i3_Dimiw=JPV(<{qeldU*Jx3*saf z9<_R$OyBR{^W2c}-{WDLi@Yyh`Gt4x2b$t)b%ZIwnNG#6(;zV&``W*ALQkcU(>#o5 zM#ja7RKSYkF#*l9y5(EWx=}#Gx*FjK!;HC#dZ1~^%}2hf%_RTJsTVB;CINQU8;O;3 z)C-n@lM$c)PLRO!X`IBt{#}PB|LoItZHdpc8~VbblID#HzC+i0=-H0y0cCayXvf#g z409<-aW*F!pjCmu6VS?XGK`T8VXo3qYI=4DEZpLzRY&#-84-pQvwrsL{YW78%yZhK zc^IR@Vuq!l=U1)S;mzWO%-CZ>VWtni=7Dtq61L$RCneTEG|q(or@2<8aNU;TB5?UL z^hH~zA@GSL$Hu8*G6iwgaJs?Jx&(E@9fZ|tduY}LZT>z=0M;D3#9%j1>8)G?s*6O# z3fN@2YXcP3g~&{F70&2A*66+9u_mr!yHn-xe#h4zz;a=UmP5x`@L@ZpCz_KvMBN@W zR!9QH5g1N*$Fh6GSE?Zc(J>iZUaD>VQq6nnog?{UOpI58MH?v_=O1nX~^*wBd+u znB=@9=2$%%zQo%r584#-%`)QW%$|`Bc^|T~32NtIt9CXC6BHM>!5y9+A}{k1d!*=t zzT+-~cy01vyHqf($W6xt9vOPGYpWjb^V;nl*YipN(=u1r+{0g$Tn=Hx@fM{CxGb0e z_EkZ>zjwd))_Es>=?Z5fu{LAf`Qc35sH*UVCw(K^X;EqD7nWGJ<=&g5&v-olhh z4n!;qdGM^Y6l6zoa!~~PamT`w%1(&`VbiU$DDUV!@75W!U+VEUf`S$n!TaBEubt9& zN~3VCj+@|2)5t|)yIa;QoPmu&R11LhCi4$mB05$ciqsUG7z%0FDkH#yK`0upe$;Z1 zzy5hL`m-K?N@=wDN8A^j#lD4oZraCfiK<~CfEYD?UfEn=1V3E7$ugK^It30GT&ttJR#V=#(7}lDucs;c7 z_pu&+;&#^O`&6ERx_+HwkuJ~T!_~2c6vx@OILAm?`We5hSQBPJQM@Npt8IS0+{bpGpCIGE z$?cyDvD$*4eq|V*;*!*UxJu#vH^7D{Vt<%jBL%tdbS8hOL&(bjoHZPhN68@DSvVnP zOvMkGAmD9SVa|R$n!znC9OkUvW8W_(cE-Q$C;umUJaw@DE_0CQ0#l?HHFBj>7tWNp zNXGB<%y%mXiZX+_4<(LP@jecr@u9?qRW_e=+g3r#p+s4YWNui4ce!dIjG;`+9Es$I zze1JMWm?vs6#Y3I--l%MO5VN4eEJEH$JgI=*ZHbdomf`gNVd#QNsij5_t^OBKdZ1B zu65glUcRegG)QEiY60_mk<{zo$2l-u7^0|8EY4EjsZ4zEd_4h?8Khj>&9+#~qz6EM1Lpx4- zQusC#(2#S792Hhf;)n?@husG5rFEr>DRE+iq08dTT9aND3X}Nq@6hG_$P}AjFWI+p zxowW$L}N9ChqcfbCEl;P>Vd-uggE_$@R)Aw!O0$}N&-+%?z_NbA2$vb|17o(?eLZn zX6aSe;Yz~xareDM2)qVfk%-ds<{D4Hw-|OBbO!g_MQr!SH#|lwj#QhO{05q+U%mR> z=k|4u*!SYNW6p=X#S+Q1e{bvg>m=BpgOl#%AqGc@cW=jJY;#*&dYD;OyYMk^%WnJG zcT-RHNti`M?YDtvB8@or2*?X#@u1V79jnTaD1N%>GyW@EpgRioduA<)&}Fqgl0WSa zuM+tEWM!*VpK*$2oDS!ELsVyp0#jwHkhc!Lgc~SE)AjnacnuBM*I)ypHIGh;n-l|JyR>2-z^XOaR zX#UgzEc^LgaH!-_ERP%v`mhH1QG!%b)i6_a-xVshnuH)$S(zs!A9r$`RfZs3y`;|6 zU6rZDIfi~@8!nS~)^ijTdi4*3RV0UwMMN~#S+10_DO?Lm*lQ)0Kl^=~AtP>P; zFTzV!ssGz-81b+|FK1LyIv80mJjyb#A=?9?KIKvv{it-3M&@ZZ-~H=7Et zWCZ?NeEH^%)iq}@HqS(`?lAC?8LYl6G>$nuw-+N2jQFr~QC(G_-tbP)i6F^ONBIk0 zzfvB?WbZ+Dky%VK%~9`73l7deEWoWr)Q_j>ko=>_Yhv=N&Lr|+0CAEJ0C*LyBX#bm z%dMJL@?J@2@56qZyiI)b@(X>CX&b*Kj30V!bdH&!Z4)@nSgPIog6pEkl6liox66Z% z<6)H8Cu1|VOv%b3_yhOtgdxS9+?yuf_OVo+*Q#u9I0(o*J_d~A(J{X(x6WBk>jJhQ z1nm_p2fNeqT13lYx=tflZ(AfV$rbTI`^{$w=2B*alfXo>vjffMcejrD(%qKMS!jF# zG@_LjvTjhxSE)sa?s~}1!Z#e|_bD1n4ScO_{EnkbTq#?`??=S<2XC3zCbg(RXF7t| z>w;o>?t9H1j9^zByG4|@FU)IyiCEfkYs4Ni8!?J1b-d?osS`gLp}@u#Q+JoYyN0Ds z&IpE<%PCE4+QlsGWcc^{I`E6UqT5o;!`Sdfx6d;o!T*S0y!}q+{CBg?S`LNjSoK=A z0C%Cx{CSnq@Qo;Vy{7ePy`H!i`s$~CdoZ47z;ikhqo!v#iqaDTr_Es3HUR!cG{-Tt zo=Fa6uHciVg@~vnx2*nnC4xXpn{zV^{(EQqE{xww_eO%0&rHYu{axibfjcN%X*j)} zvul>47B7w{wi8{Y&-iO2SLl-HLyp&A$k>RjAPU<`$Zkg0keNJJNrh zqsEzj4BuyOO*a3_bflH=nuEX!?mieS!d33cFAP?;5bH~vZauzyBfs7YJ@Tzm>BFS} zchX3(ThSL<{z}}H%J-qiN&j|^y6+;$cKG+Vk1d?vBqL^-N)Lp?)}f<`!DlK!k15D~ zU$Fx^_D0qT6ZY?cMT#l8Ghj}(-;hBHKqto`-D%!}12i@4<5) zX_J0RMMKK>brDYy(SS9(;q9B#VeFy6ZpUYc;o=2xRl$vdfHv3y%qZQ-dYE^}>_C4h zn1wJN^_k@x~rQZzhJ|TnjoY!iSqwR4+{M&7%fAw$7 z9zIhmIj-<6KG^?t!E^EUF_4U1`Zf=D$mJ+~{(rSy`9IYA_kYhAW5_VbS{P&}vLyRh zLX<5_7crmeUZE@{`)J;>L_*mrS>syA5~6IAilVY)r?KSL*vB$5Xnfz(z5l{@ew_Dt zo!5Dt^L(Cj9`ks=&XBSCK%;Q<_5PCG3YUGyXYlTD<&lXa&7%~mfzG(ARC|%N0h#9k zg=l-0sGRk4F|Kjqs-YNy=k;z4(`>qionIO1;c zYf9lQ@F$J;X)nXKwH)Gb!%5NPfbaUiIkyKv-+aaQr(iwfqF>#F7kED&QZu5Ss-W4E z=6z_fWPdDFV)?oq%oQw_y(YKX*ZBMjs|YqR^#ND=thVm=iKSY1Xw1xM{(Azbzu*%V z?@uayTOx>l_0ZI0o`l(>)Rydw>Wz7X6~(-g>b}C;pVChM*H2C+P^aLG&r%HHLq1M2 zNu4`ME9A>5oOG8~AAs^|B*{m<>1CWC1`@?KCyZCq{G9ixN$6aYYObm+XoR*^oWc2oqPexMbK8phqddbC zcRqVxXBN`^)}M6Qp}5gd4*|#&k*J}+@`{7+NGx`J9G`Cb%4%pgI|k2ho4sLcZaiBg zhcLy62*T1NY6;HE1Xpt^_bfEIrGp?Kkzwq>ad2Vz{5$bS87@&pbL_#_`L(6`55b`! zo^9BnLMLmh5W0ksaBAK39r0Jc%p#G60g<~SeWZki-B@xzM&vN0wag>VYe|COEvwaF zb!hp)TulX_9DToLrKs`J$6fjVcoF_r`!JM?-7`aBVP~b~5g};MgpYVNu!Q4jBF_AX zF~D%#?;2dkhzGKf+cYI38*0>w-UAp29cr*lvhxZTp4mNi!?b`4t`Gf`#`mbs zsn%KJirJYTFo#JIVtd`!Z)^H$_m(P4lUhu;0fsu1>&A4TrXSZ+8yYdiW8rCiw<>6* zW$uP^m0@d8zh8hB#SNOZ{pKI<266pn?X$bUu4I{Up7Eq#*caD>3_`dn#( ziT;{jc*`w5-fOxKx0TtQPT>R<5Xb?T$ZpqBb|d+w?4*3nin&`U1y;&qZVdK19gJ5t z0T%LjnX~pXzphkm4Qd8OZkIlV?Kl_vKisz8xmlhxH;#^>RoloCQ+PMjXA`J92vg(4 zJPef`9N({S&HY&v&YSs!=W2J`YN0Xr2l1Ift`5WMk=ML+#)0C^%ZF&}h$;pdE%B*$1 zK6!G~Ir9>J|I~nzzRsL`icfQa$K~9(sBp+yYS71h#d*H~a&tF=P zIrr*Kh}?<#%xwRr*}&7&uZM|Gvx7>##eJx)*XxuwOuHyp)wCgLzZ=9+Pytt&bsX?w zalrVk5jM{=vM3P#>Qv$r%$OpJyO&RuAf5#UZeI;(Sgdo6y}p+aQh=t5#+Lsh+4fwH zApj4Dq-w!?Texbs^;CtMZG!k|j>A1n$aBLKg}wN{`tD|ZzOopLQ-k^d0M(L#3x3fF zZgZc@pb|x%48UWWw<}9ae@wn~WklRGtO-5cti|Gk5bj~7cy#5Im(T|1Mt{I%)$CHDypT}vKri;vZR4~!Tm zx#Jd9V4y7OtTsSFkhtTi7C&;&b~2pdnd;G`*$;Af@4Xu?PfORDKIGq5sHLO$;O9}T zqD0TvhdGP4{`eDI`s*v+GW2dky9+(}d$Go`B!W<8w?gRBsdHf|{%&1n0Nfvur3Xvn zdb;%hq@#yPNhSjKc98Gp>dt=f-v7C$+G|A6RF`1CWQ)R)Gss_np zPV06*9HP)Fzf#>9fA;>+pwu~r-mmVeQ9gq-!OOsxo&wkG8_H6cgZOjvQ~U+TFN=i5 z`tx_l9C$|e1*HU?&_-Zq%&`A(lGiOVNSd39r}wKI%^Wgs+XUAC$Xt26Ynit`nI$L% zz+~X(ZGq?0VfV+L*vSYk7up`Ll^KEia=y}9EBocmUn4X~raMO8-ke(^ur-KsfeZvw zl*p*VyvBl3chsA=lV>ZUyb)s;>i@(PCHMUCs5FX?8QYSWhAof}yuH8A=;ys`&I`-L zE4G(buS`7;4wN#8;2PHbTb4Sg7tYynCMx%u2oi>xmm$L5yQZ(+HP_i$9p6N^e$?@5 zo|e|@T9e&xQ+Q557V7YJnE>#7PCRfl6nX)Q5QkmCIFIUn*U@WyU#nni3f(JGVwN?x z%!#XNe3Jse28240Xf317osGmg7(FYrVpq1tH8L9J^2I~9cN$t>O29Gwd}P3b_K@qj zABP&1=zZveXlE9=%vK}iXztd#%QM$A`CjyJN0NC*HH=?BLX2<5wk4c6n zU*^dv?9pWEupO~Th{FQlIO4@g;L__~=VdE-Y$h2Iw~|M4?0V|0nJ)B{ifQ}SksOc# ziEXjOMuzM7$qKJ)KX+*7XW51DsJ{LrbYS^ySV^n~0$VS?)t^8yd_Clf;!b1BH~Iw6 z5PjFwy;3$z?y1~HZI7Duj%B#zJKefs6*LUxfq|qeoUMH?Q2d96A8IB4bi|`a6Q5Mf zYck*7UevAduVRCt_T^@LA)UGt1KumN%FqjgyY!HvdWO@=PUO$MYm}*A$Y&l14>Wn% zsRTZvft3bxa+hQ2B~g`m#0GBDlO~3wZn48%css^RU7v;H00K^D1``K7|NVKOdm#DENc|s=}u|=si61p zul2@ay0KWC0@%MNBH0b$_!Nk0b*Opw()?s)=%e9H_kZR~-sXT&n{WzI$eK~0Nqmmm|wAYA$ltv`+%!dEFNlrn@FHeua6 zuB0!f0lJPL&Ic|6bZ;cGGwisZiLZ|DD4AXwK4JVLsA_3^$YtHNd=&9k1?qf7_{o4s z=h57rA@yWrdSI&+UZCq2SGk~ZXMS^7ED~ggc+!5j(Uq906INr(yg`Z0Ip1?LV^n4K z8bs}yKi1`^G-44j6avzN==4`D;r}>t*xq^u$iF9ml$0+i2Krv{dY zdyU>=*STmzt_-T}DSZ;8*i1)>!Z8@k*aU#u@$ekk18fP;T z_A98RBX41EL?(DUtKj93q1Kz9?^-ub@5l>fmOy;)hnLs^t$I=Z)aSpBefOFVSeLAC z*W%VN_h5%X8>xZ>J76&Dt(tl{J|~zN?GxO0?FPKRO^*#qtf+ZuS_m8~c-NK7b2JCl zU&AXYv|>`0mt$ee867t+#w~#;c~@Lwkbjt8s#_u?v04I1*mT?>$q5T@6D=-{6(r?M0wG& zMeDzdw)9>=!!cuVY?!&m!HyLzD1FAy+cpf6g+nmcz7*_$K6&Y}N z!>-kt6EaT03Sgs^Ty=a+Ko4*|d~tKwGyfvZG)yo`fM0{PP86bwW?6ofqBgeD=uJRo z%-Tv5YF!U{1k(jcXrfbKs(8l>O`VsXo?omBG>|wA2{g-2)1brmx4a?aBGaM#hUyvqq-L7$VLD zUWhEf<~OB9qPfMFfAn~X-CfLy+hN7zm^|$-2-5xyW|HEP!{vUXIQQ^M~w`9m2vPuZ9gJWlLrbr&KN9(^>b0GM{DGq+G4Id z9xx4itx!-*G3r?RMFdXi0*U8fN6)e!slO1?(r9$J`3d;EuuBC)1Q6dbV;cy(tJFg= zg>;?+`Xu7!wss{e7)0D1ToNx#`jqZZpX~p=f6V0ol}v~>ATCz`u>N@;myJ6Vt!?l3 zKE%-Be>SWYWoOCr2;g;DD?9UDwZ>t;; zdQuG~79on%vv}~?uQ(l!a%h7|0Vs#~!^*K8rh`UqqHPkdd8fElSPa2yz_`it@C(P) zv_)>$MAEjp9~$3enN(&DK>xz1T8>Q!*-v5oMhOfx1VPElL%AGmHrTa$Dp~li?FJBd z)Rs$Pj!e`k8-422+z$^p<`T~e;e7~|4)2PQvEDn0Nfrt$>yr4#dH^f-?Xg+!g`EZ3 zz4l({mKEd{Q@Fb*;Kyu>H{H5rxP*Vq`}-_dS{ykIMinHxBpB|#vce1YjkNuER{z5g zO0ZBQ1`zSwxZv9Q(Istz0OX|*{wk;(u_Dy`)jt4P;5uWWAF>j*mNIoE`h_qHlu$}I z0S?Lop7E#u1o(xs`+tAOqG=uyCmWWSmz&V_Ng@Wa9g~8t_ioJ=E*-7g(n7z zS*Qiz(s1`&faVi9kT)a!d$%zn?tKDama?d$Af)&^$^fDYHE#&3?MVy&ZwJhd1sS^R z!8$8TJJkHFrcSOrIH?DRlHG3^avXppvn!|nr{D$@v-xV?f!{s`5FRKz;8Clg_}?jX kVBEOXU5xnu`_g@0_2!Sdo3Vjc0O)h(w5@ryDL&@^0DWDgp8x;= literal 0 HcmV?d00001 diff --git a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt new file mode 100644 index 000000000..0d473b583 --- /dev/null +++ b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt @@ -0,0 +1,99 @@ +package eu.kanade.tachiyomi.extension.en.vizshonenjump + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Rect +import androidx.exifinterface.media.ExifInterface +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.InputStream +import okhttp3.Interceptor +import okhttp3.MediaType +import okhttp3.Response +import okhttp3.ResponseBody + +class VizImageInterceptor : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val response = chain.proceed(chain.request()) + + if (chain.request().url().queryParameter(SIGNATURE) == null) + return response + + val image = decodeImage(response.body()!!.byteStream()) + val body = ResponseBody.create(MEDIA_TYPE, image) + return response.newBuilder() + .body(body) + .build() + } + + private fun decodeImage(image: InputStream): ByteArray { + // See: https://stackoverflow.com/a/5924132 + // See: https://github.com/inorichi/tachiyomi-extensions/issues/2678#issuecomment-645857603 + val byteOutputStream = ByteArrayOutputStream() + image.copyTo(byteOutputStream) + val byteInputStreamForImage = ByteArrayInputStream(byteOutputStream.toByteArray()) + val byteInputStreamForExif = ByteArrayInputStream(byteOutputStream.toByteArray()) + + val input = BitmapFactory.decodeStream(byteInputStreamForImage) + val width = input.width + val height = input.height + val newWidth = width - WIDTH_CUT + val newHeight = height - HEIGHT_CUT + val blockWidth = newWidth / CELL_WIDTH_COUNT + val blockHeight = newHeight / CELL_HEIGHT_COUNT + + val result = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888) + val canvas = Canvas(result) + + // Draw the borders. + canvas.copyCell(input, Pair(0, 0), Pair(0, 0), newWidth, blockHeight) + canvas.copyCell(input, + Pair(0, blockHeight + 10), Pair(0, blockHeight), + blockWidth, newHeight - 2 * blockHeight) + canvas.copyCell(input, + Pair(0, (CELL_HEIGHT_COUNT - 1) * (blockHeight + 10)), + Pair(0, (CELL_HEIGHT_COUNT - 1) * blockHeight), + newWidth, height - (CELL_HEIGHT_COUNT - 1) * (blockHeight + 10)) + canvas.copyCell(input, + Pair((CELL_WIDTH_COUNT - 1) * (blockWidth + 10), blockHeight + 10), + Pair((CELL_WIDTH_COUNT - 1) * blockWidth, blockHeight), + blockWidth + (newWidth - CELL_WIDTH_COUNT * blockWidth), + newHeight - 2 * blockHeight) + + // Get the key from the EXIF tag. + val exifInterface = ExifInterface(byteInputStreamForExif) + val uniqueId = exifInterface.getAttribute(ExifInterface.TAG_IMAGE_UNIQUE_ID)!! + val key = uniqueId.split(":") + .map { it.toInt(16) } + + // Draw the inner cells. + for ((m, y) in key.iterator().withIndex()) { + canvas.copyCell(input, + Pair((m % (CELL_WIDTH_COUNT - 2) + 1) * (blockWidth + 10), (m / (CELL_WIDTH_COUNT - 2) + 1) * (blockHeight + 10)), + Pair((y % (CELL_WIDTH_COUNT - 2) + 1) * blockWidth, (y / (CELL_WIDTH_COUNT - 2) + 1) * blockHeight), + blockWidth, blockHeight) + } + + val output = ByteArrayOutputStream() + result.compress(Bitmap.CompressFormat.PNG, 100, output) + return output.toByteArray() + } + + private fun Canvas.copyCell(from: Bitmap, src: Pair, dst: Pair, width: Int, height: Int) { + val srcRect = Rect(src.first, src.second, src.first + width, src.second + height) + val dstRect = Rect(dst.first, dst.second, dst.first + width, dst.second + height) + drawBitmap(from, srcRect, dstRect, null) + } + + companion object { + private const val SIGNATURE = "Signature" + private val MEDIA_TYPE = MediaType.parse("image/png") + + private const val CELL_WIDTH_COUNT = 10 + private const val CELL_HEIGHT_COUNT = 15 + private const val WIDTH_CUT = 90 + private const val HEIGHT_CUT = 140 + } +} diff --git a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt new file mode 100644 index 000000000..d6b1c6b92 --- /dev/null +++ b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt @@ -0,0 +1,250 @@ +package eu.kanade.tachiyomi.extension.en.vizshonenjump + +import eu.kanade.tachiyomi.network.GET +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.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import okhttp3.CacheControl +import okhttp3.Headers +import okhttp3.HttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +class VizShonenJump : ParsedHttpSource() { + + override val name = "VIZ Shonen Jump" + + override val baseUrl = "https://www.viz.com" + + override val lang = "en" + + override val supportsLatest = true + + override val client: OkHttpClient = network.client.newBuilder() + .addInterceptor(VizImageInterceptor()) + .build() + + override fun headersBuilder(): Headers.Builder = Headers.Builder() + .add("User-Agent", USER_AGENT) + .add("Origin", baseUrl) + .add("Referer", "$baseUrl/shonenjump") + + override fun popularMangaRequest(page: Int): Request { + val newHeaders = headersBuilder() + .set("Referer", baseUrl) + .build() + + return GET("$baseUrl/shonenjump", newHeaders, CacheControl.FORCE_NETWORK) + } + + override fun popularMangaParse(response: Response): MangasPage { + val mangas = super.popularMangaParse(response).mangas + + if (mangas.isEmpty()) + throw Exception(COUNTRY_NOT_SUPPORTED) + + return MangasPage(mangas.sortedBy { it.title }, false) + } + + override fun popularMangaSelector(): String = "section.section_chapters div.o_sort_container div.o_sortable > a" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.select("div.pad-x-rg").first().text() + thumbnail_url = element.select("div.pos-r img.disp-bl").first()?.attr("src") + url = element.attr("href") + } + + override fun popularMangaNextPageSelector(): String? = null + + override fun latestUpdatesRequest(page: Int): Request = popularMangaRequest(page) + + override fun latestUpdatesParse(response: Response): MangasPage { + val mangasPage = super.latestUpdatesParse(response) + + if (mangasPage.mangas.isEmpty()) + throw Exception(COUNTRY_NOT_SUPPORTED) + + return mangasPage + } + + override fun latestUpdatesSelector() = popularMangaSelector() + + override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) + + override fun latestUpdatesNextPageSelector(): String? = null + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return super.fetchSearchManga(page, query, filters) + .map { MangasPage(it.mangas.filter { m -> m.title.contains(query, true) }, it.hasNextPage) } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = popularMangaRequest(page) + + override fun searchMangaParse(response: Response): MangasPage { + val mangasPage = super.searchMangaParse(response) + + if (mangasPage.mangas.isEmpty()) + throw Exception(COUNTRY_NOT_SUPPORTED) + + return mangasPage + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector(): String? = null + + override fun mangaDetailsParse(document: Document): SManga { + val seriesIntro = document.select("section#series-intro").first() + + return SManga.create().apply { + author = seriesIntro.select("div.type-rg span").first()?.text() + ?.replace("Created by ", "") + artist = author + status = SManga.ONGOING + description = seriesIntro.select("h2").first().text() + } + } + + override fun chapterListParse(response: Response): List { + val allChapters = super.chapterListParse(response) + + val newHeaders = headersBuilder() + .add("X-Requested-With", "XMLHttpRequest") + .set("Referer", response.request().url().toString()) + .build() + val loginCheckRequest = GET(REFRESH_LOGIN_LINKS_URL, newHeaders) + val document = client.newCall(loginCheckRequest).execute().asJsoup() + val isLoggedIn = document.select("div#o_account-links-content").first()!!.attr("logged_in")!!.toBoolean() + + if (isLoggedIn) { + return allChapters.map { oldChapter -> + oldChapter.apply { url = url.substringAfter("'").substringBeforeLast("'") } + } + } + + return allChapters.filter { !it.url.startsWith("javascript") } + } + + override fun chapterListSelector() = + "section.section_chapters div.o_sortable > a.o_chapter-container, " + + "section.section_chapters div.o_sortable div.o_chapter-vol-container tr.o_chapter a.o_chapter-container.pad-r-0" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + val isVolume = element.select("div:nth-child(1) table").first() == null + + if (isVolume) { + name = element.text() + } else { + val leftSide = element.select("div:nth-child(1) table").first()!! + val rightSide = element.select("div:nth-child(2) table").first()!! + + name = rightSide.select("td.ch-num-list-spacing").first()!!.text() + date_upload = DATE_FORMATTER.tryParseTime(leftSide.select("td[align=right]").first()!!.text()) + } + + scanlator = "VIZ Media" + + url = element.attr("data-target-url") + } + + override fun pageListRequest(chapter: SChapter): Request { + val newHeaders = headersBuilder() + .set("Referer", baseUrl + chapter.url.substringBefore("-chapter")) + .build() + + return GET(baseUrl + chapter.url, newHeaders) + } + + override fun pageListParse(document: Document): List { + val pageCount = document.select("script:containsData(var pages)").first().data() + .substringAfter("= ") + .substringBefore(";") + .toInt() + val mangaId = document.location() + .substringAfterLast("/") + .substringBefore("?") + + return IntRange(1, pageCount) + .map { + val imageUrl = HttpUrl.parse("$baseUrl/manga/get_manga_url")!!.newBuilder() + .addQueryParameter("device_id", "3") + .addQueryParameter("manga_id", mangaId) + .addQueryParameter("page", it.toString()) + .addEncodedQueryParameter("referer", document.location()) + .toString() + + Page(it, imageUrl) + } + } + + override fun imageUrlRequest(page: Page): Request { + val url = HttpUrl.parse(page.url)!! + val referer = url.queryParameter("referer")!! + val newUrl = url.newBuilder() + .removeAllEncodedQueryParameters("referer") + .toString() + + val newHeaders = headersBuilder() + .add("X-Requested-With", "XMLHttpRequest") + .set("Referer", referer) + .build() + + return GET(newUrl, newHeaders) + } + + override fun imageUrlParse(response: Response): String { + val cdnUrl = response.body()!!.string() + val referer = response.request().header("Referer")!! + + return HttpUrl.parse(cdnUrl)!!.newBuilder() + .addEncodedQueryParameter("referer", referer) + .toString() + } + + override fun imageUrlParse(document: Document) = "" + + override fun imageRequest(page: Page): Request { + val imageUrl = HttpUrl.parse(page.imageUrl!!)!! + val referer = imageUrl.queryParameter("referer")!! + val newImageUrl = imageUrl.newBuilder() + .removeAllEncodedQueryParameters("referer") + .toString() + + val newHeaders = headersBuilder() + .set("Referer", referer) + .build() + + return GET(newImageUrl, newHeaders) + } + + private fun SimpleDateFormat.tryParseTime(date: String): Long { + return try { + parse(date).time + } catch (e: ParseException) { + 0L + } + } + + companion object { + private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" + + private val DATE_FORMATTER by lazy { SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH) } + + private const val COUNTRY_NOT_SUPPORTED = "Your country is not supported, try using a VPN." + + private const val REFRESH_LOGIN_LINKS_URL = "https://www.viz.com/account/refresh_login_links" + } +}