From 82a1fc4a1cac98b13fe0f23d8382182018b9379c Mon Sep 17 00:00:00 2001 From: mediaminister Date: Wed, 15 Oct 2025 22:18:19 +0200 Subject: [PATCH] Play rebranding --- Makefile | 2 +- README.md | 24 ++--- addon.xml | 19 ++-- resources/fanart.png | Bin 28611 -> 34918 bytes resources/icon.png | Bin 21808 -> 17867 bytes resources/lib/addon.py | 7 -- resources/lib/goplay/__init__.py | 94 ------------------ resources/lib/modules/catalog.py | 4 +- resources/lib/modules/channels.py | 10 +- resources/lib/modules/iptvmanager.py | 43 ++++---- resources/lib/modules/menu.py | 4 +- resources/lib/modules/player.py | 28 +----- resources/lib/modules/search.py | 4 +- resources/lib/modules/tvguide.py | 6 +- resources/lib/play/__init__.py | 27 +++++ resources/lib/{goplay => play}/auth.py | 8 +- .../lib/{goplay => play}/aws/__init__.py | 0 .../{goplay => play}/aws/cognito_identity.py | 0 .../lib/{goplay => play}/aws/cognito_idp.py | 0 .../lib/{goplay => play}/aws/cognito_sync.py | 0 resources/lib/{goplay => play}/content.py | 50 ++++------ resources/lib/{goplay => play}/epg.py | 92 +++++++---------- resources/lib/service.py | 8 +- resources/logos/goplay-background.png | Bin 28611 -> 0 bytes resources/logos/goplay.png | Bin 27278 -> 0 bytes resources/logos/play4-background.png | Bin 41662 -> 0 bytes resources/logos/play4.png | Bin 10973 -> 0 bytes resources/logos/play5-background.png | Bin 33337 -> 0 bytes resources/logos/play5.png | Bin 8441 -> 0 bytes resources/logos/play6-background.png | Bin 48738 -> 0 bytes resources/logos/play6.png | Bin 13249 -> 0 bytes resources/logos/play7-background.png | Bin 39615 -> 0 bytes resources/logos/play7.png | Bin 9894 -> 0 bytes resources/screenshot01.jpg | Bin 102494 -> 106073 bytes resources/screenshot02.jpg | Bin 179949 -> 173562 bytes resources/screenshot03.jpg | Bin 174676 -> 169458 bytes resources/settings.xml | 8 +- tests/run.py | 4 +- tests/test_api.py | 6 +- tests/test_auth.py | 2 +- tests/test_routing.py | 2 +- 41 files changed, 158 insertions(+), 294 deletions(-) delete mode 100644 resources/lib/goplay/__init__.py create mode 100644 resources/lib/play/__init__.py rename resources/lib/{goplay => play}/auth.py (94%) rename resources/lib/{goplay => play}/aws/__init__.py (100%) rename resources/lib/{goplay => play}/aws/cognito_identity.py (100%) rename resources/lib/{goplay => play}/aws/cognito_idp.py (100%) rename resources/lib/{goplay => play}/aws/cognito_sync.py (100%) rename resources/lib/{goplay => play}/content.py (94%) rename resources/lib/{goplay => play}/epg.py (67%) delete mode 100644 resources/logos/goplay-background.png delete mode 100644 resources/logos/goplay.png delete mode 100644 resources/logos/play4-background.png delete mode 100644 resources/logos/play4.png delete mode 100644 resources/logos/play5-background.png delete mode 100644 resources/logos/play5.png delete mode 100644 resources/logos/play6-background.png delete mode 100644 resources/logos/play6.png delete mode 100644 resources/logos/play7-background.png delete mode 100644 resources/logos/play7.png diff --git a/Makefile b/Makefile index 2c633eb..bc08382 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ check-translations: check-addon: build @printf ">>> Running addon checks\n" $(eval TMPDIR := $(shell mktemp -d)) - @unzip dist/plugin.video.goplay-*.zip -d ${TMPDIR} + @unzip dist/plugin.video.play-*.zip -d ${TMPDIR} cd ${TMPDIR} && kodi-addon-checker --branch=matrix @rm -rf ${TMPDIR} diff --git a/README.md b/README.md index 0f78b12..1834cc6 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -[![GitHub release](https://img.shields.io/github/v/release/add-ons/plugin.video.goplay?display_name=tag)](https://github.com/add-ons/plugin.video.goplay/releases) -[![Build Status](https://img.shields.io/github/actions/workflow/status/add-ons/plugin.video.goplay/ci.yml?branch=master)](https://github.com/add-ons/plugin.video.goplay/actions?query=branch%3Amaster) -[![Codecov status](https://img.shields.io/codecov/c/github/add-ons/plugin.video.goplay/master)](https://codecov.io/gh/add-ons/plugin.video.goplay/branch/master) +[![GitHub release](https://img.shields.io/github/v/release/add-ons/plugin.video.play?display_name=tag)](https://github.com/add-ons/plugin.video.play/releases) +[![Build Status](https://img.shields.io/github/actions/workflow/status/add-ons/plugin.video.play/ci.yml?branch=master)](https://github.com/add-ons/plugin.video.play/actions?query=branch%3Amaster) +[![Codecov status](https://img.shields.io/codecov/c/github/add-ons/plugin.video.play/master)](https://codecov.io/gh/add-ons/plugin.video.play/branch/master) [![License: GPLv3](https://img.shields.io/badge/License-GPLv3-yellow.svg)](https://opensource.org/licenses/GPL-3.0) -[![Contributors](https://img.shields.io/github/contributors/add-ons/plugin.video.goplay.svg)](https://github.com/add-ons/plugin.video.goplay/graphs/contributors) +[![Contributors](https://img.shields.io/github/contributors/add-ons/plugin.video.play.svg)](https://github.com/add-ons/plugin.video.play/graphs/contributors) -# GoPlay Kodi add-on +# Play Kodi add-on -*plugin.video.goplay* is een Kodi add-on om de video-on-demand content van [GoPlay](https://www.goplay.be/) te bekijken. Hiervoor dien je eerst een -account op [goplay.be](https://www.goplay.be/) aan te maken. +*plugin.video.play* is een Kodi add-on om de video-on-demand content van [Play](https://www.play.tv/) te bekijken. Hiervoor dien je eerst een +account op [play.tv](https://www.play.tv/) aan te maken. ## Features De volgende features worden ondersteund: -* Bekijk on-demand content van Play4, Play5, Play6, Play7 en Play Crime +* Bekijk on-demand content van Play, Play Fictie, Play Actie, Play Reality en Play Crime * Doorzoeken van alle programma's ## Screenshots @@ -26,9 +26,5 @@ De volgende features worden ondersteund: ## Changelog -## [v0.5.1](https://github.com/add-ons/plugin.video.goplay/tree/v0.5.1) (2024-10-21) -- Fix caching (@mediaminister) -- Add support for external Widevine device (@mediaminister) - -## [v0.5.0](https://github.com/add-ons/plugin.video.goplay/tree/v0.5.0) (2024-09-11) -- Update to new GoPlay API (@mediaminister) +## [v0.6.0](https://github.com/add-ons/plugin.video.play/tree/v0.6.0) (2025-10-15) +- Play rebranding (@mediaminister) diff --git a/addon.xml b/addon.xml index 162d5b6..d82643e 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + @@ -13,23 +13,20 @@ - Bekijk programma's van GoPlay. - Deze add-on geeft toegang tot de programma's die aangeboden worden op Goplay. + Bekijk programma's van Play. + Deze add-on geeft toegang tot de programma's die aangeboden worden op Play. Deze add-on wordt niet ondersteund door Play Media, en wordt aangeboden 'as is', zonder enige garantie. De logo's zijn eigendom van Play Media. - Watch content from GoPlay. - This add-on gives access to video-on-demand content available on GoPlay. + Watch content from Play. + This add-on gives access to video-on-demand content available on Play. This add-on is not officially commissioned/supported by Play Media and is provided 'as is' without any warranty of any kind. The logos are property of Play Media. all GPL-3.0-only -v0.5.1 (2024-10-21) -- Fix caching -- Add support for external Widevine device +v0.6.0 (2025-10-15) +- Play rebranding -v0.5.0 (2024-09-11) -- Update to new GoPlay API - https://github.com/add-ons/plugin.video.goplay + https://github.com/add-ons/plugin.video.play resources/icon.png resources/fanart.png diff --git a/resources/fanart.png b/resources/fanart.png index 560bbd8334345fcdf4289b081e89f21cd4fb45f6..67f280c2ce05251294991412245467eb08228d25 100644 GIT binary patch literal 34918 zcmeFYcT`i`_CLA-6%_rTy04c<(*;z26vbe8+gd_x?E<_a2h9*P3h2&+Kb$A8TtWA3AvIAOt~& zRIXmpfgoBE1nm*uzYmOzwR}c-*VXpbk@;5eL#4mb{+I{^06KCk@<0`upVscEqJuOU}Bbk%BgR*t68cLQm!^Z-efmQXDrw2dmx%CjOUv=r} zDZWz44}P1mE!19A7qI$n{e4rF5JYvKprD|wqM-0EaexqU-p^&OevxOXG%--*X*)a3 z@$1=3$u31j7VG0rw9m92%#@5W{JmG>ROm4#%j!^HS#_TjdElK;+ms6Q7JoAOy3V%|y?}DPJx7%GC@_ady=i)Eb}C_L zl1;X}zmgcSS|nFZ(m|gbJo@OUx)|TDL%*Um)F`D|EI6FX8CmWG^w_AgK0}6% zolTfzB~gqP%lQ+kMtp99yr(bD3*S}0CQ`dfF}x{mfA?mFOM5xDuj%WgOg^Xh(F;1a zzW#M(|Fdh#dvDx&)bjSZ*;$1R6~>)MLrgX2!!oFqg7>y2U3T0Y^qng)$Q2hE=L!gw zpM7fU8%X6{BA;Q}GfJPJ2O3incnt+48|Sf zPcK%e0<&``0Q0(~p)P4|Z!2JGVQ+>LaJO{;b_YSya_$bM=GHi84l|r3!A|DvY)Qpg z4uXZuSv?UAw1$HM?hfIqha*ncL-V@1hqbwc#aTJogVOGjfPgK|*_6ZG*2d0B(p}~( zLRS)ehlf#TIglyN)-q>rX=rmO*gN7lgaw2J(EN(-1XrQ6vIjY&9WC&ZI#-nbkO04A z&fal$c92A&+}zv*+%N+6j+Q7v2?+@lS_ma1#1CfhI}z=iP2KtJoH$_;yELxgoXi~w z4$cI7I}VtpshPctv&`AE;5o;?__KA;(D*lbJEuP=06b9crVc1U0W`|i7WMZPPR@$1 zfXE+){EN8~T^!AEimo_2XU@NqurUAkdIuLr8$=una}>@7XA7n}fn5dv zYfEJn4efugfFZCX*g7Dq0NDRE)0u$(4_N=j8~g+j=kJVw<^QJpU$g%uJ2Dx}($J8+ zVsGvOv!`-J<}AFwq=mgX!9sHPD_RJHK?{rXi;0Pt@(ZIaO!>vlg+%#r5*89>cymE< zaUqMpky5d9ayGRy$HAlkaRCCLgAo_P;PGbW{9;08X8ghyW;lK`L2*HTQ89B-5pywd z2~(We-$-aV5`a~j+Weg>n3M$|B_WO$6%!T}<`)&mi}DMLVDS8AcwuvX2_a!qGchqC z91dfSkg_nBRI+!pH3jM<*qU16P!4vM$O9N~$xGTQGG~PZ(El0HwlQ_ag9S2Y)d_Yk z?*DmkonVX8bvA|36ciIhi-?E{3W{PxG2#+p|Cw|X=ja415vD1K7Ql!iPhho30$~8K zrm&p?0?0U!MN+{LXXNc5(m8U-;XtbJ6V`In_e+>#sQ*eArVPIw4|WO zbs<4X@IMh@UbK)T`fu~?EeLqx|I=*Pc{rqZReqJ=1okH)L%SZOi@Uq~Yxk!O0dXY` z4#X)WP0e>ja58np?dluQ+I?hx$JEXe2cpLxbN$yi;eTTa7I-wy6m2RDOu-xntVz_A zUqaXd$1f;^LF3JY%rST~Jc7c%sXN)@o!v|wahEIsjsPoQo(NVP7Z649{P%3PJ2+Si z05E<*H2;496a51i>W{!EIA;7yVrkU>4HIc(!ry`nShqU{f)|K|sDB5;KbQf2|4)AY z=;Ht6791S^Z1O+C_aC_af$M*S!2f9SKi2gRT>m2k{zsGlv9ABu;5zu9b_!<)svtMe zEHU_eGXRa&J~K7tE6@&f0g}sQSBd~52OO^IJAv-31O7kN18RZbf0jXTMbltsss*msyN4V5KPwCs}eOYB-babyqa&yCBG}-L%J!eRfNv%fc z$%6~~_u;5={^EH2YR_YJuCIJ#D(%M#4je}+sXP^rT&eVHCq22KD*5f;N>0giR?+YF zveme<#WR^1)6IP%eUhFPl+}&v>?MhBi(OXN2Uhz=CNi>TXaHZ}Lmm_1+WiK-_J`wp{o2JJd(`FsHjDl0^8n*a++uYW}Y(`$| zpCr@lD&_q4B8}5UE!1swZQ99+FhJ1t z6hrUjwz88DNpX4j$7pQrZMK0dd|UNT^7)TG$}FU!*D>DCR>CRzui%=g;H+BX-U)ND^V^kL9K)xQBB>FdrF&qJ1D z*8_Yw)8mhE)#MQt(`sI_2plzcsPS@l^)&8eb-5t}L4nUe-sB6kznHOJ5Jr>bweRiw zXxYSR(Z!0KXt^oTh1{-hkNb!EUJ-Sohdp}~iax(+vhkN2YhQH9?V$(xn3EIaV!EHa zb&lnpju&`;p|sxwEv>5;L~AWsE^hnCuusMJWc2x~h9%lCP#lJaQ9Ts@zVXsKuDyo= z`)2|B+GW;1hSRwoI+5F=$kavrEnbfK&j;!~d|pXSp6WQbW#)+vxpVW-r~HYqQgc^f z`x!eikn;oKe1CnmuVGudypOOSYZ|W^spWclJ>Ew~u0PY$&0(*x!OE~in23Udes6-n zK%tA1Y(%sm1Y!4p+9Jscbs=LtxaJa*98K>}^7D> zx4OERwL0AD>m1Iei@XmYh;(G`>wf6^WGYTM>!R8NsPHtcP)%f>=R$JW#%S@1w(&LB zs?)fK(;o=>5%Yz+nqv66>eH+@N8l-l1RvtkDjz60As ze7XfsiB~Mmdt0_!5sNW3FE@V-V-v<%KSefp+cwBcr>vRo0fGu822w+9#9KpKkD$me zU+S#-rHiz{{ZZ4=U)Hm(#X{#jpD4RO`1#E38Vy8FB6{qB-a75Lqgcr!Ua!5pN-%Pg z5}^h8*804a7kUN-`-^HxhCheS0m7TPl92oj!yS5u^~~^4OHt1Szm=;%O{a$cI@-(J zI^f2=4M1y_z67?{cl}L|wadC-3#-P&hH><+Q4$sDcloDr z?+XXe_P~%AIj6lB((oZq*HM0teY=@|tlr+1riRGxD=fv}`nJb3HC#HwsBVM%;UfJ> zxHJ}^gDYf`?J_ARu0WuV+n%seO9tcb8;~kFzwg}nos_=V9YKk>bc-4e_=yJcL?D(n zVx-h|T-#XR^)y^D=lj7$G8vZ_!-a~Qs`IsH9DY;{?h~QH6lnsOfMyD@bseT~JzP9q z`Jx$&JG?>4@A?Ms+H(UKi8wvcl0cZrND@NGkUxDmVEXv_2fXji26&uF5vUr%9?r6L z8!elDDg8D1A{aG9Yqfzt^i>KmFG{T)#Z7d$s=#j&9cZgN7FZLlOYm@8 zAx?{Q68@|8crBmzeU|&dSRoTKmOQtFciXo13^)VE2H6nt0;`xrO0HnxNxKV^&r$=% z$bCR}z#igJR<0wg4Kc_H0R&m4akU;9qFQbT2x5=}_b%n-dRKenmMKwSoKWv2gsqRj zn?G8wNA8Lszq>X|qeiWpccG~^2ZST&mizANg1At7ppVBmGgyKXF)+aL$AR|(+@EFW zz`~M0{{=Jjy2?8@eAb@v6!0xlz%VmWa0bh7^MEv?_jukTN94zX4ZPieFyH#8T z4@?WrUH}(~TU2p!d(pQ@Y}3@E7hxZa-A z1KUGj0!#@~DKG7sHX{FR0N{e+mx5zE`86V*!$VLVoC3c|*AScr8T2AjOJD1Yz|bWl zppfIeG=`3$!SA6zzop;vQ6_hJWt_SdtGcvTs z!dN%ZEV&m(OFWSPZ&|YT8LynBE{N=f;6bLm=hQI1wJYj1#9{{Rr1Ow3%uKsmRc*zl zdfDplu0r~7vdmh#CKbRO$>zZH{gp*BB!11G1baN6+d~JKSjCEHB$&7&%D9HO@u0C` z&%0g8|NNFN)UPrBflT?d3x@GW9-`~eDOjlwv>;%xB&WGC{KF&QH?uUtP2(p@WU4e@ zC5$>fVpb3(Nu#Etc;6{7+i#Z)i%eD_^4s*!Z=;rX!_NSB5Hot0%6C=O1l?V!KOr7A zC@uZLND!DI$QBRVRQeqi#D}%mOCS?>@SEFllQt`9oqBv--U1aEZs_J zk!}7gd6zQG`&5?<7STUN43BAyt_+#s_h*KYQA8kkOin_q*TF9s`AZ+TJNu3aVe$Pj z1uy}<>-vWGxg(Er{{8nu(K^Ju(7WcfpYhQu>_2E0BvcsQ-w-+aU-K2BE!=j!V-JFs zz~^)4wcHK~1DZ6uHlyfak!u56-aaHylAb#6{Mr>1$q8gd$*6YN=jre5GD)a_|B~f* zC3xQc1o?@ETMej(GU^jEFw;oCQem$gBYa+8qsB32ibtdUhlN`=_#2_K$@N*H(bm{{%G*;p(T zU4J{(P_UZ2=~I!w9vfe~9Nk3=V!dn;aJ`xK<>-;$b}}^{+bh_imfCYBH(f{BBSxg( zzq6=3z;iX!FkU5;UjZ`2d#c5zNA?k|a(OG-`VwYmf+-kpdu9l03WpCeaa~)k;o*Em-Is zw*<+E z-v}zTnY4FQlM~t3c3UN^?-w-_3_^ti0-8$%R;`0|u$NAR-SE+U1gbu%C z%ca^k*^Sprh*H@>5nhX)M6>AW#eRci4|m@Z5(k-DrQpn?&_sMi2*r9qBEi>)z60sTXq7ji>He zO~D(u>xrrn1KsjzpyP`c0Pp%XYs>1KpBL|3{E&W(6QVa%S*UDy3&cPYDcR7QFL(2{ zTleAXrd{Tu%|OjL^q3oHDVhPoSxw& zPjP&@QijAuq=F`MWL|;rUYZ`Xa02-w!pB}uLsPF{OFSHVM{Bt+ z0x>xFrJ(x#@pBAVcx)FCg8h8q=e6G5nCvuq^f=i2*$U2Vj}oQH6K0jPj+nFloP;~jFC z%gP)2jWKYALR=KToy`<7y! zf#f^hRU5E?yMs|Bl*ku`x^dgM((R7}!v7)Sly_6rxYgKnzmhetx9l(i-#+9|3ieBZo33%{80RkwE{)!PMx_EMg9WzH; ziPeh+f+u7woG{5aF_neUnr#-xWz6xlWMKW^5j|4x8oJ808b5y+c>_53>G4Hg#2A?w zU|9;^`6LBbm6NID3d(y1MoJVgI!qa7eqHyS@(E}hwByZ`N7|H(vHRAyuiA0ykW z%?hO(pDy^imfa2U;xE5o$*=}8Il{z&VeKs2N|Om8jl|XE(+>betacpCeSU*et*WtL zSE4r|=#qD##uQK^Nw zoY05Dy!uDH^|38W>nCAANPdW$R8R=GP-Q$1qfNvj5yz95I5Nc(WID*;+hsr6;*IpD z`&57=B-_@AP~}F6gskQBB|14eF;gmGT;2>XR94b!juUckg5R;csx^K&!>X2rOze}5 zNC}M;t=Q8th3|&T!ZuD)U;KWaXzx~X28h7Sw^|6aLzegrp9kXch}3E@W+bPj=Uv4} zF)a*p3N?Nb_V&qf+k$(aFG$cLORPP$;}lE5z`?@*Uqj0?fqyH(XDZ+LM6i!H{a4{` zIFLU#97cA{U@TdEHCs5OqRt<|HFMn_hu{$7dAr+$qqiMgMRz_(nZpM4r+q)HxstoNF%ty?y4&Q-FBhMi zjbd#|Ecy+1gSCi|*Jo*Rb%~Z0cF0l$9qqiG7W>hj;xNQO&L9$8pHwd{wQ?0sZ-I}l zNCAk6Xr}_%@zo2@eXQVUbOMQC@-KW$U4`U&iL)@?PZ5PDNwUv2dLRRIuwy|<7sXa$ z*CV>F!J@u@hT!)0?yJO+p0olGYO25}_RKDSKW&P=I;PqU6XD}x=+-Snqsd}wiL>!+ zbsNa>J@mdAp`ethwU9ObxHQ)UK9h#%kTwqVi6IolM zh4L`1dLd%l)f`MAOCUbRoYK=WlG&2H{(bu$ymF8Q!G*ptb4xfox-VjN)c}Tzw1}t# zeIapNY;mE>cKwPR1_mLH8wq@$*0yHUjeoEIh)tN>?3>Q`tyTvx$U!Eo@J9p1IrsSZUx?{ZO|$-yQ9G?$EYrLLe=hV z<}2`sEPnuIVcE2W}+dDC~=ar<@w9B|b4Qh@@SOnR5zK&Ua=JpeyC zjy$?=pcZ?&Dt6ud=0dxxOx>F&u-bK1;o=kR$IyDWTw83RrZ}OXAfw1g1w0}l(sF$k z7b$4X^eVR-e&Q-K`{p#VZ1XToQeF!PyqH=XZ9Q>&`<+o!2ZTMJ4F1U6wPdAa zxbTX#2YJ2DqU02(UI3%yGe=;tow2+k1?|(D3MJ8}bE4}em1Ok`j>8@&ewG>w_BP6o zkLk&Y&o1a$SM96MbHVsVH}vXf`~ou|DTL?u3f-G6%#@y-7Y38!VtKJevIgr8eYKAF z%fJ-!%u#q3mU}T4MZt^lfli*RlvtOzY@C!>YlBy*-Kgk!SbE8G5ZH4~HiM9B*u(No z+^t>I4KFqDcBnVz?smByMb|~`8*GhB5wJ#>@87k`ub8c{Z;P33weeb&n*_Cxb-QkE zgedKg(MH!e`}Br_AEOb0P6~aE)2aycXc(udSFw{f`-RGN&jdHC+JfmSIfhmYUT$)I zv#l|))0yxVb26~por;qLClw>TNAc%ofsH_g20?#;Kk$d%ALar6U^x(c;jiEv3kD5* zK#>o2fVU%>}`7$y&YNPdXj!C&d`|3mU0EdQ@Ygck34^MsVBjMWx3 zQiEJu3k$QTp)cowq3yH$qTu*@Y4O&UG_|r_YW@@Gy?^N~8i+m`*b#G_)a0!rV?j3< znfzGiLV%Y~rHFLgfUsm>t>i&3k)9{=_Ffo+ClJdAt#;dMd&vyNWy?PajFfsI)G0Wy6i)@8kE0>9cw**I@5~tq8SOB`cDsvv-gDYzaUF!F z!kbEzY2eFUdWimqoO_Z2WADv^#dY_SRGlZqZYJ77QZF?Ye!k<~1EFuh`#h6w(9qA!cD%#9Oo321SkTVv-I9eT_Re z^o~(?u1~6kGUn4BryfKH>MqincW6V{HF)!+t?d;*o3F;?sZ6yhw^Q;AQ!xXXb?f+& z%)`*bu?5%jdKPNn*zFS>2K`+X^B1<~sRFP~hEm2&lgX19laehsjwbDOr^4(!o6r**2-8a)A|LJ>k?) z)L$^97dM-F3MjE{h3c+Nx4SplhwLf)III0+7GkIU3SgEy_vQL50 zHF^m976dlZo4YPm#J08ABK@n?47W97eRH=mOO5mnH2X5a0sYv6(k~4)vKFZ)l9zssUaMPs6%}Knb07l|%;IRM&$E4uJ z#`$>S4Nqk|%?u8Cl-EbQ(b)+PwrhAtujp%su@g3FqYBfG#+YqQS;8a}gnjZNOjELE z@)JaEjZs;M!3#E7uTWBi60bdZ>z zM2u9=-STS%3)}BTFnKqk&e5qD-x^&U!U?Q4*+l%X_{7_$Yo5VXM_7!PY_y!j_ZxIL zmgFpLyRB>rC02_pN^ogJScR?suy9qKRgSqWWRgZ1?y!!1(dw0HN0}&2SnX)wOaBc! zw35VlN?7j}sQkX32;Hp1`!?FHP^xQf@Mq@(RP@5U%Iroaieq*xOXCdE=6Mc}+%*H)wtWL*;53sPtRtwXeNc3C^ zago{~dMR(e&*D{jC~(n%Q9AVEZQ8iFRz${D81pk%O}{UPEZm_^pbpk=|kj2pAewX|r#J!ZtU) ze*kx6CKagF?oZvLE<-(K;LwY{eXMXOc!L!Ox<+lI>!S<4A;C=wF5Tqo`WKVqI;NTg z^G1idSXzr%ja2(Zi|rFIk{3CDq8=ulBRWKb(@3-JETcNTX^~>?Mm~*xAt$d!n-g1A zj#o$3YQkc@iMK)-+YW(FW1ljJ0^~EEikQTKm?D#v$meEcVV~#fHRiDaERmvmt)}d?lI1?qP)lzG;L^qt&jKqvxBW3uLK}k#nBF7DS1~rw1*Lc~Gs|%OTfSmMk zb{fW;p|Y;d(8qJsM<0FXNZM@`M||!xbD_rSeQ1W?@yQz_^gmHj*z$1c5Bl|a)3?jB zj=Jl`#c*Yx?vq=!#vk+NbiED2OirdHYJ*|S~r zU9c#rUTcZCSv@K%p}SVcAjy@ySslGG>Ymzp7uc?p(?G8Y7%s*-I~(hJF#v`AtU(C* zGP6dS2YK%+Z&Fv?ZX4^Awz=#!xXE67*%)0M5@1m+^SXY-O}YBQSB4F@=E?dK1ZY&Y?X)?9a3J}lN5Y7(4vb4y~*$(h)I)`5Pg9P|J)-*bZu z_RIw2Dm^7G+%M%@h;7(rIqDgcD<)vGM^$-(61y?Bh0}_YxcyD{X%j7k&4D|~Lgj2e zI*CRF^q{fNColaju_M*L>+y+u&6}iO)sIknQnBZ!M_kkFP;6j3nL0dDSr-D4hkfN} z!FwCaEN2cl>`!RsTiId8)GE})Rhns)eO!~4F_atNBa$i;JW81uKm$zK25GZIBy3on zkxWvUBMZe+(g%J{>}`-WdC=t)a(cS%K;_{fg}m@k?(nUHpAvi{WH@sVQbFo`14O`} z0n>~1DYv@)EU%oDw|wpn3n#melf6`paqp(icxvd^U#l$J?>YNMmKSU_%5Vy1Ed135 zlen|x(&o!`g{N5p#q&$g1)CpE=yUc}I1hcSx=96OfXh6G0=BL(FNmS<08XHKb*Ymr zG}OHA+u84rX>p=*85wiNQrY#R=aye_GG4$u0c|uN++n$mfBi9hrg)h21sxkorz$7K z+LV*d$?AF6oPMcn`3auKRU?g8+0*7Aq>gqI0`H-u(&avTUY$iYl}t}h#;|vfZKoPo ziqa8NnmX9W3(v{*^IhB%ub;Cj452^u)_@oq$!57@GPpmkyT$qu?`fl0jT%%)u+Ag) zpKT2~E1our4@>tSfYgQDe!#?al~#Ib7zSu+)e~%Xt`w?iO^-iXl9ed9#tB+!xUhzN zzAa)R&CS#=I#?vcZU@=-Wwi&)u$tf(-kO!p%k({r(;hu`Pcu&y2#7SRa>KpP&%7Z& zm&zR#2(_xTSs!w<&|P(k}(KPj*VAuR5e`4s;x%Q$VqVUGpjHN7SF`s|$q{Ks1$?eQA|J_m?ZQtGVJV889|67Yt%x_6)v<6$p zm*?~9>DISVz@Wo4;1Io9`kt?Qi>dRjW#o2%q+Wsbi3i4aLN^VaT3b7QcGPY2d8jKg zww~Kb&AI?umiYm255l417}0nd%M{o9MMh?zUBFVR?N>7$MR+4ecqAJuV_tQ^=J(Gu zS59_e;A&A0u+l@%VN^72MnMO07Ze2vkv>6@JI+<>?~WuceZ7`ilMy?9NZur-NLo18 z=kQnnsM?>AKvldPce zNU ze_P`LxLdpgGpEU?!KO1+Mmv>I6mHo0MWAB9J~B71o%%Z+@S>Fk#m9Y1&V3b2UzdlL zz0!V5|7%$z>gmbxaw^v@2^kgCeV(~om={x+I9uV zB@SEm@H|^Nwddf+1Y_&|cD8TgZD12ha2hw{Gk&M$UJIQ`-A#cvt~-0-TThs?aZ^1u zv^3*|TnX;ve%6i`E^(*357AvgNtf1-Z1T7ZP7Vu8lL4)@fI zZuo#p0qqs9Ne@MeXlI!d>DqWRaBC>Y?`! z8>hy<`iXVq_1-SvJ6z`A3KxK#KgV=qw@$ z9v}bUt~?p=92M1l0nl*yfvyy|NEcnO!}h*9p}Xb# zVnJF%diCUqN5<};l4)XaP_2GLSQz_$Z*Lk?zX`GxeEb$=Mmffa^(%Ap7@r;XQ=9O+ zu69MM^p0?;W|v-2gb-x}<1uL9B4uyeaST9k4u;^ER3`Hd{Z!dQQ74I_bQ5Jc!-7S( z=?99hm>MrWB@UB6|40w_J`rJD_{yjzAH-l9I4VTxSXzeDhU*7FE4>%aqpW^Q`3<5b zo`6Mo-37IVYyJ|6CIWOtzR@4vJKH6O+IjPdibOes~S((F-cNL4_`NCAE=&u3pNQxVb)Wr zyzq(Fl!(q4`%B{is~>5PgVPPT^(P;TQE}8U2WzCNUtCM*84_HwKZUa7Y`Y9hyKgFS z&1r2UM-GDzX{PZt5nH6Vz`gw?xVKk-Nmpwa(R+}Z)$?XZ$*GEP(T;YPr@-!t^}m_d zS@_z?5#*EKMcerHb;D*Ss|Bj`v}WD9S7)Jksbq?|?SO=A5^a=mlu8XsR9Rzce&=@X zvyB%g=~O7-NVvcC)I1|Zp9srzFy1)OcVF@9BfLQM^4glLcEQ3(G2!J{0C%K!bnE`* z^xDw9DNI>5dO1^VY+yR<=4tf@Qiorz?CkZx3Y=$J@;dv8Ht1j~cQ9}A=ENS&Id?B5 z;&qHY)p)O~)%G_L*4^_25|5LQe*Fc-GbCg2^d%|g-&)hE<+{};o*29L-`V-fx`+~0 zn~@p|n5>>G;>w~xWM}w5QyplhoWg}R(mcH^1@&t#9N19&aWsUFj(A(?s8cCMC82dH z*8%wW4R9ZdmVtd-cQo9Lp0k;qvEC-3c~O3{!9~JgB`}3H=3Mrj;Fzc(Z}13%p2VKe%7-UhR=Oys zw~CUPKN7|Qk$4b?I@=_=eRAw&F4ti968CgY0I-OQ$(vTWof|`5mz5;iT90^O&)XW$ zo??L1Pa-BE0V2y%Gf#sT-oqzwHuH2*k=<=RkDpx)+x_fAJDq$u;WP2I^gTDGZ`~U$Xf02_=2Q1=K1sdMP4#hmraAlYEs3;1zGLwvFS965YF%sumGOgw(ktiZd3BfG?jg0gFC z*&HXz9kK1J=xtpRclYhyWT%Z5koR?FgD2nM!gWurvN+Ge4o^S;R|V;e#N&V`ERgFj z?rAni4lfnonx!t69P-NQdyifEoa@m^*r*-7z!*Cgz}x-8hL;9Hr}l;ci|}KLR4mz{ zE^}MCANbbS-m}^4I~{j;QR(|7%HHgNb6OXko_Nq`+ZrQwgL4BM@*qKi+VaI-MaW|| z{J_Z@J1fP{?OQeIlu(A9$%4%l-=~_qYrnl}E&|sb;6COuupl)!?CsUOxblnU_iTA| zjaEeTWAXNozz#lU5R-GG9xholRug4dR2rOr9}NT5DGxUYMa+efFVDs4BeM*=^aHDhX7zQ|b_IFZ{YrGxcbt$}iX0nz zD~&ozI;DQ(xP}|b3$&a*UKX2}J}K>LVpt@&!GxD7th^5g4f4f3XhG0q21Eze>}78f zH+eUCBFNbN+C%ds-?FK?P-XQc@{4J!2wm7KJZ2g}3p({VC+Z~4NxuV5nz`bF)xRl9 zK|hXKiqJ{qC09!~Svl|gD4TBGyjJq=Fu0EfE=%9t1wsQ?GbgtN`{22Ce^>sUTLt{5 z;$zinP$Ck0VWg^&^zg#8Sa=z18h6l);e(5uFr{Z2q z(Tk5nZ|hAACmD+BSn{o~gzr6Li=uaSBWf;RK7TKY4&S`owIwh}u@qoj z%{eJE_r_JEfCu~=B1Smc(KjpNWa;ddNe5P!@ONJYuVzV zt?4oHq=I}NrQZXl;M{mWfD3XPSvoK&;ALb~H|=8cbFB9+F5HA?!*#kzPPS&K&$^jL ztaaHi!4??Y+AJJS_KiJP5~8M=n-hwBn5tesZ^vDfWAp(;Q7w@YCTQnrPPk%7_?RDK zC&(>>0!0S2;Kf>uS{UsMkY&00FPx`D20WG=70a*dQqOaDo_XHjm2k_|^6(Po^ibk> z|0dz;9H?%QcL53}T>F1yfm3?25h7px(;V?jTaM7`)YO5~7*F$VuQa1P2WPwRQ1EXP zSa+OELW`t7&c8a@SMth8aPuTIXov7S`p!&C7Avk9Pkz2Kiw+G>a5u}1il2E|;V^n3 zAl2z~-l#^~H*e4+!ZDdSD$HdBqH(Mc3UhKJ1Wwx#efw%7C(|mEos=U%yD-&jOlDN8 zF|RBA{G-Uar>*z80YIkkG#rtrBr57hUJL2$$7(0Ym~KGaH4m$bN#ixMO?N2NgC@2s zmYzhMvAE^Z&D1wiPE51 z?15t7_cJCCiCqznNQW6!YC;Z>{HS8IYU;Qh2EL1R_;+dMk(_7Z@PgH>KNIIeb5fo; z&wyLxAmc3106jFyj5FJT3I2z76@<%iNhC3rLi{2d#C~UW-N<3nd%$yjf3n)jtD{ zDd1~rvV5EsfC9Vgz@^#mXWyP)zn#y=5$|~=x{i*)iE$vESQE%r=u`UKTIl9}h~x>^ z|7fV`o6U?KaAoFqp~LC9_Gd%3a%@?xm%ao%{17tB8?!DwhxRw`REfOVp##<+!5L~I zoH$0sTv{Em{#bfupvj7%y`B0;QLge+;#CIQ@I^I7PT>dfu4;X?=Ut3o2G7F`Legpb zNq#@2ilXbGwZ_{{H;e#yc7htlF8e*H663fm-2r=RcS>G?`}&7)3GRi$>_%~uJ7W9*j60av$iBL}6Iz579_ILxw?++_f=cY*9MN3|9EAP^ zwZ=tiw1{S6vo|ShxZ)!%KS$YIsHfn*-;uSKL2NtrR5MSdU)C4~Pys2m9YQWTJ%QAN z*m-k_o%e%NyseFzGF|G<{wS&zeJb&xcaigDqU`;$d!_|mAF?P5Hn2aQfsabm-z%pL zU!ulhpVX%er#5{4%C@82bNuO5%Bb!F@5oHGRARz4HknTqmh{!MRdB`^XMw%sz{(GN z;%Q0j#HM?6@AuVgYrR}6l$yt2G;Z8(r!N~sE6mII75Zx6{oC&k0)uCGNC7T(bn1hm z8w1)~Gk&m!7IYD9(=m!EPOJ9#h1!y$5O>F1Ex)ne|LN^xa^r+k#ewZDGiFhpMLg#s*ap6r!(J{ctRESJefVO$ z*eCO(>~A;iY&u|t)!#W|8Nu!)ytMh6LirF_=&ml+|(eF#PX)1nnrKZ(rPPovA>YWG05j}7F z_{aNom7lIt{F*A7K`HmCLXZB7h6^XS0s{buQzPg(dxf%FPwmjDXRn7FqJM5A`NFN6 z!$AFTWQ^~rH``zF*Dj6qJ~TW{1qDaJ5>XqqPSw3*V8zzT5I%o-E7m&lu4gEe&D}@8 z*1Fbg#sD0}YO=l_Dt&3B3v7aOxDgcU)H0veEJ@NwV{~;^=7hmg+MKNlu$KVH=Layx_C1z**-nfl-<{gHx>2TcV zs*i@BqI&X5lZ~2g->yv3O{d4&OwV?-_1dLKqATs*7!-9r#Q|oNU~{>2B2@a-2W9rY z;yk;N1sh8V5wTN7YSlBkO2qm556L|$ve)$ZxzKsCR)0}Lss>L_IG+50Bmy;J%E2+N-!Kf?$_wOv>|zXz(_Bb z|Klt35H@n&eAUOItSo(X?1Z6+aYJT4xLNDGhUk0Y!p6>z4>T@uZXFG?TZ?*D4SMCX zi7)9G?MD~LR96heO-*7=i3?@a6gny6QpvO`r;<3C7uV&rENi9d%U! z8?K$b(QRJDC5m4_ugvfJObr0EjQf*qvt|ZpitxT}ld1_54EFC92Px%1uUh=I^ z9Ahr!?Y{8^yt?iB7%|||r20|VB_&-Ni~@bPEhFB2U z0IF4NBw{k;r?5o4h6aFsK%G>q=S=Ra@jn9K+is~6h4P}31-O|Q7$PRb!gWgZV30P+Je$MOt z&J+2?@r?aXHNP&O^X;&^z#Q*!U7xwWXw#=84u`q{3KnqT{J>QM-Ufd0B8j4j*^UnO zo;kd-vK0<1-#@l1F5x>zwOBd~0tz_dNr3@OHxvt`b-K;Ic0c>IH17>RktMCfFU<>Rnkb-dFp#ZZ&D*=wY%+ITHbr|SADfu zvGyCV^a_anJ+5Q2fo{4v_urM1HrADwTn1G!EyEb^Y$joG`~wp&sm7_zU8KOn58UWz z!Jg?c)+$VNfF0+JihwO+g#o20CwjK^!{r~*UEy&i50=k1oL?qw<@r7S!Bv!E1pB58 z?3-gRBf|p%b&lO@?EL|5PFeIx8$|P@@y?^QzW{?@T%>?i+`5G|>+Sqkj%I_qiKXVD zDFAfVfZyCo?M+C%K$F+WUn;%gHSdWNQOxXjjB+8U7}3Z}aBHxWY7p7RIq+rmS8>D* z&+YFoH^eYRtCNQ&;=sR78_j}9-!WZEq@Cdg3CS73fCw5g!IM0D;){}lod|u> zzvL`sYJ#fTete+N+t53Q8tUuu^EG?weav_uM*}&--r0+e=?0DcWxyXGSxx5_ugT?5Ax22w?Cvn7*O`Fn3TkEP&66?$%L zsS%tqBY8<|C23ideTh2|6c6{1OW*FQuo;6Jj7IR{qm&!^)^F9!^#z8&um@lAqPUpo z=PF~|f*Bv(B=vhV-2(cTk3{TjVIc?Q#B=bHWqGHa1@WPIs&$V@K&q}54;?^^v6UaC z2bC?26i2HWC4#pE;gf-}=ZSY<&PqO5&ZbVsXevrBzxFdWkn7C4Wtik9D{Opo4@3$^ z)IKZ>!uU(@{)sbFu}gNX_`qv}gX)%SI-?8Us5JG~{v2m9j|G89-=P;K2h@V7{c$d) zcB?M%a&t7QqoFs-Rd0K0()DF7GsDQ!*{8L?1{CLzg zN}@Hsbz*v3Eq&Xd#PiHF&b&|FdGanzFRi#rzhPwVc^fJZY+Q^SD3PEfCPey2+;i?>y!-6lAm` zmDQShwYrh@kkgOPo|8&;S+OUW$Lc#KZwjouVuIxD-D~$l%`{p(RdOwvA?1sw;cqWu_*m;!BW%hDcM$p3)1t*@Oq^Z-x zMSc3#vVS0`t_1{CDi zo!r=>UeN}Lc|PYd2$k@;dy;tw%IS%`B`7*)TxY99eNx-Kh>TSlU-~3$$(*a8%umGN zSvwWP@+XU=dteX1z)lt%uXExUkn>I7H(Sq5H{gvt((y$3=o*QWhgLTGd)PjHBPXnr zzAr*h8C=wlH9LXBNPbSBn#38bR=--0h=SF4tJaIkPYFFelS<_;>)1MJKx!sBE$aZF z*ew@bw zsb&>bcD(cKMsr;6Hoi+~keX1URDXc&^UJ;F=xVJ`=N^QB!@E=etGzG( zhkAYgf7xk4M^RbZNU~&!v1>s!IOUXNn=q&&+c4Icv^X6?)`qc^Pv~?>z3DjyLsSPkaUv*0;H3@gO{Y7Yli?uyH&i7z+q4$#sRCdNAg zz}oUb^`#t#!J*cLA6-<~=zHEt5d1!x9|ZwmgjNa2HIqP?-XyCP8l2aeWEj$Na_ON? zUE|Lim47_5;Nl&Gs+>0kaIA0yDyRSSvMpFzBxkJ3J69B2wI>-mf|Y5H{{1AnO>e1y z8mqWy{wXj3J5;afmjajT&x1I@;BM5~N*pXd;Wy}V>g&HTMt zLtJF`>Y1naY>SjeTi)3*9#XLE z%v*KY0J-`s445!{Nm?97*tR<9kt^>CLBP~<$5b(4=h=+M*~egRtZ zX4+7Gw2jz!H|TuV8n)f%miiJwF%hSDc++>_#o3fQGb21A)m|X$_$RpLfeTAL$LO)W zB4+x#^rT$!M=Wot`ri+O)-pWicxz%XOx8tnjkSjcHg>0tfB+s|9>7Fs_N_arFEifn z4F8PHMPAI3P$#-4z^YCFnJ)hj*_xlBBQ}#+PfZVdHqBuYsq}coQ-$*n0^iLX$j!Y4@Q`zk&ZYh*1lyp zm3AZs&27CUm*!F2(VtDi9dKQ`fs#S#c(PsjbOxIV&ef_prKSj&_SXFX;TF@uiVbgx z``88C!3V8LzZKWYT!Y6d_lTG4g$>F$aTR9QH8u&EWr5BYG!flF=Hz-38(cDX6wlbq z{wn=6_tT{wb4zmkl_H6C-DK)=WqU4pk}5Dhr8bwv#ST0IZWj=>EPj~Kz>ZJ;)Bh$i z7~?LMb6Hw)Wcoo;Z{U4LA%%GpZ5yGYA(hj>V3`6{axPQ~T?!(Gg}jRs{?>YQCA+it zHM+JQdn!I=IBX`!Kv2m>Llx|3tB4=;2Rk{b9Lym+&54aqYs};%M_LvxyY9@SOptWG zjBaicBvq%gRaCF1s7jF2ELw~X?Pf(%S#BHyY;Mb*-o^%N(?+h*6DV;8*%zH8M>Zck zo2?4aOeuVx58eh4=HWxy_HckD6G3&?(M=mkyC6{zzm{}&&#Ty_5+j8GhZhNXYjI&q zB`%%MLRkC@^2YwA90h@}{z)jwFL$I-_jKuo?~3|kx8qT&_+1!DyR#=;Wy`p{nu7+K z%N7(cDTjnPz%aithw-)OO`6=Vr?AiFXPjTqUhy|qP?0Uo_DAK!dboFV@){W~R=APd zgt%{GeA&>B%3g&Wdmc*KX?&FPdi=cAj`!keDF($o2K|L>`e{Q4STGh0udzZ+^HgDLq6w;|Ah@@VG1R3GaT{ae% zCJ@8&m2dW2(qs>@Hb2_d5g(Jq`q0Ti{o%R?AGP8`&4qxMj)vGzoSwnTl?620p409f zGEPoZYE8#D8R#AzMpmP8ipOlG)O@4fJffLK0V%Vo$oHWaR zUW~5wO|yDfKHK`8V~3(9B$LZJOPGMuBDbqz87yE^6+Y{+S~}d*?-lj*~sg zF}kOfCw>*a1yA|pGS%zVZl-#bO?h+)SJk#^aJ}F``QLrPF<)ZdJlJ_42x*ICsJE15 zDOIu{w=$XiJ3b2wa!_;;qt5p5b)<{9NlFXM=b-6A4a*YwThVqG_Z5%srd^w!;X<5J zph=3hyybwiCH}_V=OU{j{xdG2s%7lBO{ws69$zbzOJw&}IAvnL~4OYLR<>&J}Z2N)(UJZDQl4^gWB;2WhhQopfG5V5Rhc?__%kiD7TOQonS7 ziq#!{eYlkPsZhv4Y6O-FDVH!B5C06(Ltto=HI`QX_pSh z^l7!_j&(hFhAYoCy>RA`5T8%SPDs~`$Rq6ybm>WuMX@kpAIwzB0Icpv%FfqLTGZ`g z^yg$26TkJFHgA$Zs#p@&fvadLt^sXr`D8=s zmpaF9%io%5*Tm+3?g#sa(6*eNP$AYw#NW{?m=Vhz*}P~aJX#XeiF$(8y|gF;g8C3| zd}yy(-8O$J2uWl#j`g!3PxK)y_2R?EA5ky#cgpgue%Bd3eO_|3TCtzi=ZK1p2dC1JRXeoG>m*74tk{swwjH$76^09G6#MlaPuyWdi-FndL!Waxig3I#b(5oSAsgi&rLl3S9_@v=DF;kLA=mN3Nfte zM&LM`mo(Qmh8?DFMs$5Ngs&@Ba|nI4=j#nq9K#2?Vm78LCTIbl>Rjf2SNr>+$q%H_ zDX$uF_P$vT?AgrpJ?allyty`yPkm-Fv}Z7ASJNVyP3Y(n>(&Gz&9aL{k2x zsKmOz-QExWaam4uo&7Iw&)w$pJN(l(#aE&@fn1=24F8&*Hgcb6d$h9u(9UK=9sp(0 zr>8t0oQCL#PQs`|G&jb8lAkwzN&p<};cQMgfl$x*ftVQmrDWHT6ts@A9!f0qJ)2N{ zU-hLF3MpXf$Ssh;AEEw=q$$a6E3xolWmWBs_)R>@&XIW57Zj7a<0kbS-Rwl^vn{(1 z7DP97yAO2A?gAn65HxpnL(RnIOW4c&&Se_44K0}zip4vw=TFyb9;C35j(7Lm;nrvn zqNJbp0TJz z5@3Uy(g#RJ=sl}Vi>5-k{GF|&X+jM}`E)GC7`b*Ev@Z8w|*&vGVz{<#mKURAHN)e&I) zuwL9~&*Wyszo5qv%Rhv9_=~P`k4{b9svO826**RTyH7T~(VxNwjMxy5zAg~YW3!k^ z%`%@5UP93CQRS5)Qhy!qzQM5{T@BUO@Bp~HZSp%5<6|3q*D=Io!8ZCx)bY7#!6i2< zA$I4qgwgY~U|`wTk3ayXxdAIj$W*gn*?c6NjWfKhL2J()HT5zAxZdQ4W@F#?*wM#n z=6cBddE?V*<)~!7ON#>w=Wc|(dVCL;3%$3=mo`8?cB6!5X#w=0|o!?OeXX4*|mYo@^wrI(B4h75Q{_-O^jamX`-?PKWS4(u#cJ)_Lg z<}_NcPrpH){P9&fA?sEjAD|AMkr zuy)udPDm?uY~US|>NESZvZt40kMKeTC0XVl)*OXYe^TpScSOR!;gq5)h`)V~wj5}7 zB%R_`(@(*#$^)tD0p|dOD&LO6D$8;s;lDywK@z~eaJ?*490)Ue^!R}OFhO3;(XzuabTDa#`#~lnni3WAGfQIV zWXJI!uze1Oyab2jZ@<)Xuo=*3w|ESD%JpROF_V?ag(&`^ll}jTb&&&5xO(LkO#s8O z!2EY79A8kL%UME28uPn7+P3jxlF*t3V4}B~QzXpNlUk96I-*(g>5|JK`CY8xROoTk zQ^1oX;Y{-;(Ng5ZN9C*l+ckgal%P7Ax+4kQHgDBZ1dTsGQKPC;yn1 z4qZWcAn-iM7 z#+}Zd8hW^)TN-(a)2CXftY$h}8$4L$90oDwE+yrwM+D|8@vgVNZ=w~I%j>>XqbkX3 z*QF@;y90x=kP~~MgVLNeYjh_X0Zt^&9@sT>{@3T5!yK199804T6$Jrig<(|T)885f zPGe&JB+(Dy4Ck`0_!gh482agA4dOKCT~OE~EneI5h{dQcR?=VT#9t3@nt0fG>+wLj%?PR6d_kH3nG!0DBq(ZN)3 zXJ_rnyS~XP#QAMJx_Q?y|LmpszOsvY3WirE7sbkkK(z~yug8VL@jNU9SuebZikq5v zF z$XO!b*}-xU)u0BtkAjT;Pa~3A&Q$H+3QxwSXqUCGcSC!d@$MTBvS*-GFmwTNj!0Q- zLgnbZxnho%;^rKA@^ku6&<_l!50+Qd5W_%?_C{yp71PZ~!D~f7PyfMbAGA`<2H4P= zZw%g127B0=t-hdIG%=>UCe#1{j64Duso)eJM`HrBZ`@HI&}i zDX=!f?`9!9{eWpeQ9-HmUO41Ux=`pGg03~kp5;9PN-;73+5|oIw=v}yWpD>h($-s_ z+!1OB8?e9zhOY8uit!+CmK=8!1q<*X;fD6(p{M&99|1zWdh79BpzuA6GY-DSg52fjz8$ICxVD(_{ONw!y&UXbtxECx%(4xFe-y9I zeA3ehVvv*03jA2XdD4s_AoO3E#Y`S|3_tyztw3qhiP$hTLI#MXjzeX7xY(tbC=kHG zisACj#Q{|Xkh!4)$ns4u5@hMQ9oPUL5Jb*Chm(w{Xt~9X2|)paWe*>JDYyi&gCSX8 z4*Vu3gWzBE##lP+0Y_;5LGhm2bgXyAHQ*`3mz2U!f?`ZGWZB0LZ+fgas4c~rO*~*g zf)P^~BhH~y$n@_(NR}jNJ=iX@4NgpM8_f|F0LasbD+HL`ceMB~+t{7brhV z&A*JK-VutqYTO(qflNFGSh!Pc0g)u41Z31!tQt!*-r-0!v%bsZi*PFJ8-Kg^1Uuq4 zCIYH}@%|~xxaf)ajn_5&5h&db0xx9f1>}{3)s1lv+XXK!!uG%NQPaP10hCuXfZ*Bh zXMh2Ge!?vb2tv20Mc7=ED>cPhEup#I7ItwEb|IM*7uDVXrQ0G ze*Y}YAZ->x5h7U7;@@)07e*Db+%MLu2+G1?PU`fn*Ho~XWug>-(HB^7AUEn&2%u&L z8BI4Q0vlLy1ImY~Fe0LmcoGal!1$IdIIgGnStUpxK>J8@}W)q3%D#-yelGy~jaRxel)Ts9au*d&I8BVprMH(0P zAj%W3qzyzsshd6Iq>|ie!8#VFc9i>PKqz7WQ%vQNoabP1s(5l#G4_fG4ir=OL3K9z zP~0^BSrPP^u=4$f2nKvehKACqI@_RDhpp}XQX|u}_~^GEMUYzs-LKTN&KNg)fq)n+ z0fdFOy3EynW0OCPL%ofe&b|)CDG~+RPgKy;M;R>_UrUMQO);J=XzNW&q%=9Vi1$9a+Efxd=3bS8JOwNGl^?%N>@<9>l(BR`%qm0C>`3dCOs zwG%JKxM3ww&5Ls_J;m;4XF>!U5FmDg>7?JBNa*nLm+n{2{dZivO(ve3Hac4;Fm=(* z5a?oRw{EL7FjMN2Y)0>nh}*cvjS4*#!P56*x-= zE4U^_Mk$eYu0#Zs6*YQhQd)U2ek+^8V@5UbElz|N8iD05Y#Mob(d&sAxh!wj?GQ?1 z#Y;!)8KxL`KmIKZped7A{-> z7*oUq8V$e6Z(kQGzqHA$$q@YAB1mlLDocAN_PK7;_5=MB0_T}q1GIJxCCw)Hu%N3* zrVfumV`@9pQ)~71SE^b#oYlT+-nGXqTCZ%9uV*an#@>SFgqat$X}GpH8-olWRaLNk ztX5s{Gw+(}A;(I5aH?70%V}^b3LJWd@xyYk4*A}y} z#&9B=U?#2YPm{^HdAnXpZP!-33bEFPOC`v>2~)V6#a714O?U5VA4s>g*~D5k zUIs9U)vEalb#GGu!cm5Pk}ye}>nzC$eW}_N9WZ#%$!{Emm6VqY9Dp71ZJq;Ga%2pv z-YVA)NEG{WlY91%GkA@6WlRkUCXz|(msVl-OMJAxT<({Svr}Qy89}Qt@KEc2K9jNf z+{-PZ*NHu<-s(j}F~0|n$HCVKXaOtSvuf`7Igk>j_ERfx_e-PP!7L9L!0+=BObn7n zvv+HOG`2O(c4F}Ul|@6k2<8{|>oRhqwdKW;PS!y19neDUzn zbC}Dv9g8cOOxy?yn$2}J<51Wtx&k@PoVekoeXJE8rB<&iR!Z@%?dOZqpV95<+%BA- z+c^%LYb^M9R^>k|}3qMYoFjzu-J*OUW$eCzF6cdOV>-RRyy-6n~98 zrzCG={g#$L`(|Vsq?&CqeE55sQt>0ct&x@T>;B+=@e&jAHwz@t5t{aI?B?!w1E#;0 zBxgS_T#E2z1V5OF>L1+zNU?zKboq(m6Kw{bzByRA5w1jc5toSQDW7R zbUy>Yw}6Amr~r#Y=Og-W#XoMt+2m%QOH~!in$bKqx7uqbAvXUGm^BL~(X}?-yHtMN zMpZ1KGjexW70L-m)d^g_gBq0jyPSwQ#)Vs_f0JncB6r zrh9j`RL#UBAWQBnP8O!OBSj&tvj1_mGB!ooQDW;JR==G)HoF|et2GbACM7I`cAeYQ zx!hMdSh5EC#?YC4dt5J-V8<7yd-|Gy0Q{McO=+acC#T+FZJWLg9XcEBLD>COCk9Tq z3lw{<)@50KIihZ9vfuXbGI>_F zD8&LCAmfC<(U^N1%Anv-y$`lM$|L1Fz4VmF!IqBvcaA3B;umsNssr8AD^`h}{XdEf z>;%7!1%nU2_-N$@vmf+BmCQ$6(9Dn-d9hT|qIaK@Bw|l)%^VHuCG_yYkbOz`p0{Ad_ z??#3^+dKWma*>4~yTFpr z$QC2NGnD)Mf_U8$`QxmtbuG(IqV&au z%1t~?+#f6xy?Ep?PIOGL_k(B_q$&!47 z<#uOB#AuG9qsh_4A9GWFE)%??YZQj&>G1Qvy0LPuqDe2b(#UAW@|oL%*;9<{S>3>@ z#MZPQ2sj-KtwFnW+}m<&v4&$DS+f*9wvNW;y?KNx@4Qu{Gv#}73JA9TI?ZGD@B}eY zBnhl7mcJB`N^*|INVol!`V6xr7hStnbT!DLHzWy>~W z-x-WCj2ZKMM&0-Qy}r+Ve&_f6`JD4T*SXGQ&hc5^%j^AmFCXD|?`Sa};XXn|Ma8Ur z^V&TsDuy5`Dq4lZG~gTCl7}a$sHj8jH8t;QYigc$b$5Ac|ICJp>iqk__o_FW?w$8iPuHnMFAQ6nJH zGcaO>ZAVCqybqLJHLV3LQ{{05n}WflbW=oQ#bBD zjk_eGt?e^7r0R8lyu~LDf=(YOn7cr~b8X7_X@bEN^VDKjeuHniLg(w!TLE`ep8lc> z7pN|-B7U!)`0`D<>8X;e9mayyR4ATNIC zGmNXgBmRPxqlA|6?8*MSSGf$D?S`~V-eqE|!eBo(bY|}TFrX1^r4j2rtqfgP-%&Lc zS67@A4xQ4#M>xUWP(3%#Fs@w1SdTiVQSIAK+;Z6yXMQvnv*l+R!A~7H`mM#w^!|2G z2j8Rhws*S2?}_Ch0sKDdSuX7~hblE(yHZV;d2?AclAgxaQnRo;|4Cy5_pe3ddN`A} z%jfWibbH+sviACWfL<6~ZyI|5g$+^ur@neV*#~^d;Hj;9one-m_qYhdRwZi~_=^6q zj@C6QGUdOFy4)BlDkr4&wJQ&NMpnjsKRm#tu3Oa%<3H`ptEOS2J-!JlUS`nJV(UM4 zIporfNGARF3!guqI>{$5!>vJg{L0|zjG)7ZU!12scID&qoR9WyPd@0zJ$zR*oRo8g zdKmqS`~w5De*qy6OO#HeT_d4B;qF($Dz7$?u`p_I9IDf^Vy6!NK}91&`T5^I z4)-2>`OlBj8iy#~{_`VWV6|6lU^KRM$+k?lVLonn3eM7IAUF#RV?QUvyI@$o-aM3Kq=2P^tt0q*}c zOim)U3Eon*y|7<1ZP2dym>);pfkG==#7g7Ct57xSqZJVzD_w z&S|9F54R+w6L&jZEpX@6aq~6U#8}Qe&-4)Yn732tFMRmhLUZ3?H)VHmrvUh7QlddT z(pVMptjJz-=}kZlG)n!uq|0hHshe@EI&jsk$G}n{r+sOWT|J#s!2F>bG&GPd*S5;Z zY8F?P54~7DxOE0cQ0f0-<1u|UFJ`qqdHKzXu{G+mSV4{2)x?qBENy&e%2k1K4WcIc}bp%nmee>`%c#P9<@>bh8J|Bl`iVO zn=^T(#AY&a2hB!COu?oV`Oh&n3B^}%Z~W5fh?5W(6;(9&o*vA=T5MMB-q;*IREf9} zBwY7^@a#@xb=DFt@Z8{3qx<``Q8Sb2y7##P9(Oz+#}3t-!&?K_N{Bmc-sZ{N*c-O7 z7j)MvxwbD9D_R>BIu&fCYSf`v4Nw>No`GY(wr5_eZrhC+$;C{|7ni9YitkU6J?p*L z!+cC5h<@UY%I1$OMeICgv=Z~+RQe$XmXjw>dM=~JpCA6Fmy|M;+k+K=?o7TH)Ow*l zD594(R&L)H5`F?UzU@w(Bx8!mQb3L{#4NvAIPN%p`M%zepB~!M&GF8W?-lTj@3rrl zrM{eGCErce?|HInkwR>XGymZ4N0(3@fpIc5=txi4S+&DY)sPTM5%)5;tJIABu`#=! zxRATl0PEH@osn77D~cZ87*wDbclu6TbEQbV0gJA&&(fl89LLFQhbyt?)U~4c%_|%R zzF0NEMlLiBMY3l|mtC9JD;(Nuc&Xdn@%gmE=3+?tb<+O4jNzS#3WrHl2ioyxA)&D( zuT~7t-XGxa!)+dg6R5A7noF6%*K9XK@8q5vNVy~ek;oEz8?~$9mH(+_sSL z)45Y5dPsV@E|lUsU*M-_1@lWC{F*qr#=>?jIc4F5pZ%p(`~_0HF&yxh1w(ruKd2B$ z6-rrYZuf)=2Tgo-p1qUrld)=XQvq|9qy=o_MOc zt&sOL`>-;$eNLNL@|_8o#)tc4=;$htzd~$xI&)|!WPH5sqsj@XErDaHUUesSc+~=Y zzQ0MFm+N{r6wlZ@E1@}*ATQ=^qa@L;Z|m7p%CGaOQPI9cj>cwh9TNjFJTH29LY|G= z(^;Tp%6G9x+$qWQhQB#3tJ3VT?Wd(pQJWo!9}8*1M=4uNkpq6VNI&gVai95-w?zg( zbOC@@dPQx&6-f(NtaS~nZ@tTQzB@ILpdzIa^R^T+JCG)GS`~U6p+9|#2hH?I7)MZ> z;xI2Z@2_3iTt?^BIzOa!d=4J zefpGpdHDo7>q;<#ausYow=1b9RUY%Z#G1>y%COLA1K|kQS=JQPh&PQ@OTCXARXwh* zzN|W+m|*{a^r)1_%lD!Gn8y{1KrahFF%vx)xwXh06;vtaPG0ZIl75~qaEI{` zykIsW&34`VN636|^{$qO=qZYQf7p#;5E!ZUn9sXSUKuXSUAB%=9?P=yon4=7;(}E% z9XYbU_@cbfkVYm}uB(VV|4P!z(zj{l+uU7@J^bv2+@&{5>_jg^a8>k#7{KzLB+>YR=M%N)r=Ew{Csgm2jzSjDOj(vX0oqs;*+- ztaknSb-b505>~;Hp;(li0en%gQqn2nDf_KBdbtpj`}71Zb2S68loO4d>giqKKh|2| zBq}_i?xre%uNu93emb@aiM<@O%ET?F*wabb@;0{bX;-|IB{ZKHs773G+NqDPY#Pt& zQ*CK!nO!x4;RXzW9iP^S$;p?5iFo+;e3$Tggj6g|9YBvXY9E;$6q57%rw(&4_5kxzatRL*&9#|0^>g+cie z_4EQZS~zF1MgrRQX%nG4s{?1S14E;aQrOh9xTss7=x4?wwJzkczNvBMxN zZLf|_^PCtw+rNQSQj6?V8*{0>Gz(z5p=W!hEhdar0EHxfL)H0Dx7Gj}){~~XktIN8 zjS^6IUSy|EDqDT5@1tpw8lQf|Qy0~!2z?SSFKf%fgf}VJ?SA#{&{k}b=I}<%A$|`6 z38Qc4X4N8r4OTx=k;5Vv0BrX32}&RZ#O_EAo=?H`5iUs`{|s zb>ToNWL(v5eFB0?tOJZt)qk5dMt8dJm5XT(|Ju&_A=A0X%Y#M0$@+3gUcle+#1gC? zbp5*0s>@n$r3;t6I6ZJMO>bv$tv-8X9Ut3fO{?hG40EpG&AB=_NEy$a>vS;|nb) z?EY*q*?k6_&ed5;I!uvKk9=~!N!GY!cTy#cKXM?Biq?*b4UefDw=gj=@m`jAcK!md zJd_9@wMg5PP|ww$b{oQ6E5)KGPj|d+XeztHw4_u zrexNTw3Z}~N+|Wk&Xtbt?^K`Di22T}R4YV7YuEl@)~hVjHQd00eCLP9&bbuDC#w>6 zz14Nti_JriK$dQ2>otQtd#Oe^E` zA4KYjO0(c2q*%lw=3nWhD3mx1^e+u@fugD|o z+_zH{Eup(M?X38I`{SgcXVghQB-zC@?!Syml}tRAx?BK2|IFLWwG8#pDhwbh;>dZc zKH=CS^C7akOS{wK3_vA8GTT431U>~cM9y}^lPBX$o5tbKgX!7X*+2O`pNRTJFhcv> z-vcZ%+gn&5aBBk~0wV+o9o+l{&^$-3FkQhd6M~rsv0|Y9MU7_Kv5dB(CEiYD+Z@;C z3GHIW+=z|Wy*WRp8VkoGH2qm1doPTZ<7Tlcg{sARuWZfhpsWaXDu8T@4(%UAMPZmR z>nO75S$_y1-oRXMu8#Bqrx((V!d2_`pv&#=I|wksa%|xXD-(Qt7_+*kx(;Y{-)Y_V zrkHy{bGLbn-JqmmK03S08X!T)^bQ<2V*fE24iYHg=0Nx*$OB&@$IR=8R(1QAil+v5 znUiI`#HlErau3h1dT*z9VPm=#9f%+INKO-|7_Y5vk^tVTGwFU}yauAz+LW4%I3KE+ zAh!xvw|BRog?N1X_FOceeGl8C9yKB=q2a;N^?3BfZ)W823~d+Al=Qm5EB%tiE197i z%uJ5LIDtCB&T%Qx&*TZG*;SRoOD>)X1!8rmp&}|^3^#R6XyVNk@26%c>O@O=W)2aF)3KZnqT5HvA-K$x_B|Rv76RWbdFmp$YJ#wIl9E0(>Uj1=A=|-)ea8u>61=;PPSU^Pr+|w ziW(ByXHp?UkedYrGW?*9j%grPz zUB7Viap3|5_4as!0PGYG*IZLI3Gs4olpRMN6D`wgH0gU8Qr+1xQrR(JGD;Em+`>kG zAISM`*Q+77Haiy8UIQW+V;P(2AH}baY9$hh=kOap-V5rfl5W=sECYmmN8Ch%%r~mh zL7GN}u>d5{G%}0*`zT&sQioXm`^h_bOAIkh7qWSt%0C-9cfaQw{VKeDr0iU0J-Q-m zk5bxs2ko}+uloG?{I1p&aH%w|L&jCER-5{pDWBC+Hh~Fm1jlxw00@#g*wTF)T7kozb`v$<5bQXNrUdMx$kp@(~^j zr;_m~2s+*pn%H@pg;!x6*z}R!Y`95Z7+_GLu4tn7!zC8N{i?Ej)oNJ6^1BraUc^Ra zB7}Yrv(b8ya}8a6er&+}AhLNn_hIpCb+(e8{7A5wlu$V6MiPDz_@Q`_Sh6{ z{wy-h-u6)pR?H=VZw|rGy5)W10I+_6fDm&bn&${p))#u`_Hn3I>p6ipkv(z_%DBbc zbm20s^nlGaMJ@s=IZ@hHSUM3DB`iR+**uX^7U5nn|8`cuM5cbEw9P;*?V<1L=&&;9 zr`FNKoRORv;e@7Kb7x&R+?#t0eP$-y3u9(wc_l%o6YqCAru&-`T#aY0ePsEmY-ckJ zMNi?0XvIiw%t(cJ;@Wl#r==Ns?d9#%9wrjQIq8(0XM(Yg={{3!PrPk0s5+#xzc0Nd zi{oISHrl|BhNU-FJ#lv5ckZ!aWgh-PJh0dY#+M{I4Gl?OqF>PC0mWcwqPxH&ki?A{cBpRk71Fj7K^y*(gW+G_hMfR}ah z|14!yyZKa2bAK~_VWp!zRy@X-P;H7|OAIU|ugV+pD!87WJRTbt_p)l?HC3t{V^#~u z=^^kMVpn1GC;bSUfw(&-Gs4~XBi8WpWIMNH)d*{+t58jimG--3_KSNJsP=cTy8z3d zBp|a(UEd@h*nF|vNe&p&(Vjnw#W|^m8ZqT=`Z*g z1PQ-RN-=c9)_NZ81=*R?DZ*p3NNz)8Rq5t44@j=JYSNzr8{!7WX&E@Edl1SDL3#D& zoK+9FS!}v-5h#gHUYYGo7a(k>_kDI-+$S+&8Y!eoy_K-7tOW2?W)j1*ws5MOEt1C5 zPu&#KqYIYg2xmX^8f$HsyE7_GoisDBik9VD#-c5nhw$&$T`seZv8|P=gA!ia_gwV1 z);fPm`Rnu*At50~&Nkg-x!3|@Qfn}4s)F0u65~}M|1HDgYUBWPNE8mFxgDdQ-h*g9 z>DHB|Y8oWma96q17L-)_B~J|BZyt+JHO1W#9!sT3aY5q@%t(gddP?* zLt=o%D{;XA*rqcC3@>q?HdpN{GrZh!OJ!?aaMtND;7M+cC;UN8t8skiiN&X#t7K}B z2wM6FA_TSGo|6MLVsFOYbA|hdDnskLHClS^*FFxS(k;bTcCYqTs*#<%aLO)+1K)ta zY&aHuVv5(HUR8xp4{74U%z_&awjQTGAZ}luv_*$R%p}P=wof)IdDVza#_xpg(IeAk z6fqMG!QoE3AWXN<(?usIC$H1}n%!rhwPTCAHdK*UyS@6(@Td;~N}aUu8PE_vhJ{~v z$6EQzM`8+rsWVa42cV_E44wvdn>qnV-^%ii~Ed8^>-ldB0Be%{ehz5|1@hOGp+ zG+y5<>roT0^x(PZ`l!)^!q=^wwqJxYofw@1Nn@`eoaN_hcJW_!p`O%AeVL{aOa+B$ zTqtXZFSC?`q{a!l3XyFcJb_p_Fwm;X8R{#y(BmNa1L|eIFZ39tAqwl`B2CWl@zbmXAG>mAo8`lFc7H`0!h zy%kX32bm$AU9?lLlVs7>VoLAB$%W+7(0w{PwxQ2%pCU0fH-g@FCmMsIw3XUXi}H(u zH8$KS{*>w&^dY!#KxT~c0f3+$!YxvbjQ6G@q`IB_puYU$plr&Jv+nQ^S zzjP%%1f>mNQJsA3BoBDEc#j|cG^H4NuO1ZnJOdIfPI@kR>NT#aePHHSu)E7$BzRnw z;?2+e6crU|WJL8L6Vo4OqFyK8_hw-NHoUYcFDTpEXbSfhpxv`U;cJW&X8hxt$P>aWWm(DXsG}P4UHjxzBAQdaA zVf$q%;(Hj|749*Q7%JTaBz13zdBXehXN`^^OvYn*I?&Kpg^9x#8>JFI@2+*kF;Ozz zo9*kz1=$=O{PAnDbyc6}=)##Vs_jlxdasUD)IYoV8zc|pr2;rx0t&=>QH_{V+l`U0 z?UE*^0%-H3b1JEHUpWBl&sxI53KSi$J#fBY__Z7Lo^$H_5~yHaL+&nkY7U}$>vt7M zYYjQNX8RN}HIghZB~o&>dL@|kwv_WiFK6FEDip9o#%D_n!3;g&>si`YOe&oNABQ1G zU3>t+KXv~|J9FV`lDb8ZaJkCJ=G026Zz5+#8DvK8+0P4N@^L>^n|QB3;7s~V_-SfY z@4w!LFhAHy_~s6C2>cC~wVxZ(Zh!!4ANCvkjXOCxL*gd{?MBLx!g5X2hZq2Jxed}g zxi01at_5EjnU57eOX{TIK>2NG{hn(!-2kKlD_;hMexWv5-z|KlC zyaN$Dw=s?s{5j_fPBAC z!G7j@y&F~Z8Yyr7imjK#E4QN+eAXXb?MNtO%g}ZcNjl*vlCN3`SlZ! zek}%C6L*H#c&5!EkR$HO9`0~Zp|μ4CCiIk{0^FqKvg^E)m?SI>1Kbg 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 T+e7e^B}h|ESG8Q(=HCASI;_oB literal 21808 zcmeFYby%FuvM)MFAVHHrAh-p0cXxNUAcGI?PDlt6+=5&1;O->22X_hXgdl?roR_S% z*ZS5y`|fl1J$wJRhi9Id>8}2Dz13CK)m2THijp)s3O))51VWdUkx&DH;DN93pr?-? zKKSBgAkd2wZw(z+H4_g~M`s5MYdbKhtCu5~6zpkj0Rnk09Hr_;z2S}vS@jC%g^x^& z?fYqpxQ*m;cl{|=SDh~L2l^)?e3cMWT1*c<>!A)7?8AWj+mMI#irxgV;)O*k#^2gf zc-Fsj`o>m$D_#!y!0zRZr5_vx?ykt4XwEW)jn6N=l20~P5&YVQHq~L)+3g+eIstd4 z2^EV_W2BpA)l0l;m8&{@sbIjPyKGVd0XEomBUVdua(B_@EIBsQc-GCd$2XgI&53ru;O|_iB8=0`M8C?r^vomXvKclaYq#0LAYzg z>=io~&>ikYiODnhYxtVpGWL1Xs+)#!U6)ky0Kx){_4nqmq0LVR2z z2l=_D&w0@-Vnb8)wbaDfV@u&HRfYBVI5}*~^Jf-HW{jjW7#k*RY!%ajSEs&8mU3wx z@wr|u$ycQpLc60 zYxyX6DX_PRpp@=@e$GD1!74Wpu4!8^1DR`0SQu$o@?M-?JZU_Wo_XUtaZ}jWk;QpE zs^^{Z8|y-PrcvX<=cyAgt&Kwqb@kox%4)sNz?Hz-Rx3G z5wa!P{+q`SY|xLbAJp!Rz2sL@P&1o5C|tg&Lvd4XT~_?#>o)9a%rKb6S3-!VK3jLt z^Ql`3we&&Z(C%hWey$3hW(D2j?FzePQ&6vnb?q_n?G)%ktk}IBPlCkQU9;y`!sTi; zb3X+q80z5?zCL`4-lm3U5WtAu>@!s-w^$VT86CUXeOfNHrVMU~@MJA-_C1dBl2`Ux zXP&txnN|(w-nDZOuOMWqjL|{FZePmutNR&o)s-J7+*KX%JmcukA{`Ee$~<1Ls#I_8 z?Ah#Lzq;@CEd;;e>w?~ZkJ@8QH(2QTt;ZNgj>~OmFIYVA*nZG}$9Vh7N^mNst1Yx^ zkyS!St!-C$zICR|$W|q4P$2|KE0^d^by80Le&>%vDu2Zmv9ak@#;98lnl|r*l0}V> zUOLx?N^VOE*^`{=7*KqgzgZAjpJ?NHX}#L)Q?EMIKcbUvKbMUj|7?&1)N&(0{`0JE zwAjOC(Q%@=AkeaXe(dvnO%B>-;ZBR|(rMBU+ctXis$7p_*7KENs9DTcwXSHgXv^cm z7qm=NdU)$|z?`e_a1}l4*WccR3$c;pt>Nh;~p_#}4 zleTXM<~x7PM9g=lK8R!Qcio$WuUKA?@xU33A)|de_2Z?og{vuTzN(G<=$;P+KeI-? zepyXDcqbvvq+ImVXQi!q9?LGX7=^5(FRj)0Q}X7&bK^aPU^By-Q*hC|0x#Nhcl(Z{ zE9xWm#=SVEz3fz?{Dvj#wizsEt?KNbe(K4w(j^q1bN-)==;9uc_72|^+ZRFZv7s5Cwv z?(+J@jBMd2DjnKp9_E$8S#N!Qy`u^oY%!4`GeLWGFHZfeo}KM~+1O8r zTZ5?%=)#-QnT=GwwfgP&yFfYIDr6Rmh<3@Uu-l3ujpv27y(nT;U`-@@i0ghSRY0!s z_qQR6a<7z^m93lQNa`B#GtT#$4ak4YiY{ZMRuH44!c#ah<`?{2Q%kh5ujLjjGKa0i z9_YeG^N95r8#RxXKTCBl zJPsrhLi(wcl(J>Kp7TJgvWzTQ>&aI>Pt9sd#EiMjJrvX@U6FGr>Al!gv8>`rx-4a$3fCtGG#?qeGasX||ifhFFb7=xQP} zw`A%5EUHZ#&Fo0I->{LebAK;5tD&}tOaH)iY~bE{U!E1zFGhgbK<260SQIJm0-b$r zB-+ycbD+Iq({7u+lacV*zEGBaEGoJH9~%-4E?G3PK9VX<@?DvonQKA4Y;RQML$M$n zYXs>i1PeY+%Wj+Qc& zQwyHV;|=y&(ge?ieMw0|<1K&IIoTSwjAU+uR+)3~^HSNilS^ec#YDu7K<9l!u`>DD zUC8t$nWUs$W1q{*vA1%ke4%~`?@_87 zqHq=7>_zUM!ANE-iX@#V)mq>qTR1?-dCR;-$=Mm)wrzdN@|Fp zQs^XY%9=T)k3*wRoxX<@9gkWNIa4t=!X2Eeu}5^y%_-h*A95RHn4q#M!nT5&_3WhV z%o(1BnWd*8tjMvPcEol>rEK3fW!LX1mHM-y1p`}Q8Bg&s*I~qyp~(CNX4EyjwvSKMU?~J_W7`BG=H-B%y0*Vvh{a5G*8jg;C|< z2VRUD7!hIGWxw?eYpAh%iIPFW@>1qaHJTuS?q)f?bqm94vTHUaDZPHV0?3GInDs05 zHQlq{Gi1hiDdB58=c8hW?=VUgBxc2E)D9bR6)6FJuQ|LALdm<83cIDgD!YJ&l^qqby@*U}{XpWQ6bEfhSF>Mf zx-+it0}ag+c>~wh1p6g)QzrSZa83qC4JS3k->Hl@&V!ji8L?&}AOkq4I&8Wsm^b(7 z3r*Q;_+_D*sZF0cj-4{eV>-B;rw>8m@afAi3q-YJH&&{4_0Xgb%Wp3ZnCvjS!}{mS z5%X{*ey+--RmN}_O`qn-d%$GDxh~4~Oto++j2G}>g0~JtxNJhYXyi^XQClV5Io^G% z$T=@OMN!j2>0J%O&u3m=z7P|aJE^b7Aq95ot2FdiH{;v&8Kk#lPSh!!liT1Zgko{|6snHp*l4$XND$cGA|aBww2S435S$-n z%~rAfUalB*VAix$HG3GP+t{iq&c9Ii%hP$eQIF3NhU0gQ9HLGvSSV8q?%<$q)o|48 z(JO%|seC5 zH$|zgD*v$6-Q>vCeOV&h)n0))buz8>grONhZroE0iOw4ExO-TiC#FrSKi!5nzQ(0s zFYDPXo7gOP;kWvF&71*)s{aexhbSedQ}jAG0R*CAf|@{-oNz?VkciHAhB@9;48b4R zTFKnqx>^X~?TVjb>x<@P^?teJx)CF8Yw7ILe5dCr%0rqrf2zsm9FX{(WrVm$2Hs4q z!t({nAT4oFMrGDikT#rTAZlk*&d)+Mr5P+8R4q0nXP3R8?XN!$_{m?$Woy2G*?U+? zYE07UI?BF&Wf|iw5&JY#N;>uC{oLtW7U?_s$=#2a?mXOGFkxh3BWby3JKJ-a$( zjMI-GwWKBg%0N-?Eyyzq~bo@RIy zkL;^9LDWpbED0lPb^M+k8F>@vi%#_PZ>XfNt=o>f)d>%r)}sscMI7lP5M)Kg<3bXG zu@UtID#H1lC-ECPugRD!#n{04NTh=(nAcH0-FqQX1t9Wrzhxrk_XcIbl)Rzk;5h|8=t-rD$qsCG#=KU2lkr?tO- z8<;h2N)#47BR*Y1K<^+j#r_^f8~F5N_Jd&nbYDY^qhygf`ch1?F<^lh;VDngn{UB< zEdEbEd2}s1+Si!A@@skGa8i(ofha(=RrX26S0S3go8Du!;~T0RD6rpWNXEV4`>4hb zqSN%xQF!PAt{IwF;UTYyl$azQ2nMwr$=l42`x6%P5s-t7h-WCf6{%CQ{ed1Ktw3V ztTNg3hQ8AeO^Z?59A{Q6yvZmCMJy@*J_<~kTb;5Uw^pG1={Kw5sP#(QHstLNqL+^N zNq$&iR0!5W`ra}O9b`eo$lS906qRJ6OQv02Cg0UEhrrsXoY6YI^7s;-@!QVHY)^g7 z6EXQ+f_K(*Ua~FY*fUHnqGzDeg8Xn!@vi-^FGpV4gl=77>Ny*QzCdZe2)7ZO!>0c% zl}d~$x&yBM;e>A4L9~OfYFBtOg2ri7lSe}slq9+RZnhooc+_THMAb*_!}hOLvH=cn zsYcSCC!U3Yo$7rx9MUhbx%rT4C4^@7U9Fhr*+DRYPt2dY<0yZ1LU|GSpUpHGA}=hv zo6gdz>N~@5U2Q&Nz-1_%8R|0VkNV?sP^D87x&KVRNj$ zo!b5D@*z>&&f|pN^ zPy?-`g51u~B{ggif3W7bqSL2jwMn=3FBL82k1|Lvgtj9rS9T?jvyyi`dA=M<YYVPB**$%&!|u~j$NeeImySK{q5z~D%j}0QL6u3+Pro|$ zDV_P3e)98zK$sEMK_i+)ER2$#*6wWNLMWsH&gK?;Y7$a^ zhX8&Fl3TgDI`T0ydw6&-d9X7%I9oEa^78UBv#>Fo=aEbxN^cpiX& znT>^ohmnPik&T!6uj7GUMa6%Nws-lv6ajfMdzv^hvof(TLm>Y$!o^k6{h#ywyCYmQ zfD9b78ra3b&Djhr=?=DcrTFWlj&^P?f1T6K1^n3bhi^M`3ub_+KQsSzjI^wx%0I?D ziqX;<;`nF8BlTY?&CUKn=ji5a_lL&Zj2UbPh5(GX0LZNWLhovA@y`YNm*;ux`QI1; zruzr}zfk|1y#Da=N3MJl4rXqTlgdg6l0WjxXYOETZO-@SD<>N_H@7JVD-GY&W zm5Yryf8Tb(j0B5oWa5y;G%)w@0Rz?#}b{0ks zb5k}(6EG(SqnVinF9!h6!pm*)7YJo%Yrqmr?EcEtBa}G+Wolx|0q|hKXkl&!X5?V! zGGjC`2U{?jSn#k}fVsfzVAj8J^SBOtqAIe2=M4m=B=xHH(q)xlZA!NE?D{E;)#N60@WMJn)j zW8qV9F#9v`4>8#M(cb=UabhNx%zu6gF#kuy{~MCJm4k=<|2Ld}lKull)Y;X;!P!>X zS=rPEZ07nO& zA5oE#{&50)CT4#Vzl(`G*!<5D0CN0WmzkA`y(Jj%wtqLZe`~k?chs2IoP(Fcl#`2* z1#AN79w!esqX`?g38NXO1*ZuYhlwcq5I4DzbobcY4~5s{x(|N!O;saS}Rv&5BvXc`hSP;ZwLz3W?*|4hyRH6 zzmoh-EPvT|0G|KW2JC0R_Q?E?{qgT=@n|{!jjz9}+kfK>0QCP%@}H9L|A^~<#Py$& zz<-MPf3)j=#Py$&z<-MPf3)krOk61cJYj?Ffk4j#I6r$g!k2lZ61)1`v_L0Lba{MASI=X)_ZZq=l8xoKKCPhW|Z{U`|@kblUQ6^~nAr)k6? zywm;4*T{3Qzee};oiM4ry;3-n+Pa@?j^rm?;**V5AB>Y_c4Xz!F_4szhw( zYfZ8%6q4Mh6j69#DL3gf1wVC-p;L-($!oeRegQLqYAkqbSfQ3F_B!1J-Rfycqh47& z-v{Hwe3b-jemn^yX<}-*>uuVs%(9gFWM`4dBgT->taEIt#ig+>yZ$-XCgEhP>8s<) z`d6)kuYSt+-&I8Qb+`G-Xw-DNUrIcUQI&q8sU!2FJl2$4d`A}Zp>hLvfHJ-mUMlLz zRJNG&-CDpepLz=?(tmgDYFbw>RYgO_t34X>Hu|<=?8Fs)c$pKpmvJfyr+2Et&f0m1lzH|*DA zXFivzIF`q4@#)a>Gv;LiBTyjWuCV|-h!mI}5d;bZKAr<_;C_z?@bMIQ!-4*Pc9H^v z|H~mgQU324``;f)1Yq_5>RJCi$Y0q1rQ-bi6oCM%|5YpW-v{})@c+eJ{x?BB%JYx5 z&w)rDveoj3I332TeWHmGkkAOZ?5=+Oq(H(Xp13_5TYbnjyTGq|7ZK8SyqA&TkQ39g z!c5wz(1gOMUw6EcXZdiC@DYuO?wo|BQhLm&Y_XQ!xT-opMaIO#ufSO0g~Q0lktHPe z!S2^FcTZGVQ!B&DtV>*cM%{ zMX9)>W$(uqPLDlXjEX@Hs-7T_^o>ZQfjJc_<1p&AI;^(SYnQ*Fq!jc%-;EZ&_q@Nm zj=*Kk6!f{=9EeB8BwlKEJD5A&IN-K>eZ7@DT{3%qiArZ4WU4{r!MqxmKNLppfBkz4 z8H2dh`(l6fM69)2Sit}8>K=AGTVecgy_1!fn|pJ9oonzxj`&7_-UA-t>_qpihcFpI zM1%aNnhvZDM?t>X>k+SjC|3jS5jQas$cA2X?l-<@g)8UacM`ugqYV=dCb&+U++|PS z!HxviCsFOLMbDg2RYm4Z$4~MZ)tA77fvw2eJO=Y79^6_2?x!6Xv+mo1%?n>9gXnEdy+oGvg1^Eu*KjXcD)s3n4mPtosK`mfYc`H)qcb z=9&CoOGtJ%n|4aUcMfq^>Ym}C;xO=d{r*C;{s21(c+l=S5PrChrcnk2*ygra-wwNx zPM}GwV_hS7POe8ilw85%b9s2u@lbxxbnkh2_;B^$0RwGE$(JcCyk|THVc|7ZN^qwKZ4uf}(=~U+Zg3&xzOx0S!LWc#AtFHMQj? zlRxZYwz09%s7>es9c^F_?pL%L1ru~HQVF%sia>)~9L@8(QGvwN!@*&Jgl>Tx(6aq% z#UZwh+KbX1!Nv)zZ%~gW<%-!_i0MsX0MCc{_qUC{{l=+Bwks;+ttmcE9 z(#A)|_O+RmX0@KDfy2k-&=Re-nbzwwfKTed_J`CB%Khcj)6-mr%PIY$W34&E)k>%M z{-Pp4IX`bPb*J53E;^9ENaJ+4PW{LY_p9N?TCBV#&7c5tMvIP-uBHGN&aGsVuR(W& zdV8@&23KneSkl#1R_Acf5Ss;~+{A1~h}yFvs9PrI1QRP$hD1lh?ABrs4*s^+7MVo; z!*hubU0#0vCwijDX7Wwsim>G5)T8l}?)SE;a;5L+8hZ^iOSfx$ZIAVUjs&ZSp4dD zpa@UuVsV9tsGKSwi9NYpaz)S%7%mP`+rh|!8~X`UcnEG9zr#vJ$NkN!f{&orZ}Y9e zel_qQ7O3KK%wXl1ttpG?&D{HEs!{aRg^TFFwH*Qvij3-?gI3z3REBEG;O%|oZre6Jc9tkiNw2R67_?}=D!aLD33@@N1F$#W;Jx&ezioU6)nSoPnc(|GBT(TheCOG*Bd%YG>VcuAp! zqCFRVY1E1h_jXRhQKVWCQDh*rRk(~JKkH~+Yu?^_Hpfss!^}oQt@SLO z*=;37V5tPE8d3lzSE+rqp5#rh8+xZFcuri;}J^T*H5Huomme4yjDdAK}U#G+C{dlt#k6kvB1`a-+H zNS<*(!WRRdqp|Xti#UW2q~;xO*s-5qQZ#4{_nc7U?amTML0h3Z#(lLE^>o+v#zCv2 zf?fpZ6BFtjpE@pnoUSq{P0?EK$rru?BdXQVLt)TcPPpf96-!bb*!M|;fAG-Ii7DbkH- zg;8B9c=^IUE8uN_OM}575!Up>Z>>|9o+v0ZS69O>OTf#tR>J4*>hv6sePZ`GSuIB` zF@rzPxYg67_ES_?7&;xk{l1W-5WD3FTPo9f##lPr=KN@O ztk$&IB##ORSGc`#fi<^XEN}B_AhY?cH3=9lUR#6@^tjG?kqHZdl=s{H4DoGR3xjRL za)wUJ?I|8@+2KidBgRpjk|Z1TlfZhZo+V2zi&~$fUM3*&awZ`n)_dD$H*bVn_yMRX zSr~Sn>>aV?8#fQdJzPhg40Turm3ubU`S#2Uf>2rxI&N$d##JW+9(IJs$Hy)3()`?7 zb0mjKdwU5ayzp^xEx+5_I$)n>uv?aohx9mfz_`r&Rcemre>LpP)M!`SLQe=Fh!SOb zTYE=YvT)f`fxXai->KnTzBd(~TGS;7vr3`QOP!Cv|-55l%Hiva_1`BLgT z+aqb5Hti|0aBl;swI*x)v=Vg(kr=@8jey^FSXIL^6}h7>?`nPl3ZLjvOoLgQ`)+;5 zf%px8X;#`t&!l9dkUGBlC9|j>EzXWv?;&dXkignrRhzfELEzGs5wazRW~2)Jg#zyH z799%PldKOIB)Y^9qfKzbX{sqG@>XI9ONdzBW{>yS=91d~s8rn+Y@^dG&FXOcwp$%2 z8&9?P7IX(uEUveEmRuYxQKr&7#%GaJZY86H3G!fWVCE}mUafm}CfY$lwa8drrp9%W zBeQo8t!f*ozLPsMVV@sAS)!h?InZt>XXevK79sP1Ej68eQnKQ8*;Yt#e#Lf?hm1yO zpmvR7b(z!kH z(0CB)kxy)T`xQSkJ$}y}g8VDR(%XS-4%aiD==2nEOtbZu~YK-3m3_ zrop{28n&^#6rfs00(0}r!qdd6V19XrC>*=*gm;L2iScg!_XVr%A6MKwx%rD{l%2)y z4bNO(m}o&IEe}9NYGu76Y24_j72Vz49%*&`=XHIVEA(1lIqU*LukiTo({E(?k5&(U zt$jo2YT<^9-0W^B zNg;zI#;t$*`qD1@TyiYcN@Ewqs;cg5Kf%OfoBE}wb`yZ2Z{9FhJXwH;@gzbxMZl|i z0kv`;^n5U(zagM$Dm%a2Ifak_w6Kr}w(Kan`PSGZKPl=z7DB$lw2DzHzeLZC-|7(? zCLOZpmu@)(xusYj9IUU#vvzq7l0wH9n6tWWG2I&cjC7R>z&_j0a#pSKk990_^lFlx|_cWk0|Lb%CR?}33HXlk-AuMc?4K@HXE49TWZd$lMqmx-JjwEmLY zeIODkYre>@Flq_;2@;M0zhcRWe2NFhcFkeOQO(7Zz#@KNj~J>vW>`SXXmPC@=0yA` zMJVV!#R5{w;3HBMo1PiW^nQpW;KoN10iuSB)H((i+%0-7uI8t_T<#Ug4k8%OK!zf3 zgNR(-pd2?DZw-SS52ja+qZZ7RoikRy?u{$K9IIrs@=fi%(TXEo>uctmESW^+&6XV0E_yAkOEVfL{%uq#Yy9mg4uzG2l< zns)~wB4Vpp1eEy8*%s0vQ`%<~w^PuZd`m327_}vsiCKO#dcSSoFt)1A%T>y#FIJx? zo5H$O{NV!Ni60bxHJrh{Y6ar(DlG;$T4e6u<=ae#Q;~vz>^NV7fPi4+#|uN}Gu zR?qQYOhBNL91OpP&J4J@DJ`;iC~aZ)uAhq@$V!jXwXxOkA}891!%&a*7L0ND<^HQg zi%*rkpD>4$qv^0^b!p2Pu}*o}mv!yw$wlyYTxSP=;T7xR#IoDESdf)nF^Faz>p4-| zQ01K96A15bI_ODGLk8;UFpf}OK;=&QybuErh=uJ-qi1a{;v267G;W>&iK zo~K5glsM$wJt#?x92`unTw2ac6hi_e^uK|ZcC;FflR+^!II5<=App?x>#?EatMlF6 zU6jPBV*w?QIj;Zx6YhYD_BHoZVLnTA_!b{pB8HN&4bAPjJII3{WO4yR+g(OrMbga8 zJAPE?_o-VZbBnBj*f+)1gLmqJY!YXx>|qhgc(==f#_NRE@SWZWBEK*(j+SrF`umHf zOSLhH+1_yEzQ1`$0`)UZFUo;`7m?NpxezTnW=P(XD zX_|&ZV*JQSw;TiF!33T3lfVLL{tI@}BZp&uH^mCi?=bUBN43_2?smROt?xd&%Se9Y zgRV{EYvQU4a{1^xAx-EQeo|bCCX?8;h8|dzi zXjVzn71mn%Yx$%uL$p|zme7GtNuAP80&syXa~q7GRZ0LC!ir z6vRoCw#C;VTM}8pfS?3PN)+3RnHo7&h%2qyyMJ(IR`W@~-qQ*tvI8hkm*#D^hFpxWud z9p1}43CyeSRmDoBP$(|A`6d(ZBR&6@hJ)+dL~R<%Hre!|?}Z%3@CZb+1CZOiL$>9n ze8$9kL=fED7P#lwyIi~RONHG1#J2hAsKx>Ug@}PID{khP7xZt5%8wLmmD*a8^+{5K z-$EmZid&_Rt@rauTx0W;e1UW3c zqbNMQx%K>;rtE2X{7rscXJ0QoDaV_K%qK4+JR3%_-F9kMDiy+7g{23}3d?lI&kvwb z4?R}do88O&jk6xcSmIkClh!L20IXMk65QHOMVWz?eqH+eg~Ym(nQ2$Z23vkW&~8(1 zo&7?PmRA()^XLp~{VPza662x6iRx-V?r?#!&vC)WmFpIh{g3Yw$+lG6*s8y1Efy8f zWNew9>J=IQI~p+JWwXNdG-EHuB?O4E7fV;1Cg*}-M0h> z{x0^Q*5f_(LVFmMLtDm+I-A*NbofT0p#Du@dohNzh6L40( zhtMf+$TD5M-VGLr%Azxhh`$Z??kR}iSs<{JhrdZ&d^slvYQ#7w@PCz9ZPNg~eYs3Z z?44{KOc}m$dpf#`$^8=z8gOo<$w=K&A>M2`OQUbJ_@mhvzEhxLvQRVYnF7fC4Ahtv z6EFr30T7tSxZtykh7ZS(ZzbG}v`ao4I2kn9l%wkB7wjAiCJwKmy#>cNF8T~#)Z~0p zl3(G3i=luQIaYWJPr8WI348DBgKK>-oAx4OQSJnyk$mlb6`!uQXVfZ>o}?r0q&Odd#L0 zy=jn5AFo=K;)JxHkBP#q9pO$jICQAyNy+00S{wrDkEftCl)z2I(}S|Zr#P>z2DgBC z&vQ4!5-oPF_IlfX(noCRf@u})PFthVYIBXb;+5D=F*V5fM(*tk zf?FsFDah^(C=Tn;;n>*#7I}HJQ1IZb?*+0NN*;94*`7FXFvt+GQc z!toaPB5k*YnvDFHPp}D$pz?qd=E4Q#x_b#rwr0eTcL~>3#r>-OjUE;HIa?LWwZ{j<0lp4stN=lL?#8dXUp{ zw|X8K2-G`>88xwRN3hR0X1}<9Y0Sz#bl2`q1GXRl@)-!+&-6w|w}QFR@_rb-6deQ! z-UlM(>K`}zXi5`pfTG+p*0_3Yt+vRRwk;;yb2aS=16$3UD+uw4?lJYG975-$eu6zv zDA5A+-}gsiyvEUpG#~{)rXrv(9aINvCdTGxU~%u-?hLI zBoTPH7&G`z;FP&<8DN3zF6+dkegk%;R)X&g2cRuS(|M&3vNaF5lA1y~V=B8oViMqF z0IiHh)t?4IbFE$xCZIP|R9eLrIqU^P2^F5#zh8B=ghoe0)$l+;LHpd%wJi4G8y+;?+&XBeQC4uP5h+6eVMNdbagRnY&%l|Nogt4Y1%K-Z$LXSg&qq^`cA#d zX!qZjf8O%Nb2e5`ktEt}w#9#59hR~TM4F>l+i>+npi~S+qVi+ljIFXA>^~k0>d%2w z0TNMw)pdBDt|ywx-wj-yVgU@~#`&MD2zKS3bp{2u2bI(_`sRh60NLNjdb5>-U+v)I zT>Cbp4%lVd&nhkgF1uepO7+jykMvb|w=^&APV+b1jD)C+Dp&e|q(xoLt9a-uAcu-4 zg$m&TowqAR^jb`KHKhn(w^nr4>o#YLz>`uV1^&`K8Osv#v(a&ul#+T?-w&P2x8+t< zBQWZmDbp8h(|ncjVd(RY>Lc$Xw`(jPT?KLTx{? zIH*d(9<_A>Q|3-TUD!+a(PW&A76=6JN?JnDl*k$Fn?k!`NASl2Lo9gGk4T*@BdOGs zlz3X5Kq{Y*5I=T4>pt}(G>%dpjs9d^*#bx!-WyyQW%&VxLaZ+A`D$>)AojqT;a8oi ziAqd4iSLyrB|}sm%(Fk2kK)$fgusQkvVz55d9)q;DBnj0C5+gFxYg{AGS0jL0XqgQ z?5o9PVO5W=5~@^$6d7C$7DBd8*u>6g20L2dpOipD|Dkd;jnO_(mJG?dzdh-I9xW=v zZl_9De~o7Fhn%>aPUNE`vcX#SfMQHEiLlAl-oU^BWKni_TJDrbSwhAF-sf|byRCk=?#tfjQyrQrp~rsUav8P#z9bfbrBq_Ix%U7SeUkI^aaD%j5}s(dDqK??L`#@^-NEC{G$lwyFu zO5ffKQH|1)g1+*B-sg0M;9VMbFm#M2ma5R6327%RR8{$)*GS*V`uesSXG=5z^)TVF zxpyH64KGO&!VX@;ziYtP|3G?gK9WkZ+-BaZbRp!-KhS#kRLvbro%gj0o!A|?xUA*g zfO&sQ9Q4J#*co|~ZgIayKXl6X2W-f#=lj#Z^w%Ju_`>R)baJ-C+0JYjtJ6PH}_zI>sw9aMZB5;Ie7`AudyKt}JqysA>O; zVXpIWIa^e6uYw|pFl3Qxy&|lGp}}l8<1+(K{h~L#2vD`|s>^uU=KfK;$#;1b?7TX> zEnxe8%9`=A;j+>1CX<#z5HYY0Iq>5O@NYU3yWd(H?3Znp3k)rMtzbxzpP~dqlV$P- zHA{!ua{?T#?CidpC>pdXWeFKlxZofrFzNsNks~f8eBK{Rk+VO;dM930>HADxac;Kf z=LA<@KkZ=D9XLD!UL&QBHZ*`n-Qdj0rLTw<1GgcCMVU4DqvpKl<6)JNxbVK1j^2S9 zTK9uDR8oA3nL*j>)00_cZg84EeCGm!h}CL)@OYC*u9dvZoOXF@3jaHx{I=TcRyyAA zb-Ld3{X@j2x6=LWm)+HXz;UV%o?}2=;R)i$6ev?G>>UoXk!daT5XdLI=C=1W!MrYx zC-$Bl&lDzK`W^WUrSXUKY@~e-PlKWXdFf z3~d{2;`~&}zGx1Rf#giT&HCN!4)gBnr5csPKxg(}>lDqqI4xAp0xD&TeZq5}f_LJn z6#dV4W5-)~oYvnDbWty$AEwyh!U~TpG4t)kY~dw~5%NxvJwVT34@@0wgU5Mvyav^}N3!!@Wg-BjvE0 z+FYo!m5N|j)u}LQliC^;utsIVuX_7atSjF#Kruaw&uzgLZ!V+6CAl21cBxeZ>>2j< zTP9MTDF(L(Kuv``f05Q<;oy$X27zrt+uZCQF%g(P85P=$Q=Ru}WuH5bU-bwMRkrt1W za`lR!fuUf@Ae~~lI&=cA`}>yD=;xeJ*ez5Vd+dj5zEOM7P!c1%!K=I3PP?fRP4JK= zLqb&@Dv-S6<~v~rKU?gLB!EppOk+zrMO5`Uel|kbnJ}C`rJ9bTuT{%}?oKYxPK-!X zO|8*qp;ng6>;@HwMfmupKdFno9*BxrZPfW-PeF@MLHXXq_*H;c$|Dk`m0X;!u|!74 zCwxu5oN~NDvXp08VeEfRS(mHZYQNMte%uB{0beoEX_xt5{W5tRA*d$|JFl^#*@eL? z?q2Twx<~feSpRf+``~~z$$mk=#U_5+W>nYuk-Vk^arkyp4zgULdztrn3+|V*ed5q8 zg4#0O{AveKAAS=OfVE*D9gzCuiLp$j3|le57*OM2!w~~*c7mSUwCV0#oo*B-X41k4 zSXryGT#v~o*6YrZcqPkLxkO~%MDZPN4=Oq^NLbf7mD%lhD9FD+7B6SZ zjg^mTy1{R#sVi11bAUi({WnVCtTx557~-71;%XRhc=b3j!uN239xpQ)Hm6z+7PlmC zZ{RdB*;V<@Cm-D5fVpB@w3RRdlhrqp_sBnayap2WLvH>xOKOXHiPf7X%~88doY-~& z6ncwaaNuIZ5k#b&YosWles$_>}m`55HqB3YbY5?!c*yXP(Qt1XED-zaUhBHbE;T9x7!y8x|$ux z*oH zWf(dUa5(3*z3QoSLhnz&m;|>TZ1B-zs5+M}?MdKro6b>-oBBMgtm7uX9%I(SdVyoK z`s3c#hJZstx90@Rb7xQd&5H5%8-7X<)ddBpy5;-vjaJzrA-_Ar5#I?t<=(0>-2=U< zz0&oKE&J%GFC~Ka`Jva=;H!&Sv+sQRF*MR>gTX8ZlE>;8-*v~S=eRW%O2MTaN*~!ad z>4Oyl5x@W4hEkUKez_N)vct&j$!3IpoU9Kt93wqc3^+h3}6QosZX&Du>Z2=og+~?0l?M4+;oy0=EjTR%( znkCaT=0U~|9?X!Q2>_9H2P3tLHYS~P<%jjS4tUV)vN#zWFS^#)Q>?f&HB(yh8}akw zjU)QRf#1?4Z)OZNg}(KUS02NGB5LZ1G;2xqIRx1}@zM7M!%UxF0nm??rBv zcmcP_4wH@j@pv3#=D96o^j~BJLWOr5ea15TqDd@&F?9#rpYN%Um+Y?O6*hE$(=OZn zflQD@gnmj;X8P$XWmX_apYfeCXoXzf6c1rcib#(59amV(cz^2#ecY6sq zVDOO2c;MAh!)g>E@6EJ!UU)K{I!}aNcMzG$ae^4&gUgr)&a!r_JRwv?CmusAMLb|0}a)Dzm2TY z6Cmb0#ZrDpEzio7LZWe~c28ycYQ^PMvao$|MyMYzg*3Ms>YlPRRy#t+LBge;Dp711 zxD4~$`t>vJ1#j7TLoDd3l-RJtB<~c9s{44^XJ?d1H3Ju%JI*45C;dv5Y!C(%xB++f zRX({q=LIDSIC#C6ndJ-M9v|y_XJf+D)YK6X3Q#6M0X)x>jklR~9{oVD*!P;A*%#Pf zte0gpiY3yPf9@;gzj@iQI8c0qnm~I0?#gzZxy6@TW1gRnVkc0a9AsfJf_DJLl3<*( z-t&ZPoh$cGBr*O3QtBUv7L7B^&YXpx0h_rMy=CDshDTcgB>v7R!Wg~G9Gs!I(p9>2 z6JY19|3jR4q2T(G(dXL5>c>oL(;{#Y>zoP;C=X;%Z011GpOzcc=>h4mZQw==cqj=0 z86zEtF_wmAf#e4Ui4cR$JWv$8vzaOiiA;MhnZRP=F*baeTKK=VJwxD1)#h^x9Gk`U z<2C{3?dR9qmHhhh5*W?#I|?42nQ8n;uk7uutvNS0B_4Lavi7=y%9R=e|qix)}Jrhn1YV+J3UPMLf_b z`~2y`@1LwKEiG;Bt?n(Y;@VPD>+ZDPJN3?K=ArlU3%EHiwX$g+vG1tA`a9zO`KcOB z&CNPm1{c1pwQ{|v$+csHz|#u9k7xF7`pYa{u2pBF)b*;1P5Zgq4D0<<+ZFEF*tk@# zns?7~+l%vpj10gL3;4Qj@WNT@E}f=4nQ|keStUCjbs3Np31JInUQjgLu7%s l0D}!Ha+;;evhB44$rjF6*2UngC6m2ZjIu diff --git a/resources/lib/addon.py b/resources/lib/addon.py index cddd5bd..4220cf8 100644 --- a/resources/lib/addon.py +++ b/resources/lib/addon.py @@ -124,13 +124,6 @@ def show_search(query=None): Search().show_search(query) -@routing.route('/play/live/') -def play_live(channel): - """ Play the requested item """ - from resources.lib.modules.player import Player - Player().live(channel) - - @routing.route('/play/catalog') @routing.route('/play/catalog/') @routing.route('/play/catalog//') diff --git a/resources/lib/goplay/__init__.py b/resources/lib/goplay/__init__.py deleted file mode 100644 index 67680bc..0000000 --- a/resources/lib/goplay/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -""" GoPlay API """ - -from collections import OrderedDict - -CHANNELS = OrderedDict([ - ('Play 4', { - 'name': 'Play 4', - 'epg_id': 'vier', - 'logo': 'play4.png', - 'background': 'play4-background.png', - 'iptv_preset': 4, - 'iptv_id': 'play4.be', - 'youtube': [ - {'label': 'GoPlay', 'logo': 'goplay.png', 'path': 'plugin://plugin.video.youtube/user/viertv/'}, - ] - }), - ('Play 5', { - 'name': 'Play 5', - 'epg_id': 'vijf', - 'logo': 'play5.png', - 'background': 'play5-background.png', - 'iptv_preset': 5, - 'iptv_id': 'play5.be', - 'youtube': [ - {'label': 'GoPlay', 'logo': 'goplay.png', 'path': 'plugin://plugin.video.youtube/user/viertv/'}, - ] - }), - ('Play 6', { - 'name': 'Play 6', - 'epg_id': 'zes', - 'logo': 'play6.png', - 'background': 'play6-background.png', - 'iptv_preset': 6, - 'iptv_id': 'play6.be', - 'youtube': [ - {'label': 'GoPlay', 'logo': 'goplay.png', 'path': 'plugin://plugin.video.youtube/user/viertv/'}, - ] - }), - ('Play 7', { - 'name': 'Play 7', - 'epg_id': 'zeven', - 'url': 'https://www.goplay.be', - 'logo': 'play7.png', - 'background': 'play7-background.png', - 'iptv_preset': 17, - 'iptv_id': 'play7.be', - 'youtube': [] - }), - ('Play Crime', { - 'name': 'Play Crime', - 'epg_id': 'crime', - 'url': 'https://www.goplay.be', - 'logo': 'playcrime.png', - 'background': 'playcrime-background.png', - 'iptv_preset': 18, - 'iptv_id': 'playcrime7.be', - 'youtube': [] - }), - ('GoPlay', { - 'name': 'Go Play', - 'url': 'https://www.goplay.be', - 'logo': 'goplay.png', - 'background': 'goplay-background.png', - 'youtube': [] - }) -]) - - - -STREAM_DICT = { - 'codec': 'h264', - 'height': 544, - 'width': 960, -} - - -class ResolvedStream: - """ Defines a stream that we can play""" - - def __init__(self, uuid=None, url=None, stream_type=None, license_key=None): - """ - :type uuid: str - :type url: str - :type stream_type: str - :type license_key: str - """ - self.uuid = uuid - self.url = url - self.stream_type = stream_type - self.license_key = license_key - - def __repr__(self): - return "%r" % self.__dict__ diff --git a/resources/lib/modules/catalog.py b/resources/lib/modules/catalog.py index b600e9f..f5481ee 100644 --- a/resources/lib/modules/catalog.py +++ b/resources/lib/modules/catalog.py @@ -5,8 +5,8 @@ from urllib.parse import unquote_plus from resources.lib import kodiutils -from resources.lib.goplay.auth import AuthApi -from resources.lib.goplay.content import CACHE_PREVENT, ContentApi, UnavailableException +from resources.lib.play.auth import AuthApi +from resources.lib.play.content import CACHE_PREVENT, ContentApi, UnavailableException from resources.lib.modules.menu import Menu _LOGGER = logging.getLogger(__name__) diff --git a/resources/lib/modules/channels.py b/resources/lib/modules/channels.py index 397f5fb..c1c54a9 100644 --- a/resources/lib/modules/channels.py +++ b/resources/lib/modules/channels.py @@ -4,9 +4,9 @@ import logging from resources.lib import kodiutils -from resources.lib.goplay import STREAM_DICT -from resources.lib.goplay.auth import AuthApi -from resources.lib.goplay.content import ContentApi +from resources.lib.play import STREAM_DICT +from resources.lib.play.auth import AuthApi +from resources.lib.play.content import ContentApi _LOGGER = logging.getLogger(__name__) @@ -86,7 +86,7 @@ def show_channel_menu(self, uuid): listing.append( kodiutils.TitleItem( title=kodiutils.localize(30055, channel=channel.title), # Catalog for {channel} - path=kodiutils.url_for('show_channel_catalog', channel=channel.title), + path=kodiutils.url_for('show_channel_catalog', channel=channel.brand.lower()), art_dict={ 'icon': 'DefaultMovieTitle.png', 'fanart': channel.fanart, @@ -100,7 +100,7 @@ def show_channel_menu(self, uuid): listing.append( kodiutils.TitleItem( title=kodiutils.localize(30052, channel=channel.title), # Watch live {channel} - path=kodiutils.url_for('play_live', channel=channel.uuid) + '?.pvr', + path=kodiutils.url_for('play_catalog', uuid=channel.uuid, content_type='live_channel') + '?.pvr', art_dict={ 'icon': channel.logo, 'fanart': channel.fanart, diff --git a/resources/lib/modules/iptvmanager.py b/resources/lib/modules/iptvmanager.py index 8689348..9fc0b16 100644 --- a/resources/lib/modules/iptvmanager.py +++ b/resources/lib/modules/iptvmanager.py @@ -5,8 +5,9 @@ from datetime import datetime, timedelta from resources.lib import kodiutils -from resources.lib.goplay import CHANNELS -from resources.lib.goplay.epg import EpgApi +from resources.lib.play.auth import AuthApi +from resources.lib.play.content import ContentApi +from resources.lib.play.epg import EpgApi _LOGGER = logging.getLogger(__name__) @@ -17,6 +18,8 @@ class IPTVManager: def __init__(self, port): """Initialize IPTV Manager object""" self.port = port + auth = AuthApi(kodiutils.get_setting('username'), kodiutils.get_setting('password'), kodiutils.get_tokens_path()) + self._api = ContentApi(auth, cache_path=kodiutils.get_cache_path()) def via_socket(func): # pylint: disable=no-self-argument """Send the output of the wrapped function to socket""" @@ -28,49 +31,49 @@ def send(self): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('127.0.0.1', self.port)) try: - sock.sendall(json.dumps(func()).encode()) # pylint: disable=not-callable + sock.sendall(json.dumps(func(self)).encode()) # pylint: disable=not-callable finally: sock.close() return send @via_socket - def send_channels(): # pylint: disable=no-method-argument + def send_channels(self): # pylint: disable=no-method-argument """Return JSON-STREAMS formatted information to IPTV Manager""" streams = [] - for key, channel in CHANNELS.items(): - if channel.get('iptv_id'): + channels = self._api.get_live_channels() + for channel in channels: + if channel.uuid: streams.append({ - 'id': channel.get('iptv_id'), - 'name': channel.get('name'), - 'logo': 'special://home/addons/{addon}/resources/logos/{logo}'.format(addon=kodiutils.addon_id(), - logo=channel.get('logo')), - 'preset': channel.get('iptv_preset'), - 'stream': 'plugin://plugin.video.goplay/play/live/{channel}'.format(channel=key), - 'vod': 'plugin://plugin.video.goplay/play/epg/{channel}/{{date}}'.format(channel=key) + 'id': channel.uuid, + 'name': channel.title, + 'logo': channel.logo, + 'stream': 'plugin://plugin.video.play/play/catalog/{uuid}/live_channel'.format(uuid=channel.uuid), + 'vod': 'plugin://plugin.video.play/play/epg/{channel}/{{date}}'.format(channel=channel.uuid) }) return {'version': 1, 'streams': streams} @via_socket - def send_epg(): # pylint: disable=no-method-argument + def send_epg(self): # pylint: disable=no-method-argument """Return JSON-EPG formatted information to IPTV Manager""" epg_api = EpgApi() today = datetime.today() results = {} - for key, channel in CHANNELS.items(): - iptv_id = channel.get('iptv_id') + channels = self._api.get_live_channels() + for channel in channels: + uuid = channel.uuid - if channel.get('iptv_id'): - results[iptv_id] = [] + if channel.uuid: + results[uuid] = [] for i in range(-3, 7): date = today + timedelta(days=i) - epg = epg_api.get_epg(key, date.strftime('%Y-%m-%d')) + epg = epg_api.get_epg(channel.title.lower().split()[-1], date.strftime('%Y-%m-%d')) - results[iptv_id].extend([ + results[uuid].extend([ { 'start': program.start.isoformat(), 'stop': (program.start + timedelta(seconds=program.duration)).isoformat(), diff --git a/resources/lib/modules/menu.py b/resources/lib/modules/menu.py index 774f63f..ec9b707 100644 --- a/resources/lib/modules/menu.py +++ b/resources/lib/modules/menu.py @@ -5,8 +5,8 @@ from urllib.parse import quote, quote_plus from resources.lib import kodiutils -from resources.lib.goplay import STREAM_DICT -from resources.lib.goplay.content import Episode, Program +from resources.lib.play import STREAM_DICT +from resources.lib.play.content import Episode, Program from resources.lib.kodiutils import TitleItem _LOGGER = logging.getLogger(__name__) diff --git a/resources/lib/modules/player.py b/resources/lib/modules/player.py index d555ecd..7f3c3f2 100644 --- a/resources/lib/modules/player.py +++ b/resources/lib/modules/player.py @@ -4,9 +4,9 @@ import logging from resources.lib import kodiutils -from resources.lib.goplay.auth import AuthApi -from resources.lib.goplay.aws.cognito_idp import AuthenticationException, InvalidLoginException -from resources.lib.goplay.content import ApiException, ContentApi, GeoblockedException, MissingModuleException, UnavailableException +from resources.lib.play.auth import AuthApi +from resources.lib.play.aws.cognito_idp import AuthenticationException, InvalidLoginException +from resources.lib.play.content import ApiException, ContentApi, GeoblockedException, MissingModuleException, UnavailableException _LOGGER = logging.getLogger(__name__) @@ -22,28 +22,6 @@ def __init__(self): # Workaround for Raspberry Pi 3 and older kodiutils.set_global_setting('videoplayer.useomxplayer', True) - def live(self, uuid): - """ Play the live channel. - :type uuid: str - """ - # TODO: this doesn't work correctly, playing a live program from the PVR won't play something from the beginning - # Lookup current program - # broadcast = self._epg.get_broadcast(channel, datetime.datetime.now().isoformat()) - # if broadcast and broadcast.video_url: - # self.play_from_page(broadcast.video_url) - # return - if "lay" in uuid: #Channel name from IPTV_manager => get uuid - try: - items = self._api.get_live_channels() - except Exception as ex: - kodiutils.notification(message=str(ex)) - raise - channel = next(channel for channel in items if channel.title == uuid) - print(f"uuid entry is {uuid}") - uuid=channel.uuid - - self.play(uuid, 'live_channel') - def play(self, uuid, content_type): """ Play the requested item. :type uuid: str diff --git a/resources/lib/modules/search.py b/resources/lib/modules/search.py index ce15489..5dfa8f7 100644 --- a/resources/lib/modules/search.py +++ b/resources/lib/modules/search.py @@ -4,8 +4,8 @@ import logging from resources.lib import kodiutils -from resources.lib.goplay.auth import AuthApi -from resources.lib.goplay.content import ContentApi +from resources.lib.play.auth import AuthApi +from resources.lib.play.content import ContentApi from resources.lib.modules.menu import Menu _LOGGER = logging.getLogger(__name__) diff --git a/resources/lib/modules/tvguide.py b/resources/lib/modules/tvguide.py index 1e3610c..956e9af 100644 --- a/resources/lib/modules/tvguide.py +++ b/resources/lib/modules/tvguide.py @@ -8,9 +8,9 @@ from resources.lib import kodiutils from resources.lib.kodiutils import TitleItem -from resources.lib.goplay import STREAM_DICT -from resources.lib.goplay.content import UnavailableException -from resources.lib.goplay.epg import EpgApi +from resources.lib.play import STREAM_DICT +from resources.lib.play.content import UnavailableException +from resources.lib.play.epg import EpgApi _LOGGER = logging.getLogger(__name__) diff --git a/resources/lib/play/__init__.py b/resources/lib/play/__init__.py new file mode 100644 index 0000000..daaef0e --- /dev/null +++ b/resources/lib/play/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +""" Play API """ + +STREAM_DICT = { + 'codec': 'h264', + 'height': 544, + 'width': 960, +} + + +class ResolvedStream: + """ Defines a stream that we can play""" + + def __init__(self, uuid=None, url=None, stream_type=None, license_key=None): + """ + :type uuid: str + :type url: str + :type stream_type: str + :type license_key: str + """ + self.uuid = uuid + self.url = url + self.stream_type = stream_type + self.license_key = license_key + + def __repr__(self): + return "%r" % self.__dict__ diff --git a/resources/lib/goplay/auth.py b/resources/lib/play/auth.py similarity index 94% rename from resources/lib/goplay/auth.py rename to resources/lib/play/auth.py index f09541a..3979fb5 100644 --- a/resources/lib/goplay/auth.py +++ b/resources/lib/play/auth.py @@ -7,15 +7,15 @@ import time from resources.lib import kodiutils -from resources.lib.goplay.aws.cognito_identity import CognitoIdentity -from resources.lib.goplay.aws.cognito_idp import AuthenticationException, CognitoIdp, InvalidLoginException -from resources.lib.goplay.aws.cognito_sync import CognitoSync +from resources.lib.play.aws.cognito_identity import CognitoIdentity +from resources.lib.play.aws.cognito_idp import AuthenticationException, CognitoIdp, InvalidLoginException +from resources.lib.play.aws.cognito_sync import CognitoSync _LOGGER = logging.getLogger(__name__) class AuthApi: - """ GoPlay Authentication API """ + """ Play Authentication API """ COGNITO_REGION = 'eu-west-1' COGNITO_POOL_ID = 'eu-west-1_dViSsKM5Y' COGNITO_CLIENT_ID = '6s1h851s8uplco5h6mqh1jac8m' diff --git a/resources/lib/goplay/aws/__init__.py b/resources/lib/play/aws/__init__.py similarity index 100% rename from resources/lib/goplay/aws/__init__.py rename to resources/lib/play/aws/__init__.py diff --git a/resources/lib/goplay/aws/cognito_identity.py b/resources/lib/play/aws/cognito_identity.py similarity index 100% rename from resources/lib/goplay/aws/cognito_identity.py rename to resources/lib/play/aws/cognito_identity.py diff --git a/resources/lib/goplay/aws/cognito_idp.py b/resources/lib/play/aws/cognito_idp.py similarity index 100% rename from resources/lib/goplay/aws/cognito_idp.py rename to resources/lib/play/aws/cognito_idp.py diff --git a/resources/lib/goplay/aws/cognito_sync.py b/resources/lib/play/aws/cognito_sync.py similarity index 100% rename from resources/lib/goplay/aws/cognito_sync.py rename to resources/lib/play/aws/cognito_sync.py diff --git a/resources/lib/goplay/content.py b/resources/lib/play/content.py similarity index 94% rename from resources/lib/goplay/content.py rename to resources/lib/play/content.py index da1f194..1bba225 100644 --- a/resources/lib/goplay/content.py +++ b/resources/lib/play/content.py @@ -12,7 +12,7 @@ import requests from resources.lib import kodiutils -from resources.lib.goplay import ResolvedStream +from resources.lib.play import ResolvedStream from resources.lib.kodiutils import STREAM_DASH, STREAM_HLS, html_to_kodi _LOGGER = logging.getLogger(__name__) @@ -221,9 +221,9 @@ def __repr__(self): class ContentApi: - """ GoPlay Content API""" - SITE_URL = 'https://www.goplay.be' - API_GOPLAY = 'https://api.goplay.be' + """ Play Content API""" + SITE_URL = 'https://www.play.tv' + API_PLAY = 'https://api.play.tv' LICENSE_URL = 'https://widevine.keyos.com/api/v4/getLicense' def __init__(self, auth=None, cache_path=None): @@ -232,22 +232,6 @@ def __init__(self, auth=None, cache_path=None): self._auth = auth self._cache_path = cache_path - @staticmethod - def channel2brand(channel): - """ Maps a channel name to a brand id - :type channel: str - :rtype str - """ - brands = { - 'Play 4': 'vier', - 'Play 5': 'vijf', - 'Play 6': 'zes', - 'Play 7': 'zeven', - 'GoPlay': 'goplay', - 'Play Crime': 'play crime', - } - return brands.get(channel) - def get_programs(self, channel=None, category=None): """ Get all programs optionally filtered by channel or category. :type channel: str @@ -265,7 +249,7 @@ def get_programs(self, channel=None, category=None): value = None if channel: key = 'channel' - value = self.channel2brand(channel) + value = channel elif category: key = 'category_id' value = category @@ -283,7 +267,7 @@ def get_program(self, uuid, cache=CACHE_AUTO): def update(): """ Fetch the program metadata """ # Fetch webpage - result = self._get_url(self.API_GOPLAY + '/tv/v2/programs/%s' % uuid) + result = self._get_url(self.API_PLAY + '/tv/v2/programs/%s' % uuid) data = json.loads(result) return data @@ -304,7 +288,7 @@ def get_live_channels(self, cache=CACHE_AUTO): def update(): """ Fetch the program metadata """ # Fetch webpage - result = self._get_url(self.API_GOPLAY + '/tv/v1/liveStreams', authentication='Bearer %s' % self._auth.get_token()) + result = self._get_url(self.API_PLAY + '/tv/v1/liveStreams', authentication='Bearer %s' % self._auth.get_token()) data = json.loads(result) return data @@ -329,7 +313,7 @@ def get_episodes(self, playlist_uuid, offset=0, limit=100, cache=CACHE_AUTO): def update(): """ Fetch the program metadata """ # Fetch webpage - result = self._get_url(self.API_GOPLAY + '/tv/v1/playlists/%s?offset=%s&limit=%s' % (playlist_uuid, offset, limit), authentication='Bearer %s' % self._auth.get_token()) + result = self._get_url(self.API_PLAY + '/tv/v1/playlists/%s?offset=%s&limit=%s' % (playlist_uuid, offset, limit), authentication='Bearer %s' % self._auth.get_token()) data = json.loads(result) return data @@ -353,7 +337,7 @@ def get_stream(self, uuid, content_type): mode = 'videos/short-form' elif content_type == 'live_channel': mode = 'liveStreams' - response = self._get_url(self.API_GOPLAY + '/tv/v1/%s/%s' % (mode, uuid), authentication='Bearer %s' % self._auth.get_token()) + response = self._get_url(self.API_PLAY + '/tv/v1/%s/%s' % (mode, uuid), authentication='Bearer %s' % self._auth.get_token()) data = json.loads(response) if not data: @@ -444,7 +428,7 @@ def get_page(self, page, cache=CACHE_AUTO): def update(): """ Fetch the pages metadata """ - data = self._get_url(self.API_GOPLAY + '/tv/v2/pages/%s' % page, authentication='Bearer %s' % self._auth.get_token()) + data = self._get_url(self.API_PLAY + '/tv/v2/pages/%s' % page, authentication='Bearer %s' % self._auth.get_token()) result = json.loads(data) return result @@ -474,7 +458,7 @@ def update(): got_everything = False offset = 0 while not got_everything: - data = self._get_url(self.API_GOPLAY + '/tv/v2/pages/%s/lanes/%s?limit=%s&offset=%s' % (page, index, limit, offset), authentication='Bearer %s' % self._auth.get_token()) + data = self._get_url(self.API_PLAY + '/tv/v2/pages/%s/lanes/%s?limit=%s&offset=%s' % (page, index, limit, offset), authentication='Bearer %s' % self._auth.get_token()) result = json.loads(data) cards.extend(result.get('cards')) total = result.get('total') @@ -504,7 +488,7 @@ def update(): cards = [] got_everything = False while not got_everything: - data = self._post_url(self.API_GOPLAY + '/tv/v1/search', data=payload, authentication='Bearer %s' % self._auth.get_token()) + data = self._post_url(self.API_PLAY + '/tv/v1/search', data=payload, authentication='Bearer %s' % self._auth.get_token()) result = json.loads(data) cards.extend(result.get('cards')) total = result.get('total') @@ -525,7 +509,7 @@ def get_mylist(self): :rtype list[Program] """ data = self._get_url( - self.API_GOPLAY + '/tv/v1/programs/myList', + self.API_PLAY + '/tv/v1/programs/myList', authentication='Bearer %s' % self._auth.get_token() ) result = json.loads(data) @@ -545,7 +529,7 @@ def get_mylist(self): def mylist_add(self, program_id): """ Add a program on My List """ self._put_url( - self.API_GOPLAY + '/tv/v1/programs/%s/myList' % program_id, + self.API_PLAY + '/tv/v1/programs/%s/myList' % program_id, data={'onMyList': True}, authentication='Bearer %s' % self._auth.get_token() ) @@ -553,7 +537,7 @@ def mylist_add(self, program_id): def mylist_del(self, program_id): """ Remove a program on My List """ self._put_url( - self.API_GOPLAY + '/tv/v1/programs/%s/myList' % program_id, + self.API_PLAY + '/tv/v1/programs/%s/myList' % program_id, data={'onMyList': False}, authentication='Bearer %s' % self._auth.get_token() ) @@ -561,7 +545,7 @@ def mylist_del(self, program_id): def update_position(self, video_id, position): """ Update resume position of a video """ self._put_url( - self.API_GOPLAY + '/tv/v1/videos/%s/position' % video_id, + self.API_PLAY + '/tv/v1/videos/%s/position' % video_id, data={'position': position}, authentication='Bearer %s' % self._auth.get_token() ) @@ -569,7 +553,7 @@ def update_position(self, video_id, position): def delete_position(self, video_id): """ Update resume position of a video """ self._delete_url( - self.API_GOPLAY + '/web/v1/videos/continue-watching/%s' % video_id, + self.API_PLAY + '/web/v1/videos/continue-watching/%s' % video_id, authentication='Bearer %s' % self._auth.get_token() ) diff --git a/resources/lib/goplay/epg.py b/resources/lib/play/epg.py similarity index 67% rename from resources/lib/goplay/epg.py rename to resources/lib/play/epg.py index df907b7..d2f6def 100644 --- a/resources/lib/goplay/epg.py +++ b/resources/lib/play/epg.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """ EPG API """ +import ast import re import json import logging @@ -70,17 +71,9 @@ def __repr__(self): class EpgApi: - """ GoPlay EPG API """ + """ Play EPG API """ - EPG_ENDPOINTS = { - # 'Play4': 'https://www.goplay.be/api/epg/vier/{date}', - 'Play 4': 'https://www.goplay.be/tv-gids/vier/{date}', - 'Play 5': 'https://www.goplay.be/tv-gids/vijf/{date}', - 'Play 6': 'https://www.goplay.be/tv-gids/zes/{date}', - 'Play 7': 'https://www.goplay.be/tv-gids/zeven/{date}', - 'Play Crime': 'https://www.goplay.be/tv-gids/crime/{date}' - - } + EPG_ENDPOINT = 'https://www.play.tv/tv-gids/{channel}/{date}' EPG_NO_BROADCAST = 'Geen uitzending' @@ -95,8 +88,6 @@ def get_epg(self, channel, date): :rtype list[EpgProgram] """ #_LOGGER.info("Getting info for channel %s on date %s", channel, date) - if channel not in self.EPG_ENDPOINTS: - raise Exception('Unknown channel %s' % channel) if date is None: # Fetch today when no date is specified @@ -109,35 +100,24 @@ def get_epg(self, channel, date): date = (datetime.today() + timedelta(days=1)).strftime('%Y-%m-%d') try: - response = self._get_url(self.EPG_ENDPOINTS.get(channel).format(date=date)) + response = self._get_url(self.EPG_ENDPOINT.format(channel=channel.split()[-1].lower(), date=date)) _LOGGER.info("Date is %s and channel is %s", date, channel) - pattern = r'\\"id\\":\\"tvguide-list\\",\\"children\\":(.*?\]\)<\/script><\/body><\/html>)' - stresult = re.search(pattern,response) - stresult=stresult.group(1) - stresult=stresult.replace(r'\\\"',r'\\\'') - stresult=stresult.replace('\\','') - pattern = r'\"children\":(.*?\]\))<\/script><\/body><\/html>' - resp = re.search(pattern,stresult) - resp = resp.group(1) - pattern = r'}}],("\$L.*?\])' - nextjs = re.search(pattern,resp) - respnjs='[' + nextjs.group(1) - lst = json.loads(respnjs) - nextst = '' - for i, _ in enumerate(lst): # some elements are missing: missing $ - ref=lst[i].replace('$L','') - psstr=r'