From b82cc74aad11d77b9c3c3ba622fa9c390f9fabae Mon Sep 17 00:00:00 2001 From: xiaji Date: Mon, 8 Jun 2026 22:21:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dtvcat.cc=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8=E5=92=8C=E6=92=AD=E6=94=BE=E9=A1=B5URL?= =?UTF-8?q?=E6=8F=90=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 详情页: sourceSelector/episodeGroupSelector置空,强制走fallback正确提取剧集 - 播放页: 新增fetchPlayUrlFromApi方法,通过/_fetch_p/ API获取m3u8直链 - PlayerActivity: extractFromPlayPage返回空时尝试API获取,失败再用WebView --- .../java/com/videoapp/tv/PlayerActivity.kt | 7 ++++- .../java/com/videoapp/tv/data/SitePreset.kt | 4 +-- .../com/videoapp/tv/engine/VideoExtractor.kt | 28 ++++++++++++++++++ icon.png | Bin 0 -> 22295 bytes 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 icon.png diff --git a/app/src/main/java/com/videoapp/tv/PlayerActivity.kt b/app/src/main/java/com/videoapp/tv/PlayerActivity.kt index eb6d7a9..8aff822 100644 --- a/app/src/main/java/com/videoapp/tv/PlayerActivity.kt +++ b/app/src/main/java/com/videoapp/tv/PlayerActivity.kt @@ -259,7 +259,12 @@ class PlayerActivity : AppCompatActivity() { } else if (iframeUrl != null) { playWithWebView(iframeUrl) } else { - playWithWebView(ep.playUrl) + val apiUrl = videoExtractor.fetchPlayUrlFromApi(ep.playUrl, config.baseUrl) + if (apiUrl != null) { + playWithExoPlayer(apiUrl) + } else { + playWithWebView(ep.playUrl) + } } } } diff --git a/app/src/main/java/com/videoapp/tv/data/SitePreset.kt b/app/src/main/java/com/videoapp/tv/data/SitePreset.kt index f6507ae..03132ca 100644 --- a/app/src/main/java/com/videoapp/tv/data/SitePreset.kt +++ b/app/src/main/java/com/videoapp/tv/data/SitePreset.kt @@ -47,8 +47,8 @@ data class SitePreset( categorySelector = ".text-muted", dateSelector = "", episodeSelector = "li.list-inline-item a", - sourceSelector = "h2", - sourceEpisodeGroupSelector = "ul.list-unstyled", + sourceSelector = "", + sourceEpisodeGroupSelector = "", iframeSelector = "iframe", videoSelector = "video source, video[src]" ) diff --git a/app/src/main/java/com/videoapp/tv/engine/VideoExtractor.kt b/app/src/main/java/com/videoapp/tv/engine/VideoExtractor.kt index bb7ddb3..7b484f9 100644 --- a/app/src/main/java/com/videoapp/tv/engine/VideoExtractor.kt +++ b/app/src/main/java/com/videoapp/tv/engine/VideoExtractor.kt @@ -3,7 +3,9 @@ package com.videoapp.tv.engine import com.videoapp.tv.data.SiteConfig import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.json.JSONObject import org.jsoup.Jsoup +import java.net.URL data class Episode( val title: String, @@ -90,4 +92,30 @@ class VideoExtractor { Pair(null, null) } } + + suspend fun fetchPlayUrlFromApi( + playUrl: String, + baseUrl: String + ): String? = withContext(Dispatchers.IO) { + try { + val pattern = Regex("""(\d+)/ep(\d+)""") + val match = pattern.find(playUrl) ?: return@withContext null + val videoId = match.groupValues[1] + val epNum = match.groupValues[2] + val apiUrl = "${baseUrl.trimEnd('/')}/_fetch_p/$videoId/ep$epNum" + val conn = URL(apiUrl).openConnection() + conn.setRequestProperty("User-Agent", "Mozilla/5.0") + conn.setRequestProperty("Referer", playUrl) + conn.connectTimeout = 15000 + conn.readTimeout = 15000 + val json = conn.getInputStream().bufferedReader().use { it.readText() } + val obj = JSONObject(json) + val playcfgs = obj.getJSONArray("playcfgs") + if (playcfgs.length() > 0) { + playcfgs.getJSONObject(0).getString("url") + } else null + } catch (e: Exception) { + null + } + } } diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d5728463f03962a939afea1adaba0e8549c126da GIT binary patch literal 22295 zcmV)8K*qm`P)EUKxQ!*Y=R!JF`$8_u^9ulX~TG#j)`%&ZQK(v z|4nqbJKAl$V1u#EV!Lr0Y!(|MTSkaQo6)|YU3!wKL}7& z0WYAm-g6U^6OA}X&7A3b<2yOj%xhdoiqYgNLI{*WAtDF{o75{_rdsqE5 zL-cwBf(RY~rGOAGE2@6K_x8RwzWZae{$(t9%Z z?)jf<{Bz~h(|^#XdIs71W~})4@1tr}FnJ$MJs$)Y0wSJ;mS*p;0+b$ly@C(|T5Ci_ zS5T{{0!Akt9Ud8CPb{FmiIE|4(9pF_@y{J1PgltZGp6%XJoM=@!Bf5eeS6E~Q>o{3 z@9j-LUW~hF1OrO3)vlPEOUUYFuK-(l==DklMKKOkj930hU)0YnW2^IEk6)ey6a34K zr$Kz`VApqm37+gN$XPG5f8jB)1;AUN;hdWbBPzzc>Ep z9dV707O+C<(2W3C=_Mouwy;3FHra|y`KI#<7pat-|eCHdg9aHeP@|q_Ix8|P_<%LwNY3_1~}Ut zO=tS1&U4l=^YwRN^*^=aBOC7*ivPT`J=JmcvmX>RKg)i5)UA4&%TV^5U~JXZ91=pn zPB`M=OYP11o$ZEZ@E3(%-t$lIBU8jzG7@zM-RXCh3HIINzWbZKk8e-R$sTH7 z-v8Slf42J(5!5(FFgk0r1?=S1YTwEB=8nIu@%I#N_P{%yK7M4xOr1}rW_a>%6#KK& z{M}Fk2fN49;elxh{$w=Kx06vb>E5ToyQ9UUW+I7E?b|0ja+>&0<_5lvm$+A*JmDNE zRZGR`bv}Fii0fuZt|kPTy=k@Y-p;Q64!ohsos3sgZ95(GEVI#=@fG*}H*LMotoXA` z_!H9M00}%RwWk+UWat?iV8)e@2|@Qw{1aUKiHZ7Tc9?yC(9Mspqo(#zqY&wo>pJDy zp4Iq%l1y+A^Nh%Ka8z`}C2IPU*?p!y7<)`lKw)`;MRU+m`({(=Iy^j419oqML5+RL zm{%SQ3l}oPTQCwULAKnyN}5fL3*?dUUOW9_9%QNf9&q-IU0ZsTDGF zUYYE#cp7?Drq^;Dy8b7O0xf&)X?iG`1!zir+&Iq?Km`aMf&_vOG#YjyS=Hn^XB*RB zYk^QgQ5FQ{ut`Fg=*IEhGd6&z*@t-j>)*s}cifI>MPshXU@&+xQ#BqdYlrYY;HrwM ztZ!jvA|nS*jL}+0 zTlNxk>e%JQWn5V?91f|f5~C;Nc`^(zEd{hd!>0V&ul_3UeAoZRnVmLs^Q}GkESUv` zvWJ2Dy*>-A1(w$iF~7J#r`vh*lT)WEM=HR1N2}S|vuY1?_Qs5$Wlo) zhT9ATu)gr@HKrNB4Tb~>Jb2;+=bU#OAHqakNonvEuNbMq*z+1Y8M z&3-_^XlNbvyZ4Sf&ne3aA3REFj7_jMp{%M|M0?F76TJNF>$GtfUHh<4#LAwD5w&-r zPu^&mPH_pytY@H~+WA?IG&y|1}(aCe>MQsBunX{P_X* z8R|`@rfzy;`o5UH_ek*3excUkK~2uL_kL!dE#BXFLt&GY!EngJ;v(Jt0I$I*;;U9T z6<@tp`1-iYJT=0x77Gv6&}U<`WcKh^ace+n=x*9W}MB)+ee%Owmi={vw4Qq z)k6%1!~N$NPg*^h>HtG*WD2N*m~PhA-OC{CAwGMyu!k6XnS?#ZO*6qr*M}Jfeqv^; zA7lzdGsS>)Ms9U&jg5^>e2^)dH&LL{1ZsY*s z2dP~@AxyoFw!L#)R3)v21=^imj5QOLF`0vzm3H7mO|4F5R{ZSo2NRzsCdSnHgTx65 zp?0-YMA3r68jGt@(UW_O$As}*F!Mf$%t*JTYI%Oxtmj9i~-I=^RQMPMmlg=Y4bpm8yM3rO;EadXEXlUXD|7(pn1(bb4LVETcI$ z$98*%Bu()l(C+LKM5yXGfOC%Z_0!DFHR*JADawM%Rdl)?Ha0dmapF-1gCU!no3!Rz z42A=YiLT$U2CmGikAsNM0fgTl7mzXW1*H|n7_6}@FE3%N#RnG+r4bQ*7{@^*fJ`lp z(cJ81hQNdgdSsx@k_t>OI-7{uX4v7xAAj7_dc$@_F5i& z{Bgc=^;MiW@hFi=^%O=?2sOH8yb{zjk*5vYX$G{^4|w_}@US|yD=p}o+)X(=(WX&!j!#Qt2s zS#1EOEL(}9J#RF)_PXo%^$+|SfAEnHbL7ZTUijQ+a@{}O!7E?aS3h z75CkHA6LBjEj03+5B%B($aDDRfB*0K%fI{#fBET8b9#M)?VUDPU3C@j`RRW{x7(xH zgo~beF(Sh1+9B3YpN`SK`nhy%vP+!|8i5}tlN8m|C@ingGoFqyiX^e5S&B^(w9)js zJ&K|vP4h^+8N%#Um9s9%K>(T&K}H6dI$;0telkvh%w+DzV{a%}*td_U8qF;Sgq~}r z8J%oU6|+X*K2Dr@uOTFeBsgX9%5cRM|0`d;<{IvM;11R|&+rEy{t&m^aX&xxQ$NLB z51nLpx6SKb`#O#uIm(3>UO<**y!+kn;+9))CIvqJ@lUX`vqQVxVYk~QNi&WfJH~(e zi_i0m|L*_b1Hb;CX)P_&T3X_f6OZCTzypqn1W3oH#rIFM&W50agSvwc@pa7KIXpn)0Ajy^2-MI6;9| zDq8qcmi@TmN<0z*1dS3MBd1ExQC7vL3LcR_kWfp)=rsf#JrZS1ZP02^8dVpGj#bB4 z3PiN-4vNGZg3=5X$V{=@m_&7$(?l!0R;yYWymKI)cCSt0w+O}&QpHetf;NO; z0F6e~goo5e=5yL2N@1MD(5s$A>&!SN5Nj&Ef?yPGYRQ?Jc_Nc|lyVRhO0vj6rmC61 zB0&hDLL`7hrcuU@nc&c&LsY#X)u4#>MtudrAmiF#YB{K5M*(F~cRs!=BSJeBg=Ff% z2DsviD_Gyz!p_fA1dXOer4>cu&{W9wHr?HA&b{frWMM8oE17c7T zbLUAAavvwXn;L>rG@QbONZ@H>a~ibiwNTl(S|<#kA_D*_ICLm$2AGTM)C`Dns{x`B zDuQ@Kffqri2|)`>hgR9z+Q!zBPy`aMQ2mnk|NPH$$xC01QzJ>m*uFt#@Bq_RwfsC@ROo$}*=mPI2_uITTfeBjB|kGk^{r>%+Jqf}>t>IBc!&N>PL`Z7hwa zfBZb66`~a$jgax^$&)M|IYfJVhepyu#hNH2C?psp=(@Nf9_N%W)PbM`SBu^OQ8JkE z{MEL}R59)-2x~*!MuG{Y@FAc?p@TsM0U3hwh#LSxkjRvXMr(z#f>QCBRu8SRzPXN8 z1~7yX@=wKZuhI&o6+!&i2AU@M9u=S_L{~9XNS#*1M-ep+9qNEuNa+s-=((K1uus)8 z?Ai+NgmTa$nX~NJf{v-EWB?(-SZD%EMpP-Oif%fQGg~*Q>;zs?Dkm6=6U3X+qvha+Zh%G zsxp`);X{A?5rV`Zl1(g?cW9&WA!ZT1cNk*{;?Y)d!}Z_fOP~D*C_N1c%vVEx>2*KM zV!KUlz$h3D1|&9tx)LVKGRn%6H5b^*dg)t6~hLLLH(CH%sV{%f*sgy!%5Fb#+pr^8CYQF^7BM;OFoFF(K4U#(YPoXMK_qJHCwn>`_ z1K%faHEQJ%CCQMIet(zFutPSVQJUCp#%UGLr4(L)R{^I3Hc>cVa%g##^^FbY7U$U6 z+G1sOnKRpG@J8c|M5{LV_yDe8vFx%o+@@ioPHQw9lx0j^ixHG}I2W)zPwpEmmpz)| z=;(xi#*tCz2Clh)T{%Qm4cIz!k|Z~Pqjh+ZlWquUP7wlyIJ#+uR|YK(3uIn6X6KmG zp3=IQ3@c(D9>5h*nkAx0J?v)CtRV5x5)_2R`HVbulwqCTFft*cQDRX90tHHZZCK7> zR1?DhBZ3ya4>2TDI!F#^4sn147_m?k97&ph2!(Sv0+kk|p0c1EWP&xCL3f7>F1~=B zqFYf6x>IO`Sd`+GAUaTml3u?E`1x~OdF3_q%OTnv#nWJDN`@w(Gzw=G!ypW;j9ojgh<1jC zXFvNA0PeoyPP9^34-E&EiNv=k2vWO>rVg-{XbOCAwJT|APeH&4N;yPIGzl7ymVg$) z?~OxDphm3XG;V7*ZwhoJ*g{%U-xh3jD^0KE|)V|6LTo?|=4o%Ag54#p^T@ zTZic4Dd-IbNY7CX3tZ*6;%9$`zx%`|0eJm8-^mw0@iD?Ej2)sn&_PIpV4P4?1w~n5 zbIrnhi$g~aGl_2K*rG3{wGc9Heehw7au_9OrN-IH$s#^5pEOP4{n^01V{_{aVWiJQ za7rk2U})mzw6M6)q8JX?Xm4?Pcazh*XV_?;f#BHKSm)8Lb^6-lOthqxGH4Q#q=_{t zE;y=C^6Y0_!q=|9n)8mG!)4EZ9x4RB{Et`hnpeD%P`O$h>T%th)+tJ7Xq}*S$^{oZ zo3DQC)3~AK<^SP7qVq$je1&h_@d)$hT}n}DoHrOW2El5DGJ>)mNrZH9iRSVem%nh4 z4}awIeEPFr;Rj!IIe+-yujD^|@Gtn$S3D2Z9>k!NvY6Ch6GLVb8fk+d!p_bP-ENmF z-tiOMaphGUo?j#{h0p!oAMpBLdOxrH(brMthQdasu>o2o%vWI1R9+CtX=E$xc1zmr zK98Jun8!~&%BfSQx%d7DDbNgYDD6?YL@61s@)%|gdp4PINyo7j_A$ULy9|Z{s>-32 z#+qcD5D)c{PDj6XqhBuNmTS%J2 zH?HOIIp^~IZ~qBwW1j22cqJFT^pzxOPE}Mi(+1)L;yqp}oK$S?Y@-}dG$*# z=fu7D@^9bvIvP6RIfvl9wZjyhA;AlcMuRM~Xl-JZjWM(qTKvSj-@|AA^iO&8&uzQXUW!nU)T-3^2;9sPTcms_JZP6hsD%4KezLOcD}aE3~%E znUt1}+oDd%O2{f9tAxad+Q$wxx+OA(no3|VEVM9I^M=>If#5vvc*{HZ;upWj(&93S zO{3WNf)Bn1PD%t(`hX7(5=GDVv4`i8CftADU0nZ(Kj8(hc`3fB;n*75TD%V=HbFu_ zf{&TL;FwDluY2`T{`8N(#POr6eBdopHAi%VE-DT;!^b@9c3bJh-X z=eO?WHLrOsSKs(m&bi=x9y@i4X0yd`STGnC42vOd=n24ZP%sz_$OnBWI+$G18@5rI z;id2VNgn*nU-8wiTuG%JoO+z#JX#xEcOSm0Xr?)B=P3t62E~x7y-VdP7MpW?_LHCFXMXV) z*xEXSH_^UGP_!R;oC}_J8GrMezl~j6z*s}j3Y8@U>o94|OC(u_)d?cPbDsGe9$&wk z;jrMJZo82eKmVoN@yOkzWEf+|o|@H@Akefd--{HOG4z#u`&_`7H3U-8by7r)g6RaK z_>0ed2CSiU70#6`E-rDwkz@3d2Cw?zSM$NY_ymotHA#imx~j9=i7Pn-OseS)2Rw56 zBrki>OZn<8*Kzqvet^5~y&Kg?aC*NmOVgBQv%&Jx3Wpkjd%yHKo^|Pkgx(MydYEth z#a}T9p1~Zv?)^W*T_64gPNh>iaq5gpqq7DNpWNUy7t!uleDL=_%8{dox$ce!c=*&7 zZ(NPmy$N7Mv3q8dmah=4SzbFtMMGkUINT%L)~f98Q6= zKFVbmUc!2NhrBgUVsaRXD6LQ-{vUy(k(v7a0#Be%#j~FCecXEAU7Xq6h;jc!lja#& zmXW3zT0CW0QWjMNmJAE>dEs!giAr+5{&!#E_}WoYW4Y{KzlnQ3{TWP%@mdKo1w0jT)zxnBRa&!rP_xC@;d*1g}ItBdxAN?ceo^w7%X*%sr464*NjIY2W zF0hG0hMvHnlB-=jPjQiTcucT=1l6 zLg_0Kono}cj5?Vqh1Ldb47q4zV}~1W{Tq&*a}KX~``ci?0S`RDt-t#bo_YKkY&oHO zU}2KrF$`3bT@US@9lmhQy(}~h&$|4F_{%Rnz^OA^T=bmh^7uoKa{lsRIxe8YC~qG_ zt|NC)3uMaj)y7Y7IjTaGH`p1m?Ppdes^BXa?-ghVu2 zG`;l!t%Z47G*B|6sT;JUBWK`j;Q%`k3sNu3I%GIbs0b*J(*~E;p~4cEqA4VT)52ZbCumeP7)xRwztq|&$to9P@!AqF3`@ng+8cOd@c{xBpUv}yuUyCX zU3!>eu!+IdIRJx|l&mZ;D7*{^IJ_wCy!8}WzDRdaV3Kr#hnk85Jy9&kPRvD_k^obS zA5ap;(PU8?Ee2D;ZC}2cQdKD5!uTd@^G66}MPQe88(YfLKmZ?d@PBrJ1gf*o4)!!+h!+S95HoN!1^W z^XsEwOl+F(N=Fhb`BIN{9XL}|99>&u0YzH|-0{t8ke3OWJNI0Kt*h-o%Rla%)ME+mFO z{`hAww!m74QdPa0Q<9L8l{q#jJbk>cV$cYSwM%G|)vI165?~J<&n^MRV?P6oc*9DF zfQ%4otelV(14KK#%hArEsv%2hjwh$rZpRFsPDqRFp*hFKMqa19qpc8VF;I)8J1T8r4Fk;aH zMk|7e*~wB1Ce$FS8u~p@g3+TAu&9%h8oN*c0gXkIh8P(0M$ueqQuc;48ZD{-+BBmy ztXvIF0VS3o2~J`yua_pGJ&Vf=_%h&!A!hr;qsI%G**L&iSl}tSfks9TSCQ!+%l0(d zI3#IfTobeVFo&{LybReaPE%F|NvcTm3^7X-9HW#b-aF8NV%R6oG~!QD6uX$Tg$jlc zh6IHJ4dVRl6yCXT_~kU zY=U!8IKd?;2`SCWP#8_VHpieG&}p|hcFy^9yrN8UcDflK+z}Vu(AfZI0jdbti(;s>_ruY`C%SWmDg7!I8;qalt zCXl27Wh;aMJARG7`kLZHAG;34A}Ux^81T8j{&RMFcO$CDk=1kPb_NUw0}idMQdT8J zQPxE!8S9&UuKe=NeC$(KbLV~cv8tAs-}U_bE8a?Tw`9KAsw0bn_cfTsX!5*4nx>rI z+Mt&U*RS8tSMR@>9u<9E;+1g4dw-ISE+|w-7`Vqc#&pl{k z+1xn8hRJ!;d*4YXoujJ_G*S@AYK-4j)n|TnIYvbLee!OX-u?G+|J7dx7a3p_Y265qd+9OB_RMaVB6* z^h)+Oi)Jj14kGT8Rso_M!44VflA%tZOzD)1WcFfMyBuR0m@FZqS3AQ%_XOpmx3Il? zFNGJhpU3!SjnMTdTnr|Q0x|eOppnl(qVPp@5p}S!%ec`5RS~qSxmkl2oP|M}p)$or z?+nL|uJWvBT*8r~NBP1R{)V}wITQ(7!yzWg7+S^9C`t{^Ku|G1VS|td#nvMy$!*Gy z{qT?SlGgLMb?cv4TUg?*2fxJ)58ldlcZb9-(ol6kto{`hr-j0JhQ?1OEwOBDZS$g^ z{#h<)G{C^tm#;$}88F{k!WBD|TBrzk<1kccsSp%SS)9ru?2SO?J(o0AxcK5{@{hON z!NS5kjy{#~6v+@%4bk4BWzyg~)bQ~deRCjPp8^9AeOVELHw02_vOur1Nx1I}-FC@R z6Uw5C6Tu{!!xx{&c6XjZu}GtJ3_@Px+p-$j8cVraYc2VLeGO^Twz znhdcSonjM>!-QDY9JG%a$-0U*G!h=`Y;yAUEw~-t^!B%K<(2=y0}njFv9)7lM(|o8 ziN+hi8Um17gBGD-6XtBnFZ|T|_%HwUH+bL$m+|1;_wwF%zlWQ@dLyrRr)-T%e$XI_MxYx08E{urkoxQcdRD2-5= zXdpTbDkw}aAQl}Ax$_tTiFlIWdF6{PA#1>q#bwTP+gO?EkEAB`52HdDnQGO#R|1Ue z0XqsMhEV|pqcX7B`Zp0p5Cb8QxQf(!j5tgfvSdAZGo{-v(D^czF4-;$4yz+n_Cgx1 zl&WeGe9Yjv5J8M(P&k3+T#H7sz*6HlXV$mq^mZ}Ub8_btt=0! zk;bqIP6vX9BzTe#c=LPzEw|kGbwmPkXciGxUm9pjMft@q@|kJJHwPv6cB?f$k zu9_&HlX}Hc(c?9*x`^Y);ksLU{O#Xg&FkOzYPNe@*fd2A6ed`#OE4}O*K>{+ZJl=+ zX9h?1z&IE1R3rc@_UMrq0<{t#6j)tg7?1!*Uiy4UH822Qg4Ud8F95s5eYZV|gjgu) zydfA(P=-NO(r<4?7xGyb)=e8?d^FE9&O7%w-Cmz#N6)2OZPxIoKm`9rrZo~`oIf*c zZtd_R@A+}Q{ISn77z}yd^Pb1n);4$Dc_*)V$;&u(^R-m2qTBD0WEthq5pko0+t1sv7`)|iKGV;7hLpKrS$b2$}eJ4H! zp*o=?efBeGZEVur>Oh{;TA0JR0V)^hQ3G5wDne9hw3NY$VxGW@kHhbM=1$hPH^@|| z@fV@a&nR@z7%^xu`=Yqh70Z*~eVpxd@}wDHR(=TJK$U1)ff|4rvT^gDk>(}Jcc}&i zp=x5Y7R#5tkYcz^2y=MxIEg<-*)IxgnsMmxVHO((C_z_aKX$&=Vry%I#f767>!6y{ zD~zhSCzZ|7MQU$u!ifRf8)stSCkiUh)|pL~pZ#pA8?PZr6BZX28R!zNy}2J#1cJ(*bEUAWKTJ z#TFaur@<9C7hz>unL7V&NYV@+gq`jV{q~S&o->ayL>n;H(%xyacIYto+HCy>I<_6~Nza%k-k4{tsevu`qK zfA+}34|Dfjck{f9zmE$pIG?rFA#?@bdh7(}o_8KsU3C>nQ`hNaMF=qp7$jiQ1eY4x z#?#H<`(ODA%6so)XZ;KpUG`Fro;uB)pZGJ5uB_3s8HtqGIyj^h1RIdVqfNAn3gFg9 z;T>#C0W+OKg-L0uOm-Nv(@cqSU3F_JG$k%< z#{x>7G4K|V1~w7eor1a5<1l|dOKVH0d%9R_Fy5ey!H}SoB27{fRdRCUK@658iDlbs zYio!&mR2%`RU79W-Z`A}gy3;b;T(A92rfXg!MSTkxc#PExb22-va-6u$&;s8TRY4f zU;lc-1CMd;dFS$Q=V5xi9wI_jRd^N9#xM*eU%2v1{QCQTmH+4e{SUnAMK9;(ja&JN zx4whBzWn$6&`-XZTOPTac7K!k`PNLfMSwKT80MPYR>JpR@g`VZ+S7Y-SHZSTp$1L=# zzMr%FM)R10YC_j1Pyr)|*yK6*DwKr+^w(0l#W04txN3^2Qf##7F{?ng*kpKOc|4+_O&gIdKhf$3N z&wcS_{K+RiPMHadt4rK}_gyhsNEqKvP%!irN6)(evYgv~=flhog*YZZnuWQ!XlxD&nn{LfSiB4LJ6(!Iv%Io| zb*Cs@g`|^W&Y)o14JmYB?a&Gz{i{F6ma+0U2^N#49Dl}zJhJg9&Q-ByqE3^K@Bm^I z)(Jb`{1%;W-b15^^^BXt0V~U^lpz|fqsUz1A+MmNVW@?^_IMq000F_77#|^6LJ0UE zeEI5Y$rcY|MPtO{8aY{>(~u!mIUJP(?FWIV`tvYpdZA-oz^Eg^EK+1&>j6=Si-`#& zL&({!j-b?lzC=PKwnCHPq=gfYV*$m0{=gHO=hF8LN^%Mxiy_4seAS?=7Gm8TWi4gq zKqqYPY>}oJ4Lyg^IbIYZrwNipbg(s4wxW{@(iGZi0GUvhCBuG)xw$4~zap^-jYD(v zhdp-OfX8+=Sl`}c;pl4Zb0;J&XRUPv*MPFqW!^R-Y`jvqp-`2=aJRr#37OB(rHuuo zb-%q*X|}T#E?XfFimE@PxzJ>HIAr1I5)X$!udeA&LPa}m&>0LU>#}zv0X#HZiB(-v zag;$o45>>e7=pUv zv9>@A^?DtH7^w#nge%^11!s1*Nf+jECZ&=FA!zUwR!-8gw_``G+NEvPzVlmk33Qt4f-A;K-3VhQ(<*-7~dV(TF5?&)Cp2HsbI_GMr1Xb_pjM-Oz;g zfTKkNx78<|%P~n5YN770r|VzOEUSXGqidYn*J+mf@62kBWcW|@|4PYf-M^ZXsu|Z4e~4@OB7CoekGJH5L`tPDl$LB`U1-&6KMk! zo4fqVul*{||Dl)BbDl(Hs8PFJ*_R8LUik+Nflv_>oC#tM(NWJPs4hW8kb`K05k&^* z+DNH@p%GM=M^y`0X)@Q$$*n=$fMYA?aO-W4W9`zok%OSoVG@wCB&d;(>=mL+EWPs3 zSYDvJ>u4^nu-@-r?4(1fRvK-hggJC2^M8z_91{ zZ6wC+wL?jXGO;YGN|p(F2?<$@SnC8Mu^E!7k98UfEo3^ODUfSLo~EQW{?PFqH(f_V zb!jCTCL~ccAhCm2?aG+o&<33M?7G0fSj6T8EwSlDmeDS{R1JmCHCicri1iFcD?}8& z^x!R-$#G6-_j?>VbO@^zrs}ZTC@|$oQZ>YtyAc5EW5Ko*nv9HQsSyXJoTFD-Di#Q4 zF3ygIfrp9pU_@ynq>OCzH?i z^tl!FB&vgF86z?QDkg8dO1b1EKSHT9RLBt$oH1z8WFCy4Fu*_uTDf8So?DULHl=sC z-hgWJF<$=zFT{3ElU74au+avfw#;iIF?tG?!X!M>E4g)NKuJmnilQia?G-;tySGb` zX~=BN0HH31&@nYzl!VHmF>IXL=EOsfFzk29tkBzijGunTYiR0wX{NjMheLE?QP$$n z3`-%y(kf!CN;Q|*D(Cpb-`qh@bMu{+6h2avPLQuRb~R%YvXl~Ut&c2!kTI*)hp z_ki=n!l?YKP6I#HG0OncZMUb~zfl2^($UA%N(d(9_zPb}&$iG$#VbpPihi%pk)>67 z+q;pYGsE)29A$T%c{AXlo3F)+!wz;is^Hb(1Z#-nNSi-wlDbwrqY2-P*ZjbrK9KHzL z@=tg3$ipWt? zJv6MVfu8^syf^AMrORsnUrDTWSEBJ)dUk=GWD#u=1lZVJXJKiPt+GTC%PW8I1*9#w z>V^kN=jSMmrsql;;z@O&5gbcZ!I8m$Bg(VY@1ax6d}2tfVfW#ONs5B9+u`t$HFVWw zq3V+2P#UC+u8q?kZycgr)N(4On~gCf3G@cL96GW_S(F4Z=+t5pizEge0;vpX+8r*w zq=DbLjcTY!8>`GWGn@#H3h@&G4kAq0{n#XFDECN`1OIyNmF0rcv)|LFG`r|EgtXuy6vz?31V_UII`5R%$R6Dlk{ z)1Z?y>q?mlq#*T*7hZZP&$^(=M?Ug7-ujb2PA)@o6&RwCeu)zo5iGvKRt0%Ez!=5F zSG*0DmSJs;JOA*bJm)<>2TJq!-~J7!Pn{q$C5@_!#g9X=g5XRb=-5QcNGv)bcql3o z2^=|mn4n-FRYV|!Sa0Bi2PsjZ3!zV^+hcj@9MTdNpY;;XeCrYN)*|!Eb1;|EIq?vO zjy;od09!XbOppd5X}$U)rohb3?>@rs{p@UF+xvio*l|5}8>xRqB*wm{()*LMibQrm z>iuGiF_hLQ9qI-jPsjj!?{Fdo6dD!kMvN-Vbl(g*prvGG!Sdd>zlcwM{Ode$r{ThL z57SCux!K_4gO3nOhZ!d=WpsaW(v)KB)?0aadk3i;FM8YC`0{W4HggLtF8}GD;@*$` z0V@iOpKXJnG)N+dIJ65SK2DAf!f-IeXv1aCc`jf1#@Fx)hK0xbin1!GssdXTB*EdT z5|S2=JopIbUwS$Be&c#BdG5;@l#Z>O-V=V*w3Oz>GQ#04z+ck8uvqI2&`vi|FO!dAh(+EZsiA@ug zc;-UEd>D|)fSf+kJ005@CV`&oQ@IZF4LJSCW2`P5iamE#Ojfu6K^vU0ls3g1!=Px> z%7o*soNxZl2f1Wno|P0Rwg@dnVGX5DVxd|P@-)RH2C)I#FeGSRcG*ifcjX8RNrO3? z@ut_lfiL~_=ehX!Gf1^%X>oznMp$|Pyu^kRcuS|4kD{n`)^fUHcl4VHGqgF&FPn^P1g&)4 zL-=eX+HFdixNw!JH$CdT9lMRGeeL4U&Z26HpQ5c8NP;H~|6h4$)@xgGAM{^Ut!a;E zynUxuJ9gWcC^!TOgltDxSe6hx7y}U!FT4=mc*sWpJ_30_iFk;D1W_Cmlz_lege4%s zpg2wpibFc>p@-Yu_uez@aqTr!@laK3)mnS)bMEbKKT%ibp0oE}yT*V0=b7uSNZgx{|uWFPG5PzYFFCiM#3eCkXEj@nLBO%zQ;fJcUfOwkWlmJ>=>#Y zo1050avqcrd@4opKpML#y7FSo?y!j^g&d*Sh zW;Bi|^DU~!e6@Ldhf>^s7(Tu0+Z$4KVN6fL>)v$J`)=n6r}g||G_L%iTkVI2!jnpMoWzZGq zolVXpz*c;Efp&*Q|AksV^)v3TemZ*LQpeI@c{)Gbo*|^ivX~YFH1HgnpN!xqKl@W0 z$8dGEqO9TbU;693@y-=n88JRR1Eo+>B9&}>1GKRz6s3Xpe()A24<944n3XPg^wqEO zqksEryng%&`eNB6ShOkN1UEMecDvkW7&$&dE6H#C)^G8%f9=bB?~OP3(igwXH-7J% zWJfcumn#=NFZS<*0H_#`HCNBxVtVfZ`C21oLRA@}C_~q9_A{Sjx7#otPmv-)nAoXS zbr4kJ#jc@a`xu%D&!T^Fy=o$&RW9i;G+(zRWnRi7NVxx+x&l(#5N)CP`#<*=`Hg@1 z+kEk7KgIdu*Z9}J{y!Lv1f^6gqbb#9L8NUa4^?Zl4{tVx>2yN0T5vy^@!j9~CO`cT z{vNDW{P5rW8sic~2}hF&&s>_*B$AvTpYrtSg|(jpc~M|$#rWiifA^n$o4@lnzs7(3 z@4wUTo1u67y)6`)U9n=6R8_bcZX_= z0R~H;?Cs!(ZXNxCY3(|~@fVnysw^?CBH&~+X=wi;|9}_F58!nPCO|lbNGYb-gy+jk zrV2jwQ=j8U7qF@gqvJEA-lBvgiAE#>Ds2y5Yi(1P3el92lLpxC$ZGiRzyA;9#g0eg zxi^j5gi3LYiXw!7q9}<}gqAipj*Ju+mkU1e_>-9En*Z|c{|0Hizj=W_LtiW_svT>+ zg7N|>4aW~Yg}i?b?~i%<-EVO`oj3jt#(D1|B!bdKP7ZH$v)kQ2K78wIk{si>+vUt= zbCggNtF6UH4okNlR4uNcs|X5p$fm~!I8%ZWF8{3cg4IS-lm%z!=ls&wzk?{&yuDm< zQ$-vdox?_upb&Dx2v{PJ!k`31LZXzHIwVR6QmL3^N34nhna$A%ipZcPloFD0hEmFg zbZv8#iijfRd;|<<_wRAFx}nrH!f4_&ZptDFpx%`Y_A)Mer&1A0gG4b(kBI6ewO+HU za#ojDY~SBdjpa0ShvyDa*HtQ{;EaU!z z`z+pnj&ZpZ8fh9?I%hUNVZC^dqsTfm zR9X_7EoD{O=vk-l-l~Y}WWV3TrV)Aq)E6?OBfxWu=rrb)?8AS z6-k_;P>ju(%9I#w%f37~x#y~wRn01dfvu_9-2K`~*)m}#k64SxoF07m8A?>RMG6OpIn+7mTWsr0yCse04F;RvBTa zr6yMii};ugF_DU__l(X#RL)T~tmx%8vn@5_GjB#Jrl=~=1(De@mOI9JL2PyoNUVQ^ z|BiIgOSqyF6;rnQj8dl5vIJqAGmEP=7%*V|w=vkVG^N$;kH!=GKKrc05VkPJWmxO+ z?m`HZ5F}EOL@{Y>_vY;%{D^<{PyabT`O|;FqI(tX0qbyn0D+?wp3BgV(UFZ(C^8jE zeuJng)UKeYDp#n$AY_}CTr@$6G?qTFX+m-&JEgczMt93cZVp-~Y7`Qi)k_*kbYfGX z%L3!HlzVjvozsg~lbO195i|*vNZF#$`jO3q=4otgh7YHy`su8sP4S{``FGEp32d71 zY?QHBEU2oAQ8q&Q?B0Dd@c_$Uf)D#vV}TWqC(|*es>wGty^f!|)F72r?sWlbFh77D zB`ib~j%3ro2_hAfZ*p6Ht*p^iZ6yS`Zw+gcHfSe{w=PRB-9kghUQPHRrHN<`rh{%> z!3kW%tf!4Z@azjTpD#_cMV=hMd-b{W$zF|dWo25F++2r1nKNV~@^kWKmqm~<%>#=B z>awCPDw}1!sylsnJwU(jC`E$HmF zP3|_owT8VKv90U62ybIhu&Fs+`+e`WB?jc`7oLn)f~QCUTl zWsJvT)|(AVDz=*q)A1CkAR5_jWDh`abgQKY`%5z~yzy3bt5FCYQM&>PLbp{#ntvu3 zKNx;j6dWI)uvxDutBNei8bDD}5h+Do)#OD^QS6vHW~wKC;|y*#MVmhaBRH8Kvt4hH zNH$xW=B+GicDo&ArdYJ)0p1oN=>Py0#z{m$R9%uKDW)_eM4Ziz8@?nQ!=^WI+PvC2 zduXTq^#1-Ly#8494zdyXYOSe@!q#eZjPQ_pVlOht-+M0vp4~g=>D3jLu9;6J$Vl?= z;X|Ih^MvE06V|I$P@K?;cOd`>gVXed0MIV@R-MTp0Myp^kl3PbX+^n6TFhglz+h9@ z=vrfHSM|gJ!{hr8xw&5O%Go*3pFL+3rETxppsO0KE2Na9X=-^4d3!$Xkmx*r`jmUe z=d2b>9-h5ISyfPJ>quJJTm<1>__B6QN6o>s)z+vR!w093xM57rw`tFpFj86&+_d3r_@!= z58wTMbDP>yxWdLDM9ST)?p(V!RR=U(5F`21_n-6X!^b>%`yI-%q^v56-Hx)VNYXUG zCN1F)8D{%Ok5_l8d2I<859salQpo_Dm_`q=+vZ5ASS*&LX)%~0Kz#4X()ePG+D%9~ zCMAgz{^X56r51uH&4|(jAtcMi5-B9HiX5$zjuC0O;Fbg!y36dNY_Vf}`n?{oB~`6seMY>-T<_o9k=F;|bSSSAi-=@K?U@1>!6t zO*32RLs-w-kZWnV|8|X@shduwL`as`3nY@$^V1dp%8DdQdg}>#4hlVbv%I7=&l|@` z8est-+)-Pj*)-=T9Jd!o5m#3?*1KrEB~8Qe-7bCa$;$kmEx|)RBRORG8Z4%BiZF$#iNXT)fC=Kt(F><+uI@MznXL zu3Po7G1`@SO;M4Hhc^aO*XX*o7CvLpb&aVtr>AEuZ*EAlj8|Vd;}?GZAM)0lZxA^L z3-3H?3t~vt8h-g#eg$pd_~gXq_zCm~!X;`_Dh5HDhbXdsh)I&L+Z8qrq1d?#V%G&& zIXtY->>XmH|692IaW#kBvtT`ng}Y<4_&@Q{D;i@!)5Ck+7Ls)v_lMPAw)Erdix z5i*J_umhE@Y?0==Vmg^L44qdkNT(wa2DY0ON=V{3vH>8Yl)9=Yik)@7l{R+L7N2sF z$T|=iWt$)DlL~IuIaOWrNJUY^YQ5t6>WbB7$#S`3xwzrt;yFvF zP+2Wk+}vETTrSzJH&kUwQP`3#bybt42}ztF(cD}O3GMbFJ_sRptlQCy!XSRB{D@E^} zHN9z8JM30gWs}P%iWNx`qm(W3R@XH`N~DOwk*tZkD(ndT%y0O*?Q_iYp%DL^z6 zY`Ysz;OWJd)6)^puXY?Coluq)n{`eUDU#G~kTwP-A=0Ijk*wBYd9~tZal^BxPg&gD zaCu?Nsa#)Ov0ksZcz(fpy=1kxVY^@4qADwHmN%3|;WofnrJ{gWwI)syG=?Ni(8jP_T0k=H`Le76XI7g4V?Lj8etyn;Hs${P`<$E{@!-LI zj*gFb<^Fw+j*mG%J3|P?&S=X7i`G3Xl;FFbLA@e^2RLnq0lJ!{=2rKZjiRbptyWxJ z-;i&&s5ovg!X%CP+E>0rmc?Y_5eAsg=QeUzDFiXKj;L$vl?!lrdFf1+j)hQy@pR0| z$qCchgyW+VX7d>*C#TG&GbWP>Cnu+zo}K|PolHnlTlQTl#dtJsoJ}H!I<*5Dt48Rl z(0bNyuWQ#vGa6->ei;_0SJ2L^{ruv&%`Z^fa;|T^{Wi7VzMcpW*9Y|8=&T zEm0gbixGPYx9&|JdOcV*tf{~)8aQfNnnW<2f)QLf_iAfZv(>3Znjs@atp)jR$3OXn zf5dn^VSY4cJeu?BtDmB-MI&KpGk;AiVh|a3=}@Ac~=`VOP|wRx7soj;GI_QfZjZkC~2V zwv3E6)ZXl z)z-!FN+@px2}3vhZEwG=FgkKUFq&+XSpaa)h^E4bz5PZTo3Frm+8X0?C_Bl&5+D=&(Ye48^KXC2A8uYzwp zhI$x4sg@UrM5B%st(!rsk-+nnLPAwpV^0z*rqd}=9I@O?Sg*HeZ77T&-_?|LObv)bfHVMzwk))X|lwyIEV6ENUhslDFDxU^^5 z7?NZRLf8fRcqtFsCIkeUN*hfx5~FPGf~?CU>~*9$*O5187G^L?t&Tz6bwLsX4pg_bL)`2C z->r9E;j2JHDEw=G_+pp{L@wKtub#6Hg|z-?o|1Tbw{eagO2BwL=4fuY(runY-MV5E zAkPq@yNej4P`ADu-jspQUIK3VA=*FAc0g*orS-8@->OEy<{lU`d|rr_2@Daw?<%Ba zDnNOjNAUl9R5hB6h?AHPo<2uwsI_r6^EQ;!GaLu9m)kzQ3D&gZhdS=y1N+Lf6*6!p zqxLz|@GuQ64r>OQuIqHWH+Pm*e&OcF3w8AEDtrJrZTRMy zX8W3N1T@v@wL1tNX5)mqu6Xs;$BmIg$WT8W*=ojDh{^2nceZ+-OWeK_+Xch z^Y9O~L)^_r>aUj-rjIbXoP+)S(z$|L2C;i%jDT%k^YFo(_ugA_|NbjnU0$;*3ToN_ zkX!o}p*O8)F+s=3A-d1s()v!2-S4@GXW>YjG*nY|5>-oG>%v-D$dSk#7WF-HX%(C zr^x9WBDxwj_Si!+@N?JacVUO{vmlp#AbU0Bh`;)3pz+6P|_gVyBx%g+*NV1@n-76lpo43%vya7 zj~*RUR+WqD4La#F8G{2IsAhWbJGZr$d%h#}_I_UY*583mU#i`KhOkeg160Ctf?{hd;Wsj*@$^P_ADQsCpZ&xeaL0-O&e< zBM1EqzU~Gsd{}YMSKK%>K3*IXUCvuNhFCNhz&$BM7dV>v-7$~Asz--6vEK^o}a^Rk`CAubNBEUfwT(Ze}aX|;xN9J$-?#|pmJ``sUJ zP-=J?`hVAk9$4ev=O5&~#3~)BQ9Oh`Qtx zk53V`t%)6tQh_lEdA>j?8Emf!)CB#F>psU?B#q%uW3%fENHd8x3Hfe^(Y1B`*<0iRhNl07gNTrEvVV95 zkQGQGCCJ8E12FlnpwhJ!1&1hZ$C5R?X)oGdgyypcf?)?QaQL0u@#AWu`Q^DUzjs-d zQfybm0?y9nWNCzr4Kgmq3I_nLgDg`B67pScZTdn5UOOLVQb7iUCXs^A(PtltlwdR( zH9W^Q&n*zhejUtKb0~V=%7dD^JGkZUb9d|FoAos9@P@Rm=3S0?Pd_1FZeROyemfH{ zHQ7=;(#iNjS40xVX~b+iB5s~H&G#bjlq=kXL>3`T%C^YS=njOnhk09TTw>h!OzTh( z(8aJ93j|s7+56B0&`RgK$_&34Cw2lt4d$E-GM8}zAEgEhKNW@h02-7$?9nPx!t z1g&(_$<%dM-<}T&UViizf>|qM8z=VJ1GW{%kH#ZrV?`pZ+g>{l)A0b`vjs?ZqoN2B z5o3fc!{)P8gx)|Orz|6Y<+9>vnsRZq=J@ys0j$;*2yiB4iL)1ka}Kabr_TeJpnWa( z-WR>>UL8Z%U4nbiZKF{uJ|uot`bsQ-cQ zTw)ak!XzjSyRxDo;!G$xu5xoZ0%lnal`8Z=dN{Ge&;fI|zeBXMzZPpkn zSp5UW*y0<7hGkx|(^VU8CA(00czL}o-phC>Tm~%r+eaozDJaT{&1TJdYeTZNF^-mc zt6?z8Ui7Q?zn9MQN4N7fJ&&7PFvbuMAO@s_As(ZPaeBMb<1w1|JD8?D{MJTd8cx41 z3r1OtG@7I7h*6plM~Wm098esu5_10@2nJ#UgTIZ1BBQKYpw42*p)_Ta1E?hn`&z*L z9s|PI=LK4d*1RJG#7V@6aT7CKR+V$%8klcy+&!A?7j+Ak=(jrspO0TTd217aY8PE| zdNg6XT5|9Fgh&aJND@U3!Hd>mx3#mjJnAA(!Y+0M;-ujd=MmssbB8xJPk55qs(pYwuBnC1+52?GN@L2l$B6{x`w|P-2Nuv=( zQBjo@MO9K6gBGIo+UXr|f9HDC5h-Y@TnwpN1dzqCE$`xjQ>v_`FqOEL5%|F={SWf7$kB$Z@W*VLw_4kZOKgb4`lxfqyIdu94^ zz7&weF<>!4zAJ6kjfS$dQf`QGJ{sa4p5D;R_jryVhR*~K^);OP8V>tzHcIUU%Xd_} zf;3i)Q^kCgk|}I-u@Aw*p0+UzqWZo0xjF9f0E4SN@VO9>MgpQ3QA>7Zo7HQ$c`7EF z;tIos&q7wE%P>k|d4d)+Od}nrxXaV-SKs>aHqk>FO??t?{%ev$_BDib6HUACy?|5b9h)faGl^7;goL8Bl|hVdbN4#+utwRc zU;bV+7-D}6LF-A>`Wcvp45djNgil)_5O;=7yu{Y@Z3QpMGjvF6M@kyLW)kD_Ui#Z? z*eq_yvW(em%s8De%>