From ee7538e03a76dbacb5599ed19810ae9b99605f13 Mon Sep 17 00:00:00 2001
From: "Sergey.Pak" > announceList,
* considering we'll be a full initial seeder for it.
*
* The tracker usually listens on port 6969 (the standard BitTorrent tracker * port). Torrents must be registered directly to this tracker with the - * {@link #announce(TrackedTorrent torrent)} method. + * {@link #announce(Torrent torrent)} method. *
* * @author mpetazzoni @@ -180,7 +183,15 @@ public void stop() { } } - /** + public ConcurrentMap
@@ -195,7 +206,7 @@ public void stop() {
* different from the supplied Torrent object if the tracker already
* contained a torrent with the same hash.
*/
- public synchronized TrackedTorrent announce(TrackedTorrent torrent) {
+ public synchronized TrackedTorrent announce(Torrent torrent) throws IOException, NoSuchAlgorithmException {
TrackedTorrent existing = this.torrents.get(torrent.getHexInfoHash());
if (existing != null) {
@@ -204,10 +215,16 @@ public synchronized TrackedTorrent announce(TrackedTorrent torrent) {
return existing;
}
- this.torrents.put(torrent.getHexInfoHash(), torrent);
+ final TrackedTorrent result;
+ if (torrent instanceof TrackedTorrent) {
+ result = (TrackedTorrent) torrent;
+ } else {
+ result = new TrackedTorrent(torrent);
+ }
+ this.torrents.put(torrent.getHexInfoHash(), result);
logger.info("Registered new torrent for '{}' with hash {}.",
torrent.getName(), torrent.getHexInfoHash());
- return torrent;
+ return result;
}
/**
diff --git a/src/test/java/com/turn/ttorrent/FileUtil.java b/src/test/java/com/turn/ttorrent/FileUtil.java
new file mode 100644
index 000000000..3abff5e1d
--- /dev/null
+++ b/src/test/java/com/turn/ttorrent/FileUtil.java
@@ -0,0 +1,56 @@
+package com.turn.ttorrent;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public class FileUtil {
+
+ public static File getTempDirectory() {
+ return new File(System.getProperty("java.io.tmpdir"));
+ }
+
+ public static void delete(File file) {
+ if (file.isDirectory()) {
+ File[] files = file.listFiles();
+ for (File f: files) {
+ delete(f);
+ }
+ }
+ deleteFile(file);
+ }
+
+ private static boolean deleteFile(File file) {
+ if (!file.exists()) return false;
+ for (int i=0; i<10; i++) {
+ if (file.delete()) return true;
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ //
+ }
+ }
+ return false;
+ }
+
+ public static void writeFile(File file, String content) throws IOException {
+ FileWriter fw = null;
+ try {
+ fw = new FileWriter(file);
+ fw.write(content);
+ } finally {
+ close(fw);
+ }
+ }
+
+ public static void close(Closeable closeable) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (IOException e) {
+ //
+ }
+ }
+ }
+}
diff --git a/src/test/java/com/turn/ttorrent/TempFiles.java b/src/test/java/com/turn/ttorrent/TempFiles.java
new file mode 100644
index 000000000..bf0953d1a
--- /dev/null
+++ b/src/test/java/com/turn/ttorrent/TempFiles.java
@@ -0,0 +1,136 @@
+package com.turn.ttorrent;
+
+import java.io.*;
+import java.util.*;
+
+public class TempFiles {
+ private static final File ourCurrentTempDir = FileUtil.getTempDirectory();
+ private final File myCurrentTempDir;
+
+ private static Random ourRandom;
+
+ static {
+ ourRandom = new Random();
+ ourRandom.setSeed(System.currentTimeMillis());
+ }
+
+ private final List (df6*bhmz&WLOL!iVBym6uYjCORH)
zAV9jf$YH`*4{_Yr1!FIcBAj8+2%r?nJz<@NcJyxuI6&ky01@_#2J8d+etX}oN#eG!
zT>|0QyCHxmtpwWu(p}3pEVEg}H*b0zc=XY7k7~(7*n5zT#vfg0#dznPc}NqV`=Mh$
z%~Gl3fF)9M$(ylnf7hdc#0EDznTA$Sl>0p0DL#)7T#gocFQbl9o>R;0(vA3Jg(LcX
zxq5^;Q!i;ps!;cRR!YoC5Qt2IgkWE4>${(PUUJDS#VrpOyWRkrOl!V{t|8o+s$!;e
zBWU1V{TxJ6vdHD8{Ai6vY2=V$h6RiDAb3)L*(hmS?Sgfpg34GMq$h&E-6PvIyT^@-
zpjl`*`z_kS&2cJ)Pnp{hLH-$o*d|y2u@s5Iq$u&7d>(3gdX_J5o}WsYt3h#O!p^i!-aC_2X(suN}dWUf-=Q86zCtV$eE#;d5!u|
zdLfo}i>c&Ct12~453)F^8T1e|)8sl97(xHA8JcR6&dYwNeenl#BcnB5W>Hx*6vR2{
zoaH2_C*Ed0m$5FIwlZHmgj}U4iNEpzqwjtue+~dQ3dm5V2IvuQ{OYgX?4H!%=P2mm
z(nWzFkJ((Cn47HlI@sJghAO$NF!t~1{6ESxUR0SxHGkGK4g&!Iu>U+v|52{@k7B&P
z*VqXdI667}tb3FBqvB5b&pH+PKl0~>=63ovPIP}OGD=dAkpp5t@Cpi25q^@N$+$A;
zMqtD03}s*dlPeL1d9b0BuRDw15WF;XXS~{izZAnPhIZQqU_Bo1NOPxWI)9itME7;X
zF^TQZj`G4L4Ze-KPU
(9o2@5g*^cguX+t<2`(tthdAq%+)}^yaox$Yd9q3=#k3Tl7YbeLK;pc|&{d_Q5pRTHA2mg(zEtm?T+@&Y|!W6TNpcJ
zvj;&RKa0w1oB0vd*uuU-tZ%AUO;t?0u2j`YGmU}_!}#&BCZk(^pY@)jQW$bF*I(s2
zglB6rq~55J(YeR1%-9!Xx~dp*fv=1W_J>-EBB~ lbmpG!no&?y5jPJ-X?3p;
z3tldS%#upC6sPU@eBgoWi(0pFGQ;WJSBR#$Zsg*MYdO5zK?>avT*xj?G2#PF
VuI;;SBbXdna8(i zyTrrNMbj#k_pj2E(m9Byq<(pgVRI&gJV%>^T}b7yl$60ql6FUA=0jrYgoF>}A0@JV zG?Cba{cPyG08FtdtmaJTK6a^G9Cet7Yngzd z(i^N%z>G-(AzwbOCfF1S-|!j1jNlutQJEm|FF$Y}AxxjY<{6KRO}9W(Ko&&h3*NT` zQ|uGV3s@)8+yW=`f1#O$cm$d50OD_sX}XokKdWjrKK%lVxhy~}_E@pK&sa1vb>;qDW^9@3B;u{%yUp6VTWbe=1t z`($6n1;aXmB+pF5)A9!rT}TwlG29=~E*V%dVEYAdQW0t-A+%ITf{b8Y{kG*`T4tUV z+AXU>VkqOcMo8H{nK_o9 zaD(aB0q8IG`R>q}Jl44KJ{z`m1 z0HF#&vlIlg6ipzm9cfPvPc*u5zdNNE)JR!Ku)IJh?kkJvN2r-63le@?cr+N wllPXX085uEb|N##Bj0llPW#JrxmbxXmPiU`ifmBZ zeab&k#u{Ik$pk6CCBV)inY(Ut_91#!m+!X#wfmd6fvs>Z9D{-f56a-*FUhfZDz7N~ z;O`eA0D%7gRs8+0dj78nth()rD2(()BArR{8)S@DewHB5oS&d4GRZ&_1d@Cq1%;YG zCefUscJ+4$W+Tr_9&Pu_PUL_5j!)S4 Nkp#92F58+T4mFRm`Swtvvq z^h)OI_4!W^V3uDZKL(}wLtz>}guw4g3o=u)m=H)KNLU3rg)#;sEBOYjQ;jE#{_p_f z)cY7?2iIznJFQk^{o_oOS9kd)E&6L&Exi-W)DkCBG?` zl|jo+HTYKwU!n=F=Pb=8WTAA_WhP@p$CS)Ys*C=3D~c}+S4vh@^dSfAv?X|&D5R@< zQ7&7%hAdq>Yx5L{Lf_4pT{~7h=s!$qf#})DG_>}qj1x`@ijNas1I|5m?woGDQM(f< zGw3i(PGI*J`#x>VtDB3hT~Y9dWp5r+w&>|9BI>P?&3(0;s1ozXZr9HTYr2)yvx=&= zp?|#?gSZE= WX8_y@QGh8u4RL;Zlcc`HD z3ZmeuDH{R_ hdoc5uiEAxVz zXvbU^W~{i=-Cc~ta;_x+YXCzoh>UQWdhMBuyjF_Dd7sSipZy57NNc(VG(Hv(%E)Cq zvPgL5s69EzCMujg7sv *=Q4oFXdg%6ORF_9&51ypilnd)64^;79Wxb!H3n#f z*%Lo=`RX>y3buz}-y zi<`+e6UB4{_)_ >B_NjdL(?sO~Gn?qjz<1sO=0N9_)+qeSUP=U;)^#fg-tl!v+~ z6#n`w>><1b=H{QE#9&;ny`?)H28eO{GHv9Z vo%S z7O(+M%!@7iMHliBwe>4|^gRFIm<~ns%N_XDy|a3h<|TRB^PsCxb_Vs}yCAq{`51S2 zFz@bQ8gTlLK(cJ3=Myk@56oj{k*nu$T2FYGJAz_{6~^@tORlXU#)@ZqK1CEgEa5Au z0)NuAhFk)V#GGJTLG_=xO)1pV7ak_;Wjk&fY+j+FLO*qBmtU-g%iFQ}2aayMF(0Mi zckWbX^_pr?#NWh8UJxx^kXX-L{S-Hvk=Gs|81CPGM?3@dq4vehemN+9rSO0oeWFZT zk9~_1!#?uYv)`m|F@~&pJ>#FPvDzo!|E7i0yh83=|Hz}|Kd=0V{@(!fe>Bc&;ksIj z$X_&c_aw1kMMj7g3iT2uc!n(Ec*TQ48D#h@c;t2KzjR0hP5W43F&dd!G|pu$Q7tPQ z7cH8kQ8f`Q`4|=#XjUvxJFYu6-&r4)9j`n)!6q;nqz+PVQaq VWh&HS){#18g#k)m96ACxm4a@3KwK;2ZUI4D%V+FbA~w0) zWWjNj Q~L1HV^VyExM4Iyz<>mYI!Z{4#@V03rJ#Z6p$0%$ADdQ)Ex$3Gr`b-N4p zD%}!jP1PQ#c)15 =qJO6fWO>tLlK#%=5bOXdmPq-85LFW$o3 zF4kt~brYRRI!)Za1f=~YFK5m$M0`z2HcTt6P92 w;9c{xj5tyzqb(S-*UCaafbbJwA~OV)RPDxdtjRT z5iFJj^YNRN4Gpr)$hKb49Ct3qm3NFr=e}N~_s`QL =h6 z2NWe;I(nw^7NbM>4&6-2igv}9A#NONGS^u=QsokQqV~Y3{jT%x-E`aTl~@+R?p8JR z0^IS1HA=X7Y8YAzY7v8sDdn1-3A{v;gS5I>B{_-_24@{v-S66``VHG=sqmdH-PgM) zF*YEH7*m9mJLecVgN_(6JJehb{$oSwyMJ~kUqV8TZ>1|FK3;xn-U>P8+DnyUPwk@) zy`=E16Z?*#pU@$Lq(V39R|242t^=L_z!F}cF&&7Y6`Ofcm8HxBreI1{?h*-F=~UpK zOq%rb1bYSs X7Z-XABR1>%r#WQoE4Xz!2U&S&Xl!9 Pmt;S*rvQc4K5pNm|vWQT}Xw zRDYhSVF;i`Viqb940v)nP__6x4?pM39kxh4g}Y?k1=(4|bm_R`(+TxB+l(25Ma{V* z2T|~^j~Ps*C09tNUN^2^c9c(K1%N3ref^Canq^=T_!hJ9JBm*uNJ9}sN^^>0N8a96 zWgcD4{8X^f(va()s(Ob4GC(U@viQ#Fr8s34qV(HnseL%r?Nk+0_hqNmS!YrsFI1`< zhY$63qgB7MGxB*yk`MC@fjW*XLyv8b|AMd*HR4uU2Rjl@U6RU74)+IVWwvNWTpxZ? zt?k;*dTm0kH+O}d>Evbo9bey>bia$*KDultlm2E2xtHQHOf^W7jTyr=pnCV-&Qer1 znl6ObTMxsLUFpGKUc{wFD8tL0D*v|5^`K9lF7>ItdWt-D&o#;E5%w&7e+6nGE)_f@ zUwU_3L#qP$7Lfwsl#rh^#^rORSUAY8plDAugm~J;NU$hvNtGA*_AA^aH`^5l=O@<1 zb0A>|HZwvX2Fi|BR9j~YSMaw_GKN2C8YF?k3S}7jTPmL;T;>WS$x$!o*^fweJt1%& z%_Nhz2c4g~BklAXkrOTya!x1sQ!T_&KJq;5lK-L)-@r5Nz^3<6sqKPv6dQczg98h% zP2ota-U^=Ac?JVNm&4o`qFVkm_E4e~$+fD(FHg%Hu6S$&s%)g7qQ&DBSjQ0`i#^n$ z-VVKZ$qr@QbG3e?(fGGwnHkz}gnboPG~Z(dgq8~o^KQtoJZA{<;veF^@m1W);k=}5 z5%p8{D)w`Xb{PEjr+CBn(^0(T;aW)hsy@8gcJyDZ!We3%iGrx@#p)p&4EzokAvgkv z8=q`LLZ?$CV1H!`hwd%pU~-cDGN^X|AZsYI2LtCAdr>qxO`ucft2qQzI%V__oQd5) zElKNYfK3mA-j6KGla#Lg0yx8;v=!DRFlUQ Oxh!+OWRvmNKlhAS0y*8n zD4D6m9X^tAUmN289zP)y&NzKxu6-Ih;*(xwYmUlq7vT|(T>w6DA>QPYu{3M(3q9%N zm3qVJ1LcYU B%yq#ohwxCbCJ^aGEP5A@cy4HPJg$x3Yk@c>pEf4fe&dNSO3-;(wh?Up#J52cfpgIWZV9$ zOrcdAkQ6g=Z@s&T`pdH%pcb*Q0JzZMa571n{jbERD#fJ}`1$FVN4uqi@yYkUl9UVq z?7JP%008s^00092)1K--JTv}DM*i0@{0~lB4Z;g)5&gU8g4qgGOhAkc2m%kyg|&(- z6+b+L3{HyR5FDhAK|I9Bt^xCDM^00-v1!GkT3NG6xp8rUrK!M(zkI1sfZJnrUc>To zQ^B%nX>F}y``M&^bwb7f`1RKF{;BKwrRUmvc|6gU`v%VM)u0*Ibhj3F`){D(j9;kR z3kxjl{S7#5?A=XTZpih`g?$e8?&_?U7pm;d4H2yD?a(}r*L17^mdcIy*B4(OEb>QK zOOE`FAqem8VlKr?Ixg=p?aOcjq|YdCj^Yg^$n^c(A8$8*b)WuzM4ySjk*_b*KBYU) zJ|BR-N;jlmU+JMeWG|Gyv9~v@I64M3J(O Jv^Q1u^L>HAK&}Q-}m&}d%M=TezM^HT!n&pW#*a9f>5H3W~Oe|3^qcXsgSJ- zx8U$i<`7-|VNhh;w`vSaIEBKtLhIO)#2_iGgL~Qf)uNWybN!oZFx(hRd*X(bOF7WP zk2z|8#fJ7e`bpedx7IWgSIrYJi>#ywDjtd24Mu}{(F+kXD6O5T3>vRV%q6s9Pl7Uo zqURMxX}B|()|!goBO$4 F}H?oa}XHIZ-N=$at1ljmq2Qx?CJsNgK zU4F&F-7RAodE)h6=R!SKG5Gt-nz}tv8x*hx6Fb0U%ia&)u8Lu~1xsZMm6e0Phn?T0 zxvoW2(j~h?Sx@{Bd=6BID*GJCbqpZ8SG*9OfNpc4UF153_>o_0(nH~VCLx1wU(BqX zx;| $sR2F-r33Y<^^mOM26RfIqUMlC^1<; zv@`R0=i|c1kOS &eJsrB#J<4UmbpMlLN%J< zMihDFtar~L(D9B;iQWw`vQYWW9I2B$&i8O$BoRwFw}hG zaYNw6yxuA=atBH++nk6CBGIKlFgfm(Nq;nLUub8gDUKFAOe8_NdDeB*1aGxMSiy+T zHgt<7GOtB)TbRnJ`chkHlg~S*O;|07hI-a`NrECPy8aGxa{_4@u^c=&MRhx8jsODl z!g0O%)T&r|0M&AxrLnS}MO-cF4N|4b7L{$)e_P!^$AAa6G{F+Kda1(`l%m;klOsV_ zr=f;JRY;rIdd?R`S&UWA)-nPmmgDHcT3(+(buDbr)=l4QH{uj$!)(&!@4<`(c{ubq z7T6#=R+ULryc){v8f{b@=6&|OaH8>0d=dWm)tIzY_V!Su^il!d*sX|x_rglfT=fp2 z4k7>E>dGT0^VOlmDbZw%w4QviAUMl0RgT*IF#EdtXOKjP3y)!>_oL841K; Hwn1TnK6o(UbR*&tIMyzTfB zUmCKpQ_0;HO2p>1{ACUlD1 0WEJ;VgcSLba75%y? ztF9%^*Uh}ihsS7()nBdax{>PdB;_f4k}|}PJlJgqtuhpkO6&=%7iKYx3CjEf;rs uCfLKuoa7*{ON|;XT(2wU+jlD+_oWshxq;h}4dJ)PAcNR)2w+L&i zSKoo#-D@Pvo5XhlH}uet3mybR(1UxHw*`=m>m;Fg4T&_fN;=n8I+IR$vfy|Ub$^l+ zc^Y**swmclLXuN=8I)D`cy|zWX`B;EeU!r3oE}P6j-X!37Fd?f!)phyweyLV8S2T< z+o^EkQQkN}G)^`d8p5)Msx=z|&qAZRQlcMpxGEP4GbDu1ZDa#5>gCP^67l zteobAZcYJB9&NgAm*060-rnHl*W~$H-x=7llUj*wgv$+8$V#|KNj-*E7^YtT_m1_X z9ik9BEB=r#C+gRuUI!vvF1A>bn?XOoE|l@0JrS1Q%LN}o3}3<&9};Jr_CSLt8Xh%D zToNJNAk0C344;dhDU2fqh|3Xo%tQxhTJSc<;AW_N>n$F)Re&(!9GQvy19^s6e~6xZ zc$-p26H|EV$ybb=-CQYZPQj?T6n)ETjwl>BiZpY%mw8e#ee_C+Dax3-TCi}n*ctj! zi9xAKeR-hy1QypJR|L=wB-u)2d251?Z$y eQA2&*#Q?Y7=0T04GPkpi_~A$ z`T|Rdqoq NFSN-gHnsu4 z*2}#s7pJgstaNUdqj#)yT2~{L%ZX5|bl$6xixx)SlaUXIcK1*-r}e^H`8{{5G&813 zzg|+tdX||@dS&wQJK%s{#AIf){KEBoSj4-sdQ>??yRydQ G!f``O*7mq%+r0L$D=^BdR#ga3XH22pF9N}37xtlG`$Lh zFo_s@B|1InlNw6NL!Fqx7zeoKL7SR$Y{lsj7avD*v*qSlE`(RV-48G>J!}M>N3w?k z0wiq))f`p2U>&Qp;2mZKFrZ!m1`{H?k+LVdPGFF!3ltZnJJ4VA%~Mhk6WEf4k~NH| zI@pY?)eS1C>fY(jH-qfO6glhIqKPN-3ymIysffmRsu#onXlMVVlDF#eqw5qmpEFyq z>kN~-1yYP=hQ*U!!2zMp&b!3k?4o#}^9aQD4iB<%QAXHD<(R*I5EQ1aD9O{5M55o# z0XboFmc99A)Qk F<4+h(kSs=f8dK*5z1Xd5R7+@nF=q^f373Dn2AYyS*Fo}uks z^e5y($r0=uoF{6{M1(KAM@9~V(-3YziUWT@0;m>}XEw-dHlXguk}aG$jbN!z%W4Ej zIe8RZSt-JX0Q~Skmv!7kvb(g}p>|QigxG2RRm*MaB3NR?>q@6p+xt!}eSwU{lsFK9 zLXcJbH*u@7#R{v@b@RlQb^4w?=VZ5(F(oV1@_K#k3|7Mpwh}*fy l0$18)t!@=?QR$mc(dtXl`R40hvd$(P0TvC0rKW}&*#Xn!Q zgZ0`Q ;TqxL6*`!Wl<6NlNlOo_; z#D8` usBLLaYpoNez`mP z;@kw~qQsABMOSeP`;a~r26YFmXuOG&h>$)suUw~nia1= *{ zj4Rcy8DDAe(F1`dM9qV_8#}g6VZ=aJ#eLm*ZCZNb!p%}B%@D0JkxuA9!oT}?3d?yr zN5h)VG6k@1S%f$q n$*-2 z$qJI+Ha%U>>TBfnjBa2}&Os5XTwq~GyIuZMiFv|QU_v)1YWxf3SSCc^&lc{psNfI) z@23gf0WNsx$LyEf$TmDo^|5OgP9$dC#H4WkED6dmm9Gg*c{z4eF5z3DQ#U;e7TOZM z;5CE6LA*lKDn>qDaYJf1L%Z3yi2vVOoaj08%ep*rRw)*;QFlBHZhU7fj+Hw1(Rt^Z ze&%Ws3mWp))!7F*aGBLI;?$pagVItEXx|Y6Cq<}akPZQ{NxisD21?qR66G>PFxD(# zP~1lIUj67(7)mBpL?v|7yczC^P$97%`IC&etYsi%LTpte=KEP>tkFLvMoSh_c(^gH zqtg FmBeIuD*C#%NI`Vdn>rf%(i!F6 zczG0wv%VV!F|-)ycX8MAAV9h>$mXynzf+B8H(RAY7Q~>G%493&8W!aFTSyl1E}5^8 zTVD jM28pY{P{u5Q?H6Hh6o z*x&0nvcJC*MmjJpG|x3OkUup0eQ$Ji3@4p`J2z1~V{G+*Gl_)H2*IF-Ye}~XZQ;`o zbk{QPqCg@e;0PaB3KVY@_|4HdVu2+&iyHXXgG8aqkL *qYl`UkwYOlRnCm~b!$~wY0S3l z3NrS>q>xD7cZFIhj$>S{Ss;=pg~&s%2rp`3kP=l&yQ|=DtT@J;kw$$)M>eP>og{9N znI_qHidAPbuO8y1R+V;E*F48e3(cDAEA;`yjBJ>zXBZjbbi~UpDM+5cI-n6KbjU`) zC^9$gP+m5sP5Ib5i+u1y_bg6sId2w@#Wz~7*LU#4T0b`J>>Lr(r^x65t{6UP@Tm9O zq{1^uy^9!I@34Rd*e50reLyIdXCJA^lSAoOPqU?pGpB!~s786Y(Q>)@4`eS)&h(eN zc1kYM16fjvq|#%S-T-BC<|90wPwj--HcrVA$)HILjU?wu@0JEcyRbD8SH|wm>cr>e z&i@Go_b@L(z1%lt3^S!8!@j =5SPer7kgoW@XO^e@JOH4+1H1eHtbbsP3zsMS~7Luw@ViZsCv3 zjE=9-bCp9Gt%+bpc#Q8UX1hX5?o5#35WA!J{x(j>CYW;8>)>3Bw~^ldeK9=z#3)&7 zocMcjLZET7CO|{saG~fIul7v5YW$~Tun?!s*)AC+vxcLFSnP1|JcE1#=%Fn^VaUr~ zUC!qnX(iA(*q^w*39Qt`g@x@)$_5$?ER;EkYSL)64Q5!$Spa{Luj7$nHa~*amzQ^N z(Tr8i!CNe!#W8NUWMx+ZQ&dlOGkwnAZFj?lHM}^lY=G4lleMb*(2am7#BF!}!7fg0 zT$WWlap#kp=>|v5Au`QrW>1a%LVCYgI5ab{osXdVoAhDtI nkKm!p$HPbV-2i#~W#^{QQHnL~Qc52vhe;%P z#hnwz_)*PKMIl!)#D5GQONxM|u+WB_4EC%M0GH_`Sm09nfh#B~pYxeeJ?RMJj>jc; zZayeo`4Si4F9q3D5V|kR-~d}_ZD~zFH<)=`ZGc2UwRoO&CNKo_`Rd4W>$i_Rz=e}L z;t}oIP})N2CXW-kfK6x}-nAemb`=i!C!VGrXJL&w xDzqVaId;&8yw+;*;;zS^-HFB_b4_VcB&d}l@5 bJeO<^*-+$bIdu$_&qgwmjc|e z-vqn3qorjxC@wX6ZOir#ZqP|ciEC0-wgM+Nx_}~F)4Z(U#`S9xvmo+WBAg7!V4!k2 z_T8WWFxx^n1PAiI%oPmB_#4GTcUU1ys>fyy-Jy7NXVt1*d&kldev}688TP$|-&Ke4 z2D?;4Eu{X2U7vSwOOF_%PAP@OqFJn5+;qDZ7*i~R>?z!_mQ^)dp$A78JOT=266eI? zGzm)X&dPvfs-?kGMd-Vtm>j@#HU(js40x@1kgXa4lUB#f4t)Wopqk(`NUSj}d2ymS zv9cT!P3# WtaR$V_mg?oH0j zT$uGl)&F?ZY_>}AtbFsB!X2?lFO@}`nthaJAzmFrs&6qlsp_iU%-;awx*{=`oTz@k zWz6>sM$|1fuH7T=ni0AOW${XMz2iz@O-^D@q@o>FrM?BCxCNRyN*#T71?jQy|6+;! zO1}B0zG^ivyS~fsPJB$*|EIkC?=#W=Szg|(s` QC4pXerP#WV7ZCLIsF+<~dYq zw8-K$RLnlXeALRTIBY$$v7zxG)XJ7ms0+MPD7cOk!TDw_-pBl#PaNl5rbHur0KoIf zbnidBJFRq$vpI*4y1k#Ud0;!`ZcuoUM;Q@{Z8~BL(LYA$X;U&G_bHL3mJAfQOD*og z-L?@&% 6 9e(mdrBM6t9z@USS!`GuSuZj;_&YbU0rB;5<2HED94zHe?=huD8l9q`931 zw*}$}TOqlXvRh9q @P@FS!h%r %iDt(^A$;n;5$q_k8KZ*{BI-5`%L^D2fqZntfXRs&&?Ow*nIo5f= zWr|h4mNre3tw5|9Ez%#?2$hV`sV)r#pa1q`2@Yqa8V)A%k=*PR{2C*=ztpo<1|6uh z7lB#QGzp^VLbf^QGkzsYiusZ@tSX)9iShO&;&dLB-iY{~K|uSI-d%gfahJi8HKGm^ zsfM`F5Yl=V11KbfjsPPsj4pF|eH5P+FX15hL!}Jiw|}#_TNpAB)?6LsoO%62o@8Kn zQ~(`|+8AXW%VAx~ZhXk-KwFGW$n~I0Wk~I<@LXbR?VWHx8)lD)aKB={*NELgFQ#c| zsYV|8Q=Y|7HLX^6`MZxV9tt>!N9enL$juI9s*aA2@51F_L7@*%;+{EX_`KfPE_HUX z&6j*obIVy-7KBz>QS|V16H~LtQ}?asY;}%MAofj;OtGz{qEFsrJ| 6VPt@fON42X56HQO9CG$q^<_ z><>XhPUI|f`c5|On4_WZZmFO{*zB#aZ0V(hTjq&lK*ZT+Zox9hgyyB2tnwehn8ELW z!)N6WcHHisa(fJ%uF8s?a|k=daJ+IgE&+_|`M=Z?nly_Z^P{+h=cD(Cy9abEmUul# zyr22EgGJaf@o5hbUyo1
zz zsxCth5AsCElB*x+c^%@r72s}2T>WHuX4LyR22rAZnyMbX%=`Wmf#l1fGE(5XU;64h zu1fu1-*=eXeuMe{1(E%adkzI-eWQO2r&NDORV3B#s0vIv;x|zp(X2p)X_H>jOi7L` zk3UfzKyFqogg&rqM4FwB|IqTv_6qg70QN@MQlq?csqumGL8ARJBhH8bt`Zc=@s`E& zc4_PD`DdNuA|#2)=Txl#>0-XDB#HyI(p7y4~$=97-z 5JO=yVm=X(I(^kMo72>3!Wp zYZ3Jo)S)z+msC~v{>B#vqBXUKseUBrfJ |M!Ke!ux3)}EsHD1l0hKo-l*jh+~;rcpkio^JrVZk!5J z=st?v6|fLB#b z-2khsWHoz5hPuqzZ}pM0Mn$4TQeBxi));d7+ayIl<|nAIaH;OYUiYlEK1{RA>=OAa z8fQ>!vNDD6oEqP&2LvxqMU{iDwFpmGt4}_q!?g1h>T|$CQQ2pWxcip`q?i7X2(fy6 zbEZ9Li?Bqz2nXegp+?_0dg3VrB)Z8KJfeI+4vo~p-thx?bzt|$|8}*L=*? Nbh?&9?a#T9RI78Ykg^{f zv_Y^sW15}N( aY5@@+)o*Ka_A3}iV|sqi}$ tjbv&w=n|~w!>a7 zh&8HFe7P%%uS4HQ;Uzf!hOr@E&H5#bk#BYN3gt{E&$24l?LSsIQ-fA^<`c6Ko@45z zS |%@m2OG?j2%5u(`rc}v );*{7^OuY%-My4nO6& zYSes3yjt=Q(AX=FGfhkm9cR!j)57IV_7e=aG^T{pzfNJ_>8L(cT@H8D;(ZhMcivq- zr*CF_Ll~wP_5nC}i)`XmV#n?oXwY1TdtFoC-=1$%lL`-eWhlH`T)RcRRfQ&Rp7S7k z@d-ydbqixqJRU$|KA>p?wI6E 2766#Q2R(08c*M~wdV zyKyxBcU-W3n?-(j?@V?G2wDn?atdpILAYuGwVxoc0$PHa>Wp&b%JFU1+0~8YccLwd zr+oGT1^D*6K+ohumz-)8&tt|ef3CXRnPxv >Z7+1tK(IF(IOiq`W z>8>Ap_A}i|obY6sgmX)X_!XO 8x>_FW zm7!2;V-7MXNZg<|({#SVy1qi% 5MfGGIB=bsh^GB^$HNh^#gEuHl$O}?bSQ 7d>B`7n_?IjlYRCt z{#EK8DR xmOtnU j&NhyLIr$w;QL$^+VGRhbg1CySE3ZpSKx$olPI8zrtomJ?MvvC4b%u z#vX8a V6dQe9##Y4H+xDlL l)XqY)0i$O>HDoy1wEa4A*bQ)pC8!=llh^kOOEe5Wa7VC6)DiLG#8_ zPWUp};KQHOW08G#H@lo)V$l8;m>sTM1}%hkdHE)QEQVzq!5I`wS%T8n>EF~uv7Hsu zlcmgGu7IY#G43&pdQ1xbKm0*H8j;NSVedV(mpVbn`DtbQ{0ed;U&RG#jnx8<)T)Oz zCbX isKU49+QwZ!jWECok0s^ 0}oD_Pu(#@7)e^6@dPsB zm0GY`2u>4)GQaAj0!MED#4=D{V0&k} Hz6R7Gdbj@&6nQcB|i7CAFA47Lfb@fNO=n3ew`7AodsRU9psnOYJrLkM9h z`mx|_1)MQrlBYQa+!3A4?-~!|6ifcFvx~2X?ekB;-|q!6Mf+RIk#F>y`v3L9{P$9R z`)OI(x?6u6i~rL`(46ou-e)1DepQ4K0eNC=&-Lh7v*@%w#H5vA0@udnlGE2Ni!|hX zlStuUzJ7cY?Aok)Ny2o0=&!o6dA&=|-bOF5eq;^k0654o=#K_efUp3*Fd;zxB9-HD z!d*|3&ke@CG9wYJbzUNh<4OgR$vX^-+ldL_Rn=a3lBeKWF!qV1(7#ujI?E4(*y2)f zPZF8Jalou&fTK{<;HFnq945kmqFD|C)oKJ-jM|=V&Q$8yji)06fO|Y@oFt+#S|ij0 z;f_g9-TEA)0q_)u(@g>yXBLf9(C(1Tn~Ntpx~J0jX!tt39*T>o19V4nfpGfVg8)}T z4e1mj$u*h%lsxz?VTFwuHw>pI3L177IX_Sp?GAd<^(za|UHp$K11e&3Ofrnxpt7|} z@T-U5xDWzsoW5En#RcZg*uK^J^Z|uY&)}cCIRU`R*@52HId_Wy0(vKiOn~4ZAQ#r =1JwX43& RO@Tb56qM87m~kbB*~fMl ~0%tLYQW>X3?29QO9c0&HnnpYGw{% z1+Ymk>az!-n{P~8J{``<``}8$EPuQK;gFyP;P}f`5^Nb{+q?mvdT9vuKJ8vqEudDU zP#n%IkpuW$2M!7PIw*Qdu*frU?DYq_U%Z7b$mjJf$fBtI51L-WuE3KDG2zK^JUr%2 zT1e-lEVscAu!F$F9SWlQAMqnpLdAIwJyKR4550HpkgRil_(KP&(n{( l*(b!|=bNIselI zt0{sEA`okLC(B^NZP `@=Oo^EUE z%cZ;7`t(icWe@HqM9#Aqh=F0jItQ*|LV);1Ajjo&vz|2XC&GJWPD0r0&5SR{o=PN> zcNr13BQ-#v>dgu*SKhW@*zZT7e=bFRTK^M#t3%->X?P0D5wn3JmRwO|i$PX#*f1TO zW*G^l-GrzF 6r|4IWU!8dYxq66I`tyzw>xsFXl~bvKKubc(f4G{WDM+8Q9QN z HOCk^Xg&3h5h~ z{T;qr9XI<;!iFB{ZE{w )ChHRoQ|D?mNw#oeg{Waxt?-7a-6*#0l%D!jq?0(AWrVy~ zhff;gN>wm<@Mhh|OAK@~#;s`ouo*K;XDJ|_{K4ZW%th39L)tJq+E5l`SMzmT2axRu zIc!hhj4)329FU*)aE40n7@4MQzvU&bgz6!{_93Y9L_E5Tm8?1q`nUly1r~(UegHia zMgLK5gD)w8=U!@vq)9bOZ=CYJ*$4L5SVt8p*2w++ W3CY3)*K3rTP+JNMCZo9&k0M08+ kQW|>lRX6tY8w)Zf}enB1|)74Mq{IlbS VRZM!u!{ltkmZCD^=yHnfb$@_l5pP!H09 z0D+iBrRt@!z|KD!Lg&V+n`1IB) k8B=0ELMZ83}-LD^g{wYWa z&h4_k4S)x)?jq{p(!Mzcp9=SN^J+rW2Mb3Qyr$3U#dRePmHFar6PD z0}_e3L2LcRPz+AShz;VV{YF!8%vF5>zT|b( *&(I(g_j_6> z6?d1K7+-#F!=pl+%D|F9s!-F!Y9+y|dYF#MZ;h~;&{Gsv-
PJ9lGo>CtMugTRt`GWp6QY!$SnhpLPm z@rn-N=t9$E5|W-Y>5_dU${jVXc&Vb~%YqV#rrO)pPlXiBAEJhoOoc@w%fV4OQzlKu z;n(Dh%8fUT^7o4VsPjuNQYy{fpm(HT&GSVwQ?VUd!>6dai7d?1MhX yb+ zFOlQ!Hq#p9(#+WHRI?$Na>n(r#7jvm7 ucgnns>X3ERb zPEo3RL7i8$7}@P~vbt(dn ^;BGV(#Oq;h63yH|ZUJ`sZ-~zZQap%M2~4=Jd~kghcjr7OSRI zC{HE2llb1b9kqtqM2v`bbJc$H2GsAKF1;fkhK`y6wf5(r+-DQwY3*^(Up)yIuD};j z9g=Rk^WOC)2&*7*lO)&P00zVLR)Hh-{r!j(VHxgCQSMpEIJDLsZg&UrPa7x~U8f;c zLGHs=8t{)oIf2c-(bdf(^BV<`{CG4y?GXklRgESyM)L+%Oi$xG1(98hd@e63yJqQ` zHExRd7a+SQlbfi+byTn_*^FG4d*Tm2#odwU%hSZjjT29`$-tO5e(tBWeo<1-wZm2^ zqit*0#ocA2Kv~wcWG-L9h{~!$Yve9L(a#I#hg!|jDX)oYOdIdDFPj7+Z{tjukTzhx zvIvhyXi12Z?Q_tjz@084T0guqHl;~TV}^s K3rT~?* zFDx^00P u(LlTDIkm3 zVpSPUdF+u(hJTFQwUF0yB$W=`Z464pXxj36a7a|C=C+E2N$cyX3*Oi2x~8sQB728I zWNjJ)AABv!qH1^8RvTzIxwsKFhJnHI{J?F^^a|`r6e3yF_h6GS=d}vVD4}+|G&(Ql zVSJSDm2$ne foPb)Hb?6)ZC;XRb=}`shH(5-jpf- zXMs1}!%R2MhiVb)p+w4c&Zo=g8CerK?JgdPOpKKD$u{N8^&v%A0ezwh{;;cel;HHW zckXkV{AT;>`u0P14$K%+j{wY#eXJ?O4ZVcN44rDd7m?*C7(0`<^8Uhd_7yQKLA@>1 z9=0H}zaJIHnQme9#4x&{?<7~4t6*Dk+H>wGwh@Prf9K5{%6XoKSUw4pqEDQ30L4AT zHdOy+2#kWw%IMdhoe(%yKmDh)Rh`kB)`P$+y|p!)kw=-|oO(KNX{&)T?t#zH96fjg zrfYZJz*;2RyXZForU|Tlgd5165(<}`AlID|SSn?dD$Rn+3~DTNn7?E6tV%7S4wOJZ zqxo$>Hbn8aU~033@(Y