cd-circleprint_0.7.0/0000755000175000017500000000000010733770135013502 5ustar colincolincd-circleprint_0.7.0/CHANGELOG0000644000175000017500000000240210733767007014716 0ustar colincolin0.7.0 24-Dec-2007 * Clean up menu code * Implement single label selection 0.6.0 9-Jul-2007 * Use fonts installed on the system * Minor changes and bug fixes to graphics file code * re-organise system config vs form data and label data * clean up font handling so it works with label open * sort out window management code 0.5.1 7-Feb-2006 * Cleanup of main window layout * Fork to preview to prevent blocking of main task * Close preview on exit * Ensure selected preview App is executable * Update default text strings * Tidy up "Scale" widget resolutions 0.5.0 7-Jul-2005 * Convert to "use strict" and fix associated errors * Major rewrite of font and colour setup * Implemented label data/setup data separation * Reworked program menus * Updated man pages to reflect program changes * Many other minor changes 0.4.4 * Fixed a bug in positioning tick marks 0.4.3 20-Feb-2005 * Fixed graphics file refs in Makefile 0.4.2 15-Feb-2005 * Fixed path problem with viewer default * re-structured project tree 0.4.1 10-Feb-2005 * New Maintainer * Added missing comma after "Labeltext" (Debian Bug #233782) * English Language cleanup 0.2 Added graphics for the background 0.1 Initial release, there are many items to do cd-circleprint_0.7.0/Makefile0000644000175000017500000000124010266172142015132 0ustar colincolin# Edit the DIRs for your needs and run make INSTALL_DIR = /usr/local INSTALL = /usr/bin/install all: install install: $(INSTALL) -d $(INSTALL_DIR)/bin/ cp perl/cd-label.pl $(INSTALL_DIR)/bin/cd-circleprint chmod 755 $(INSTALL_DIR)/bin/cd-circleprint $(INSTALL) -d /usr/share/cd-circleprint/ cp graphics/debian_logo.eps /usr/share/cd-circleprint/debian_logo.eps $(INSTALL) -d $(INSTALL_DIR)/man/man1/ pod2man --section=1 $(INSTALL_DIR)/bin/cd-circleprint > $(INSTALL_DIR)/man/man1/cd-circleprint.1 uninstall: rm -f $(INSTALL_DIR)/bin/cd-circleprint rm -f $(INSTALL_DIR)/man/man1/cd-circleprint.1.gz rm -f /usr/share/cd-circleprint/*.eps clean: uninstall cd-circleprint_0.7.0/graphics/0000755000175000017500000000000010733770016015300 5ustar colincolincd-circleprint_0.7.0/graphics/debian_logo.eps0000644000175000017500000022447110206057352020261 0ustar colincolin%!PS-Adobe-3.0 EPSF-3.0 %%Creator: GIMP PostScript file plugin V 1.11 by Peter Kirchgessner %%Title: /usr/local/src/cd-circle-print/graphics/debian_logo.eps %%CreationDate: Mon Feb 26 22:08:33 2001 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%Pages: 1 %%BoundingBox: 14 14 215 261 %%EndComments %%BeginProlog % Use own dictionary to avoid conflicts 10 dict begin %%EndProlog %%Page: 1 1 % Translate for offset 14.173228 14.173228 translate % Translate to begin of first scanline 0.000000 246.000000 translate 200.000000 -246.000000 scale % Image geometry 200 246 8 % Transformation matrix [ 200 0 0 246 0 0 ] % Strings to hold RGB-samples per scanline /rstr 200 string def /gstr 200 string def /bstr 200 string def {currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} true 3 %%BeginData: 75057 ASCII Bytes colorimage jo4NEhu jo4NEhuUEms8MuqrVlisqu6Qml2LY[ nG[q~> jo4NEhu jo4NEhu jo4NEhuUEms8MuqrVlisqu6Qml2LY[ nG[q~> jo4NEhu o)JUdirA0?qu?Woq#:?nqu7*"o(W(\s8Mupr;Q`rqu6Wqr;QNlqu-Tqr;QZpl2LY]nG[q~> o)JUdirA0?s8=/>qtg-`p\4IXp\+:Ona#L3i!<;ur rVc![rVc6bJ,~> o)JUdir@p8!r`,trVm*#r:][MnFuq]%/p(pm.'fEqY0XTpA3kL!<;]jrVt[PJ,~> nc/ReiW&fSs8Vuqs8VimoDedg!rr9!r;R*&n`K<8qu6Qlrq-6hrqZTkrr<#srr)l]rr)ldrdX~> nc/ReiW&fSs8Vuqs8Vim-N3l>q=jRQnaQ& nc/ReiW&fSs8Vuqs8Vcks8W,us8;urrVc^#rVQBXj5T(frr*B(pZ^Jpmdg)Bn+?GRs5j7[s7QBi s4mU(~> nc/Rerr<#tk5Y8V!<;Tgq>^Hn$NL"smGm!Qj7 nc/Rerr<#tnc/Xgq#C0h!<;Tg)#a@-p@@\1cc nc/Rerr<#tk5Y8V!<;Kds8O>CoB"l`j6kmS`ON+LZG"K;l1b)SrVQ'Ej5SkHj6lU nc/Res8W&skl1_`rVcWms8V]ir;Zfrs8 nc/Res8W&soDedgqYpWrrVcWms8V`js8=eOq=O.?jN4BjOeB"JH!N`n-V%s3Y/&KBlgF nc/Res8W&skl1_`rVcWms8VNd'`@jibJ1O,gV]kHFCn["R'tK%mIgJW#kdQDf>tYUm.LAVs8E3" qtp rr2utr;Qcrqu?Bhkl:5Qp&?WAq!-SaeCE1&f[\Hqa2Z*Cf%/C#dbsQfs8Mumo^:u8qWm&&nG)tS m,mF$rpp*Orr)fVrdX~> rr2utr;Qcrqu?Bho`+mhq>^$brr#:`qtg-`p\+.Dg;U.UG[OWO=^k>u2'sOl1.+rJDg[nV_U@#h f[eCo_/%Sq"aa^qu$BjrPebd~> rr2utr;Qcrqu?Bhkl9rIs8OeOqX*(ZZ_*22Jr5bIH#7"t?>Fh?OI;iPbhD4Dlg!]mg=F]m^rk0b kLn)"a4TVJf`(jLjSjZ~> s8W,urVuosqu??gl2UASp](9m)?'@#f=A/gZ*q*K\%9Apce-Xd]W\H<`SU%[rY#2*o@Uq.iUQd/ g<\"+qu$Elrq6<]rr;rmrr)fVrdX~> s8W,urVuosqu??gp&G!iq>^'cs8 s8W,urVuosqu??gl2U/Ms8u=Eq:esmd:a0%O?X-W. p&=sjo`"Xcs8MZjoD\Ob2Z!%/gXals]t:nj_83q(_oKsHe'H4T]XbJfcJ%FFlg4!$in`2-^W+OK g="0`_p6ofh<4>(p&Fpgs8C:CJ,~> p&=sjo`"+ToDVD]r;-3^oC(bk_Q9#OBiI5C)\Wep%hB-Z$OI4Q&J>]g()nqr>]G1IMN*=;Al(fR 6;1He;+3c:;Iad$Q);"/d+mgQo_81Xr;HTkrr<#ErdX~> p&=sjo`"+Tm/@CembZ0uVNc^Q?<:#":af:F=&r6r;H7=QMOgWK[(!9 p&>!koD\RcrVlKioD\^gs8EK+r;?0Le%E3&^;@n3b5TTabU1W^d*L"^bK7`?_8+. p&>!koD\"So_oR'r;-3\nET&[[ZbT$-lNa1%1EUOrX&T1)@$HM"U55=$4@7S(FD"&77BU'.30$5 &.oNfrY,;E'GD3&.n=*!R&n*Qj6H1-q"jpdrVc`prVt7DJ,~> p&>!koD\"SnGX!tr;6?Wg:a#)?;s`s:f("dq,%)erD3nu;,gt@FF/C^E+E*JrD3Gi'2_Y(:JXhh @X=3;^X;'1qYU6js7Q?nrVZTleGas~> nc/=^q#C nc/=^kl:MY)?'L2qtg-_p$h5!_lJuKAl1Z?(D$u^#R:V4#6+l+"TJZ*"q:eC$4R^j+snW_*Z,Is r nc/=^kl:5Q%/fndfuLIpPD"$h=&SijrDE;c"&W0,@K'g>?WpG.;#X8j:]OAk:_$E+A8cdJNL-BE `nTqYrV$6hrRCgs~> nc/Res8W&sp](3kp&FpgqZ$Tp%fQ=ulINYTYI2-bbg=efnCA-#eC2gkbfe,NbKS8Ye(*(Kec=8! e.C*Ubf7K2[BH[5[aF=2r;Q]cs471"~> nc/Res8W&skPtGY(]F:.q=sXQmHNQY\6#;k#g#MGgo_8=[s7lWgs7c]lqu$EErdX~> nc/Res8W&skPt8Ts8<<%qXj.([?P`?;c!*`!)`_n!)`Je!)N>cs%rbmr_N>dr(dYt>&BJ5g%"h6 r;F_9J,~> qu6Tprr2lr!WN&mrojCZrqcX+q!R4reBuCQ]Y))$bg4_debRbrebI])e^W'qd*L"_cd:%eeCFKJ qpc8+ccjJL_7dFi]>i1Hh qu6Tprr2lr!WN&mrpTmerquforYYV3qY0XPk17;DNd,)34Xh?a%LWRJ"pG/*!rrDs"9/K)"U=l0 "U5,5"U"u("!IdN#71bI%hKBm-9P1?JtBR(kjS0:p%7hDn*ol=pA+UaoD\dgq#:9koDX7~> qu6Tprr2lr!WN&mrojCWrrhrD qu6WqrVlcq!WN&lrosI[rr2p3rquZjnD;F%\@fSn`Q66KdF6UpebRerebI\ue^W*te,Ieqe,Rqt eb@W.eC2gkcHODN`501"\A@"jp\b!hrr33$qtg0dr;QZpp&=piq>U?mo_s@~> qu6WqrVlcq!WN&lrpg$err)lprYYS0p[[Y2d'\pF66m?\&.K!S#mUY<"U"u("9/Gs"9/N#"oe`* "TS]#!s8Z0"pb)5)%6ud'HAl5LpbdmlgF3,k25"Qj65n&q"t$_rr)fkrr)ffrdX~> qu6WqrVlcq!WN&lrosIYrX&Q#q s8W&ss8W)tr;ZHhi;XD]in2c-c,moDaihrScdC4keGe"cf)F4teGdu#eCE.%rmh)"rRN%?eC;sq dEp4bbf[uE`QZ`YgZnM1rr)<7aNW5rnG;t\qYpHnq>U?mo_s@~> s8W&ss8W)tr;ZHhnc/RerVm`6rVZQhq"MqYU3irVHNlrV?HkrUg)>~> s8W&ss8W)tr;ZHhl2UVZ$MWi:^8I-EDdcXCpeUrfr_`_np.t`dr_`_nohYcg:f("dr_NSjnk^&u ;d+!eQ)qmSioT">XeDVs_q+/Jr7Cpu~> s8W#r!rr9!qu??gjSo\grVZQVb.=me^W+OHe_/OQeHXOSf@JO'eaq?-e^Daa^UU\cf^/;-pY`?K V7"S-o_ndcs82fos7uZms7H;@~> s8W#r!rr9!qu??gnc/Rerr3Z2rVZNep$h7s[Z"HP+VbLq#R1Fb!s&N.r<3-&rrVco)?^3K$P+$u 4DB_IV3H'g/Mp%8PJH#Cp\F^arr)`nrVcQkrVcBfJ,~> s8W#r!rr9!qu??gl2U\\$N0bcd]\C?=&;[gp.t`dr_`_np.t`dr_`_np/(cds%r_ms%r_kmnaWm ;H[k!YJeMoSSVA6EK@BVmePK6J,~> jo4?@%JoSUfZh@L]tqb5d*pP4f)4(oec==tf)O;!ecXIPe^a?D(=gm]c,[]9_9:9Xf\"K[Yd:jS bi%sdqZ$!_rr;WiJ,~> jo4QF')qk,q"*k&Z]Aip1EmPD$OI%AlN@+hp]CL!q?-a#q#^U"o`P3s)[6QU%i-BL8Q8\a4sq?n .m@9t[GLKIq"t!frSIO(~> jo4NErr*6&r9Vb8P^I1M;t!cb;>a5j;a6&;,gh=I"d?,F'V^G?YtS"cg^o5lM^e` oDX7~> jo55Ys8MBb%fZCsim56H^W":;cI(+jm+)0ermUquq:5Pto@ jo55Ys8MQg'E7t/q=Nq*[!YUq'FtTZ#mUY<"R?0g"Si-""S2`o"SDls"TJW2#7(YF%M'*^&,ctJ &/?g"NQ^PSoCi"Wr;HT_rr<#jrdX~> jo55Ys8MKes8E6$q=E.5IU1N$!)_oU!)`_n!)`ShrD3;e"]&T\Z/to^rTjI_s7H;@~> nc/Od!<;rqk5Pqaiml8m_SjXCcdC4keCEp:!7h(u!7gPh!7h&!!7h(u!7geo#h@GRe'cXjcHQ71 rQGYj_8!n nc/Od!<;rqmf3=d&cMY(p[@+[Qu>MH(C^ZU"pP81"R?0g"RcEm!rW6""SDlr"TAQ+"pYG5$2b&A $4\+:AY[<"i8*JapA"I\r;?NSrdX~> nc/Od!<;rqkl1nbo\I*HH=^.$:]O;]:]OAl;?0Sf;#O8j:^L9?OiHJPo'GlCh>Vp~> nc/Res8Vuqkl1tfqru><]>)J6eE,6]ec+%ueaM&hec"&!ec+%ueb7Pse^W+!eb.K&e',bBb3Sp% qt^'brVlZnk5Kl~> nc/Res8Vuqn,EsurVZQgp$^h\Rp%Nc%giLDj9,AamK3Fjr<*!$o`P-qoE,a1#S.h nc/Res8VuqlMh.hr:As^L1O@\b>817nPB3_r_`_np.tig;GpBk:_HZ,F/I%8j4`G\q"jsgrr)ir s5s<2~> p\t'ip&=U`s8Mcm$1luu_na11cI18,ec=8"f)F4hec==uf)F5!f)=4uf)=.sf)O:ted^-Ub/;9K h<4;&o]YZ p\t'ip&=U`s8N#t&H2P'p[dRsY^fe2*>/_c"U+#k!!;Ef!!Mor!!McnrrW'"(BapL&L0PHHB=ep SZU&kme-APr;HWorV6Bks7QAA~> p\t'ip&=7V#Pm`5VhJhf;WLXS:[1aV;=mZb;>X2i;>sB$;,^kHO/KM+`4a=Qnb`1^ !<)]lrr;ZjJ,~> p\t'ip&=des8N&urVlfr&,uP+rr)]V`ONV!b0SMce`kZUeb@Pneb@Smec+,%f@JO'pX];nr72G0 e'Q:X^W"^_oBb&`nbN(\rVuoss8Dcmrr;ZjJ,~> p\t'ip&=des8N&uqu.-(q"!h9e?FBd*"r_e#6b7n!rrDt"7u`q"nMlq!rrDs"8r;u!tteA#Rh7g 5$N>W?ur!WgZnD*qY^UBnp&9I~> p\t'ip&=des8Mfn$3'esqX)h6E`Q)t;#a>W:]OAc;#aDk;#a>c;#O2`:^^TPO/\t8SAa7Qq#('h s8Dcmrr;ZjJ,~> nc/Ufrr;usli.Fko()\MhTj'U`ll`Xe`kZbec4/!dfInEqp5Snc-4ARaN2Et`r3pfaN;TIbg"J\ daQ^reCE+;ee$B\dE]kUc-b1naiM]Xjmi9Is6'B3~> nc/Ufrr;usnc/Xg')hb(p?9i=^SGd:,SCLk"pG/5kl^kerrr9(rs/Q0!"&W3q[3B4r nc/XgrVuosm/IXrrUf43o'"-,`6-BRe^i@(lIH6keC2jnccs\WrlY8_!65#U!5e`N"M_[c^qfra rkSQKs1f#Y_SjL;c-Oede'uq6edp9Yc,[c>_8*Xe][>d3qu6Nnp\k0kp&9I~> nc/XgrVuosnGa4%rVQB\kg-,gO`E>p%LE@D"9Sc0klV(l"U,)8#lG#/$4@4M%hTKl)&jM7*?P/" &KD],(`*o#&Io3W$4$h?"U,%o!u(kA#R_+S'G_N(2e%ocg#h_pq"t$arW)oirdX~> nc/XgrVuosm/ICjpuK5p[\%A7;>a8j;;+hQ;,U@n<``C*=]t]*s&TD* nc/:]nG`sonDVX5e'l@Ub0JD`e`YL%e^Mplbf[uE_nj1)^:h(b\@f]"cI:=pf\+pVee6K[ccjDF ^:Uk_]"c2*bg=efea(cse^Mmib/hWD_nEh)c.1qOr;ZZn!<;TgJ,~> nc/:]o`#L%qtKX:\<1Au9041*$O?q>jT@.="U>;>$OmOT%M'']&euH81dF]6=^5D*>K1t$jm7E"U"to"9/K;"pbPE%1Wp]+>cl2P.B*-oD&4]r;H]rnc"%~> nc/:]nG`aae$=s[IWJci; nc/:]o)B4!rUf*q]XGMlaNW#ZeCEg7s4&jRda6:`b/hQ>_SO%&]XbJW\A$)6gu[bcmdTW0lg!Wm hV-B!_nEOc\@oc"aihuWdf.bqeH4=RfC[YoeIp?Yd*Bq]bK.W:]tMh]q"t$is82fqs8W)us7ZGB~> nc/:]pAb0l&H2Fpj2$OQ0,P<3$OI%B"9dojrri?*#RLqO',MQ,*ZtA(+sng$8mQCcNg,s&TUq[B R$*A\HZ!:n8ieOO+r_7.$O?q?r<3*%rrhoqrr`?+#6"i;#RUtN)(/==ZI\72q>C3irr<#urr<#l rdX~> nc/:]o)Asnptr6-@o6,&;#aDl;?0SW:^9cm;H$Rr='5H*,$A#P?>=\>QD:Ui]"Gbi]"#2RX/;MR MLfqc?sQu>=&`'ppe^ufkthX] kl(Y`rr2Kg%f>hWcGIB7aj&2\e'upulII$,e'Q@]`Q--IeCWI4jQ#:Vf@o'=iof[to_%qPq"Od] )>*Lin*B/uinrVNi7uo,_ns:1aihrTdF-P7f)O8$eC4EF$dm;Fb/_E>bh2(Kr;-HjrW)umrdX~> kl(Y`rr2]m'E7t.qY0R;[>7j<*"WMb#6b86"R-"N"9eu8$4Rdq/NH-j<*Wa;?!1ohNhNM]]uA(9 c-FSYbK@iA^UpkUW1]?.G%FQ9/0#?5$OR1G#6k>7"RuTm"TJZ*"qLtG%i6fhDj\<#o(`(Yr;HKk !<;fmJ,~> kl(Y`rr2Kg#P-?IKP"@a;>j;k;>sGn; l2L__s8MZj$3'kpjjUuT`QlrmedU$SbJqK l2L__s8Mio&,uP)q=a79_1ko>&e,-O"QTY'"U5;D)'h(/ l2L__s8MZj#5n2OY(U7\rDEMi"&Vro;?Fm'kYV:TpeV--M6u=8r:^*is7cMC~> nc/Ufrr;rro)B'nn)Da7_o0dHe^s':rn%2$%+38;^sD$'lL+69q"t'j!rVllkPl+mq=O%8jPJ1u ]!o>haj8Gdldl*d$ImJJa2#L0cJ%R\qu?3cJ,~> nc/Ufrr;rrq#CBn%fQ4qmFSLm;D/t!$3pb nc/Ufrr;rroD]$nn'.kbB3>(/rD%iP`aR/g%mJ_V~> nc/XgrVuiqo`#?uq=3Cj_nX:;nbW7_s76/>~> nc/XgrVuiqq>V'+rVcTbl.<:g8gY,Z$3pb="SW#u!qcZo";_4I$m7NQ^"2H9nF?)8jQc:+oCV_L p@nR^p\Oja(ARXtp%7kHnEo;[Y(pOX0d[kR$j["?rWN$!r<2ourr`i9#71eN,Wp+Qdd$K%r;HTb rdX~> nc/XgrVuiqpAYX%rV5m5UjQQI;,U7g;Gm0bs%i/]r_E]%C8'SWrr)iuq!e%VrW)urrW)ocrqud( q;]VsN-&Q9=B&0qoMGK^o2#Zf>]61^lhLDGrdX~> p\t'ip&=[b%/8c0b/VHCcdUFqf@TKBs4%V/e'lamd*BkW_7%5.k5>5Y!<2ork5PA[rr2os&H)(^ inrVFbJV9;air&Xe(*p p\t'ip&=sjrr*N-qY9U@a-UU4.MrR#"pG/5"RcHk"TJW7"pYD?$4[_.@@Ga0o(E"W"nhHZq"aab qZ$Har;ZWor;HL/qYBs^p@..n_QTG^BM:&u&e#*R#6k>7q?-^"p]LO!rrii;$PjpRBq*K3o_JC^ rU^#=~> p\t'ip&=ad#Q42N\X.SO=SbnX;#F)mC5fgnqYpKo"9/2mqt'derVHKnrVZWps8;j(r:B.+beC3F J7r%`oMGK^nk]Wm?$;IFkOnfQs7-)=~> pAY!ip&=ad$2sYacFgg*ajJZ:fC7?'e^W'rdEg(\ai;<;]sc&CnbrIes8MusoDSagqu6WorVlis rVlZn%K6(ge]#D@_8F=;d+$VDf)O:ked9gOaMGU'dd[,4r;ZEgJ,~> pAY!ip&>!krr*B*qXs75`11*e*YAed#5eVm!u1qB"U52;#n%4U(a1G5NkFZLq>C6krVc?e!<)fo s8Doqs8W&s'`@h%o^M,$aJ=;g4=_Hg%h&aL"U+Z(rrhrr%L!(E%NI*5Wm0buq>:-ho_s@~> pAY!ip&=gf$NBqmhS+hW=&DgmqbcKP#?+Z,?\GZ6qYgH^rW)oorr;rqrr<#qrr2p-rV#ErWJGJ& =]J jo5&T$hiH$`5'=4cd^Ouf`'Llee-H^da67]`koL'_TLBbkk"WLrr<#trVtgTqYq$(r:fU>gsNsL ^;J+?eGRnteb%E#e^W'qc,df:`R*]Cqu??gJ,~> jo5;[s8ET.qtB=&YCBP/*>8hf#6k>8rWM]mrra#>#7(VD%MKa25[/K(`81"Zqu-NnrVb[R'`It* p\"(BiR#<>P&jPY*Y]%i"pFc)rrhrr$j6b?$5+=?@?esqo_JLbp&9I~> jo5,V#l3`2VLrVd<)NQkr__oV$;XQ"@rmHu]\DiOdf'[Rqt0++bI jo5/W%/p(tl,pQO`QQWWf%9oRs4?tqs4.+u%b&kQcHFDTai)$/a49DNqu?ZprVtgTpAYNto&@g* ^V\"6d*pMBeb%E%e^W'rdEfqO]t2V\q>U jo5;[&,uP(p$1)/I7,(i%13@G#5n`*"SDlp";:qC#RM"X*?lsg9P]d$eaE,+qu-NnrVb[Rs82rWE0'oE,X-"U52=%N-X%UWVlpqu$EkpATR~> jo52X#Q=G_c)>hf;uTYk;ZBV\:^^6*>[ClNHBbbcl28g*$NL,'m`hefDIQaIqb[;g!_uNeohbZa rD3_p n,NCd!<;urqu7'&p?^JU`59U?dF?_CfDF,9e^i=%eC)[fbf\&J`59:6iofI`h;dnqrr2rprr)lN rqud-rV?'Lini5*^r=F>cdC4keaq>me^XTI#LCN1^W+X^qu$KirW<-!rdX~> n,NCd!<;ur&H2V-r;$!J`h.*7-5-gp#6t/2qulm!!!<-%)$C*I#7(VC$OdLU,XG@=BPW6o^"MWB q>C3irr)fQrr;rsr"T&)q=s[TlIa"SNG;!4'FkHU#6kA1"S2^+"9er6#nRq5?^K:+p%eL_q>LHq rr.E~> n,NCd!<;rqr;R#rh7f5!@8g(t;>X/i:]+#h:]+$!:JaksI#F>YQ)DCJm.UD$rX/Vul.a@fR!`@A ;>a8h:[_*c:Jt21N4S?MrVc]qrVl]urVlfrrr.E~> n,NFes8W&sr;R0(r:fO3`4fDF/!eJ-Tada#tT`l?!6]XbMsnG2tVp%\Oas82fps4RDH rseo"kg%#\_SjO>d*gFoo@Eok$J*\Qb/D',dd[)3rr;fns8N)uJ,~> n,NFes8W&srr!<(q= n,NFes8Vuqrr33$p>ilNCJsb$qb[;grD4/';,p\#=B/@%Ega,G_8"=VnbrL.rX&Q"lH#cOBO4b< r_WPhmnj!Z#$,)ocfk6(rr)orrqlrurr2rtrdX~> qu6Wqr;QZpq#:3k%/f_[eAoGCaj8Dbf%0ZKpsp),ccEl:aN`/U]stMplgaE6q>C-is8Mush>[ER qu6Hl%K?7tleg+0]tMD.cdUG>ec=>"edU*[f$r-nbJh38dcUK,s82fqs8W&us*t~> qu6nq>C3jrr)fO rr2lorr;rsr"8i$p$^th]:jd[3Zo"D#mLP9mfNt$"U>>G)F%r/g$A>-qu6Wqs8E#uJ,~> qu6Wq!<2ur!<2rspAY'k"ngBNMelYq;#jGg;>!`t:KV4JH$*n:CPAas^!,?toD-?($iK_^f>FSD DH]k5:ZtUZ;H7b%_=7="rr2j"rr<#trr7K~> rr**"rr2rtrr2irrr2rlrr2p1rquKPf#55>bKnYee^i='f@JOOfDF/!eIpBYb/D'6dFmI0a25X? lgF$-r;6Nnrr)lRrr)lorq?@"p#498^;@n5cdUFpqUY\uqUQ)*eC)^d_S3\5oDARfqu-Tqrr)ot J,~> rr)utrr2Zlp\kp+r;-*Kb)B@R&e56S"pG/5!sA`/"8rB!"9/KB"pu"d2cOI7FDGT+K;5QQa5uga q"jperVlfprSIPPrVQTmr=Sr'q"=7EhnkOh67<``$3gY:n,j+&"U,);%NdHG\Cg rr**"rr2rtrVl]prr2rjrWiK%p>`E3APi8$s%r_ms%rYkp.uB$>&8nXTUUt"NM=2-`nL+`rr9k7 $NL"qgpE/`?rp6'kYMIZ=_=/Vmelq\!<<&t!<7Q~> s8W)trr;oqrr;usrr;rrrr3Q-o&\<=`Q-3Me(*%#f@SU)qq(bs("Ld\cH*c?f&>rao'bf)k3_p< pA+^es82fos5*bRrrN,tp&=sj%K#b`k1e(s`5g*KdaZhFf)F:tedBsWeBc7S]ZT$rrVcclrdX~> s8W)tpAb-krr;rr%fQ;!l,/in0,k?-#R1G9rWN6'qZQg!)$C*I#7:ti9QZl2\[o;\\\lhHg#V\s qYU3irVulqrSIPNrVHNnrVud,qt]pQhoW!YAj%=O$O?q?"RuTn":GGA'-9\iYNPNRr;HHjJ,~> s8W)trr2utrquirrr;usrr;oqs8N8sg:)oN=nkko;#=,a:_6E3J"Xd1g"+QtdFmXFkj\KIrW)oF rW)oirX/])qXNLfZ^#Q:<9I'];cn@?c2%&3J,~> q>^EmrVulrrr;rrrr3<#k0q5[a3`8bf)4/"f)+(sed9jQbJqE7cft0%o)Jahs8Dusrr:gRrVlot rV- nc/Ufrr;rr%/fnhfq)h7'+G3P"pOo-rr`-$qu[uC"pbSO,>!9_f&l5`mdKZ8o(;YNq>:-hrr2lp rr2oqh>[ q>UHorquirrr;usrr;rr#QOf$m(89l;"mie;#=,b:^'j)H`#*Zo`+mhs8CIHs8DWir;R#qjM[C/ @THCj:^0^'Ffjs'rV-;A~> rr2utrVulrr;Z`ps8W&srr3;te%EE4bgP"kf(@SmedBsTbf%*1g$/2-rpp*hrr2l rr2utr;Qcrqu?Hj%/p%nhn=.o+qG"c"pOT$r(aiaeb3o!"r;-DC~> rr2utrVuiqrVuTj"oRrERVH'p;> s8W)trr;usr;Z`ps8W&ss8NH)nAhcHajASgf%0iPs4I2"s475#$.RGLa2,F6mJHnQs8N#srQ5'= r;cimrsA>Vd)!K9bL+hin^\#seC)[^]#idqrVlinrdX~> s8W)trr;usr;Z`ps8Drr%/fndbF_ZO'+>-N"U4i-rrr0#'E\I@"U>DO-rGl3hsg=5q"X[\qYL3g !;uiprr2oqao;8;&,c>$q"=.>`/7_T*"WD["SDlq":YG9"U52?&jLH;iU?O s8W)trr;usr;ZKi"Sq,rJ5Z,=s&/YiqG7As?[o<1o`+CZrr't mf*%^#Q=A[b.5I8df.hjfDjD2e^MsncH*cAh!Fh7s8T2"rr3?&oB4cM_8=@@da[g<#h@GSbeh33 h#.-Nrr)utrr.E~> mf!7err)d&qt9!RHU&;V$3pb+"T/E3"pbSK/mO7Aea3#+qtpC3krdX~> mf!4dqYgTic_bdO;#sQlqbRJoB8`tClhRgbs8Doq#ljo&oA@9FE`qs0rD38d"C?&Gk4S]Prr)lr J,~> n,E+^#Q*oFbJD n,E@e%fZG*r;?B]gQktp%grXInc\mq$j[.I'dZP.ZIeF8qYdc"s8Doq%fQ>#oBXVgBK@4J$3p_; p]LHtqu[3/$54FdVp4])rquco!<.K~> n,E@equ-d!n[aTk;"%6^;Gm?g#?>,[XjQS5rNZA%rVc`ors&Jb]Td;;;tNob:\mln;H/Rsk5G>Z rr2lrrdX~> s8W)tqZ$Km!rr9!qYpiri6BBbcI1:rr7Cr#r7;D/e^MmhaMPX2h s8W)to`+mh%K62#p[?OZ3Zeb:#6b;&"TJZ9#7(\H&1CD#S\X7Uq"t$frr)f7rW)uhrX\u(p[dIi V/f'M&./XF!sJ/s$NpY>%21j=W9EmMr;HQordX~> s8W)to`+sjs8NB(rVlfrm&+i0rD\i`UV5=Nr:g0jrP\[8s6fjip#X2`H s8W)tqZ$Km!<<&trVm6(q!?JHaj/;`f%BrQrR_b7f%/C$da6:`b/hN9c0P-!qYpKoqu6Wq`;]f: nc&Id#l=/N`P0:5dadm="4u&LbPoK^i;EHO!<.K~> s8W)to`+mh%K-(snCt?[,8:Fh"pG2)"TJW;"pYDA%hos+-:;jA[*\17qY^6is8;urrPnj:s76-u rVZNep$^A+F$:]Y#mL;2o)fC("U58@+ZbA1lhLATrquirJ,~> s8W)to`+pi$31#'rql07OBkod;?'Pb;%$9$='Js:G+cLniV*!E!<'n9s8VKc#63u.ST%b2r_WVl o2#EarD3])DQN='s8W#rJ,~> o_njhq>UBn$2NW.`kopIe(*%IfDaD9f@JI!ccaAH_oL$Of\#!>mJ-YZrr;lpr;Xk;!<;in!<;cl s8NH)qX3.`_8FLEe(+$?#h@DNc,RKNq>L3j!<.K~> p&=mhr;I-%q"*LGF[$ZP#6k>8qZI`>"9\l4#7(YF%i6HF6;La#KVclQoD8C`qu6Qma8Q)=q#19n q>UEm%fH.qkL$2G6QQ[B"pG,4o)fL+"U52G,AOa@o_A=]rVc_G~> q>ULQh`L:gI;tj,h;YX)sq#19no_o$gl,]<:>5V1s ;=@li-q^rdX~> o_njhq>UBn$2;r^^;J4Fe^`7KfDjJ9f@JI!bfI`?`Q?HYj6>pqjm2a?s82fns2k9?s7uZos7QBj rsJSigr7+Lbg=hifC[YoeHaUQa1B^ep\t-ks8IN~> p&=pir;I-'qXj!qJO1Xm#mLP:qZQj$'a=pN%M^*>5Z2-9Kohat]AW;Vr;HTkrr2isrr:+>s8Voo s8Vfl%fH.pma.VC2&Ql0"pG,4o)o!q$j@"P;3f&fpA+Uarr.E~> q>U?ms8N&uqYg]tpZ%uc>u:8ms&/bl%oQG5B6/ZeTrbW3]?]d>rUg'hs2k9?s7uZos7?3os6.=d C0+=4;#aD\:]u?Yg\q0MrdX~> p&G$j!<;urrVm5ud'pd2cdgRsf@TuPs47n7eBuLZ^q\"Klg=36p\=LUp\k*knc&OdaSu5 p&G'ks8Vuq$2Er8W*gti$j[%7"TAQA"9er5#7:qX.nY#PX1?'fc-b)"nG)nZrUTses2b3=s7H:" rVQB_k0KW(1DgN+"pFDt#m:PG4D_%^oD&4^rdX~> p&G'ks8W#r#QOf"k/`EaX/n :N2Q=qu?TnJ,~> o`"pjrr;usrr36&q!?56_p$R.f)O>%f)F2,f%&6rbfIcBaOg"Us7$$drQ>- p&G$j!<;ur%fQ+`["(LY%g`IE"9Sc0qZRZ<#RV.a1K8h/eE65joCV_Lq"jpenG`Cdb5VA>oDT0s qtg!R`emhI'at o`#!ls8W#r#64\rdA_:crDESks%rkr;c?Tl;$U')C4W/+lhUJYSGrQg#6*PbLLO1ZpJ:ier_`_n qbRGl@ rr;usnG`djk0qAeajAPgrRV&#rm_A*e'H.Q_pI0#nG<.akPkGYb5VA rr;ThrV['"oA,X0/.W*o#5eW%"VV(G$P+=DB:?WhlLO]Gqtg3er;H'_rVt%>rVuHf%K65#o\[E@ 80noV"p>)!!sf,>)_H?Ziq3'GrdX~> rr;usrr2utqu?Qm#645&K4RkUqG@;l;c s8W&snG`agftt_McI:>Af*p6\e^W$naMbs;h rr;oq"o\AtrVZTkrrr)ld rXA`"n)Uiq66-OA"U"u!!sf);&K5,aeFNG7rdX~> s8W#r!<<&t!<<&t!<;ur#Q=J\T4_;&;#=,h;Z'At s8N&ss8MNf#kuf[`Qll\f%BoP$eEhUccX&=cen0drVZ]Qrr2l.rr2p'q=*.T^rt*ReFM/ud`fS: ddm56rr)iqJ,~> rVulr(&e(-qtg-`qYU3hr;6<\fs5!,&I/O>"oAE5"U55?&0strXO-)"p\Ogdhu p&5$kr;HNl#5d`5N*'"Tr_`Pjs%s2$;,L.rIA+gHpAY*lq>U?kT)JokkfK9(;>3od;>F&g:BQ*R g&1gJJ,~> rVccqrr3#uq>U!dqYU:"rqZ!-\]<.Jf%8RQf*^*Zda$"T`67',q>1-Krr)f.rqud#lc[2dbL"`/ edKpO`kKg]o)AXerr.E~> r;Zfr'E.h(n`f9%o(r:_qtg$P`0Et.$iC2+":t_@#R_=m7X_Glnb)\Sr;HTOrr)l1rXJi'q=a"" QqAV9#mLP9o)f7%#7D&'C9-arrr.E~> p\k rr)lrrVm'"lIsqGn,*+ir9W1Z^!"sWr7;A.e^`-oaM>^GkjnQJr;YUPrVaD.r;Quojj_2cbgH"4 $e*JF`QHQirr;uts*t~> qu7B0rVQ rr2fp#5mN+cI(qWrVd'%ouEM>:Jame;?'Pn;ZK_p;$Kj'JYpc[q#(0grW)orquH\drX&Jre=_+j :JakbnPK6]"(QYfqu-ME~> s8DrrrVm'!gV1kamJHnfq;9<3_Tg[/f*^*Ye'Q4T_9;'=rVHQMrr2l.rqud$qtAsb^W4XMo@=/r dETeO^tntfs*t~> qu7E0r;#s)U9r#&r;HTjp?gLp;(E%["8`6$"V1eC$PXpXJ$@Yuq#(*is8UpSrr9V0s8<<&q")q0 D(uh8#6aW#$NpY>$6:mWiUHdCrI=~> s8Mlp#Q)oN]Zo[?s8N!&rU7(A@o#otrD s8Doqrr30!b+d,Nq>:0rpX6Ob`R!-4f*^'WdEKGCdGjcrrqcZhrW)nfrr2p&rqtou^Vn=Fq:>Jo #hIMRcca/4f_tdKJ,~> r;R*&r;66VZ%9:Bnc&Inq=E[gFYOjD#6Xi+&Hr@D$4nIZJ@+%sp\Xpgrr<#mrW)ngrr;p'qY'(! R8GFH#mC#*rWN6'$NpV<#o+\-c/ncur."~> s8N#trr*-%qS&!(l1P&U#6+Srjdfj_r_WMis&/hn##JTTUsSN)qZ$?irr&SjrVulr#PRGqIUQ2P ;#F2`:^'Wn s8Doqrr3)tb,*Ybrs/Prc*=t(d+8-H$.dSPbf@WDiUZj?s7cNmrLX#drs.uBaMGpEe^aTK!S,^! e,Ri%d*Kt[_n4Onqu6VG~> r;RQ3r;-*PYCXF[q>U?jp[6M5>oXIa"p=c+%0ZqA$5+OMI^7]!p\Ojfrr<#mrr;qgrXAc&q"!a_ GX`V["U"u+!tk_?#6tM>"pP;<$5Y%+\CgQPr."~> s8N#trVcuq]oU81r;Q^#rql*2MGmCO;#!ll<*aXAbj>?)s7cNmrM';is8;j'f:@+g:f("d;GpBk ;#aDm;?0Sm:^Bis>EmP!rVleH~> r;QZp"9%3%kPG2_r:A=G_T^I+f*^*Yd)s8Ddc']lrV6Eirr<"crr2p'q=*.S_9LEWec+,*e^W$p d*U%ZaSs3_c.(P0nc&Q=~> qu7B/qXa!jW71S>rVQE^jgg4='b1KRqZI?4#R_.b7!#QdmJ6YXrqufnrr<"drXA`$p@6V1CaT`! "U,&.!sSl3#Rh4U&,cnB$R@rTTZd$(qg\~> q>Us&pX6M*rVlisrr;fI[!_gKpJD*!H(E4Jq"Xmdrr<"irr)lqrWN8ba-L-3:^U&t;,C(d;H-[u <;fW!:LS@2]%m8`rdX~> rVlfr"oeDnmcX6>rs/Mnk0LiacdVjE$.dYTbJh< qu7B.q=!CpbN8["qtTdIesTl#%giOFqudH4#7;(d4E.(EoD&7^rql`mrr<"drXAc&q=`ppNBJ3i #6kA2!tthB$kagF//fQT*"jepEgt/Cq>5[~> qu6m"rV,g?fBiM:#QF]!n%Y!$:]=2d;$Bp(ELb#4pAb$hs8S\irVuiq#ljPYZ>`oC:f.-gr_O2* qu6m"r:B7Ep\Xjf(&Hk3aiVfUeCN7'f%&6q`PKXFlh^STs7QBks7QBjrOr4/s7?6frs%oBbJqZM df.c.dETbLf'h8%al1aea3EH.pAY)B~> r;RQ3qtB4+iTg(5qt]gJftMJ])[ZiS"9\W+%L!%B%37ZJVpsr(qu-NnrVuQis8Vckrr9\2rVcBf s8=,VQp"#6b23"9f#@(eB0b0K`2o+"p$+XO6b qu6luq<[))nbN1a#6+Mjhk+Xfr)!5e"^,l1a6WNqs7QBks-`iiqtA*fBN=k)&Q2Y^\.rVleH~> qu6fur:B7JrVm]5p@.V=d_ElLdaZguf@JL#ccX5He`?Dss7QBks7QBjrOr4/s7?6fru1RmeAB,H dFHdsd*'> rVuos,l@?#hX((8r;#s=`NYM#((LQQ"9\f0"9f#9%N73#2"pbbY>,@-aD1cCb4?Rr&g@kC@J,~> qu6fsq<[/4rVm-#m+p(%JlGYG;#F/o;d!n"]]Jkep&>!kR/R9hgS]I%:]!s$:Jt2Sf!pO%Y*F0J Bq3Z:rVleH~> rVlfr"9/2mr;HX3r8lAVeB>hTdaZguf%8L$cH!lFe*$H&o`(ZbrVuWk"9&5us8N#tru1h0hS$SC cdgRqd)s/3e+rb*o(r(LbbWJZrr2qJ~> r;IB.r;63YpA4X]o]WT4CfDtr#mCJ2!tGG;#71eT0j:-pkP"`LrqQMfrr)firW)oprZM18o?sLM -P6^k"9Sc2#nRnTUo^Ju\smnC0mh1)p%eN9~> qu-`sr:os]rVd&rb+b/UBi.b*;#F/o+4F>qu-ME~> rVlQk$N9_O^;J%5b0\\hrRM5(ccO#>dc9ujs.]Mks7cKprVlisrVlfr%HG+3`6Hf^e^2LU[F=sK rrg]=`V'--s*t~> qYpNn%fH5#q=a!uMbZAa(^UBLrRrr2]mUAk,ip\k0kqu-lup#*fB2&Hc. rWEl=#n@YGQab>ngr$(23e,E6p%eN9~> o_o*op#`8uDIcoH;#X;r;H.+\Yi#HOs3^fGrVlfrrQ>*>rV?EqoAm#c;Yj5i:Ci,sh='t/j3 rr2Zl$3'ekca1@+bKeQ5ed'[I_nRESo_njj`Vp&@rr2lqrr2p,jM&4Bb1"nkd`obC fD5=D"Oj*]k4ATPJ,~> rr2lrs8EK+r;-0WdAph-*u,4i"oJH3"9o2H-;'<:i:QjCrVlQkh>RESo_njj`;]c7+TD94leJ"$ ,S:=d"9\o7$kYjVY1hq"hU7]jKtZ46qYbp~> rr2Zl#Q3Z'NEfUf;u0>i;$Bm'G-g0!o)ItRrr;cm!<;fm!WDrqrVufqrQ,!#P>r r(diLY1*(@qt9B`Eh(G;rVlhI~> rr2Zl$2s>Na0`Y*cI15Af)O8)e'H%L`R=/Cs3UcEs2P$6^VIq=e^i3qaMHEqq#10k "PpT2ipcsIJ,~> rr2iqs8EH(q=NpZJ4:7`#mUV:r rr2Zl"SpB=F\ha.s%rtu>BZLcqYg!bl2LY]mf!=er;?Nmr;Z`:rW)oprWN8GL1XEa;#F*"DjJ0' o_SLbbEK!LjSo2ZJ,~> qu6Tp!<2ut$2`St^q\%?e'uqIed0dRccX&>h!t4>s8W)ks69O^rr`9!rr;oq!<)]lhZ)X8s8W&s rr3Ptf#b_IdFHgtdEKVVg["b9rr3,hgYh8drr7K~> qu6Wqs8EB&p[@"):b<1a"U+`*%Klq@$l1UD[+Fg@qY^?lpAaCVr;?Zqs8;irrV6Bjr<3&qqYBpc p\jg]p&FacpBUKhqYL*erVbgVs8Drr+8ks,mCRU4)@H]O"9eu9$mnGgXi]PcmE_uG`81.`r."~> qu6TprVcom[X2Q`:]O;g:^^,u<+quPli$h_rr2Tjl2L\^"9/8us8;irrV-9krVZQnrVQQos8Mut s8Muts8;irs8DrsrS.;Ss4*T^=8l%o:Cgr_UWqfjq>T qYgQrrr2os#l<)[^;eLMf%'cN#M%8JaMc-HmJR"arq6T4Mj8K&Yr;Q]q )"Ze9^r=aPf%&6qbKS;hnFZGNs7l*Mkk"fRJ,~> qYh!)rr2cdilQF!*")uR!s8H(%Klq?$Pb9qU"S`*qY^?lp&F:Ur;?Zqs8;irrV6Blr=8c&q=jRR o'l)6l/q'di;;C?i8N_YlgOH qYgKprr**"p#_lU=T)%r:\mlk p\t0l"o?`V^rk(&ed0gTccEi8g@+k4s8W)ss3^i$s7?6grU9abrttP!ftkYUf%/C$da64Zdbj-K o)AUan`TKBs*t~> p\kHnnBRq;*>/Y_qZ@91#7;"e2rVZQfp@@Y pAP6nk/rT^;Y_fT>qYg9js8MiogA_-Ns82oss82fqr p\kHurqGg,]#;kArRM;*eC)OY^;K(2rqQNnrr)lFrql^!rVQ9UlK8',s5a1>s5Nt8s541?i8s:r qYgHoo`"gfn,E=d)#O$a^r4[Pf%&=#e'?%Ydact6rVuohjmi?MJ,~> qYpKm#l!YnJ41([#R1,.%0Qh@%j!f\[bCBLr;Q]os8W)os4@8Lr=]#(p[m_,d)*B"Xf%k^Q&poY LAcf pAP3kd].Rgp.toj=`1+emeHh^rqZTJrYth6r;HWps8N#rp$Leme^;Xa`PB*pZ)t.0XK2?%$*CMC _9:?bkjeKJrr)lUrWN8dc'hu6:_$9-Dh+"hqZ$T_g?\b pAYBrkgdkoajAN9ed9mVeBu@S`6RZInc.);qYq0(p#=<9\[SuT[^U?kn,E=d#6+P[^r"LLrmq,"!n,?:rl><&rVuofj7*'JJ,~> rr2lps833#o]DWB0+J>@(,K6mg["Y4rpg$@r[n*HqYBmXn*89-Q?d(A:.RiA69me# 5X7V$6:+%-77^3WEJga9i:?U:q>:*gq>U?mnGWamr;-3J`-s-F#5\K5"UGYV0M@_qp&!mtiqE3G J,~> s8W)tqu6cn]S'tk:^'j5M8o,_mf2#?!r`&qrVd?-rqtm'Z^Qf#G][tGDf0CfC]A,TCMe':N2")? n,!(CrWN8jgneEQ:^pB,BR.&^s8VH rVlrurVlcq#Q3Gta3)]UeGe#)e^N!n`PKpYo'l\.rr)j+rq5U>iR,HMY,eP#Vka6`&u)8$WN*## XJhqeSu&X+d,+-`r;ZTlrVc3ar;Qr]^VS:Hec"&0eBuL\`5:@.s8V`TnbW4aJ,~> s8ET.r;$']qYBpQfRbt%$O?n=rWE0'$3^YE+B+*7me-GTnGh2@0E(hFp@IG!`3GSR?UQ^r*uZ(; *?QLS1-.We7nQEJ84H!:<+L?>YK5MboD&4]rVHNls7$$fr rr*<(qtg6js8Ml_W+oT2:]sX#K<sB#:L%\=q#CB^h rVlrtqYgBm#Q*/b`Qur\ec+,*eC2gi_o(F+qtC'irqZTUrr2rkrr2pCrr(lu`l#X-]t:kc['6L& Tqem,`QQWXf@SEl^U:/=T:rU6lMU\^rr;rarr<#srqud#j1`=Te'uqIedp9YccaAGh>IYs~> s8ET.qt'.Dp@e.9_e^A,#R1D7rW]RUrr)Zl1]@7Jp[RRmX++&7 0dn+^'GD)n()e8D2,%ItH@h$6NeMh!A6Mi(:h>9bfBN#)r;?Nms6]gcs8Dp(rVZT_iKQ&."p>)- !tPM<#72>'LZS1*mbcs^n,.\~> rr!9'p@.kVrr)BDQ<7*`peV,k;eDlZn+Qe]rqZTZrr;rsquH]hrr2lrrX8bgbbp#6AmebA;GmEi ),F(0??1^[R%L4RWM,]=Jp;3KD1eM*mJ-_\rW)o_rr<#prWW/k[q8K5rD rr3N.n`BBBs8Mi`d^[?HeCE+KecsXPd*9\XlLY#UrqZTUrr)llrr/df-ob^VIY"]t:tm rk98cc.V"8l0[s/lK$^I`k8UZ\&-VRmeH_[s6BR`s8;lors%T$_TpTYec+,1e^Mpk`kL4*s8W&o o'5lIJ,~> s8XHZo^hOqV-"B>"pG/.!t5;9"q2P=PLSgkqY^?grrE&os5j7YrVZZprFQuYhE )>k!g&JH373_EUmJsW46[Ca/f[]Q9hL3I<;@;Lk&bN/3hqu#dZ!<;urs8<9%o]_l*'aOsG"TAK6 "9eu8(+4RfnG2Y>i7I5kJ,~> s8EK)q<-Arrr2iT`.h)b;>P)J,~> s8O#:rSPQRs8W)dhordVe^`7$e^i=$da6=jht$(4jo55Yqu6Nn.d>C'^qmq-a2Ps3]XbMje)BZ\ mIBiBp\F[^qt^!Zo'br0jP.qfZ-r"6rVtsXrr32daMuNQe("BJ&(T.Vcbm0Ar;Zfrrp\t;s*t~> s83?!m`VZXo'kqQJOL+W"TAK6!WrN-"U>Pi=.n75qY^?lnGhVLrVcZn2#[=Hp$:S=G#U7A'+P s8NK&o?jnus8VuBUj#W4:]O;h:^'j7MSnlWm/QAM!<)op!<)Ti0)bV=b++#p>uOTr:Jah_:fD%V S\*2)jQZ%!nF?)?nF#W+jknS,XHnNpZe4aFhYmVqF^%cB:]OAl;@QK";H0.Np\t*ekgeqsJ,~> s8NN#lHm)ts8W&XbJhrr_cKn,In~> s7m)de[M'hn*K)+>r)usrWE0%rrWW3"U>Md;4ZD-r;HW`s5j7ZrVQR8r;#pLc)l7Z//8^($ORCZ ,;MS`Ckeh*fBMYko(2MQob@&inaPr1iR><.Jp33Pa5QL_qu$ETrX&Pun#8u+%0m%>rWE0'%0d(O +)AXIp%J(;bN&JM~> s8NGoh8#o;s8Vo.KkUB\s%iPh"]]2g^[1^]s6BU]rV$3pr;,KuTQFWA;#a;u;,^b6FFfd]al;ji rr<#rrr)j)rV#O(\!rJS]%66Bi;NlZaF.GprD s8NVlc,73Os8W#K[_9Z*f%/CMecsXPd*0;Bjm)mArr)fgrr2lirr2p1k0(ZS^;@e,_7mFb`Rs;B p%\IRrsA]%p@$tZ][Gs9r;ZNjrr)lr!<;`k#QO2@c-4J]eGe#0eBuL]_nXahp\t3mnDNd8J,~> s7QuPZ)*r0mH<2X3?eq=!s8W'!t,58"q);0OO`^qrVl9cq>U?mp&=sjp\l61p?LJ,?U#\M%L`[R% iHT]BT&t,dG*dLo(2PKq"Xjas7d9%p@RqFlf6[>Z&aO1^Z"q_qu$Eerql`hrWr;gX]?q_#6b80! tPM<#727uAu s8NJ_]WnEcs8MboBNn@5:]O;f:^']sD6iC!m/Pf=)>a$CMK)cu:f'qa:fLP=Og!!`l1"HErr2lh rX/T!o'"fHUmSL7m/$_[s7uZos7Q?os3-40;ts/t:KV(e_VkCms6A/!rdX~> s8NVlcHOGns8VuFYe8$&f%/CMecsXOcH3l=k3E!Brr)fgrr)fjrr&mJd.cnDE^7J,~> &bYeEZ)t%MleBF!,T$pp!s8W'!t,59#Rqe?R,%0/rr2Bdq>U?mp&=piqYpNn+8>?RX`60A'+bT` &Krl!?@SW^gZS/"p@n@Xq>1!cr;HNmq@WPuq"OOSlIN)&S#afro(r:_p\t*jp&56ln?H:S&I8RD rW s8NJ_]t(Z/rq>QG=B&/s:]O;f:^'a"EObH3m/Pf=($El4B3J),:f1+sC3k`4^=ViJrr<#trW)of rX&MqjhRq$^=r&Nr;QZpq>LBoo_o$ocAcU=:\dfq:M59HXjm:Ks6J5!r."~> s8O#-j5Jqcs8VuGZG+H.f@JO'e^i:"ccX;Mdd6W+s8Mioq>U?kp&=pgqu6Nn"R4=P\[qdR#eIOl jm2F/q>C-ir;Q]qqYpEm#Q45Yf[8C5p&>!crr)ferYkh,h9sEgcdUFqf$i!g_q=M;b2N=!s6ne3 s*t~> s7@;e`l,dIl-$)5)%m8]"9S`-!WrN.#7;+t>-.#_rr2`ns8Mioq>U?mp&=piqu.T6r;-$OX_:!@ ((h)h(*#SMNO6aZjRDjVp\t-ko_o-ln[)jc'+"jH rW s8N\pda6>(rp%mk;,L.e;,C(b:]+#m s8NQ%mdBQ-e^i9ubf%BIjRi'D!<2foq>UBlo`"jgqYpKo%fH.Z^q7.e\%T`$ c/A6iq#C3i!<;inqu6rtkM+\InGE4bp\t0jo)9R-o&/!;aj/>bf%/ s7Qoaf\,!=l+;jI'+PUBno`"jiqu.Q5r;$'Hc\aq7 'GM9+01B&lT"a(Fnb)_Tr;HTjrW)unrr;p*r;69\jiFm@`o6ObrV- s8NDpiSrqhrS+f3:]=2i;>sAl;>sAo=ad.#oD\giq>]7L"S:cXDdNE>$!Ln`LnqlAp%n^frW)ol rW)uhrWi)I`Pp0dq#(*irr;9_"Oi`Z<_rKe$\,RgUWiW8s6nh-n:1~> s8NN(p%\F_rq#=#^W4XKqpl#&ccEc3hY@$Fs8Dres5X+Xrsnhme@2p![&q*kipujArqZTfrr)fo rqud%rV?!Di9^.6s6oscrVQR4s7>:#`Q-9Pe^i=#d*'A`qt&t?rr<#qp[dj(~> s7m)mkNq^,lD\MZ%grUGqZ@0.#7D+iB; s8NAtm.'fHr5tFJr(mf!;Gp@i;,L.d?C&XqlMo]>&c^k-O'5IY;,M.bY12J"p&+dKrWiAnkgn/> meGiA"P'&e<_rKe$[JYV]A!2^rqGmGj+%~> s8NN*qY^Bnror"Y`QQZYrmq)!"k1]5\\$krs8Dres5a1XrsJ,D_m-Ya_St$cnb3"Trr2lorql^" qsWh?p\b'[rr)fmrY,>)kgmYjbgFtlf$r*ka4KYHoD&=bs8E&mmXP~> s8*5uo(DhMka>-q$jd+@qZ@0.#S%e4K>ZX@qu6$`!<2rqjSfqlq!dLRGY&hn+#d&=Qb;;Bo_/(U qYU9jo`"ghrVliq$N0etq=`?>Lp%eIYo]OqY~> s8NB$p%\I`qR_8jr(mAjr)3Pl"BK6 s8W)ts8N?&ho*RYcdUDCed0gUeC)FQ\@pqts8Dres6'CXrsIPgY-#1Mg$nY/r;6N^rr;otrr;fn #QOf#qYU3is6oscrVQR-s7l':_8=CBe^i:#da$"[dcL?(r;QfmnUL~> s82lorqZokjG>]6#mUV:qZ@-.$54g^T]#54r9aLarr)fYrr2j3qXs.1QUrhK,r92*]@Z-6pA=ab r;HT`rr)lorr;p%r;-'TmdU#Mn,E:cr;IZ2o>HD]*=`A[!s8T,"UGJ]6&F4Yp\F[^q s8E#srqlotpo\=9r(mf!;Gp@i;GgA!Ges1QlMoiB&c_k0qtIR=>u4aUBmr;lEKJ,~> qYq6-g:P>MdF6Uqf%&:!da,kF`ma;Ks8N#gs5s=YrsAZ#e#07Q`RjDSq>]aZ!<;lor;Qits8VQe rVcWm'*%k&h7^PEcdgUseC2dhai*'6qu6]op4*~> rV[*#q:0i m/I"aq>LWtr;6<`pA4aVrr)lprYt_*c_"\l&./UE!s/Q-"pl.uH-bUGq"jmco&kN~> r;Hlup[+YYej;$0mBRagR$jo,8Yrr2rt%K>hPTNtf3I[e.8oD\dOrW)ulrWE,pq>B:P)Ye0m;,C%a:f("mA#&;^rr2lqrq5W.~> qYq6,fXSoKe'lgre^`0udETJ?g[k:*s7-*es7cNjrs8JmcDIe[g%>.:s760hs7-*as6oscrVuls s8W'2s8MuT\[oi,e^i=%e'c[b]@m,ZrrN,tJ,~> s8F#:r;-0F_J0r!"pG)3"9S]."U55C,\a1*o_A=^nGhnTrVcKi')h_'o^9VZ>ph[4MSds.n+QST rr)Ees8DKerquutqtp r;R'%n(j7-;Gg7dq+q2k?'E4hkl9fE(&e(/s8W)ts5(;Brr2rNrr;rVrY+k]VdE4r ;,U7f:esnb;cSq-lM^\\!W)P@~> qu6fqo$k4jr7(bs#Lh&DaMl s8EB(qtTg0VcjcC"pOu/rrWZ5"pb\^6&`tIq"jpfnGhnTrVcNj'E.h'oA@WVA4ndcN4J' r;R!#j2HgN;,R6f!)NSj"]AZKYi50:s5s:^rVZWnrX85R\W:uFL9B&&rVulr!<9S.'_gst@8B]s ;Gg7e:Janb:k6%0rVulr!WDnG~> r;Qs"n`8$/anjNldET\Kce\*Qs7-*es7uZlrs8,Oa02tjh":IAs8N#ts7-*es7?6is69O_rVc`q s8W)trrq;e[DU8>qpkqn]Z&:]rVlfurr<"K~> s8NB'qY'EkLeA?gqumQ5!sT#='fos0k48EJrr2EemJd(_q>M0.qtTdL_inUg5#7*]iUZ^ rr33%s8CHIHVjT:r(mPtEKeWAr941CrXSo)rVlfpgTufJCO<8Lp%n[fs53hUs5*_\q!bOs:Jand ;>X/n:NMuJr;Z`p!<%E~> r;Qs"kL.DcbPK`nccNu;fBr=ps7-*es8)`nrsAJih8m%$^"_rRr;Z`p!<;Qfrr:[N!<)ip!<<&t rr3/YZa@Wpebdo$b.PmOm/I"as8E#uJ,~> s8NH(q=EpOBfck5"9e]-rr`]7$POgmQHA[lrVlfas6fmbrVHL+rVZKagUrVV7P7Yl[--uRqY^ s8W,u"TSD=ODb"nr_`Vj"B/Zf]AhuQk5PAY%0#YGZ&!@&IAbNks8Vrp!<:pT!<:pT"o.Pk@8Kf" ;>X/n:NrS\r;Z]oJ,~> s8N#t#Q s8EB&p[I:18h1AW!sAN*$j-V<%NRQcb2N!grVl*^nc&Lcs8N&us8E]1r;63W]6dI00K43kg@+_2 qu-Kkrr<#trr2r^rr)lirr)ldrX&Goj3330'Fb rVd'%r3pfX:f'sa:^']tC9Qgmrr20^ir0;7U46NU@@Q-Crr;cms8Tb2#5@Jf@8Kfuq+q5jK=p(> s8;kH~> s8N#t#Q<5Z]>MnDec+&&e^VaY_oh3>s8W)cs7-*fs8N#trVulrrsAZ$jiP*8[`%)$qu?Nl!rr9! rVc![rVcEgrVc3arr3/YZaI`rebdo#b.Q@"r;HZprdX~> s8EB%p?C7`1a!54!X&E)$NgM<'/NjhiU-@9rosIQrr2lqrrC6kJ,~> rVd'!oVl>':f'sa:^'d2KuNiarr20^jSfM[m(.XW;J:`oo)&+Z!<9_2"8;&`@J3M#:P?L?rVQSE~> r;R$#dAaXpcIUPFe-=IQaMHU?kn,E=d"l?Sm_p$X-eca..eFEA5s8N"J~> s8NE%p#4&7+r:Xm"8r?0!sArK9nU.GoD&7Is7-*grVc`qrt>>0r;$*C]Ql+N),QF/l1=`JrUp0g s69O]s8W)us7uZms7$!oqXrmnKe=&K#R(#,#RM&:0jJ,~> s8W,u"SV,N<)WKf#>\BKVq:nHroa=BrX%o>Smk\sI^7T%e,KCIs8N&uir0)SlE+JjpJ;&iJ@OA4 rr)fpJ,~> rVm-$qTu7Qa3W?7eHOFA^tS>Sr;Z`pmJl_U!<;ur!<)orrr38rk0:0:\_$WUrVuKgrr)'[!<)lq s8Vlns8DBbrr3/YZa@WoeGIf#bJ)HlpAY'krr.E~> s8NE$o@1*W)\WSa"8i9."UlG^UX/N)qYfXXnbrOer;IB0rr2lnp[l_%@O!!CC:;abp\Xm[rr2r] rr<#irr<#erX&Goj3<91'Fb s8N6$rTi$rohYcoOM^)Yrr2-]jSfJD\VaNk?Bs"*rR1ZFs5*_Xp$/Ye:\RZi:OTJ!r;QZnrdX~> s8N&u#Q+5AXh2[$fDX8)e^MINiV`]Ss82fgs8Drqs7uZmrU^$frs.l<^TP&ahu!?Os8E#ur;H]p mJd(as8N&sq>U?mmJd(_qu6Tp"l?Pl_p$X-ecj73dcg?&rr;usJ,~> s8E?#o#@%t(_I)["T8E1"9o;[Ger;2q>:-il2USYrVuNh'E%_"n@jEK+XoL,f^/D1r;HWos8N#s s6]garVulsrV?HkrU'U_s8;j&qXrmnL+a8N#R(#,#RM#1J@=e8q"t'iJ,~> rr*'!hS+\>r_NSlrDl2TlE$3/MIGue9jXRQ,arW)utrW)uarr)lsrr;rJrWMoZ X^Fs!:]sR>W7(V@rdX~> s8N&u#Q4AEY.Vm'fDX8'e^D@KiqrcRrq6 s8E?#o#R>'(_@#Z"TAN'":>>D-\^%6q>:*grosIYrr)lhrX\r&oBihu66SEuT]PeBr;HKkrr;Bb rVc`p!<)`mrVc-_rVufp$2aGYdY]^o%1!+6!sf/B5BW^Gj7`?KrdX~> rVd&\_hV#a:f1*g;#X;o?``Pdr;Ps\jo,Sdb`$C=p:\RZh :NiGLjRN0IJ,~> r;R<*e#p@*d+?k"e^`0s_S"k(s8Dris8Drqs7uZmrU^$frs7MjWhd],qu?]nrW)oqrr;rarr)li rr)lqrr)lirr)fmrr2p$h6=3%bgcO@#gUB=kj.X0s8W)tJ,~> s8Nr3o?XFC(_@#Z"9S`/"U,,C/ rr3Z2kg5;b:f("d:f("d:f(&![J0Rtroa=CrX&VDHt$$([bCWYqu-Torr)otli-k_df'CGosJ4( p.tp5RBONdrVc_G~> r;R<+e#g7'd+?n#e^W'p`51O2s8Drhs8W)rs7lTnrUTserrq,XU7o^(rr;lp!<)ip!<)9`rr;Wi s8W&squ?Bhrr)]mrr3/XZ*M3ieGIf$ccFD_f\5ZhrdX~> s8Nr4o\.#o*"rYa"9\f0"U,/I243Y#rVc`pkl:GWs8V]i%K#ngjdo!t-Y'7)n+ckZrW)orrr2ra rr2lgrr;rqrqlZfrr2rprX&Jqm,+*f)%R#VqZ@*/$Rn\[K=URKrr.E~> rr33%o&H'6;,I6h#uFJr:f18.]DVX+rojCErr;p&^2I7VNmm@ns82cqrVlcrs6BU_s5EtWrUg'k r;*s7ohYj)IZU;MrVulrJ,~> r;Qs!e#^+"ci2N#e^MpkaN3QDs8Dr]s6'C\rrprIS"Idsrr:dQrVuKgq>]j]rr3/YZ*M3heGIf) dEBMD^r,(.rr)iqJ,~> s8NB$o]FYJ+VkFkrWN6)#6kMU5G.B;rVc`[s60FkqtBC7PrpWOGKf.=q#0%JrVc?es8Doos8DBb $2aGbk+"RT&.&L:!t,;>'dGqJV!n*Yrr.E~> rr33%r:Zja;GdB@XWrosIFrX/T"[q&QCSaQFUs2b3 r;R<+d]9msce$e"eC)[fb0K8Ns8Dr]s60I\rrprIT;^'2rr:dQrVuKgrr3-!p\4UcmJd+b"lQhs _9:@*edKmK_7.G8lMge]rVh<~> s8NB$p$1:[,T$pqr<*B0"q2_HV!n'VrVl']kl)"ep#FAS2)7FPf^&2*h#@9NoDT!nr;-*QmJ$SI rX&Jrn)p?3+qY+aqZ@31#n\%@D6E@&s8W(K~> s8W,u"onIr<`;in;?'Gr:JkMF`;f`6l2ToF#P[Yg?X%0Bp&>!4rWN8uo()YSrW<&rrVc`qs7uWs s1rSS;>3lk;H%V#a8Gu:rdX~> s8N#t&H1%W\AcbFf%/ s8E`.p$:Ia-5d3t"9S`/":#Ab:oEdVr;Ps\li-n^%/KMJ]6Q%h;jH8/pA3SDrVcBf$2seup[$Pc nGN7RrX&JrnE?ZA-P?^gqZ@31$4n"MNkk/[s8W(K~> rVd'%qkdFn:f1*h;#a;o;Ib3rs82f[s6'@es7,!A>[hrapAY*5rWN8pio9Y.rW<&rrVc`qs7uWs s29(c;YX)f;$;HXgAV'NrdX~> s8N#t&H1"V\&HYDe^`-qbf\5^mJm(_l2U,Lqu6oso$OGA_VP+gs4dPPs7?6hrrqo=d.%)8mf*4c "lmA0_91:)edKgE^9uSjs8W)srr.E~> s8E`/p$:F_,o@'s"9\f0"UGVk=0(icr;Ps\li-q_%K,tia-9mY4^t)Enb;q8rr2lgrX&Q#p[Hh< Z/YZZn,UAD~> rVd'%qkdCm:f($g;#a;o;J1^*s82f[s6'@es5L_O=_NT(p\t37rWW8ukJ"[pqYpNnoDSmm`d1uj peV2m r;Qs!dAaUoc2Q2tda-+Xd+[sgrVl![mJct^#P-iqYIi0Dr;Q`=rr2p"k-2)Orr;ZjrVccqrr3/_ _7[V,eGIf%c,76(f_kdLrVh<~> s8NB$p?UL^,8^jqrWEK1"pkhr?*Eenrr2*\mJ[^trr)clo^&kt5Ti@4X60$KqoesFrVH-K_1.-d q>BmarVm6(qtT^GW)P>]#mC,-#RCka4G__VpA4dfJ,~> r;QlrV,^Fi:^'WnCPp=8rVl![mJd.crVd*&d[,&UDjJE#lOJKPa1&'s8VKc"TQMi@8lns #$boEo_eahrr.E~> r;R?,d&=FncILFodEfqSdbjTpr;Pp[mJd%`$2jPZcG6a(h!P(>s2t??rrqJaX5j6[o`"gfs8N#t "m!J3_91:,f)F2)b.bpFkl(P]rVh<~> s8Nf0p#t"Q+VtRo"U"r3#7;,(B!_%&rVl$\mJ[^trr)`ikL#G`.iLm+[-@5YqoesFrV>s?[rcuB q>BmarVm6(qtT^GVc,,Z#mC2/rr`T6%ln:"kOJ?Err.E~> rVm#up7bJ`r_`Vj"]&*9OjF(*rojCLrr<#trX8A\["o@f8MN6BTrWN8AHXKeH :^(`u`V]]8rVh<~> s8N#t&H0tR\AuqHe^W!laMlZioDe^el2U/Mr;R)tmFJqY[ERk-rr2r?rr2p#jfPWFs7?6grVulr rt+8+]>;Y>f%/C$eC2IKeF`Y;rr`9!rr.E~> s8E`.p#OJA*Yo4l"pG,6#7D82Dmo32r;Ps\mJ[^trquTdfWT3A(_oZ$^$G@er6,'Gr;#a4YAnp7 q>BmarVm6(qtKUDVGJ`T#mC50rr``6$PH='`:! rVcrqnX`QSr_`_nr_Nbo<-4PVs82f[s6]gcs8N!)k/`ip;G__Df)#EerWW)_a,#c/lM^qd`d1uj pJ;0K]A s8N#t&H0tS\B*"Ie^W!k`l$HppAb$hl2U/Mr;R)qjj:TI[a+13rr2r?rr2p#kI%_\s760hrVlfq rt+2$\A?A s8E`.o\[Z+*#&hg"pG/7#RhM=H+WVAr;Ps\mJ[^trVQB_cCJ>c',*uu^[1[jr6,'GrVH*E^P%Nq qY]sas8W,u)uKBuk+G3i&-rC@!sA`1"qDGWZ./@=qu$ElrdX~> rVcrml'Y@Fr_`_nrD3VsHD9!jqu5j[mJd.crr*8_\;=?a:jfS$qZ"V8"oIo?R@N.-rr)fjrWC#X >#G)l$W0f_dd$i3rr2lqrdX~> r;R?,dAjaucdgRqd*0GFh"(:@rVl![oD\dgrVl`p$1Qcp]stPslh:>Us31KArsJ&+^?YatrVlfp rU^$frt""p[DC&9f%/C#d*9D7ebf=FrVh<~> s8NB#o@^ci)A@'Rrr2*\p&=pirVdK1rVQ?[`f3t=&eR`s_!Ujlr;ZfArXSo) q!lh(TA9>ArVlfprUg(+qtBF;RQVZ$#Qt53"9eu8&KGZ.iV!$ErVleH~> s8W,u"Rt?7:Jgmb"]/6MX4mUProa=Srr<#qrr<#urX]%_X+48I:OKJ#qZ$Qos8U=B%KHG+j/f?B rr)fprr)fprW)orquH]krWW87C/e#*qG7Ao r;R?,d]C%$cdgRqd*';@h=gaGr;Pp[o`"jgr;QZp$1HQj^:Ll$lLk/Ts3(E@rs&)Kg@P=BrU9ab rt!tlZbai7f%/@!c,[uPjSf#Vrr.E~> s8NB#o@LKa)%m;_rWNQ4$4\"RN5bDarVl$\p&=pir;I9+qXs?oK2*?t&PA(umIpDSbPhhHr;$$G _8>F6rU9_&qtB7*O>e'f#Qt53"9o,>,X@"*j7iEJrVleH~> rr30$n(a+&;#=,i:]sjRZJGQYrojCHrXSt\UjQ6>:OBD!qZ$Qos2k6Cs6n4Vme?\\rVl]prVHKr q=:n';> r;R?,e#p=(cd^InccX&:hYR3Nqu5j[p&=pgqu6Tp$16L s8NB#o@:3Y(_I)[rWEK3$4e.\Q-&[pr;Ps\p&=pir;I9*q=O-gH:Snb&k\.umIpDSbPhkIr;-3Y kNMU;rr;Ke)uK?gab2Ab%L<1>!sJo;%QS9nbiAKqrVlirrdX~> rr3-#mFm_!q+q5j=,FKGs82f[s69Ljs4*`d=&;\>Z.JjPaSlDBrr;ian+l_W!<)op!<)cn"S:`S ?VgPqs%s2$F.0i%nG`Ierr;usJ,~> r;R?,e??O,cdgRqccEf2hu*KRqYod[o`"mhqYpKo$1-*\_7dJ+k4AQNs2t?>s69O^rsmtr\&6G> f%/9paMQX'qtg?mrdX~> s8NB#o$OUJ(D$lXrWEK3$4n=iU rr3-#ldV"lq+q5j=cp\bs82f[s6BU`rsI2AFB246H*#Nls2Fs>rV?6dpAY$hqYgZfgnnU\;>a6# ;,pbNYfl(srr;uss8N"J~> s8N#t%K4h^]ueXQf%&*e]=6\ss7cN[s6K[`rs@u9`PK:#c/S6krr:.?qu??grVucorr3Gf^:_D. eCN7!b/_HVqtg?lrdX~> s8E`-n]n(=(D$lW"9Sc3$P=V#YgrCBr;Ps\m/@RoqXa'ZBfd(@&O_5[lh:2Qb5VG>!;uin!W;oj rr)fnrYGA'g:)Jl*tJV[!s8`6)D,Eh]@Z s8E?)ro_Rd:esk`;>j;p:Kj48li6k]l2U)Krr3;NO`+5r:Nr_aq>UE@rr)lorr)f^rWVZ s8N#t%K4h^^<4jTf%&'c\?t)ks7cN[s6K[`rs@l0_83q#cK"Hnrr:+>rVuNhrVucorr3Gg^qI\1 eCN6uaN`2srVHQnrdX~> s8E`-n]RY1((U]U"9S`2$PFe1^>/DXrVl$\m/@Roq=3T<4Wk7@"9S`1$782bWQ*obqu$BkJ,~> s8E0$roM7[rD3JkrD3Yn>GC!Es8;l[s6BU`rsR&-BiIo)G,3I[s8UFErVtmV"n:?JCfs[5:^LWX U!)?^p\t0lrVh<~> r;R6)f!<'7db!(#c,@#ph#@?Prr<#srpBaOrr2p(jMAOG_8"@Yo)8Rf\GlI,qu6Tp%HP=<`QZi_ f?hRejRN6Gs8N"J~> s8Nf/o#R>&((^fX"9Sc4$kt.Ac/\Norr2*\m/@Rnq!mUJ="b3s%mP?Cjmi*B\GlI*r;IN0p>aAU 59LIB"9S`2$Sl(HZdA%1qu$EkrdX~> rr30$il-^M;#X>j:^'X"WpBBYrVl![l2D(jaFRl#:eu2-cM@Lcrr)lVrWVuYZ>NfCqbRK7Og r;R6)f!E09db!+$c,6olg]%6IrpBaOrr2p(ik)b;_SOLPm/?q`\GlL-qYpKo']d$A`6?`^f?_F_ hsUICs8Dfls8W)tJ,~> s8NB#n\pkp'b:WVrWEK4%2LOPf&uc'rVl$\m/@Rnq!dLC9dgV`%Q.jhe`c`'YPo@8p?:+n66QjF "9S`2$o21M][uWCo_AC`rdX~> rr30$i4t(D;#O8i:]k%.oD/:_kl9oH%0+:k?;aQpD3D[$q#/P r;R6)f5Ys8MuscMmeBrVlisqu6Wqq>UBn ''$^<_p$W]f$;4Xf]rG8s8)Earr<#tJ,~> s8NB"n\^Sh'b:WVrWEK5%N.$`hs:"4r;Ps\m/@Xpp[I@<6R!'N$nG/1_qt%^rr2lpcMme@rVlis qu6WqqYhH2p?pt46m<0J"9S`2$o)"K`SL(Rm.C8Us8N"J~> rr30$hS"S<;#F2j:]s[)[ep%"rosIIrXAhCE*,t5:1\sYhspZkrr)lirr<#qrr<#lrWC#W=]5,n% ;Uj/iUHg?n+Qb[s8N"J~> r;R6)f[HKrpBaOrr2p(hQjN*`5KO-gA:gKs8MuscMmeBp&4skq#:9m'&pO7 `6Hi`f$2(Se`cu3s7l*Wrr<#tJ,~> $NL,#n\g_l'b:TTrWEK5%j4''jR2a=r;Ps\m/@Xpp[7(03unh?$m.BK\(L9Irr2oqf)GICs8;lp pAP'lq>M?0p$(.n3ZJV8"9S`3%5M4O`np:Rk4& rr30$hnFe?;#O8k:]sWtCV9WArosIIrXAb=C/n,-:KqP'f'N=\rr)lqrr;rgrW)umrWW/l\S>,A qbR`;MR;:1rUf@GrVlirrdX~> s8N#t%K4nd^s(3Wf%%s[]"?o"s7cN[s6K[`rs@JaZGOT#\ua3Qrr<#trVtgTs8Vuqp](9ms8N-! rV?Hms7cNlrtOD$\AcbDf%/']aOB>Ns8VcWo`"mirdX~> s8E`-n\pkp'b:TT!s8Z4&LgAHkj\?Dr;Ps\m/@^rp?US!1`-]2$POLdXO6P4rr2lphZ!QTqu6Wo qtpTqr;6Bhrr)Zls8Vln)#Epcc%[kd$jQn;!sfAn?]rFcoBY<$r;HWoJ,~> s8E3%rntSG:]!rl:JkGA_>j?1l2U&J"TA5/A5W;%"At'$kktAXs8V$Vs8VoorVulr#6"JtrVlco q>UEopAP3gl`XeqqbRVqCQ#RVn,Dn s8N#t%K4nb^s(3Wf%%pZ^r5@6s7lT[s6K[`rs@McZbj`&]<0ETrr<#trr:XMq>^Emrr;?as8Nf2 pti]uajAShf$(qOf'3/5s7P[Lr;M3~> s8E`-n]78&'b:TT!s8Z5'J`gjlLO`IrVl$\m/@[qp?:(d0bt3+$P=4[WR1/0rVlcHrr2j)r;6Be p\"7Sq>1$frU'S$qX`18CF0W#"p>#1#S/n-Ra'j`lJM",rVleH~> s8E3%ro;"S:\mlk;J(R%s8Vuqkl9rI"8_\u@f0%*:Pd6Xr;?Nos4%&JrrN,rrqZ]nr;H!]s8<*" l-5W&qG7MpD3;Eio)A1>n,<4aJ,~> r;R6)f!<'7db!(#ahbsAl2L_]roa=Irr2p(h6F?)a2l!"dJWgX `5U!Le^i s8Nf/o#me3((U]U"9Sc6(-H97m.:&Nrr2*\m/@Uop>jMR/eng'$4n"WVp=c+rRLoHr=&W$qYBmU mdK`?qY^j_hCl,%1!.:!tPYJ4E.(Gk4@lqmJQq]rr.E~> rr3*"k0&__;#aDl:]j[8ONme)rVl![li%(fq!P=n:]4)m:Pd6Xr65-Fr:osYp\OgdmJ[@hr;HWM Xb'^P:_$9?R)%tZrUJq:rVlcprdX~> r;R6)eZlm4dF["#ahZ'MmJd.`rojCJrr2p(hQsW.aN;3'de`tCeGfCG#Q+&[q>9gVqu6W`rr)j7 n(H",b0\Sde'c:JbiA6ms8VcVoD\afrr.E~> (B=C/n][h6((^fX"9\l9(I`PXme$ARrVl$\m/@Uop>X/F/JJU#$4dnPTZQWsrRLoIr=/]%q= rr3*"kKStb;#O5q:fV\.df9@ErojCJrWW>ql)\8grD3VmKuN*McMe+El/_4"lKn9Dli%+er;4]t CfU:-%="eqo(i7RiU6[DrVleH~> s8N#t%K4h^^<=pUf[e0Zcen6ks8W)urVul]s7-*gs8Drrrs@Sj\&HJ4_6qbgrr:LIr;R#rinj;& m-FHGs6osbrta\2^WFgMe'l^i_R.STp\t3mo]YlFs8N"J~> s8Eo2n]dt;(D$rZ"9eu;(f,n%nFcYUrr)fprosIQrr<#trXo#"hnsjm'+>3S%MVd-`9m s8E3%ro_Rd;#O8k;?]lsIAb]srVliqs8M9_nc&RgrVd!#oAliW:]4)n:P-=ZqtIdA<_uTg:^MW\g\^sImb[@0rVh<~> s8N#t%K4h]]unaSf@J$XeE?K's8;l[s6K[`rs@Sj\&HJ4_RJ%jrr:OJqu6rphqR_tlg"9FmJd+b )#a9g^VJ+Ae'cXf`P]OEo_\[dq=aFTs8W)tJ,~> s8Eo3o$ORI(_I,\"9\l:)d&?Fo(W"Yrr)fprosIQrW)usrXo#"hSFRi'+>0R%22Er_!Umpec$*X r;63Rft"E6g!8+7qu$E^rZ(n7q=`ddJhRlF"pG/8#n.k2FM6H#nET2tnGN7ardX~> s8E3%rp%sn;#=)o:f`:Vh>dNProjCIrWMiQW*`@!:^'XD\(gf[dJaIMp#a?4h<3PLoBH5WnD1!R ;Yj2t>%a>Um/?bNmHO6@rVh<~> r;R6)e??R.dF["#a1p s8Nu4o@:3Y(_I,\"9\l;*FYYfp%\F_rr)fprosIUrr)lprY55$h8"@f'+>0Q%2)3e]Bo:jrr)fL rr rr3-#mFdY!qb[Jm=H1)Trr;rrkPsiH"S1QM?VgVs#u>oPf),LHrr)fLrr<#trY#%nftFrLjk/>Y rr)fprr)irs7uZos8W)ur<<2^_NJ/"rD3r#:etYP\G#t&oB,E3q>C5B~> r;R6)e?6I+d+?n"`kL:(r;Q`rroO1Qrr)fmrr2p+hmBi2b07f9ebB%Bs4.,IrsJSdi8itWip?=7 s7?6irVlfprtY.adDEoNe'u^c_Rn(RnbrLfp[@hTrr;usJ,~> s8NB#o@:3Y(_I)[rWET;*bqq1pA+Xbrr2lqrp'OVrr)lprXo#"hS=Lh'+>0Q$kYp[\*Neeec$'W qtTErZEppF^!Yj1qu-0ds8O2?rVZKbmc:p.9H4HF"U#&;'Hg;4^$G@fmG6stq#(*irdX~> rr30$mb3h#;#O8k:^'scbNJp*r;PmZlM^qWihp-ZrD3YnHEG`ps3prTrVZ38`5fs>c/.j_li%(c psl0g=Sko'<*=gZf_YXJo&K-5r;?PE~> r;R0'e?6I+d+6dt`4Y(,s8W)[s7QBirVQTnrs[bj[`-D6`k9mrr;ZfFrWrPqe'.1KccYVRs7cNm s8W'!rVlZn%I;B]`6-NXe',bE\^pTTrr_u\o`"jirr.E~> s8Nf/o@:6Z(_@#Y!s8Z7+*50Qp\Ogdrr2rr!<29`p&=pir;I<)p"mN4///L!#Rh82IC/>7rRLlW rVH3EY+<;EU8?K6q"t$brr<#urZV=@rVZNcn`JDq=YUTt"U"u7$lq'HaPugdr9W2%q>:*grr.E~> rVlufg6,8/:]sQrSCd0+rr<#urosIJrWMfOVdE6u:^'X?WmghEeG]jSr;,WiYgM%/[H7G]rr<#o rW`E!o#-;s !<2rs$iSSX]ZJOOf$qXNiV``RrojCJrr2p)hQjN,b0@uAeaWC^rX&Mqm,$ITj5&_frVuHfrr3T- p?UP_aiDNJdaHL`^<,'nr;HWto]PcDrr;usJ,~> s8E`.o@'sQ(D$oX!s8]8+F2#eq>:-hqu5m\m/@Uop>O&C/JJU"#R_/+F04^#rRLlWrV,U0^9P5] ]#Nk,qY^<`rZM1;q=`jjW.eP8*=W5W"U5AK4`@1Pm.U8PlIP+mqu$ElrdX~> #QFc'rp86u:]!rk:KaCKnG*"Is6BRdo]N8^:]+#kFeR+WgA_*Mr;I$!mbl:)aiqiSn*BrXn_V9e NGMitrD3\q;K8)Bnb`=b"7Ft1rVQSE~> s8N#t$iSSY]unaSf@@gOi;EWProsIKrr2p-h6=6'b0J,GeEZ`+rr)fPrr<#urr;rsrX/]%lf@?o f@K?crVZ]err2p.q!H\G]#)P6dF6Lg`44=mqu6cgipZmGs8N"J~> s8E],o$FIE((^fX"9\l;,(Iu&qY^ s8E9'rp%sm:Jamd;$9^!V<7CErosIJrWMu^Y$b'':^1p,aSGi6rSIPRrVucqrVc^%pZ'oZe&&uW meQ5K$30)"P%I`l:esmd:^'`rMTk8\rVcocf]`;2rdX~> r;R0'eZca0dF["#`4Y(,s8;l[s6K[`rsRVbZ,4W/bJ_fdn,;>Hp&Fsh$NL%so(DV?lh:;Vr;ZBf rr3MpbeUm-b0JA\cca>OdcLB)rs/Q%n`B9>s8W&sJ,~> '`\1.o$==B(D$oY"9\l;,D4V6qu$?jkl:#K&c;=efT.j+%LNFI$ntkVk4S]8rq66frXAc#mH*Bb f%9$Rq#('hrUg(6r;#jCZ>N#R'+5$K"pYGB,=-n%j7N0Eq=a"'k4niOrVc`pJ,~> rr30$kg5>d;#F/n:g9sepA+^Os6BRdqXh.);>a5mClH4*g\q3OrqlcprVd-#na#Q+iSj1tr9aIg qtA9tEEc@=qbR`1GH'TnrVlfoq r;R0'eZlj3dF["#`Ot1-s8Dr[s6K[`rs[YaYeeH-bfA#\l2CYErq$0grpg$[rr2p.hQ3`jajSYd ccjDDdd$Q*rVm9(qXNb>rr<#trVc_G~> s8N`-o$4.=(_I,\"9\l<,`(=Fqu-HlkPsoJ&c;=jj-VhG%giOI$Rnf9k4\c:rqHBkr;Z`orWN2t qt^$dpB13erVlcoo_op/pZ^7o4rb+@"U"u6#n%8&Br0n_qYU3bn`SZkq>:-h!<.K~> rr3*"kK](`;$Tp&Y4MJgs8W&skPsiH"TA50AlAP'"D31pq#B.K!<)op!<)ors8W,urVm!!rVlib rWMu_[V8V6:]ta*a7oW5rWW,ilJM"-rr2rr!<.K~> r;R0'eZlj3dF["#`4Ot)s8Dr\s6K[`rsdqu\%g#2cH=AVj8ArWkl1,Prr2QinGX(#rV>6RYJ86- da-+V^9u8VqYpHn"ShNWoD&=brVh<~> s8N`-n]dt;(D.#["9\l<-&U[Nr;HNlkl:#K&c;@nkbV**°J#pDKljRrK8rr2irr;- rr3-#kK]&`qb[Jm>d3qurr)otrVl$\l2Cha`-G]frD3W)F0YK>qu6Tpjo55Wkl1V^q>LNcfqr=X peV*A[bCTXrr*)olKms4rVQSE~> r;R0'eZlj3dF["#`4Ot(s8Dr]s6K[`rsS#1^V7_8d*BbPhY[ s8Ni/n]dt;(D.#["9\l<-&gpTr;HTns8Dr]s6T^tr;$!QZY)<6$3g\?)D?a&o_e[Urr<#urr2iu r;6#mU\A%20R!?*)KBp\ascm+pt(r;HTnrdX~> rr30$kK]#^;#F/n:gL@$qu6Tps8Dr]s69Lds36O><) s8N#t$iSV\^<4jTf@7^Mi;C6jqtBRL nbN4Grr)j-rVGHb\])b;b/;HXe&C);qu6fmm.C;WqYl!~> s8E],n]dt;(D$oY"9\l;,Dk@Ir;?NjrosILrWrGup@6(Z<#lGI#6tqfH/%icrVc']#Q=SqoBPDt jo4BIjl#"Rjn&EKrVl]mn,E@c*Vo?a^48!S$jd.G%4"219RXM*nbN+[qX3A1qu-KjrdX~> rVcu`cAYOq;#X>l:]jq*p%nI_l2U#I"om>YJQGYH:]sg(U%/'Xrr)lerX\u(p@.A6mI0Q6mcils lLsNBrVu`n"S1HNB2SV(#Z"lSI!ML>mJQq^"7kUDrV?GC~> s8N#t$iSV\^<4jTf$qULi;EWProsIKrr2p*r;#0\^Wb'P`O==or;Z-_&c_k-p[@A6o(W"Vp$:Yt jn8ZDrr<#mrqcX(k/+jRbKRo:dIZe^l21DY"oe;ep\t3hrdX~> s8E],o$4.=(D$oY"9Sc8,)+e=qu$EirosILrY5>.q"3.@DC#i##6tbVDq"%Jr;HT\rY#2-o]k/U cHjkbd*KeOaj]SQrUTsfs7cNmr>kh2o&J&T1D:-&#RqG/DL-]$a5HXerVQE[kOAEJqYl!~> rr*K-kK]#^:f("d:f'qkXRZ,dq>TXYl2Chcl-#Dur_WVl"&bQRqYU9ks7$"!rV#^=f@ep7hqm/< cdCG7rUKmes8Drqs82d!s82H#CJk"+%s";>U:f@Or;Q]or:K=HrV?GC~> r;R0'eZlj2dFZt!`P(7.s8N#[s7$$fs8N#srsSi(j2AgUbg48;f),CFn,E7b&,c1`e]l+N^:Uqk b2Msgs5s=Xrt#)*ji53]bK%K5eb/\*o_nag#5e,fq"t*kqYl!~> (B=C0o$4.=(D$oY"9Sc8+F;2jq"jsfr;Ps\m/@^tr;-0LcAOb*%1*7K'kG)9p%nUbn,E@es8EW. oB4<%U6LLcJ:iu\a5ZXdrT=)$rVZNcn'\1P-k?Xk$Q:U+U9_/Ef]`),rV#XHn+Q\XqYl!~> rr3*"kK]%c;#aDm:^0]uUZ:qFs82fZs7-*erVZX(o]E>p>#A*m;,NJ2nGV_Qs8W,u&,l7ie\ADe SsP_.TsE)2p#c5Rs8Drsrrh`;TO^q!:_6` r;R6)f!<$4dFZt!`kUL3rr2rtroO1Mrr)lsrqud'l-@;eaNhc8f(o=Ds7$$brs\o%hSc^nQ&CBP S$q;Ts7QBks7QBhs8W'+qXrmka3DcE_8=n#rr<#trr3)pmI^DWs8)_F~> s8Nu4o?O7>(D$oY"9Sc8*cAI>o_JF`rr)fprosIKrY,8.qXj*O;_8Ui#Rh>KWmL;2qu#s_rVmN0 r:B'cRXS^@5!))AN5kD^r;H?gs8Vck+ohQ>qY9XG^4K*$$j[1L-V90Dk3;-onG3"\n`0!2qu-Ki rdX~> rr3*"kK](d;#aDm:]sQsRFCL$s8Dr[s76-hrVl]prVHKqa+7f#rD3WRbNAd'mf*1b&H;Y&m)uGm H>-Pa>BlXcq>Bmas8Vcks8W,u#QOf$h62N<;>sB'@!8[?r;--Wp&4mho]brGs7lSD~> s8N#t%K4h^^<4jTf@@sXf';u.s8W)[s7-*frrE&prsSM_e%WZ?_n+.UoD\ahm/I%b%0$1nj4_r+ aMl0Gh!tCDkl1JZ%J];Kf$DI[c,dZCh s8E<"o$4.=(D$oYrWEN8)Hi?Gnb2hWrr2lrrp'OLrY,8.qt9BkKMNQu$4RS=M7`-Iq>BRX&cDCl gW6n(SWf%oVnq6_q>C3Wrr)d rVcr_cAYOqr)!Yp=,46@s8Vuqkl:5Q!<)op!<)cn"5Bo/=T)&!H`kors6fmbs8W'.qtB1(bJ:Tj W2R;Rl2:MBrr<#urW`Did&_n8 s8N#t%K4h^^<=pUf@J*]bLc.\s8W)[s7-*gs8W)nrs@Vo]#;Ft`ma,Lrr;?an,N:as8V]i!WE#q s8W',nCl!r]u\FB`k9dnrqQKqqXaL]rr;ioJ,~> s8Ec.o$4.=(D.#["9\l9(.3/Nm.0rLrr)cqrp'ONrY>J4rVZNcnC=jc-l!1$&NOL#k4/3Cm/I%` &Gu:ro'Yf*in;oEnauVQr;HQms8V]irV[K/q=a:?]n&s(&ISmN%2;^:cKb#qqY^9rp?qPLr;HTj rdX~> rr**"kK]#^;#=)l r;R6)eZca0dF["$c,IQ=jo5;[roO1HrqZR#jMS[G^:h7qg\h'Nm/HJRl2LV\&,>PJbJV07b0.uJ _9qK=rVZ]prWN/pqu?]krdX~> (B=C0o$4.=(D$oY"9\l8&hHeHgZnP1r;Ps\li%Rrp[IY?iR!`[.ME@)-q'!GlLk#=rX\r(q"F@M n*K9$n+HJPr;Gp[%/p,$q=X1)WdRSn((L6L&eZ9`Oh^)Nq"jsfrr)fkp%\I`q#5d~> rr33%kK]#^:f.-gs&'#"@sku^qYgEUs7-*frVc^,qtKpcp?]53?rKlu?uiIAqs+1\s8)]srV?0a k5PAY$3'u(rTVJ$I:ZIX:^0m&K!sD.s82ctrVQBdpATR~> r;Qs!eZca0dJh`(d)`i-h>R?Qrr2$Zp&>!kq>M'-rVHEjs8V?/_n s8Ni0o?O7>(_@#Z"9\l7%2LLEa5HXeroO1Qrr<#prY5>/n`&Wrm-1fn6QHjP)'j4Ai:Hd2rr rr33%kK]#^:f.-gr_`u"@&`;\s8N#Zs7QBks7lR*p?_AJrr:9,E`c49;cfIOp&44Us8V]is8VHb s8Duq#Q=Z"pX>US=o2#"=_3/ZbOto4rr)fhrdX~> r;R<+eZca0d+6h"dEBA=e*-Jas6KXss6S4mq>^KfkhOP'\?`6Yl1P&Ss2t?:rt4qbf#u(Pa3;cM `PBXMg=50Zrr;EcJ,~> s8Ni0o$4.=(_@#Y!sA`3$5"C`OiHterVlf[s6T_$rVPEX^u"8?ae*TA.i0'E rr3-#kK]#^rD r;Qs!eZca0d/MT#da#kKaj]VSs8W)_s7QBkrVQR!rVliSZcM_9rr3;qim,'=XMNQTrquf_rr;re rr<#orr;rsrqcX.rqu'+^qIV/cd0hU_7\+[jNuf[rr;EcJ,~> s8NB#o$4.=(D$oXrW s8N9%rTDIb:\dfk:K)%eb5D59rosIUrr;rlrY!_OZJY6NoB!iYHs*Nb_]lr(mYu>'d!FV8r6.m/DM~> s8N#t"oZrS]un_$ed0aPbf@T=j88fSs8N#_s7?3irVHL+s6@qVfBE,3s7u6IfYjr"^"iP`s82fp s8;irs6K[arUg*brtG+gf#>GBaNi)Ua1fXKl1X`5nGN:cs8N#toDX7~> s8E<"o$4.=(D$oXrW\_5(LZ1 oD&4]qu6Tnr;H]rl2L__p\t0j*rPp2p[I=dRVY/3&dejK#Rh;"?%]#]][QEHqu-Nnrr)HfJ,~> rr**"kK]#]:\dfk;-\+HkOefPrp'OVrW)orr;HTnrY"(pZ+8EZp$1>XYE!R$?>cRrnF->Vs47/S r:o6`Q>g)-r(mYrBoK%1c->2Bli)D~> s8N#t"oZrS]un_$ed0dSdETA5g\LdHrrW2urp'OTrr;rorWiJrkgdK"q#:9k#l4,E[B-7Kp&"^f r;QZprVlisli%.fr;HTnrr)fmrqcX*rql$0`4s12c-OYV_Rn7hq#CBnrVuNhJ,~> s8E(D$oXrW:0i!<29`oD\dgr;IQ2q;&TOJ>_>cg"P8rQt%Zk+'tbb m.:&Nr;QZnrVlisl2L__s8N&sr;Q`p+T2-5q"F:?d\:#%(^p]U#7(YM*`867d+mdPq"t$grr2lp o_s@~> rr**"kK]#]:\[`n:KsC?mJm1brVc`\s7ZEprVZTjqu6KnrVld0l--H#]^bXZme5JMO'bmaL;MmH nc&Rgli-q_rVliqq>UEm$3'o$p?T\TBN7k,:^Tur=Fn'6jQl=/rTjH5~> r;RB-e?6I,d+?n#e^W'p^q/G$rr2rtrosIKrY5D0o\@..p@dk=m.0u>h86%p_r(Fis8W)ss6BU` rVlfprVHNks8W)trt"_Wcc3oDaj&&P`4a4ElMCAWr;Q]qo_s@~> s8NB#o?XCB(D-uZrWN6'$NpYD-$R)[q"t$hrosILrZ1q4l.3%hS^,Kq^VIY"Qto8A7;8FJl1OlM rVc`prVc$\s8Doqrr;io,Q7Q:q=X.@mciQAO(($g%g`LI$4IIs;MMs=jQlC1qu$Elrqu`erdX~> rr30$kg,5a;#O8k:^Bin:et;efC&\;rosIUrW)ooquH]prY5"g_jIafhU0d'gYTZ4G?/R<]C,FN rr;rcrXA\ro_SCRfWgHR>>e8r;#a;tA:pu;lgXQ@qYg?k!<)HeJ,~> r;Qs!e?6I,dJh`%f%&@#`4k6js7QBks7uZnrt=D.d-p>Zh;%>ps8UcSU70'or;?Torr2r`rr)fq rr)fmrqud0rr)fprqkiq\A#r,cd'\P^:2D[q#C6js8V`jJ,~> s8NB#o?aOF(_I,\rWEW3!WrQ6,BgfXq"jpfkl:>Ts8Vrp*rPj+n%spJ\[\f@UqPU(VK+^U3-i9l nFcVSrVc`prr)0^rVccqrVuco+oV?7p@@M*g>CGrP#3\E$j[(C$4R^k8r'n8o(DhUr;HTnrW2uq rr)KgJ,~> rr30$l-YMe;#F/u:esna:L'OFmf3:ckPt5Ss8Dln!<)lq(&ugVXN\i&]XcSfkKTH+?!EZKm/6hA rr)fdrX8]%p$1f4mbYC#?<$eu#Z=]LY1<4Dr;?Bis8DNfJ,~> r;R<+e?6I,d+-_!f@JO%`4k7.rrE&_s6fmdr;cirrtG"`f#lY3hojpSs8VN@^S8-[jo55Yo_njh pAP'jn,E4as8ET0o\[s1^W"@@c-!r9_pd`CqZ#j[J,~> s8NB#o$X^M(_I,\r<3-&$3Ub^GJW54qY^?ll2U2Ns8m p%\F_p&4sipAP'jq>UBnqu.c;r;$$Og8/f>3-#RCbJ(,B$J\C^-Aq>:*grVZZprUTr<~> rr39'lICqk:f1(dr_`Yk"]&Bsg[G1@rosITrqZNkrY4S>\>Qsl_kOm-l0$0dKk#P$`priorW)oj rW)o`rX8Mein`;<_4Q9i=&Srm#uYAgWmpA2rr)fZrdX~> r;R$#e#p@*cd^PFf*'[R`4k7/s8W)_s6osdr;ciprt=+kb4O]1eaiS9s8UfXXK0Y>qYgHfrr;rk rr;rmrr<#orr2p4rV?3_q>'6q]YVV3cHXMN^U_SSq>U6jlMc;~> s8NB#o$k!U(_I,\qudB0":QN#`8ULfr;HWZs6oscr>bb4q=3XVH'lmYGE0#RjO_A1;+a?3`nTqR q>:-brr;rkrr;rmrr<#rrr;p;r;$!Pg:O>]RttT1(D$r]#m^kJ)(8LJ^Z=t[qY^?klMc;~> s8NE)rTr1!:Janb;#O8k:^'X"U>GG?rVl']n,E:arr*]/o#6WnkfK-lcfY,ohlM!=CSKYPqu-0d s8D]ks8Dcms8Vln%fQ:meB#_J[$GE*;,C+er_Nc!?@]?4o],q$~> s8N#t#Q<,R]?&:Iec"&$eA]2_r;Zfrl2U&JrVmPqcICq9iml')qu?]agrZt8_;G7hs8Muts6'CR rtY+UbL+kkdE'>Mbfn5K_8"(Ekk=rRrr;-[J,~> s8EB$o$t0[(_I,\"9eZ*$3Ub^I)k4>q>:-il2U,Ls8=,=qtBR'S"?a^Um-M4gt9iWR!)A?J?7Ge p%S=[r;HWos69O^r?_IAr;?HhqYBmWkL$GZ@:32/2&m)5#RLhH'-05NQ,)2Eq"jpekPfu~> rVcoegQGA,:^'X#VW7:JrVl']kl)@qq:MjXa2Ys#T#C3gjNtN,G))O&lLaoO!<:jR$hrl.Sr&A\ IW&Fg;>j;s;cn(,\Cg-CrT*s.~> s8N#t#Q<,R]#W+Gec"&&eAf>ar;Q]qs8M9_nc&Rgqu6Tp$MEW?fB<(_VT/6)rr38a`3>cOoD/@a rVlrus8V9]pAYg*qrPDgZam]`aj/8ZbJh60^XVoPs5s<2~> s8E?"o%1Hc)%d5]"T/?/":QK"_qt%[qY^?Ws7-*gs82dC3ik5Kl~> rVcofhNUh1:^'X#V;h(GrVl']nbrOgp\krmcFpC"jg]]9iofFho"g60Bq*H0p\Xmfs8V?_s8Doq s8Drr$N9njd&1e^=BABrr(m_t;d=($b38X!r;G^UJ,~> r;R!"d]9q!cIMjD"k:T/f^/A3s8W)_s60I^rtbM)kh5.sikWUakl(P]o&\3/\[pAaq>1-Vrq$.' pZBu?\%TVraNi/XahY[.c/%a_qZ#^WJ,~> s8NB#o@gom)%m;^qZ@0.$Q`]Ibjb<$r;Ps\kl)\%qX*(VWk6feK8Gtq]Z/72XG^b.EL+8gn+6>O rVli^rr;rsr$;19q"OIQnEf/]YBs%p(D[Yo$4$kA$4\%1 s8W,u"7bB::\ITf>*$J[s8Dr]s7-*erVHL/p$'r;c033:U9VYgip5CBW.p+eYLMh9s8W)urrW2u rSd_^q!?G+J72>T;c3Eg#?YVlWljJrqu6QTrdX~> r;Qs!dAjatchl8seB,POg@,%@s8M9_kPkJ\(@g;Jr9i7\]@ZlVr;HZ]f!h!Zj6l^?qu?$^qu7T6 rVlcnqY9gZm*s%n`5]pBc-XeZ`4Wk-hY-aEk5Kl~> s8NB#oA%2u)A3D_qZ@0.$Q2H[\a8q_r;Ps\kl)b(r;$'C^s(`WV29&FWOTsrhmSAQ6>2Ffh!"A) r;HWorUBgcrVl^=qt]sUmd0/th:9KFK1[F)$k!CK#6kD?&KEW.LrJHEpA+UarT=*0~> s8W,u"7tZB:\ITetbLl47\tY(YaOT59q9l0o@>Cu3oD&:`rr<#s r;GmZ!W;cmp^$Qan)`!&Ipc:P:^9p#BS3GFp\`qJJ,~> s8N#t#5urK\]<%Jr72&$b.t[+jSo2ZrosIKrW)orrr2p5q=41Xp[6SAcKac^o`"ROhpTHP`msAJ s7lTdru:q1oChhBiRZB&cH=8Pc-FVZbf[o>`6mB&nGE4bi;S6~> s8E?#oA7H')Ahs=/FsFp\XsSs6KY4rVlfpr;69Vi8j7_c_,*%Pb+eacc*G_H"pQ0 R_\%Qp@nCZqYU3hrV6Blr>5D/qtg-`p\".Hjj:l\\uM*LDd,UX'b1'H%LERW-V89I^u+VSqY^ rVcrmka>4Cr_`Mg#ZG8a_ta--rr20^o)8Xfrqllsrr2lnrYb@lmIfi([YUBZ]Yi=cin1f1N..5( fCo(@rr)orl2D1jo]"HRe&JnrR>ZB%=&Slk#Z5#WS%m\IqYf=NJ,~> s8N#t#5urK\B*%Kr72&$b.k3bh#@?RrosIKrr;rsrqQL!iP*Ccgu%JprVlg&d%RPMf(Jk;rqcZj rqHF4rVZK`lK7Erg<7.8[(4)td*pIkc,df;]ZT@.r;?TQrdX~> s8EB$o\df/)\WVc"9eZ*$3UYH+$GnElLt,Sl2U)Ks8Dus,lRZho_81Xr;HHjs8=DDqYBmYoC)#,hUKH>OcY?<=?S&O&e#$M"U52;$P44(8U7;emIU,N rS[[*~> rVcrnl^CUGrDEGg#Z4T9[e0Corr20^o)A[fs83#urr2lpqYhE3r;HT r;R'$d&4@ncdp\!rmh8&bJC^!i8jq2rW)uirqZR"o&J'.bi.^Ko`"jrldikP\&@(nq=t!frqHF5 rV#U7d`ot\cH4&@^;%S.cdL7hc,RT4`S'JIqYpKos8E#uiVn?~> s8NK'p#=28)\`\d"U"u-!so):&0aH-h!4V1kl:>T!<;Zi,lRZ=qtp6ao[^C0B5`3NLn:ufaK(>@ qO3\MZp&e,-O"U,)9$PamPCQc*Qkk"QF rSRU)~> rr30$q!OVH;#F2g:^9m%E4Y`=rr2-]p&4skrr2oqo`"mh)#i[@WJ6S2WNX4miT\RhP'2PDYKGhu qu?Tnrr)fps8Dlp&GttVcb$']Z1 r;R'$c_\(icILLtrmh8'beq-/j5g75rr<#irqQL0g98BKg=GBXp\OjgeZ>aK`oHFWpA+XcrVuiq r;Rl s8NK'p#XPA*#&hf"U"u-!so):&0jQ.g$/5-kl:>Ts8V]irV[i9qY0F>W+9FUAmKM rVm#snsrNPr)*Ag##\]I]Cbt!kPt5Ss8VHb*;fKFJ;BPSMP%?+na#;@Hu3;BT>BINoCi"Xrr)io !<)or%fH5"p[n%FkgmSHM/?Bor_NPjs&&em%8g#$;,L4l@<.XRkP5)Srr<#rrW)orquH]^rdX~> r;R$#c_\%gc.(;BecjUK`4EP=rVllsl2U5O!<;ur!<;lorVm`'h9WpP]u%h@jmrH=gXF?c_8*n5 hX:=@p&?-3n`AHMc-4JXaMl3@b0/#RcHab]cHODL_8FLIhs:+;s4[I&~> s8NH&p#abI*Yf(h"9eZ*$3UVE)E*GujRrBKl2U5O!<;ur!<<#srV[l9q=O*uV0u?85Y>$tOfZU0 T63dr6WnAdVS1I=nFH5Drq-rso'Y\ma0M:nFC@s//fkW7$47+<#lY&?#RUtN*]RD_Z-VM#p\Ogd rSIO(~> rr3*"qt6TU:^U&r;,q;8me?b\rosIOrW)urrW)urrW)oqrZ(n6hnG\2F`2JTS@Hu3f>O;.G&i1u WP6gBnb`7`r=],0s8MlfkhF=oX.50"FD+oY;> r;R$#c_e+gc.(;CedL*\cGmE(huF^V7_?l1k2VgAZU~> s8NE%p#t"Q+;P@k"T8H&":5;@'.S=Ch=URCl2U5Os8W&s!<;urs8>[kr;69_kh;J+5qac<5ZrfG ]>Tk@74U&M;fIbt^X1N`g>(K>C&Ju`TA!+gmme$>P rS.=%~> s8W,u"o\1i;G^0d;#aDl:^1:)iq*3LrosIOrr<#srW)urrW)opr[\$Cn$ma\?<^NLL9TCnn%k65 ?ll;H@(BO1+*ErVuHf!<)op!<)9`J,~> s8N#t"oZfH\&?SjedU0]e^2FQ^>Jecs8N#^s6'@]rVHNkrugjjaKMYC[)0u6kkt8MlJ9F^Wi*2; _ogHajQc$pinW)`d0n1=_7dOt`6$9Oe("BIs3qG)cH3r:]#31_me6SVs4[I&~> s8E?$p$1:[,o@$r"TAK3"9Sc3$4e:jU!N?+rosIGrW)oor\sfRqY9UF`h@E?0d.u#79XemJTbm? ;aj/H;I!gPH%Lm6O,\d:c%iU?F6qu$EIrdX~> r;HorV,gMk:f73g!)`Yj#$dG7kPtP\l2TrG!r`,uq>Ml@ptWTLCgU+HB6oQ7^U0u4PC@:^C34r^ Pb+eU['[-=U6gjmHZEe+<`8cipeV8r>&B8"aPc[frVlcrrUg*grTjH5~> s8N#t#5uuN\AcbFrmhM0f%&0l`5LL&q>^Hnl2TrGs8DioqYrY7]XG)O[C s8E?$p$CRf.N8g&"TAK3"9S`1#RhVGK>I*QrVZZ_s6'C]rVQRLrVZQfp$(8+AORsf()IiL>%i,1 LN?iu4uP&G/2]R[:/4GG1*[SL&J,H_%1ERM#R:S3"VCqD#n.Ig/ja0>_r:.Xp\F^arr(XOJ,~> rVd'%ql!_!:f1*h:]OAj:^1'TY2''VrosIGrW2usrVu`n,5C]BLiHX!;,UA7Oe/VZ[[r7sA7&PF ?"S&$J:N)iBO"G3oM>?\&Q2V5A9*aBh":XGrr)fprr)fNrdX~> r;R!"eZcX'cI_sE#1Lo?`mEQ2k5X<;qu7Z,j4_ntZaI9[cd'eno'GMqf\+s(`kAjn^qmk%rk8ZR _o0O6a2lBFrQG5`%*6H,_SEt-f&,KPq#:6lf)C1~> s8NE%p?ppr1ER&3"T&95"U>>I2eB>apA=^^q>1!err2HfhYnr%r;-3YlHQMae T9P.R?qia=.P3;+/0uAS&J#<[rX9bS$47(G#RLeE$4@7P&fWGsD32!Fi:$F9qu$Ekg&?L~> r;QlrXC592;>#eGs;#F)h:AR`m;HRO]R^UN#nG:W5J,~> r;R$#f&X_SQ/c#/@skd-:?(qZ#.GJ,~> s8NH'p[@1&4!P4A"9eW)&Hi7B%4"Q@l14Q9ki_4%qu-Nas5!Z#rVZQfp$UtPLL2ti*>oS.))t`T [^irEO*+\u2)$O-+WM:3%h87A'FbN`',MT1-87YdJ>^]UnFl_VrVb=HJ,~> r;QlrY\7;?;>O)t:JtSI`;BN4q"41LqX4CFrr)lmrZD1=qpqp/BjXn>:f(#-NP"?:kg[DGNd58I ?X-`7;c3?er_NPh%Soo!<**:1AT r;Qs!g:G#9cMcAoedg3Yd*0DFjo>A[qX`q4o_JOdrq?BLrql^=qtKL=d(HchZF@`sfAQ/us8Mc^ ki(@Lbe^iqYck@?\%)@H&%K'TZEgsRaO/`#jm;^=rqcZGrdX~> s8NB%p[I:.6mrNOr<3*%&-N.@#oGU_fB;JH]<\p%q#(-joD\mkrVbXQ-iNu>q=X73`2S`-4Y%Bd 'd52&BS`Oj]!86*Oa_+M8NJ@E(`!f"'DrIY',2/t*@E[4=)*5PXh`EHnFcVSr;HTFrdX~> rr30$s800B@/Egu:^^-%Cpi^+q;]lDbNeNqfDZ$RmbZ$jO)//%:_[2MKV,p/hrWV>`3uJ*Km.9< <_uWf:]=)t;HmaTK9N+BbhMCUrQtOo~> r;R*%h7pbBc.CS"fDa>2e^W'p_7nk(rVcBPe^3[Zs8Dris53hNrrhH*^p^fQ]G8<+hsp:/pA+Xc q!d4h`OiRa[C<]Yrk&]R]Xt\^['dTeeDfrlrV$9BrdX~> s8NN)p[RF69e?h]"9\l2rWE-&&-`XnHbe=mZ]BWm`q&s(rr2Qi!<2rqhu5hIqYU6if)C1~> s8W,u"TSD0G\$bM!E)ej:^^X*g[Om^YFhTBr;Q3cec$]ko]WrLH"(#Y;GgY3P.B$)m-sK0f>Fh` N-oVYAn5C\raGb7$tEmcG__ck_V">Urr::CJ,~> s8N#t#l`f&_naLIf@TrOs4%M*`PC'ipA=1/_7\k*s8Drks4[JLruLarjl+V(]=#,X^;Iq3fB)W( r;#sNki:X[iSrnXr8\7Gio/hSjQQ%'q#(-is3L[p~> s8EE'p[[O?=>C?m!sAc(!tk_?$m8oF`RU>h<*lTbnb`7_rq69mrr)fNrr;pZr;6?cn)hp'Q#onX +r2+@2+_.tMP%2l`lGd!WhG`;K6q`\Df0H3EcukbOIN/R]u\^^mIg5LqYU3hrR:ar~> rVcs"r4RVnr_WVlpeVH)NP+9@]T@Jj_t*[(s8MWieG_/up#OQ3T7UZZ:fU\6H]4Mu^X;$$k24e; ahkZrXJ_heT:_dLU8G$"^;eILhWF8$bPm"~> s8N#t"odW.`P9Ujed^-M_T^a&q;ff-YhT!Or;Z`pp]&qGq#;&jcc*Q+ZDs[sWkHd>oCV_MqYU3h rr*0$r;-6bqYgEbs3CUo~> s8E<$q"*dKAN12,pB)!1$5c0PYK))[0g(EcT DMb*o_8F40_nNU_V4X3DQ^XMBY.DX%hWF.lnb)\Rr;HT>rdX~> rVcs"r5+>-o2#ouGFd7LWc_]]XPi^Mrr2NhdJbNnkgHPgG%G&c<`3.5H]kJKf&Z#Zm-X*#h:0`k `P]X7bL"u(me?YYs2b1i~> s8N#t"odf=b.l-oed^-P`5Ba]ptj'$[Edk+nGiCb!<(aQq>VT1m-*KY_m,r1Uoq5EbL"eskjS0< qYU0ao'>E"lLk)So`*59J,~> s8NB&q=O'XF$C3BpB)!1#SAO^Pd4gL+Y@B#dI[,0rVQWorr)lorW)uSrr;p8qt]sVjk%JWRtYWU 4Xqm11H\-&=CQ)iI>!@RM%kc#LQJ".^s_0(m-sW=pA"L]r;HT>rdX~> s8W,u"onMBQZ>sq:^^64J&C65@TZut]]AS^d/GBcmG?1%WKVaE='&L4C34o\PF\YU[CEi[\[JfH Xg5R]g$//(qu+M5J,~> rr2rt"oe#McG%Kred^0Ta1f@Io%D!q]#2q_nGiCbs8CdQp\u95lINhWYck=;Za@6Uajf))k3;:% m-3QehrOA+rq-69rdX~> s8NB'qY'BgJk$C[pB)!1#7MD&EfWa+'d-"k]^5:erVZ]orr)lorr<#Sr\4Ed<+cM3k0TeE?Grp\=OZqYU3hrQbCm~> s8W,u"onPKUj5i0:^p9%B;ih( s8;rsrr3/qm*`Pgec+,"fDa>3f@JL!bJV3Ii7,of^U_2DnGiIdrVb@Ir;Ri4n)rWehU]uk]stGY \[oDc^WFmUi9Kk'p%n[es8U"9J,~> s8NQ,qtKWuPYi&$"9\f/"TAK:"9Sc2#nS+?9.18\(G&R`i9pC=r;Z`prVuiqrVt[Ps8=ADqtg-` p[."i_m?(qF'q['.jZ;`-nR596W@W?LRbTdeDKQ_q>1!crqucobPm"~> rVd'%rRnQ.:f1*h:]OAl:]OAk:^g3)HAQB8;,gqQ`qTE%s3^fGrVc^:q!mM%d)\Q>?4p5 ?t="lIuTko\B3Fdme-FmrdX~> s8;rsrr3<%p!pXpe^i='fDa>5f@JL#cH+#NeBuRa_mR&7rVlBfrVlcog&;$NrqHF+rpo4)c,@9+ \$WEFZbOZ4i:6gGr;XY5J,~> s8NQ,qtTd/VcjcC"U"o1"TAK:"9S`0#7:tY)\<;`%iIEfbiSTsr;Z`prVuiqrVtRMrV[o;qY9[M khj@[P^R4F90kd*5=.n=A9Wp'\^BO1pA+UarPSVb~> rVd!#ro1kO;#X;n:f1*h:]OAk:]sQk>$b;0;$9g5[-75Ss3^fGrVHL0s8DcRcFTm;K6_EQCMIX( G__T^\Bj4-rr9e5J,~> s8Mus$iTnP\B!+Mf@S[+ec"&/e'ZF`cdC1gc,[K4iq`QDs7lTns4[JHrt>>-p$h>3jlGI]iSieY lL+9?rql`hrW)oqrW)uIrdX~> s8NH*rVQ?E]O_fe"pOu/!q>^*ds8CXMs8=&:qY0XPm,?O> _n*.TVP9ZTUoUf5_opQel1+NDqu$EdrW)oqrW)uIrdX~> r;Qp!m+7=qqb[Aj:\mli;,gRprD qYpp#fXSrMe^i@)f%'`M%b9%Vd*U1heBlCU_qFDOo)JObrVtXOhZ*?Ls8Doqs8UUJJ,~> s8W,u#lXY`c>XX3"pOu/!rVcZkq=s[Vo^hYE nEoN'ioK:io(;VLq"aa^qu$Hlp\t3krVliseGas~> qu6flkF#7Hr)!Jk:\R]`;$1*VXl&^Lci*qEq#:6l%0$2$p%%\GqZ$Qos8VQes8Doqs8UUJJ,~> rr2utrr3<'g:PANdaZk"fDO5"ec""teHXIH`PKL>mIL;Qrr)l@rqQN&rdX~> s8NN,rVcZ_gj:4Z#6k>7q#gKs#mCP@%idQA\F94lrqHHgrr)fIrr;rsr;QTnqZ$?up\+7NoCVeQ qYU0hr;HT0rdX~> s8W)t"onJjUKU[e;#F/o=DNuGrVlHh_#=Q:r;6 s8W,urr36%hS[CWcdUGDfD!i'f@JBrc,[E0iqr]Hs7uZms3^fGrVZZks0hoW~> s8NW/r;HTdjbPW2#mUV:!s8]#!t>A:#7MCn/lS_/oDJRdp]('grVb.C!<;urqYdl%J,~> s8NB(rVlisqQ4C7qbR8ipJCid#?+c4@XZ2eqt0o>rpB]8~> rVlfr#Q rr2oq#kdDJ8h(8V"pFo-rri-"%Klq@&hZF5<0k_kqY^ qu-`uqmq2eqG@2hq,%&f$ rVlfr#QF5Pd(m`Ke,@htfD3u)f@J r;I$$p?SVf3"QH&"oSN'"Si-0"9f&G2c3^oQbMJTqu-Nhs1SF2rVQTorV6BkrUp0gs4I=$~> qu-`uqo=q?q+q&gq,%&f$ q>Ucto$b.fcI1=qec+,"ebdo)f@J r;R3)q!YbG8.uI>"p>#0rW<-%qZ@<2"UG_l:4fFN`T?pmrVlTlYPnP#rVlcoqu6Wos8Moqf`$C~> qYp`seZF3q;#X;m:f%'e!)NJgr_Wo%C5&n:cI_RXs8MutrVl]prO;b+rU^$grVulss4%$u~> q#:Wte?cs7db!(#rmh)"qpl,+f$MXae*d21q#'peXT&7uqu6Wqqu6Wos8E'!rr)fJrdX~> qu7'"o#mb1(_I)["9S`)!rrE"!tGG;#S/%GO2AoblMCGXrqQMnrr)fmrr;rsrql`JrdX~> qYpZrj2ZuR;#sKhr_NSjqb[8h#?5&X^ZaY:o^r1^rWE,sr;F/)s8Doqs8Dcms8Duss8UUJJ,~> s8W)trVm*!dB't%d+A0Gs4.)!$J3kVbf7onrr)cor;Zfrqu s8W)t$NKtogq[\H'atGN0m0VCk4ANLrr<#trql`#rr<#qrW)ogrr)lLrdX~> s8W)ts8N9$o&5m5;Z9Pj;#a>i;#X;s;H@V3eE?N%r;Zfrqu?Tns8@NJo_s@~> s8N0"rVlcq"oHcQ]>`+mf)O;!ed0mYd`obPiUcpBs8W)qs0DY&rU'U_rRh+"~> s8NQ-rVlinp$(%V/fbB,"T&<$!rW35"9f#;%3el6a7&d#rVlfrrr2fpZMsh&mJd(af`$C~> s8NH*rVlirrql8^?<@,'qb[;grD qu6Tp#5m;n_8=FHqptetrmq,$#M.ANb/_]Wn,34crqZT"rr)f_rr)fJrdX~> qu-p!p[6t(9IpY["T&<$!r`<$":YP@$Pt[1ZKLfTr;HWoq>[c"rVu9arVtOLJ,~> q>LNqpU#*Qpe^udr_WMi$W'oAOjX%(rr<#trqZSFrpB]8~> qu6Tp#Q qu-s"q=EjND*&:9"9eT(!!<-%rWEZ6#71n]6B]XUpA4aerqZT"rr)larr)lLrdX~> q>LQtqSeV8:\[`d:]=2g;%$2u=`h.8p&>!krr2`nJc>'9J,~> q#:["p?^2=aOAYhebI_qf*KsWd`o\Hf&uc!s/,eorQP7k~> qu7'&qtKQqO\HDq"U"u&!tGG;"U52>'.mgdcg^Z*rV6Dirr)l@rdX~> q#:KpfWop$o2#Hb;Z0Gq;e2')k4J\)rpB]8~> p\tNuq:E3tdF-Oppt#Js$J*bWd)EiAeaEG9pA_#hrVat>J,~> qu7*'r;$!9Z=+U]"pG,4p]CL!r<3K4%37`RZJb3IrV6Dirr)l@rdX~> q#:Nrkg,8g;Y3cd;,[?i##JHDR*YF%pA]^CmJ_V~> qu6Nn#Q*5h`QQTVec"&!fDX;"fDjD,e&fD8^uP:ipA^rfs8C1@J,~> qu6Wo$N'V^d!$lS#R1G8r p\kf"]S`MYM8XAs+11:rdX~> qu6Nn#Q3Z-aMc9LeG[qufDX:uf*BgL_6UQ.qYg-fV#LDmbl3+~> qYgm$r;-$FO[UW+#mLP2!rrK&"8i9."UYbW2gr-kp\agdV#LDobl3+~> p\k'9J,~> pAY^'p$0o9`Qlo_f%&@&f@SU)r7;2(c,6s$jSf)Os2G!:rTX=]s2P%g~> qZ$Tp')_IfX`?T;$j["=!s/Q,"9\f/qud<0#n@b1J\9n6r:p<2rr2r^rr;r:rdX~> pAY9lbb&uQr(mSn:f("d:f-pa")+Xdnb3!6rpB]8~> o`#*je@!*7d/MSpec=>$f)=2(e]u1F^ZY7h`r>r8l2L__`r:J~> q#:d%q!Z7n=<%q["p4r/rW<-'rWE*%#mCSD'fCKPhY-jAs2P':s69O_rPnhe~> pAYsDf;$1L2g@=n:Jc>'9J,~> o`#0me$Qg.cILJ?f)F8)e^2CN_s$am`r>r8l2LY]aSp\~> q#:^#qXi[_F"A7<#6ac'rWEN2#Rh>"G-Tcnqu6Tls2P':s69O]rQ+tg~> pAYd;$9^.Ut+r-s+11:rdX~> o`#0ngqgeBbLG);f)F8+f$V[X`SL%ZpA`,2rr)*\rVst q#:a$qtKL5O\7/6#Qt;*"9&E3"U>AF-=2qXlhCAWrql`7rr2r^rr)f:rdX~> qu?]qrr30$rUdC>@f9.';>O,d;$Kj*OLsKHrV6DDrpB]8~> p\t0l$2s;Jb.PjFeCE+Gf)F8+f$_ja`5g?qpA`D:rr&YlJ,~> p\kQtq"*^SH9i)L"U"u("9&E3"U58A))c!(g[P.>rql`?rr2qnrdX~> rr;uss8Drr%K6;$bFWcN:f("e;Gg'9J,~> p\t0l$3'_gd_*WIdF6YBf)F8+f$r'jaMcBkpA`G;rV`PkJ,~> p\kU!qY0O)Ug"fM#6b55q?-[!$O-hB&ggGFdcpQ)rql`@rr)kmrdX~> rr;us!r`&qrVd'!iPLCP;c$?j;?0Sl;#4#o oD]*ppY!F&aj&5_qpt_t#M.GRd*U>#oCi40rr)ekrdX~> p\t[$rVQ?Nb',KX$3p_;qZHa!$j?kA&hR7Xd,X]mrVl`pcMmeBV#Gl~> qu6`srVlcq#QFDVT4M/%;>sGn;>j>e;$U3=Mo+WHq#1'hJc>'9J,~> o)Asmk0h;caNr?5f)+&(e^W'sf&-&tp]&M;rr&YlJ,~> p](9m$N9kmi0RCr%grUGqucg!$j?h>%jt/8_qjeUr;QWoc2R_BV#Gl~> qu?Qms8N9%ot#fh;#F2i;#!lm=(d5thX:4 rr2utr;Qcrr;R$$p[$,3^rt.'f)+&)f%&9tb0]JOrr2rtrr)lMrr2qbrdX~> rr2utr;R6*s8W)rp?K8H8eqpC"oJK""TAQ2$5GICYLi: rr2utrr<#ts8Duss8N2tfWoo";#!lp;cdk3cKkH.s8N#rs+11:rdX~> s8W)trr;usqu6ose@<95cILJEf)4/"f)O8(d`9D]l1b2Ws8Musg&CsMRJq^~> s8W)trr;us%0->*q=)q?C+L82#6au-q#h$.#7MhWM886Cq>L6kg&CsKRJq^~> s8W)trr3E*r;?Nms8W#`e'9J,~> oD\ah$MrZ#_SF@DeCE+#rR^tu"k1W3^WPp>s4@8Ks-`k:~> oDT$lp#se_:Flt^rWN6'r<3*%rr`W4$5P3pS^6KnqpbWDrL*Y8~> q>LBmrqlcprr*&rl`bbHqG@,frD oD\ah$N05DaLoR?daZgur7Cr!#hRVP`O`h=nG<(_fDbdLR/VU~> oDT3rq"*UPHpe_Z"pG,3"8i<$!t5;9#n@b.E2M+Qp\b!@rr2k`rdX~> q#:9krVd*&ps#RX<)QOhq,.,fr_Wnu;eVZ@l2CV\s+118rdX~> nG`jpq p&G'k%K-+tnC=dQ+;5"b"U"r&":bS?$4e1?D7AWtq>:-is69O^rJ:H'~> q#C?mr;R$"ld:bs<)?Hk;Y mf*UiiQK6Yb0\Vgf(mo(f$r'ja2#aSo)&@bl2LY]M>i#~> p&G'k%K65$pZg.\6mW9K"p>&&":GD=$5"@LNPa]Iq#'=SrV_TPJ,~> nG`jpqWb2-@8Kfu;H!-a"]SZLZJ>'Ls+11:rdX~> p&=gf$3'Yac+1a9dFHhDf*U$YeC)U[_p.$/qZ#m\rVq`RJ,~> o)A[f$2a>SY'E8G%1!13":kY?#7D.o=cU\np%nXdrVc']rV_TPJ,~> p&=jg"TA#=VKVo8!)iGd##\E2L9T_;rVqHJmJ_V~> p&=ad#l)ua_T0sOf%0iP!8.8%$J*bXdE'5Ccg(?)r;Z*^rr7fRJ,~> nGWdmq!QG*A1SW,#6jf(rri]6$lV!3U!Mrrqu6Q[rr2kPrdX~> p&=gf#lEc,O^hKi;,Zs^"^#Mu_s$jos+11:rdX~> nG`Lfrr3?%iQT6Ubgb1of%9lQs4@;%#h@AJa2#aQnG<(_qu6EkJc>WIJ,~> nc'4#rV?*Kc]1mS%LE=C"U"r3"oAE0"U58E)E;Q,earV9rVQTirIOtHrdX~> nG`dns8MfWZ%-C^qbdAkrDESkr_Wht=DjPEli-p8rpB]8~> rr2utp&G'krr3K+mG5t#aNr8`f%8R-f\$2Ts4.J*dEBJIdGXZrrVucoq>Z$FrVh<~> rr2utp&G'k&,Z+mk-]e4)\<8["U,#3"o8?2"pbPG+$t(WhsgI=r;HQmq>GmDrVh<~> rr2utp&G!i#64GEW-_TEqb[>kr)!Gjr)!Z(GFm7QqYu-GmJ_V~> s8N0"rVlcq!<2lqs8N#t$NBnleA/uBbgFtmrRh&"$.dVRc,[ZEm/?q[s8W)os+11JrdX~> s8N0"rVlcq!<2lqs8EH)qY9U8\SE`6$O?q?pB1p/"pbPJ+%VF/j7W0Cr;QZprqZMDrr)hH~> s8N0"rVlcq!<2lqr;Hltn(3k8=T2.f;$L!(H*Z2rs+11:rdX~> s8N0"rVlfrrr2iqs8Mrr$2W`1`4a19e(<4Nf_a8+e^W!i^r4plq"k$jrqcYGrqubG~> s8N0"rVlfrrr2iqs8EH*qtg'Sf9KMp'+G3OpB2*4"pP;?&1h4Sal`!^q>C3irr2cmJc>THJ,~> s8N0"rVlfrrr2iqrr*9'rr2i`\;4is;,HaZ#@rh'iqW p&=pis8Mrr#QFMaag8b)deME$f[n^)eBc1P_9_THs7?6gs+UH&~> p&=pis8EH*r;6<]kJNWa*>8ecqulm#rWWc:$lL^)W7'Pfp&"[coD\^eL&QT~> p&=pir;Hs"rqP?_J5fGC;>j;k;>sJm;$U06Mp(JUo_X4=nG[q~> p&=pirr2fp#l*/n_SXOHe^jQJs4.J+d`f\D_qXPRr;ZBfrVqTNJ,~> p&=pirr*K-r;66Xh7nA+-4^Ff"U,#3p]V'2$4n%8FJ?\.n+lkZoD\^eL&QT~> p&=piqYgZro%Tm[?hmRu:]XEkr)!\s nc/Rer;R3(oB"*)`Quu^f%8R,rR_&"#M%5F`5'18nGN=Xrr)kNrdX~> nc/Od')hY!mG"^g584P4#6b86"U5,6qudH4#R_1b2e/Q,l1b#NrUg*frIt6$~> nc/Od#ljo'qs_b%E_uR/s%r\l!)WSj"^5]$^uG$ nc/Odr;R0&o[q+#`lul]f@S[Qf*g0]f$hsf_n*hHo_e^goD\ahK`6K~> nc/Lc%K#qnlcuD?0c^]1#6b8/"o\W8!sAc3#n%@c6%?5soD&4]o`"jgK`6K~> nc/Od!<<&t"o76!O_7kn;#jGl;#jGj;$BiuEMUnKJc>0 rr2utrr;usqu?QmrVm0&qWZYP]Z/:IpX]`&eC)[b^V\F[pAY)Crq$,>~> rr2utrr;usqu?Qm%/g"uo]a_d>VQj##R:#+%0Zq@#RhA!?'EY(pA=f>rq-2?~> rr2utrr;usqu?Hj#6">\[u+iqmnj3cA;@MSrr7QKoDX7~> s8W)t!<;urr;ZWmrVm6'p#jW7_oU0Re^jTK$.dYVe'>nJ`7=GXs+11@rdX~> s8W)t!<;urr;ZZn&,lG'q=Nd\NDq;C$j[%@"o/<$"UbM@%NdiR\DcrPr;D3Gp&9I~> s8W)t!<;urr;ZKi"npTUK3q^K;$L3AR+D!/s+11@rdX~> kPbqjrr)KCa2,R5d*pOsf_a;"ecjLF_RRYRqZ$Nns8Voos8RlRJ,~> l2D4lr:od?_L=p#&.8aK"pG2*":GD@'-Bu>c0+crr;HQms8Voos8RlRJ,~> k5GS_p>Dci?Vp\us&/_ks%r\l$<(#S_UEoL]2f~> kPkJ\$2Wr?ahYm;cdUJAfDjD-f@8-d]>NInqY^BlrW)unrW)tQrdX~> kl)%iqY'F7X*I2Y'FP3P"o8B%!t>A:#RqD'DPP\JpA=ddrVcfsq#19nLAl]~> jo,Jao?!YM>?1Aos%rYk#uGB+`Tm@!rr<#srW)unrW)tQrdX~> nc/Res8W&srr3r:qXE%P^qn1?e^rC'f@S[,f@JR(d`f\Ka4U"[s6]gbrK.#/~> nc/Res8W&s-2dT4mb,!c2]rV=#R1D6!sA`1"9\f0"U>>B*BA&MjRW-Dr;Q``rr2qZrdX~> nc/Res8Vuq#QO\ie!OoT;#O8k;#aAp;Gg:frD&Kb\pAFsirr<"LrqZPD~> nc/Od!<;rqrr3?$k1.Ph`QHQWe^jTK$.dVQbf@TDiplpDs6]garK7)0~> nc/Od!<<#s%fQ;$p?gG'D*]9Y$O?n>q#h64"pYGH+%hO,ipud;qY^9in,E:cOoBk~> nc/Od!<;rq#ljo$m(o'2>?1W!!)WDe$;a]+I'VGts8N#tJc>HDJ,~> p&=pio`"mj$i^"jeAB&>bL"_gf)4,,f[n['d`fVHbhi$hs82fqs8DrsrVc`orK7)0~> p&=pip\t0j%/]bbe?3OD*Y/Va"pOl,r<3Z8$5"dhNQpbUnb)\Rr;HQms8W&ss8DoqrVr#ZJ,~> p&=pip\t3k$3'u(qX)[rC0FI.;?'Po;$Kio;IkHckl1VVrr<#srr;qRrdX~> p&=pip&=mh$2N`6a2#[:cdUGBf+-Hbf%&9ra2GpCjm21"qu6WmrW)urrW)oprr2kXrdX~> p&=pio_o p&=pip&=sj#QFVc^QrnC<:j&e:^L9=MR^gOe`cZ&qYgKpr;H]pM#Mo~> nc/XgrVufpqu7$&qX2bG^r+=Ae^scPrmqP/e^;U]_8XdKb1Q@as6]gbs-3M5~> nc/XgrVufps8NQ-r;$$OeZEC:*"ND_"nr-/"UGPQ.7@'6G,s!Uq#'LXrr&)\J,~> nc/XgrVufpr;R$$qsB#;H74QK7]Z:k4nrUs+11JrdX~> nc/Ufrr;oqq>UlujO;2e`Q?KVf%8R,rmqV1e^Mmha2cEG_TUm+qu6W_rr)k^rdX~> nc/Ufrr;oqrr3N-r;-*Pd@+`4+;>1h"pG2,";(eA#R_=j.P48:W7pe:qu$EknG`CbQ2Z:~> nc/Ufrr;oqqu6p#qWPSVEa)Q:;>j;s rr2utp&G!is8VuqqYq!'qX2kN^VS%=e(*(&rmqV1e^W'qd*BkV_841Gp%n^grr;rirr)k^rdX~> rr2utp&G!is8Vuqrr<#t%/]__e#R.?*tSec#6ju-rWW<+&d]!Z'IH(k`p!$hqYU6irr2lpp&=pg Q2Z:~> rr2utp&G!is8Vuqqu6p#qsAu;,^Fm?ZVt$qYg9is8@ZNJ,~> s8W#rq#C9k!<;rqq#:Zqk17Yk`5p6Qf)4,0f%&:!e'ZLb`l#X s8W#rq#C rr)orrr2]mrVlisqu6Hl#QFSa^m]IS r;H]pqu6Wqrr)orqu6Qm!<2fo$3'hjf>YJ r;H]pqu6Wqs8MusrVlTl%K?;$p$CA>E^1i]$j[%7"TJT&":PG<#RqG! rVZ]oqu6WqrVlisq>U3i#QFSge!k>^;#*u`:^9iqA:^oFq>GmDrr.E~> p&=sjs8N&sr;Q]os8Mcm$Mir?c,R]Ac-b"jrRUtus3qA(dEKVK`mWl9qu$JHrdX~> p&=sj!<2orrr2Zl&cMY(p?gG/Gtoq/%1*7D"U,&."8r?4"U55@)_kQY\D$9BqYU5DrdX~> rVQZoqYpKorVcfsq>U0h#QFYf`hIro=Sbnh:^Bj!Ar!bCmJ-X2rW)qJ~> nc&Ugrr!*$s8N#rrVlfirs\o(oA\05]#2\9daZhDf)O8*d`f_G_8tF+r;VEKJ,~> li7"apAb0l%f?"fh7S>9.ME:"#mUY;p]Cp.#n@_&9Rsh3n+QSTKDpB~> rVZ`qpAb*js8W&sp&>9rqt/XCJ72:O;>3lm:JansH)0-_qgn_HrdX~> nc&dlrVc`ps8N!!rVlfgrsASljO_Sk^W4UIrmgkr%+NYI`50=6g#D5dr;VEKJ,~> li6t`p&>R$qY'C4[#JT^,npgq#6b8+!t5;;$4Rn(:3rD>eF< rr)rsrq?Bjrr<#rrq-3rrp\=?O)nZ,;Z9Pe:^Kom rr2utr;Qcrqu?Wos8Vuqo`#@!rVH3I^pCbrd+$RqqUQ&)e'Q=Y^q-qebi/?rs5EtVs/>pI~> rr2utr;Qcrqu?Wos8Vuqq#:p)rVH9YkKp/P5op[J#R(>6q?%31"U>>D'-Ai$FK+?rrr:sVrr&ep J,~> s8W)trVllsqu?Wos8Vuqo`#0ppuf\iE)fg8;>!`n:Jaqk@!@mOnc&RgpAP'jrqlcplMgb^Yl9.~> s8W)trr;usr;Z]o!<;rqo)Ba0r:/La`Pfg>c-OedeCE+#f%&="dEKVF\&@"dqu6WTrr)kqrdX~> s8W)trr;usr;Z]o!<;rqp\tm*rVQE`kK^,W<\k[,$OI%B"U+`*'EeRD#R_4]5BEg]o(`+[rVc`p rVc![rV`\oJ,~> s8W)trr;usr;Z]o!<;rqo)B!ijN43NC0FS6oMGQ`"]80;S]LF%s7ZElrVl]prTaC\s02KQ~> jo4cL%fQ7icbR6.`6$6LdaZgtrRM8)e'H.QeFNP:q#C*f!<;ZirVrhqJ,~> jo4rQ'E7t,p$LSQQrks\&Io0T#6b54!rN-/"U>DG5(U#olgjcGqu-Hor;HHj!<;ZirV`\oJ,~> jo4iN$NBqmhn4\S=&;akrD jo4]J$hr`6cc jo4oP&H;Y)p?phVR<2Fi+qtOq#R1&,&d/CE$RenrQ`nB_nbE"ZrVcZmq>LBoo)AXeW;_;~> jo4cL$2a;M]:FRk>Z4Mk:^:]oW5$[7m/-_[!<)lqrVZcrs6K[_s02KQ~> rVulrq#C rVulrq#C rVulrq#CX2i;$g&u=_N,I[FP$Oqu6WqjSo,XYl9.~> rVulrq#C9k!<;rqm/IRmo]XrRcH=,Fair&WdF8*E$.I>Kb/qfPe`Q`'s6osdrM9FC~> rVulrq#C9k!<;rqo)BL)rVQEan_qE^IpYSq)%HuZ#6k>8"9e]-'*em\-9bRmb2i-dp%.YEqYU3h rUTses.oXE~> rVulrq#C9k!<;rqmJdRno%V!VN-Ju<;Gg p&=pip\t3k!<2?b)ZK[2oB4Z=\@o_taNMlVe'upueBuL\^pqeco`+L]s8AbmJ,~> p&=pip\t3k!<2Ngs8FMGqXs:7c)Q+e.i/g.$jm7F"U,#3!sJo:%N$EtXO-1umH p&=pip\t3k!<2Bc$2sbmkg$#V@T-.t:_$?#;H?tZc0G3+rq>[Kr8[eTs02KQ~> p&=pip&=1T+8bZngX40]]Y))$bg=hge^W$nbJ_'8guR_krVQ?crqufdrW)nmrdX~> p&=pip&=F['`S(/qY0L@d'Am\?:?Oh'+PBU"pOu/'*SUI%MUm8KUf9_^q%SElh1)NrUKjes.oXE~> p&=pip&=7V$iKb_d(#d.G\:/W;>3lr;,V=tXhW6@g nc/Res8W&sjo6D$rVQ'=aL&1\^;nLGe'umrda?:Y_S4%:jSS]=oDSUerVclurr)$ZrVsD,J,~> nc/Res8W&smJe^9rVlcmq"=+?hTi9S="t^1%grXI"U"r1"U>>B'-/bsBonR?VoIK[p%nUbrr2r\ rr)f*rdX~> nc/Res8W&smJm4crr3B*rVZN`kfflT@oZD&:_?K";,L.h=D3#L]tCVghX:@Bqu-TqR/VU~> nc/Res8W&sir:%omGZRBda-"S`lQ nc/Res8W&smJm.a/,fDBq"=+=e$bZmA5,$.((L]Z#mU\@#mq(N(aV7C=BKC3jrr)l\ rr)f*rdX~> nc/Res8W&skPtP\$iKb^d(6':JT,!t;>sB(:Jakb:f("k@s*ZdKp&1MmJ$MW!<8GcJ,~> rr2utrVuosqu?Wos8W&sq>^Konc/Xgrr4#\m`Q66Hc-FY[bf@T5['$CQq>1-k rr;rqrW)ucrr)l,rdX~> rr2utrVuosqu?Wos8W&sq>^Koo)Jah')hb)p@7J,dBegD4XLsW&.T*VrWs5D#71bL()nAG1j$Fb nFlbWrVlfqs8DosrU'U_rODiW~> rr2utrVuosqu?Wos8W&sq>^Konc/Od$2sbpmb"t4EF)TC:]4,i;%6?!;H$Rr='K(#g@,"?PQ$(~> s8W)trr;usr;ZHhl2Ub^qu70)qs`V!f?hRR]">_qaNOS.$-UB*]XG&bj73-Hs8W&urVZWps6Tab s0quX~> s8W)trr;usr;ZHhl2MS!rVZQhq"=(;e@h] s8W)trr;usr;ZHhl2U\\s8NN+qX*"VZCd,)DIHRCpJ;&k;cS4GdeNP8rr&MhJ,~> p&=pip\t3k!<29`rVlZn)?0U3q p&=pip\t3k!<29`!WN&sr$;18p[mtBki9soOD@H=*>T7u$jd.B"pYGA%1jsXN8!Uiq"t!Urr)l$ rdX~> p&=pip\t3k!<29`s8N&squ-s#qY97!Y`O!4;c*HhpeV0(Gd?r=s8Vrp!<)op!<&VjJ,~> p&=pip&=4Ur;QNl%K?>!khX_:f$hmb_o0Roa9]i*_ns: p&=pip&=4Us8N#rs84;Aq=s[Uo&eK p&=pip&=4Us8N&sr;Q`rs8EH"kL[\[Um6^\Cg^7?qG7B!@u\.TpA=^cs8Duq!<&VjJ,~> nc/Res8W&skPtS]s8Dior;QitrVc`n&b"Mu]"#>b_8F73a2,@%`S^Ufs7?6grNQ9O~> nc/Res8W&skPtS]s8Dlps8=8AqtTgOkhjq(T71$0,T.7,%LigS$4[_) nc/Res8W&skPtS]s8D`l%fQ>'qtK[<`2JT7>#S6nr)!Dj#%rInm.gS[qYgQpr;E>gJ,~> nc/=^kl:AUp\ts%mGlpOeBPtH\\#Vj]=ku(h^'cs8B/#J,~> nc/=^kl:AU-N3l>q=aCHkh=+dU5s\:=%+nk(D75h&Krr4J=aF%kjJ'8q"jpeoD\diYPs%~> nc/=^kl:/O%fQ7niR5WMUQgIVBjO_8r_Nl)BSWP&g$8G4r;Q]oU&KQ~> qu6Wqs8Moqp&=4Up&=^cs8EW/p[I%]\u`*D]"G\e]=ZYeqtU2ardX~> qu6Wqs8Moqp&=4Up&6<:r;6?cp@\%HmHW`d^n?-\4sLs[&eGZi*\(3EYM&"(nb)\Rr;E;fJ,~> qu6Wqs8Moqp&=4Umf!4brqm&ro%UmPKPaaer_WVl#ZtGgYg`=Cs8VlnrVrhqJ,~> qYgKprr2lro`"+To`"O`(B!sqj4i&4f?hOP\@&ZXbg4\lkOJHJrVrSjJ,~> qYgKprr2lro`"+To`"mh,Q.H8qYBp\p$qD)b-n"&G@OE4/Ku#N+#m2;MP7Q%g?8,%q#:*fqZ$Hm r;QYtrdX~> qYgKprr2lro`"+TlM_Y!qX34d^TaDpK61^1;c?_3JX jo4NEli-h^rr*N.r;5[)_R6YOW1flW[a*n,qsscgrdX~> jo4NEm/I%`.f9)9o'PYsd'8UJ9/I\.(`X\M3*Up)^")N>oCV\Jp%J+Rp\F[_qu$BjYPs%~> jo4NEkl1S['E%Uof"%8uBiS#+:f1>&I\"!skkb;Ws8DrsrN?-M~> jo4NEli-\Zs8EZ&kMY%Bc+^?VS#*C&a3;rdk3W*;!qQ![qu jo4NEli-q_.K'&:o^V8-d_DoQMgT>H:I$or6;qB8K9W.9]#)D+b0J]$mIg5LqY^;qrdX~> jo4NEjSg4uq%`#3P+f+maNrGig"bNMo(]3`J,~> nc/:]l2UGUrVucop&G$j%eoDC^8dNbPa%H&TXW1uro+"@l1OiOYl9.~> nc/:]nc/RerVuQis8Dcms8 nc/:]l2UASs8Voos8W&ss8W,u)ZBL(gVBP:D,sS3:f1>%GEAH!Yd1gTe)g0!Wr@M~> nc/:]l2UGUrVu`noD]a+pZp\cb/q`Gaihu\hVmPShr!APjl>=anbE+`Yl9.~> nc/:]nc/RerVuQirr)Tj.K02Bqtg-`p\+:LleK^oUm-RXCLL7F=CZ5mJ:iT6O. nc/:]l2TcBrVmr:qX*1e_6p88Q]?`PKoVLkUnsrhYIMBhd+d^QqY[PrJ,~> p&=pip&=4Up&=pin,DnX&btn^k2G+Lf[7m^_pdW8rr<#&rdX~> p&=pip&=L]rVlcqp&=pgn,=I.qtTjSlfI$X`j2.kJphi_EcZAHG^=dgKoW.Nh=LF?Yl9.~> p&=pip&=4UfDZTbnDV[(['-F%St)=?SXuCASt`a?jS/PTrdX~> %%EndData %%Trailer end %%EOF cd-circleprint_0.7.0/perl/0000755000175000017500000000000010733770016014442 5ustar colincolincd-circleprint_0.7.0/perl/README0000644000175000017500000000250610733744412015326 0ustar colincolinThere are many programs to create a label for a cd-cover, but not many for the labels on the cd itself. Sheets of labels for CDs seem to have free software, but only for windows not for UN*X. It is hoped that this program will redress the situation. You need the perl/Tk modules to run this program. You can get them from http://www.cpan.org/authors/id/NI-S/Tk804.027.tar.gz or install the right packages from your distribution. (For debian: perl-tk) Furthermore you need Pod/Text.pm for the help-function (for debian: perl-modules) cd-circle-print updated, maintained by & Copyright (C) 2004-2007 Colin Tuckley. cd-circle-print was originally written by & Copyright (C) 2000-2002 Matthias Kabel. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. If you have not received a copy of the GNU General Public License, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. cd-circleprint_0.7.0/perl/TODO0000644000175000017500000000074610733767007015147 0ustar colincolinThere are still a lot of things to do, patches are welcome * Calculation of the height of the textfields, so we can center them vertically * Help functions Maybe balloon help * Use some predefined options for different types of label-sheets * Use a pipe for the preview function * Use different media (/etc/papersize for debian) * Read the text from a cddb A look at cd-labelgen may help * A canvas window to move the objects interactively * Allow for two identical labels cd-circleprint_0.7.0/perl/cd-label.pl0000755000175000017500000022350210733767007016457 0ustar colincolin#!/usr/bin/perl -w my $VERSION = '0.7.0'; use strict; # use the ToolKit use Tk; use Tk::Text; use Tk::FileSelect; use Tk::DialogBox; use Pod::Text; use File::Basename; use Getopt::Long; # Global vars defined here my ($circle_frame, $delta, $fontlistbox, $fontentry, $scale, $text_frame); my ($fmw, $fgw, $fff, $crw, $caw, $spw, $psfile, $viewer, $converter, $number_of_background); my ($begin_from_bottom, $x_scale, $y_scale, $scale_x, $scale_y, $shift_x, $shift_y); my (@textfield_frame, @circle_text_frame, @textfield_entry, @entry, @text); my (@font, @fontsize, @begin_from_left, @eps_file_entry, @eps_filename, @eps_file_label); my ($tickmarks, $print_circle_boundaries, $number_of_labels, $which_field, $pidsav); my ($graphics_file, $radius_inner, $radius_outer, $starting_angle); my (@ct_clear, @tf_clear); my ($graphics_directory, $Bounding_X, $Bounding_Y, $x_origin, $y_origin, $debug); my (@shift_eps_x, @shift_eps_y, @scale_eps_x, @scale_eps_y, @fontfamily, @fontnames); my (@color_rgb, @rgb, @ps_color, @tk_color, @circle_radius, @label_active); my @configurationfile; my $fontpath; my %fonthash; my ($label_fn, $label_id); # Global parameters to be changed if needed # The variables we want to be saved in the configuration file my @SaveVariables = qw(delta begin_from_bottom viewer converter radius_inner tickmarks print_circle_boundaries begin_from_left[0] begin_from_left[1] number_of_labels debug circle_radius[0][0] circle_radius[0][1] circle_radius[0][2] circle_radius[0][3] circle_radius[1][0] circle_radius[1][1] circle_radius[1][2] circle_radius[1][3] x_scale y_scale ); my @LabelVariables = qw( text[0][0] text[0][1] text[0][2] text[0][3] text[0][4] text[0][5] text[0][6] text[0][7] text[1][0] text[1][1] text[1][2] text[1][3] text[1][4] text[1][5] text[1][6] text[1][7] fontfamily[0][0] fontfamily[0][1] fontfamily[0][2] fontfamily[0][3] fontfamily[0][4] fontfamily[0][5] fontfamily[0][6] fontfamily[0][7] fontfamily[1][0] fontfamily[1][1] fontfamily[1][2] fontfamily[1][3] fontfamily[1][4] fontfamily[1][5] fontfamily[1][6] fontfamily[1][7] fontsize[0][0] fontsize[0][1] fontsize[0][2] fontsize[0][3] fontsize[0][4] fontsize[0][5] fontsize[0][6] fontsize[0][7] fontsize[1][0] fontsize[1][1] fontsize[1][2] fontsize[1][3] fontsize[1][4] fontsize[1][5] fontsize[1][6] fontsize[1][7] color_rgb[0][0][0] color_rgb[0][0][1] color_rgb[0][0][2] color_rgb[0][1][0] color_rgb[0][1][1] color_rgb[0][1][2] color_rgb[0][2][0] color_rgb[0][2][1] color_rgb[0][2][2] color_rgb[0][3][0] color_rgb[0][3][1] color_rgb[0][3][2] color_rgb[0][4][0] color_rgb[0][4][1] color_rgb[0][4][2] color_rgb[0][5][0] color_rgb[0][5][1] color_rgb[0][5][2] color_rgb[0][6][0] color_rgb[0][6][1] color_rgb[0][6][2] color_rgb[0][7][0] color_rgb[0][7][1] color_rgb[0][7][2] color_rgb[0][9][0] color_rgb[0][9][1] color_rgb[0][9][2] color_rgb[1][0][0] color_rgb[1][0][1] color_rgb[1][0][2] color_rgb[1][1][0] color_rgb[1][1][1] color_rgb[1][1][2] color_rgb[1][2][0] color_rgb[1][2][1] color_rgb[1][2][2] color_rgb[1][3][0] color_rgb[1][3][1] color_rgb[1][3][2] color_rgb[1][4][0] color_rgb[1][4][1] color_rgb[1][4][2] color_rgb[1][5][0] color_rgb[1][5][1] color_rgb[1][5][2] color_rgb[1][6][0] color_rgb[1][6][1] color_rgb[1][6][2] color_rgb[1][7][0] color_rgb[1][7][1] color_rgb[1][7][2] color_rgb[1][9][0] color_rgb[1][9][1] color_rgb[1][9][2] shift_x shift_y scale_x scale_y starting_angle label_active[0] label_active[1] eps_file_label[0] eps_file_label[1] eps_filename[0] eps_filename[1]); my @FormVariables = qw(delta begin_from_bottom number_of_labels circle_radius[0][0] circle_radius[0][1] circle_radius[0][2] circle_radius[0][3] circle_radius[1][0] circle_radius[1][1] circle_radius[1][2] circle_radius[1][3] radius_inner begin_from_left[0] begin_from_left[1]); my $pi = 3.14159; my $home = $ENV{'HOME'}; $configurationfile[0] = "/etc/cd-circleprint.conf"; $configurationfile[1] = $home."/\.cd-circleprint.conf"; # read the command-line for any options my $params; GetOptions ( 'config=s' => \$params->{'conf_file'}, 'version' => \$params->{'version'}, 'debug+' => \$debug, ) ; if ($params->{'version'}) { print ("cd-circleprint $VERSION\n"); print ("http://sourceforge.net/projects/cd-circle-print/\n"); exit 0; } if ($params->{'conf_file'}) { $configurationfile[2] = $params->{'conf_file'}; } # Build a list of available fonts and their Postscript names my $tmppath = qx'xset q | awk "/Font Path:/ { i=1 ; next } i==1 { print \$0 ; i=0 }"'; while (defined ($tmppath)) { ($fontpath, $tmppath) = split /,/, $tmppath, 2; last if ($fontpath =~ /Type1/); } my $fontdir = $fontpath . "/fonts.dir"; open (FONTD, "<$fontdir") || die "Can't Open font dir file: $!"; my $strg = ; $strg = ; # skip the count record while (defined($strg)) { my ($ffa, $ffb, $ffc, $ffd); ($ffa, $ffb, $ffc) = split /-/, $strg; $ffa =~ s/pfb/afm/; my $fontfn = $fontpath . "/" . $ffa; open (FONTA, "<$fontfn") || die "Can't Open font afm file: $!"; $strg = ; while (defined($strg)) { chomp $strg; ($ffb, $ffd) = split / /, $strg, 2; last if ($ffb =~ /^FontName/); $strg = ; } close (FONTA); $fonthash{$ffd} = $ffc; $strg = ; } close (FONTD); # set the system defaults defaults(); default_attributes(); default_text(); default_colors(); read_configuration(); propogate_colors(); # then we need the main-window my $mw = MainWindow -> new; $mw -> title("cd-circleprint"); # Something which some window managers seem to need $mw -> geometry("+0+0"); # some key-bindings # We want to exit the program with Ctrl-q $mw -> bind("", [sub {&clean_exit}]); $mw -> bind("", [sub {&print_label}]); $mw -> bind("", [sub {&preview}]); $mw -> bind("", [sub {&write_configuration}]); # Now we want a frame at the top of the window for the menus my $menu_frame = $mw -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'top', -fill => 'both', -anchor => 'n'); $menu_frame -> Menubutton(-text => "File", -underline => 0, -tearoff => 0, -menuitems => [ ['command' => "New", -command => \&new_label, -underline => 0], ['command' => "Open", -command => \&open_label, -underline => 0], ['command' => "Save", -command => \&save_label, -underline => 0], ['command' => "Save As", -command => \&save_as, -underline => 5], "-", ['command' => "Load Form Data", -command => \&read_form_data, -underline => 0], ['command' => "Save Form Data", -command => \&write_form_data, -underline => 10], "-", ['command' => "Save Image", -command => \&save_ps_file, -underline => 5], "-", ['command' => "Preview", -command => \&preview, -underline => 0], "-", ['command' => "Exit", -command => sub{&clean_exit;}, -underline => 1] ]) -> pack(-side => 'left'); $menu_frame -> Menubutton(-text => "Format", -underline => 3, -tearoff => 0, -menuitems => [ ['command' => "Fonts and Colours", -command => \&get_fontattributes, -underline => 0], ['command' => "Angle", -command => \&get_starting_angle, -underline => 0], ['command' => "Radii", -command => \&set_circle_radius, -underline => 3], ['command' => "Page Deformation", -command => \&set_page_scaling, -underline => 0], ['command' => "Positions", -command => \&set_positions, -underline => 0], "-", ['checkbutton' => "Top label", -variable => \$label_active[1], -command => \&select_labels, -underline => 0], ['checkbutton' => "Bottom label", -variable => \$label_active[0], -command => \&select_labels, -underline => 0], "-", ['checkbutton' => "Tick Marks", -variable => \$tickmarks, -underline => 0], ['checkbutton' => "Circle Boundaries", -variable => \$print_circle_boundaries, -underline => 0], "-", ['command' => "Graphics", -command => \&get_graphics, -underline => 0] ]) -> pack(-side => 'left'); $menu_frame -> Menubutton(-text => "Options", -underline => 0, -tearoff => 0, -menuitems => [ ['command' => "Previewer", -command => \&get_previewer, -underline => 0], ['command' => "Graphics converter", -command => \&get_converter, -underline => 0], "-", ['command' => "Load options", -command => \&read_configuration, -underline => 0], ['command' => "Save options", -command => \&write_configuration, -underline => 0] ]) -> pack(-side => 'left'); $menu_frame -> Menubutton(-text => "Help", -underline => 0, -tearoff => 0, -menuitems => [ ['command' => "Help", -command => \&help_window, -underline => 0], ['command' => "About", -command => \&about_window, -underline => 0] ]) -> pack(-side => 'left'); #$menu_frame -> Button(-text => "label", -command => \&print_label) -> pack(-side => 'left'); $menu_frame -> Button(-text => "Preview", -command => \&preview) -> pack(-side => 'left'); # Test for Canvas don't use it #$menu_frame -> Button(-text => "CANVAS", -command => \&create_canvas) -> pack(-side => 'left'); # # Now we create two frames for the text-entry widgets # $circle_frame = $mw -> Frame(-label => "Circles", -borderwidth => 4, -relief => 'groove') -> pack(-side => 'top', -expand => 1, -fill => 'both'); $text_frame = $mw -> Frame(-label => "Textfields", -borderwidth => 4, -relief => 'groove') -> pack(-side => 'bottom', -expand => 1, -fill => 'both'); # First two frames for the circles $circle_text_frame[0] = $circle_frame -> Frame(-label => "Bottom label", -borderwidth => 2, -relief => 'groove') -> pack(-side => 'left', -fill => 'both', -expand => 1); $circle_text_frame[1] = $circle_frame -> Frame(-label => "Top label", -borderwidth => 2, -relief => 'groove') -> pack(-side => 'left', -fill => 'both', -expand => 1); # Then two for the textfields $textfield_frame[0] = $text_frame -> Frame(-label => "Bottom label", -borderwidth => 2, -relief => 'groove') -> pack(-side => 'left', -fill => 'both', -expand => 1); $textfield_frame[1] = $text_frame -> Frame(-label => "Top label", -borderwidth => 2, -relief => 'groove') -> pack(-side => 'left', -fill => 'both', -expand => 1); # Now create the widgets for the text for ( my $j=0; $j < $number_of_labels; $j++) { for (my $i=0; $i < 4; $i++ ) { $textfield_entry[$j][$i] = $textfield_frame[$j] -> Entry(-textvariable => \$text[$j][$i+4]) -> pack( -ipadx => 10, -ipady => 10 ); $entry[$j][$i] = $circle_text_frame[$j] -> Entry(-textvariable => \$text[$j][$i]) -> pack( -ipadx => 10, -ipady => 10 ); $font[$j][$i] = $entry[$j][$i] -> fontCreate(); $font[$j][$i+4] = $textfield_entry[$j][$i] -> fontCreate(); configure_font($j, $i); configure_font($j, $i+4); } } $ct_clear[0] = $circle_text_frame[0] -> Button(-text => "clear", -command => sub{clear_circle_text (0)} ) -> pack(); $ct_clear[1] = $circle_text_frame[1] -> Button(-text => "clear", -command => sub{clear_circle_text (1)} ) -> pack(); $tf_clear[0] = $textfield_frame[0] -> Button(-text => "clear", -command => sub{clear_textfields (0)} ) -> pack(); $tf_clear[1] = $textfield_frame[1] -> Button(-text => "clear", -command => sub{clear_textfields (1)} ) -> pack(); # Was a Label filename specified? if (defined $ARGV[0]) { $label_fn = $ARGV[0]; read_label(); reconfigure_fonts(); } update_display(); ############################ MainLoop; clean_exit(); ####################### sub clean_exit { if ($pidsav != 0 ) { `kill -USR1 $pidsav`; } exit; } ####################### # Very incomplete :-( # #sub create_canvas { # First we need a new Window to show the objects # my $canvas; # my $cmw = $mw->Toplevel(); # $cmw -> title("Move oobjects of the labels"); # $canvas = $cmw -> Scrolled('Canvas')->pack( ); # The inner circle #my $inner_crcle = $canvas->createOval(10,10,100,100, -extent => 360); #} ####################### sub add_font_from_entry { $fontlistbox -> insert('end', $fontentry -> get() ); push(@fontnames,$fontentry -> get()); } ####################### sub reconfigure_fonts { for ( my $j=0; $j < $number_of_labels; $j++) { for (my $i=0; $i < 4; $i++ ) { configure_font($j, $i); configure_font($j, $i+4); } } } ####################### sub open_label { my $OLref; my $olfile; my $home = $ENV{'HOME'}; $OLref = $mw -> FileSelect(-directory => $home, -title => 'Open', -filter => '[^.]*', -acceptlabel => 'Ok'); $olfile = $OLref -> Show; if ((defined $olfile) && ($olfile ne "")) { $label_fn = $olfile; read_label(); reconfigure_fonts(); update_display(); } } ####################### sub new_label { clear_circle_text(0); clear_circle_text(1); clear_textfields(0); clear_textfields(1); default_colors(); default_attributes(); propogate_colors(); update_display(); # and also the filename so we don't accidentally overwrite something undef $label_fn; } ####################### sub clear_circle_text { my $j = shift; for (my $i=0; $i < 4; $i++ ) { $text[$j][$i] = ""; $entry[$j][$i] -> configure(-text); } } ####################### sub clear_textfields { my $j = shift; for (my $i=0; $i < 4; $i++ ) { $text[$j][$i+4] = ""; $textfield_entry[$j][$i] -> configure(-text); } } ####################### sub configure_font { my ($ffamily, $fweight, $fslant); my $j = shift; my $i = shift; $ffamily = $fonthash{$fontfamily[$j][$i]}; $fweight = "normal"; $fslant = "roman"; if (($fontfamily[$j][$i] =~ /bold/i) || ($fontfamily[$j][$i] =~ /dark/i)) { $fweight = "bold"; } if (($fontfamily[$j][$i] =~ /italic/i) || ($fontfamily[$j][$i] =~ /oblique/i)) { $fslant = "italic"; } if ($i < 4) { $entry[$j][$i] -> fontConfigure($font[$j][$i], -size => $fontsize[$j][$i], -weight => $fweight, -slant => $fslant, -family => $ffamily); $entry[$j][$i] -> configure(-font => $font[$j][$i]); } else { $textfield_entry[$j][$i-4] -> fontConfigure($font[$j][$i], -size => $fontsize[$j][$i], -weight => $fweight, -slant => $fslant, -family => $ffamily); $textfield_entry[$j][$i-4] -> configure(-font => $font[$j][$i]); } } ####################### sub propogate_colors { my $color; $color = "#"; for (my $l = 0; $l < $number_of_labels; $l++) { for (my $w = 0; $w <= $number_of_background; $w++) { $ps_color[$l][$w] = " " . $color_rgb[$l][$w][0] / 255 ." " .$color_rgb[$l][$w][1] / 255 ." ".$color_rgb[$l][$w][2] / 255 ; $color = "#"; for (my $i=0; $i < 3; $i++) { $color .= sprintf("%02x",$color_rgb[$l][$w][$i]); } $tk_color[$l][$w] = $color; } } } ####################### sub default_colors { #set everything to Black for (my $l = 0; $l < $number_of_labels; $l++) { for ($which_field = 0; $which_field <= $number_of_background; $which_field++) { $ps_color[$l][$which_field] = " 0 0 0 "; for (my $j=0; $j<3; $j++) { $color_rgb[$l][$which_field][$j] = 0; } $tk_color[$l][$which_field] = "#000000"; } } # Now the background in white $which_field = $number_of_background; for (my $l = 0; $l < $number_of_labels; $l++) { $ps_color[$l][$which_field] = " 1 1 1 "; for (my $j=0; $j<3; $j++) { $color_rgb[$l][$which_field][$j] = 255; } $tk_color[$l][$number_of_background] = "#ffffff"; } $which_field = 0; $rgb[0] = $rgb[1] = $rgb[2] =0; } ####################### sub defaults { # Name of the resulting PS-file $psfile = "/tmp/cd-circleprint.ps"; # Number of labels on a sheet (very incomplete use of this variable) $number_of_labels = 2; # All labels active $label_active[0] = 1; $label_active[1] = 1; # A variable to define the backround which is treated as an additional circle or textfield $number_of_background = 9; # which previewer check_viewer("gv"); $pidsav = 0; # which converter $converter = "convert"; # debug level $debug = 0; # defaults for the circles in mm $radius_outer = 60; $radius_inner = 21; $starting_angle = 0; # defaults for the radii of the text circles $circle_radius[0][0] = $circle_radius[1][0] = $radius_outer - 10; $circle_radius[0][1] = $circle_radius[1][1] = $radius_outer - 19; $circle_radius[0][2] = $circle_radius[1][2] = $radius_outer - 19; $circle_radius[0][3] = $circle_radius[1][3] = $radius_outer - 10; # yes, we want the the circle boundaries $print_circle_boundaries = 1; # Yes we want tickmarks as defaults $tickmarks = 1; # defaults for the distance pageborder circles # distance between the circles $delta = 20; # distance from the bottom of the page $begin_from_bottom = 10; # distance from the left side of the page for (my $l = 0; $l < $number_of_labels; $l++ ) { $begin_from_left[$l] = 40; } $x_origin = $begin_from_left[0] + $radius_outer; $y_origin = $begin_from_bottom + $radius_outer; $x_scale = 1; $y_scale = 1; $scale_x = 1; $scale_y = 1; $shift_y = 0; $shift_x = 0; $label_id = 0; $graphics_directory = "/usr/share/cd-circleprint/"; for ( my $i=0; $i < $number_of_labels; $i++) { $shift_eps_x[$i] = 0; $shift_eps_y[$i] = 0; $scale_eps_x[$i] = 1; $scale_eps_y[$i] = 1; $eps_file_label[$i] = 0; $eps_filename[$i] = ""; } } ####################### sub check_viewer { my $fn = $_[0]; if (-x $fn) { $viewer = $fn; return; } for my $dir (split /:/, $ENV{PATH}) { my $file = "$dir/$fn"; if ( -x $file) { $viewer = $file; last; } } return; } ######################## sub default_attributes { # fontsizes @fontsize = ( [qw (32 18 18 32 16 16 16 16) ], [qw (32 18 18 32 16 16 16 16)]); my $ctr = 0; foreach my $ffc (sort keys %fonthash) { $fontnames[$ctr] = $ffc; $ctr++; } for (my $j=0; $j < $number_of_labels; $j++ ) { for (my $i=0; $i < 8; $i++ ) { $fontfamily[$j][$i] = $fontnames[0]; } } } ######################## sub default_text { # The entries for the circle text $text[0][0] = "CD-Circleprint"; $text[0][1] = ""; $text[0][2] = ""; $text[0][3] = ""; $text[1][0] = "www.debian.org"; $text[1][1] = "GNU/Linux GNU/Hurd"; $text[1][2] = ""; $text[1][3] = "The FREE distribution"; # The entries for the straight text $text[0][4] = "$VERSION"; $text[0][5] = " "; $text[0][6] = " "; $text[0][7] = " "; $text[1][4] = " "; $text[1][5] = " "; $text[1][6] = " "; $text[1][7] = " "; } ##################### sub modify_color { # # capture the new colour in all 3 formats that we need # my $color = "#"; for (my $i=0; $i < 3; $i++) { $color_rgb[$label_id][$which_field][$i] = $rgb[$i]; $color .= sprintf("%02x",$rgb[$i]); } $tk_color[$label_id][$which_field] = $color; $ps_color[$label_id][$which_field] = " " . $rgb[0] / 255 ." " .$rgb[1] / 255 ." ".$rgb[2] / 255 ; # make the color selector window follow the chosen color $fff -> configure(-background => $tk_color[$label_id][$which_field]); update_display(); } ######################## sub update_display { my ($i, $j); # first do all the text fields for ($j = 0; $j < $number_of_labels; $j++) { for ($i = 0; $i < 4; $i++) { $entry[$j][$i] -> configure(-foreground => $tk_color[$j][$i]); $textfield_entry[$j][$i] -> configure(-foreground => $tk_color[$j][$i+4]); if ($label_active[$j]) { $entry[$j][$i] -> configure(-state => 'normal'); $textfield_entry[$j][$i] -> configure(-state => 'normal'); } else { $entry[$j][$i] -> configure(-state => 'disabled'); $textfield_entry[$j][$i] -> configure(-state => 'disabled'); } } } # # Then the backgrounds # for ($j = 0; $j < $number_of_labels; $j++) { for ( $i=0; $i < 4; $i++) { $entry[$j][$i] -> configure(-background => $tk_color[$j][$number_of_background]); $textfield_entry[$j][$i] -> configure(-background => $tk_color[$j][$number_of_background]); } } } ######################## sub set_selectors { if ( $which_field < $number_of_background) { # set the fontsize $scale = $fontsize[$label_id][$which_field]; # display the right entry in the fontlistbox foreach (0 .. $#fontnames ) { if ( $fontnames[$_] eq $fontfamily[$label_id][$which_field]) { $fontlistbox -> selectionClear(0, "end"); $fontlistbox -> selectionSet($_); $fontlistbox -> see($_); } } } # set the colours $rgb[0] = $color_rgb[$label_id][$which_field][0]; $rgb[1] = $color_rgb[$label_id][$which_field][1]; $rgb[2] = $color_rgb[$label_id][$which_field][2]; # and the colour selector background $fff -> configure(-background => $tk_color[$label_id][$which_field]); } ######################## sub display_graphics_file_attributes { my $i; for ( $i = 0; $i < $number_of_labels ;$i++) { if ( $eps_file_label[$i]) { $shift_x = $shift_eps_x[$i]; $shift_y = $shift_eps_y[$i]; $scale_x = $scale_eps_x[$i]; $scale_y = $scale_eps_y[$i]; } } } ######################## sub help_window { # Very very ugly , but the pod Module can only handle STDOUT or Filehandle my $parser = Pod::Text->new; my $tmp_file_name = "/tmp/cd-circle_print.man.1"; $parser->parse_from_file ($0, $tmp_file_name); my $help_dialog = $mw->DialogBox(-title => 'Help', -buttons => ['OK'], -default_button => 'OK'); my $text = $help_dialog -> Scrolled("Text", -scrollbars => 'oe') -> pack; open (TMP_FILE,"<$tmp_file_name") or (return()); while ( ) { $text -> insert('end',$_); } close (TMP_FILE); # We should delete the tmp-file # fix needed to get around locking waitVariable() call, which is never unblocked when the dialog is destroyed. $help_dialog->OnDestroy(sub { $help_dialog->{'selected_button'} = $help_dialog->{'selected_button'} }); $help_dialog->Show(); } ######################## sub about_window { my $about_box = $mw->DialogBox(-title => 'About', -buttons => ['OK'], -default_button => 'OK'); my $text = $about_box -> Text() -> pack; $text -> insert('end', "cd-circleprint version: $VERSION\n\n"); $text -> insert('end', "a simple perl script by Colin Tuckley \n"); $text -> insert('end', "originally written by Matthias Kabel \n"); $text -> insert('end', "The following people have sent patches which improved the program:\n\n" ); $text -> insert('end', "* Dave Regan \n\n"); $text -> insert('end', "cd-circleprint is published under the GNU public license\n"); $text -> insert('end', "You should have this license in your distribution\n"); $text -> insert('end', "If you don't, write to the Free Software Foundation, Inc., \n"); $text -> insert('end', "51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n\n"); $text -> tagConfigure('red', -foreground => "#ff0000"); $text -> insert('end',"May the source be with you", 'red'); # fix needed to get around locking waitVariable() call, which is never unblocked when the dialog is destroyed. $about_box->OnDestroy(sub { $about_box->{'selected_button'} = $about_box->{'selected_button'} }); $about_box->Show(); } ######################## sub read_label { if (-f $label_fn) { if (-r $label_fn) { open (LABEL_FILE, "< $label_fn"); while () { next unless /(^\w+.*)\s+(.*$)/; # skip comments and empty lines $_ =~ /(\S*?)\s+(.*)/; #(\#.*$)/; #!!!!!!!!!!!!! evaluate_data ($1, $2, \@LabelVariables); } close (LABEL_FILE); } } set_graphics_attributes(); propogate_colors(); } ######################## sub read_configuration { # we start reading the different configuration files foreach my $i (@configurationfile) { if (-f $i) { if (-r $i) { open (CONF_FILE, "< $i"); while () { next unless /(^\w+.*)\s+(.*$)/; # skip comments and empty lines $_ =~ /(\S*?)\s+(.*)/; #(\#.*$)/; #!!!!!!!!!!!!! evaluate_data ($1, $2, \@SaveVariables); } close (CONF_FILE); } else { print "Error: unable to open configuration file $i for reading\n"; } } } set_graphics_attributes(); } ######################## sub evaluate_data { # much improved by Dave Regan my $var = $_[0]; my $value = $_[1]; my $ref = $_[2]; my %symtab = map { $_, $_} @$ref; if (defined($symtab{$var})) { my($eval) = qq|\$$var = "$value"|; eval $eval; } } ######################## sub read_form_data { my $FSref; my $home = $ENV{'HOME'}; $FSref = $mw -> FileSelect(-directory => $home, -title => 'Read Form Data', -filter => '[^.]*', -acceptlabel => 'Ok'); my $fdfile = $FSref -> Show; if ((defined $fdfile) && ($fdfile ne "")) { open (FD_FILE, "<$fdfile") || die ("Could not open $fdfile\n"); while () { next unless /(^\w+.*)\s+(.*$)/; $_ =~ /(\S*?)\s+(.*)/; #(\#.*$)/; evaluate_data ($1, $2, \@FormVariables); } close (FD_FILE); } } ######################## sub preview { my $pid; # first we want a new label print_label(); # next kill any previous viewer if ($pidsav != 0 ) { `kill -USR1 $pidsav`; $pidsav = 0; } # check viewer is executable if ( -x $viewer) { # then fork to the viewer if ($pid = fork) { $pidsav = $pid; # we are the parent so save child pid return; } elsif (defined $pid) { exec $viewer, $psfile; } } # if we get here then an error occured my $warn => $mw->messageBox( -title => 'Error', -message => 'Error attempting to start previewer', -type => 'OK'); return; } ######################## sub print_circles { my $epsname; my $name; my $dir; my $ext; my $path; my $label_no; print PS_FILE "%%Page: 1 1\n\n"; # beginning of page print PS_FILE "gsave\n"; for ($label_no = 0; $label_no < $number_of_labels; $label_no++) { print PS_FILE "$x_origin mm $y_origin mm translate \n"; # shift the origin of drawing # Set the clipping path print PS_FILE "gsave\n"; print PS_FILE "0 0 $radius_outer mm 0 360 arc clip\n"; if ($label_active[$label_no]) { # First we need the circles in the background color print PS_FILE "$ps_color[$label_no][$number_of_background] setrgbcolor\n"; print PS_FILE "0 0 $radius_outer mm 0 360 arc\n"; print PS_FILE "fill\n"; print PS_FILE "newpath\n"; # Then we print the graphics if (($eps_file_label[$label_no]) && ($eps_filename[$label_no] ne "")) { # check wether it is an eps-file $epsname =`file $eps_filename[$label_no]`; if ($epsname =~ /EPS/) { print_graphics($eps_filename[$label_no],$label_no); } else { $epsname = $eps_filename[$label_no]; ($name,$dir,$ext) = fileparse($epsname); $epsname = "/tmp/".$name.".eps"; system "$converter $eps_filename[$label_no] $epsname"; print_graphics($epsname, $label_no); } } # After that we need the small inner circle in white print PS_FILE "1 1 1 setrgbcolor\n"; print PS_FILE "0 0 $radius_inner mm 0 360 arc\n"; print PS_FILE "fill\n"; print PS_FILE "newpath\n"; # Ok, now we go with the text # Outer upper circle or textfield print PS_FILE "/$fontfamily[$label_no][0] reencodeISO def\n"; print PS_FILE "/$fontfamily[$label_no][0] findfont\n"; # The font we want print PS_FILE "$fontsize[$label_no][0] scalefont setfont\n"; # scaling the font print PS_FILE "$ps_color[$label_no][0] setrgbcolor \n"; print PS_FILE "($text[$label_no][0])", " ", $fontsize[$label_no][0], " ", -$starting_angle +90, " ", $circle_radius[$label_no][0], " mm OutsideCircletext\n"; # Inner upper circle or textfield print PS_FILE "/$fontfamily[$label_no][1] reencodeISO def\n"; print PS_FILE "/$fontfamily[$label_no][1] findfont\n"; print PS_FILE "$fontsize[$label_no][1] scalefont setfont\n"; print PS_FILE "$ps_color[$label_no][1] setrgbcolor \n"; print PS_FILE "($text[$label_no][1])", " ", $fontsize[$label_no][1], " ", -$starting_angle +90, " ", $circle_radius[$label_no][1], " mm OutsideCircletext\n"; # Inner lower circle or textfield print PS_FILE "/$fontfamily[$label_no][2] reencodeISO def\n"; print PS_FILE "/$fontfamily[$label_no][2] findfont\n"; print PS_FILE " $fontsize[$label_no][2] scalefont setfont\n"; print PS_FILE "$ps_color[$label_no][2] setrgbcolor \n"; print PS_FILE "($text[$label_no][2])", " ", $fontsize[$label_no][2], " ", -$starting_angle -90, " ", $circle_radius[$label_no][2], " mm InsideCircletext\n"; # Outer lower circle or textfield print PS_FILE "/$fontfamily[$label_no][3] reencodeISO def\n"; print PS_FILE "/$fontfamily[$label_no][3] findfont\n"; print PS_FILE " $fontsize[$label_no][3] scalefont setfont\n"; print PS_FILE "$ps_color[$label_no][3] setrgbcolor \n"; print PS_FILE "($text[$label_no][3])", " ", $fontsize[$label_no][3], " ", -$starting_angle -90, " ", $circle_radius[$label_no][3], " mm InsideCircletext\n"; if ($print_circle_boundaries) { print PS_FILE "0 0 0 setrgbcolor\n"; print PS_FILE "0 0 $radius_inner mm 0 360 arc\n"; print PS_FILE "stroke\n"; print PS_FILE "newpath\n"; print PS_FILE "0 0 $radius_outer mm 0 360 arc\n"; print PS_FILE "stroke\n"; print PS_FILE "newpath\n"; } } print PS_FILE "grestore\n"; $x_origin = -$begin_from_left[$label_no]; $x_origin += $begin_from_left[$label_no +1] if($begin_from_left[$label_no +1]); $y_origin = $delta + 2*$radius_outer; } print PS_FILE "grestore\n"; } ######################## sub print_graphics { my $file = shift; my $label_no = shift; get_bounding_box($file); # Very inefficient, I have to change it $shift_eps_x[$label_no] += $Bounding_X / 2.8346; $shift_eps_y[$label_no] += $Bounding_Y / 2.8346; $shift_eps_x[$label_no] *= $scale_eps_x[$label_no]; $shift_eps_y[$label_no] *= $scale_eps_y[$label_no]; print PS_FILE "gsave\n"; print PS_FILE "$shift_eps_x[$label_no] mm $shift_eps_y[$label_no] mm translate\n"; print PS_FILE "$scale_eps_x[$label_no] $scale_eps_y[$label_no] scale\n"; open (EPS_FILE,"<$file"); while ( ) { # We should scan the graphics file for "Showpage" unless ($_ =~ /showpage/) {print PS_FILE $_ ;} } close (EPS_FILE); print PS_FILE "\n\n grestore\n\n"; $shift_eps_x[$label_no] /= $scale_eps_x[$label_no]; $shift_eps_y[$label_no] /= $scale_eps_y[$label_no]; $shift_eps_x[$label_no] -= $Bounding_X / 2.8346; $shift_eps_y[$label_no] -= $Bounding_Y / 2.8346; } ######################## sub print_label{ open (PS_FILE, ">$psfile") || die ("Could not open $psfile\n"); $x_origin = $begin_from_left[0] + $radius_outer; $y_origin = $begin_from_bottom + $radius_outer; print_page_header(); print_prolog(); print_page_deformation(); print_circles(); print_textfields(); if($tickmarks) {print_ticks();} # now print the closing lines print PS_FILE "showpage\n"; print PS_FILE "%%Trailer\n"; print PS_FILE "%%Pages: 1\n"; print PS_FILE "%%EOF\n"; close (PS_FILE); } ######################## sub print_page_deformation { print PS_FILE "%We want a deformatiopn of the page\n\n"; print PS_FILE "$x_scale $y_scale scale\n"; print PS_FILE "%End of deformation\n\n"; } ##################### sub print_page_header { print PS_FILE <<'END_OF_HEADER' %!PS - Adobe -1.0 %%Creator: cd - label.pl %%Title: cdlabel %%CreationDate: Mo, 1.2.2001 %%DocumentMedia: A4 595 842 0 () () %%Orientation: Portrait %%Pages: (atend) %%DocumentFonts: Times - Roman Helvetica %%EndComments END_OF_HEADER } ######################## sub print_prolog { print PS_FILE << 'END_OF_PROLOG' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Reencode the font to support international characters. %% This is taken from cdlabelgen where it is taken %% from GNUPlot 3.7 /term/next.trm %% Free Software is a great thing, you can look around and use the good things %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /reencodeISO { dup dup findfont dup length dict begin { 1 index /FID ne { def }{ pop pop } ifelse } forall /Encoding ISOLatin1Encoding def currentdict end definefont } def /ISOLatin1Encoding [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon /less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N /O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright /asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m /n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve /dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut /ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar /section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot /hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior /acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine /guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute /Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis /aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex /otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis /yacute/thorn/ydieresis ] def %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Now calculate mm and points /mm { 72 mul 25.4 div} def %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % A function to print the textfields properly % As you can see, this code is taken from somewhere %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Zeilenumbruch /Wordbreak ( ) def % Trennzeichen zwischen Worten (Leerzeichen) % BreaklntoLines umbricht einen Text-String in Zeilen vorgegebener Laenge. Die % Prozedur benoetigt 3 Parameter: Den Text-String, die Satzbreite und die Pro- % zedur, die aufgerufen wird, wenn das Ende der Zeile erreicht ist. Diese Pro- % zedur erhaelt die aktuelle Zeile als Argument auf dem Stack. /BreakIntoLines { /Proc exch def /Linewidth exch def % Satzbreite /Textstring exch def /Breakwidth Wordbreak % Breite des Leerezeichens im aktuellen Font stringwidth pop def /Curwidth 0 def % Die Breite der laufenden Zeile /LastWordbreak 0 def % Index zum letzten Leerzeichen /Startchar 0 def % Index zum ersten Zeichen der laufenden Zeile /RestOfText Textstring def % Unverarbeiteter Rest des Textes { RestOfText Wordbreak search % search sucht nach dem ersten Leerzeichen und { /Nextword exch def pop % liefert, falls erfolgreich, das Wort vor dem /RestOfText exch def % Leerzeichen und den restlichen Text /Wordwidth Nextword % Breite des Wortes stringwidth pop def Curwidth Wordwidth add Linewidth gt % Passt das Wort noch in die Zeile? { Textstring Startchar % Nein. Laufende Zeile als Parameter an Proc LastWordbreak % uebergeben (Zeile ausgeben) und Variablen Startchar sub % fuer naechste Zeile initialisieren. getinterval Proc /Startchar LastWordbreak def /Curwidth Wordwidth Breakwidth add def } { /Curwidth Curwidth % Ja: Wort in laufende Zeile aufnehmen. Wordwidth add Breakwidth add def } ifelse /LastWordbreak LastWordbreak Nextword % Index zum letzten Leerzeichen um ein Wort length add 1 add def % weiterschieben } { pop exit } ifelse % Kein blank mehr gefunden: Schleifenende. } loop /Lastchar % Nicht vergessen: letzte Zeile ausgeben Textstring length def Textstring Startchar Lastchar Startchar sub getinterval Proc } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Center a string /center {dup stringwidth pop 2 div neg 0 rmoveto} bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Now the real thing for the circles % % I got this from Adobes % Blue Book % Program 10, on page 167 % Adobe Systems Incorporated % CreationDate: Thu Dec 28 13:14:59 PST 1989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /OutsideCircletext { CirctextDict begin % This routine needs four arguments /Radius exch def % radius of the circle /Centerangle exch def % angle of the starting point /PtSize exch def % fontsize in points /Str exch def % and the text /XRadius Radius % To get better results we use a little bigger radius PtSize 4 div add def % for the distance between the letters % gsave % save actual Graphics State Centerangle Str FindHalfangle add rotate Str { /Charcode exch def ( ) dup 0 Charcode put Outsideplacechar } forall grestore % restore Graphics State end } def /InsideCircletext { CirctextDict begin % 'Insidecircletext' needs the same four arguments /Radius exch def % as 'Outsidecircletext' /Centerangle exch def /PtSize exch def /Str exch def /XRadius % To get better results we use a little smaller radius Radius PtSize 3 div sub % for the distances between the lines def gsave Centerangle Str FindHalfangle sub rotate Str { /Charcode exch def ( ) dup 0 Charcode put Insideplacechar } forall grestore end } def /CirctextDict 16 dict def CirctextDict begin /FindHalfangle % 'FindHalfangle' calculates the length of a string { stringwidth pop 2 div % on the circle 2 XRadius mul Pi mul div % The calculation divides the length of the text 360 mul % by the circumference of the circle. Half of the result } def % will be put on the stack /Outsideplacechar % put one character on outside of the arc { /Char exch def % and rotate the width of the character /Halfangle Char FindHalfangle def gsave Halfangle neg rotate % rotate the coordinate system a half width of the character Radius 0 translate % -90 rotate % senkrecht zur Kreislinie stellen. Char stringwidth pop % Zeichen zentriert bzgl. des Ursprungs posit. 2 div neg 0 moveto Char show % Char true charpath stroke % This would show outline fonts grestore % restore the old system Halfangle 2 mul neg rotate % rotate forward for one characterwidth } def /Insideplacechar % 'Insideplacechar' works like { /Char exch def % 'Outsideplacechar', but the characters are placed /Halfangle % inside of the circle and counterclockwise Char FindHalfangle def gsave Halfangle rotate Radius 0 translate 90 rotate Char stringwidth pop 2 div neg 0 moveto Char show grestore Halfangle 2 mul rotate } def /Pi 3.1415923 def end %%EndProlog END_OF_PROLOG } ######################## sub print_textfields { my $i; my $x_position; my $y_position; my $label_no; my @textwidth = qw(70 40 70 40); for ( $i=0; $i < 4; $i++) { for ($label_no=0; $label_no < $number_of_labels; $label_no++ ) { if ($label_active[$label_no]) { $x_position = $begin_from_left[$label_no] + $radius_outer + sin($i * $pi/2) *(($radius_outer -$radius_inner)/2); if ($debug) {print "print_textfields::X-pos=", $x_position, "\n";} $x_position += 5 if ($i == 1); $x_position = $begin_from_left[$label_no] +5 if ($i == 3); # shift the x-position right if ($debug) {print "print_textfields::label:x $label_no: $x_position\n";} $y_position = $begin_from_bottom + $radius_outer + cos($i * $pi/2)*($radius_outer + $radius_inner)/2 + ($delta+2*$radius_outer)* sin($label_no * $pi/2); print PS_FILE "/$fontfamily[$label_no][$i+4] reencodeISO def\n"; print PS_FILE "/$fontfamily[$label_no][$i+4] findfont\n"; # The font we want print PS_FILE "$fontsize[$label_no][$i+4] scalefont setfont\n"; # scaling the font print PS_FILE "$ps_color[$label_no][$i+4] setrgbcolor\n"; # setting the color my $t = $text[$label_no][$i+4]; # Get the text to print if (defined $t) { print PS_FILE "/YLine $y_position mm def\n"; # We need this for the linebreak print PS_FILE "(", $t,")\n"; print PS_FILE "$textwidth[$i] mm \n"; print PS_FILE "{\n$x_position mm YLine moveto\n"; # Ok, here we are, we have to correct the current point by half of # the fontsize print PS_FILE "\n0 -", $fontsize[$label_no][$i+4]/2 , " rmoveto\n"; # Only the textfields above and below the hole in the middle should be centered if ($i == 0 || $i ==2) { print PS_FILE "center "; } print PS_FILE "show\n"; print PS_FILE "/YLine YLine ", $fontsize[$label_no][$i+4], " sub def \n }\n BreakIntoLines\n\n"; print PS_FILE "%The next textfield\n"; } } } } } ######################## sub print_ticks { my ($i, $tick); my $label_no; my ($left, $right, $minleft, $maxleft); my $x_origin = 0; my $y_origin = 0; $minleft = (($begin_from_left[0] <=> $begin_from_left[1]) == 1) ? $begin_from_left[1] : $begin_from_left[0]; $maxleft = (($begin_from_left[0] <=> $begin_from_left[1]) == 1) ? $begin_from_left[0] : $begin_from_left[1]; print PS_FILE $minleft / 2 ," mm ", 2*$radius_outer + $delta / 2 + $begin_from_bottom , " mm moveto\n"; print PS_FILE "gsave\n"; print PS_FILE "/Helvetica findfont 12 scalefont setfont\n"; print PS_FILE "90 rotate\n"; print PS_FILE "(The tickmarks are in mm) center show\n"; print PS_FILE "grestore\n"; print PS_FILE "gsave\n"; print PS_FILE "newpath\n"; print PS_FILE "/Helvetica findfont 12 scalefont setfont\n"; print PS_FILE $minleft / 2 + 8," mm ", 2*$radius_outer + $delta / 2 + $begin_from_bottom , " mm moveto\n"; print PS_FILE "90 rotate\n"; print PS_FILE "(All comments to colintu\@users.sourceforge.net please) center show\n"; print PS_FILE "grestore\n"; print PS_FILE "gsave\n"; print PS_FILE "/Helvetica findfont 14 scalefont setfont\n"; #Fontsize for the label print PS_FILE "$x_origin mm $y_origin mm translate\n"; # origin of drawing to the middle print PS_FILE "newpath\n"; # Now we want some tickmarks to calibrate our print $left = $begin_from_left[0] + $radius_outer; print PS_FILE $left , " mm 0 mm moveto\n"; print PS_FILE "0 mm ",$begin_from_bottom ," mm rlineto\n"; #line to the first circle print PS_FILE "stroke newpath % line to the first circle\n"; # now the tickmarks in the vertical direction beginning from bottom for ($i=0; $i < $begin_from_bottom; $i+= 2) { $tick = 3; if ($i % 10 == 0) { $tick = 10; print PS_FILE $left - 2*$tick , " mm ", $i ," mm moveto ", "(", $i, ") show\n"; } print PS_FILE $left - $tick, " mm ", $i ," mm moveto ", $left + $tick ," mm " , $i ," mm lineto\n stroke newpath\n"; } # next ticks between the labels $left = $minleft + $radius_outer; $right = $maxleft + $radius_outer; print PS_FILE "0 mm ", 2*$radius_outer + $begin_from_bottom , " mm translate\n"; for ($i=0; $i < $delta; $i+= 2) { $tick = 3; if ($i % 10 == 0) { $tick = 10; print PS_FILE $left - 2*$tick, " mm ", $i ," mm moveto ", "(", $i, ") show\n"; } print PS_FILE $left - $tick, " mm ", $i ," mm moveto ", $right + $tick ," mm " , $i ," mm lineto\n stroke newpath\n"; } # next ticks at the top of the page $left = $begin_from_left[1] + $radius_outer; print PS_FILE "0 ", 2*$radius_outer + $delta , " mm translate\n"; ### correct this with pagelength #################### for ($i=0; $i < 3*$delta; $i+= 2) { $tick = 3; if ($i % 10 == 0) { $tick = 10; print PS_FILE $left - 2*$tick, " mm ", $i ," mm moveto ", "(", $i, ") show\n"; } print PS_FILE $left - $tick, " mm ", $i ," mm moveto ", $left + $tick ," mm " , $i ," mm lineto\n stroke newpath\n"; } print PS_FILE "grestore\n"; # horizontal ticks # first, we have to start from the left margin print PS_FILE "0 ", $radius_outer + $begin_from_bottom ," mm moveto\n"; print PS_FILE "/Helvetica findfont 12 scalefont setfont\n"; #Fontsize for the tickmarks my $top = ($radius_outer + $begin_from_bottom); for (my $lab_no = 0; $lab_no < $number_of_labels ; $lab_no++ ) { for ($i=0; $i < $begin_from_left[$lab_no]; $i+= 2) { $tick = 3; if ($i % 10 == 0) { # every 10 mm we want a bigger tick $tick = 10; print PS_FILE $i , " mm " , $top + $tick, " mm moveto \n"; print PS_FILE "90 rotate ($i) show\n"; print PS_FILE "-90 rotate\n"; } print PS_FILE $i, " mm ", $top - $tick," mm moveto ", $i ," mm " ,$top + $tick ," mm lineto\n stroke newpath\n"; } print PS_FILE "0 mm " , 2*$radius_outer + $delta , " mm translate\n"; } } ######################## sub evaluate_shortcuts() { my @shortcuts = shift; # print "ARGS: @\_\n"; } ######################## sub get_bounding_box() { my $eps_file = shift; if ( open (EPS_FILE ,"<$eps_file") ) { while ( ) { if ( $_ =~ /(%%BoundingBox: )(\d*)( )(\d*)( )(\d*)( )(\d*)/) { $Bounding_X = ($2 - $6) / 2; $Bounding_Y = ($4 - $8) / 2; last; #!# exit the while loop here } } close ($eps_file); } else { warning_window("There seems to be no bounding box in $eps_file\nHope for the best\n"); } } ######################## sub get_eps_file { my $FSref; my $fn; my $epsfile; my $i; for ( $i=0; $i < $number_of_labels; $i++) { $epsfile = $eps_filename[$i] if $eps_file_label[$i]; } # set the filename if defined as default !!!!!!!!!!! $FSref = $mw -> FileSelect(-directory => $graphics_directory, -title => 'EPS File', # -defaultextension => "eps", -acceptlabel => 'Ok', -filter => '[^.]*', -initialfile => $epsfile); $fn = $FSref -> Show; if ((defined $fn) && ($fn ne "")) { $graphics_file = $fn; # Remember the path # First get it from the string $graphics_file =~ /(.*\/)(.*)/; # and store it $graphics_directory = $1; for ( $i=0; $i < $number_of_labels; $i++) { if ($eps_file_label[$i]) { $eps_filename[$i] = $graphics_file; $eps_file_entry[$i] -> configure(-textvariable => \$graphics_file); } } } } ######################## sub get_fontattributes { my $flb; my $fw; #Frame my ($flco, $i); if (! Exists($fmw)) { $fmw = $mw->Toplevel(); $fmw -> title("FONTS, size and colours"); $fmw->Button(-text => "OK", -command => sub{$fmw->withdraw})->pack(-side => 'bottom'); # A frame for everything except the ok button $fff = $fmw -> Frame() -> pack(-side => 'top'); # Now we want a frame for the radiobuttons $fw = $fff -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'left', -fill => 'both', -anchor => 'e', -expand => '1'); # This frame is divided into three frames my $fwb = $fw -> Frame() -> pack(-side => 'bottom', -fill => 'both'); my $fwc = $fw -> Frame() -> pack(-side => 'left', -fill => 'both'); my $fwt = $fw -> Frame() -> pack(-side => 'left', -fill => 'both'); $fwc -> Radiobutton(-text => "Outer Top circle", -value => 0, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w'); $fwc -> Radiobutton(-text => "Inner Top circle", -value => 1, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w',); $fwc -> Radiobutton(-text => "Inner Bottom circle", -value => 2, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w'); $fwc -> Radiobutton(-text => "Outer Bottom circle", -value => 3, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w'); $fwt -> Radiobutton(-text => "Top textfield", -value => 4, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w'); $fwt -> Radiobutton(-text => "Right textfield", -value => 5, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w',); $fwt -> Radiobutton(-text => "Bottom textfield", -value => 6, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w'); $fwt -> Radiobutton(-text => "Left textfield", -value => 7, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w'); $fw -> Radiobutton(-text => "Top Label", -value => 1, -variable => \$label_id, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w', -side => 'top'); $fw -> Radiobutton(-text => "Bottom Label", -value => 0, -variable => \$label_id, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -anchor => 'w', -side => 'top'); $fwb -> Radiobutton(-text => "Background", -value => $number_of_background, -variable => \$which_field, -command => sub{set_selectors()} ) ->pack(-expand => 'x', -padx => 100, -pady => 10, -anchor => 'w'); ############################################################ # Another frame for the fontlist and size ############################################################ $flb = $fff -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'left', -fill => 'x', -anchor => 'e', -expand => '1'); $fontlistbox = $flb -> Scrolled("Listbox", -scrollbars => "e", -selectmode => "single", -width => 0) -> pack(); foreach $i ( @fontnames) { $fontlistbox -> insert('end', $i); } $fontlistbox -> bind('', sub{$fontfamily[$label_id][$which_field] = $fontnames[$fontlistbox->curselection->[0]]; modify_fonts() } ); $flb -> Scale(-from => 8, -to => 44, -orient => 'horizontal', -variable => \$scale, -command => sub{$fontsize[$label_id][$which_field] = $scale; modify_fonts() } ) -> pack(-side => 'right', -expand => 'x') ; ##################################### # Next we want a frame for colors ##################################### my $fco = $fff -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'left', -fill => 'x', -anchor => 'e', -expand => '1'); $fco -> bind("",\&modify_color()); $fco -> Scale(-label => "red", -length => 140, -variable => \$rgb[0], -resolution => 1, -command => sub{modify_color()}, -from => 255, -to => 0) -> pack(-side => 'left'); $fco -> Scale(-label => "green", -length => 140, -variable => \$rgb[1], -resolution => 1, -command => sub{modify_color()}, -from => 255, -to => 0) -> pack(-side => 'left'); $fco -> Scale(-label => "blue", -length => 140, -variable => \$rgb[2], -resolution => 1, -command => sub{modify_color()}, -from => 255, -to => 0) -> pack(-side => 'left'); } else { $fmw->deiconify(); $fmw->raise; } set_selectors(); } ######################## sub get_graphics { my $fwb; #Frame for labelbuttons my $fwf; #Frame for the files my $fwg; #Frame for graphics-place buttons my $fw; #Frame for the radiobuttons my ($fwscale, $fwshift); my ($ox, $oy); my $i; if (! Exists($fgw)) { $fgw = $mw->Toplevel(); $fgw -> title("Graphics files"); $fgw->Button(-text => "OK", -command => sub{$fgw->withdraw})->pack(-side => 'bottom'); # One frame for the labels $fwb = $fgw -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'top', -fill => 'both', -anchor => 'n', -expand => '1'); # One more frame for the Files $fwf = $fgw -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'top', -fill => 'both'); # One more for shifting $fwshift = $fgw -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'top', -fill => 'both'); # One more for scaling $fwscale = $fgw -> Frame(-relief => 'raised', -bd => 2) -> pack(-side => 'top', -fill => 'both'); $fwb -> Checkbutton(-text => "Upper label", -variable => \$eps_file_label[1], -command => sub{set_graphics_attributes()}) -> pack(-side => 'right', -expand => 'x', -anchor => 'w'); $fwb -> Checkbutton(-text => "Lower label", -variable => \$eps_file_label[0], -command => sub{set_graphics_attributes()}) -> pack(-side => 'right', -expand => 'x', -anchor => 'w',); for ($i=0; $i < $number_of_labels; $i++) { $eps_file_entry[$i] = $fwf -> Entry( -textvariable => \$eps_filename[$i], -background => "#ffffff") -> pack(-side => 'bottom'); } $fwf -> Button(-text => "browse", -command => sub{get_eps_file()}) -> pack(); $ox = $fwshift -> Scale(-label => "Offset X", -from => -$radius_outer/$scale_x, -to => $radius_outer/$scale_x, -resolution => "0.1", -orient => "horizontal", -command => sub{set_graphics_attributes()}, -variable => \$shift_x) -> pack(-side => "left"); $oy = $fwshift -> Scale(-label => "Offset Y", -from => $radius_outer/$scale_y, -to => -$radius_outer/$scale_y, -resolution => "0.1", -orient => "vertical", -command => sub{set_graphics_attributes()}, -variable => \$shift_y) -> pack(-side => "right"); $fwscale -> Scale(-label => "Scale X", -from => 0.05, -to => 1, -resolution => "0.01", -orient => "horizontal", -command => sub{$ox->configure(-from => -$radius_outer/$scale_x, -to => $radius_outer/$scale_x); set_graphics_attributes()}, -variable => \$scale_x) -> pack(-side => "left"); $fwscale -> Scale(-label => "Scale Y", -from => 1, -to => 0.05, -resolution => "0.01", -orient => "vertical", -command => sub{$oy->configure(-from => $radius_outer/$scale_y, -to => -$radius_outer/$scale_y); set_graphics_attributes()}, -variable => \$scale_y) -> pack(-side => "right"); } else { $fgw->deiconify(); $fgw->raise; } } ######################## sub get_converter { my $fc; my $FSref; $FSref = $mw -> FileSelect(-directory => "/usr/bin", -title => 'Converter', -acceptlabel => 'Ok'); $fc = $FSref -> Show; $converter = $fc if ((defined $fc) && ($fc ne "")); } ######################## sub get_previewer { my $pv; my $FSref; $FSref = $mw -> FileSelect(-directory => "/usr/bin", -title => 'Previewer', -acceptlabel => 'Ok'); $pv = $FSref -> Show; if ((defined $pv) && ($pv ne "")) { check_viewer($pv); } } ######################## sub get_starting_angle { if (! Exists($caw)) { $caw = $mw -> Toplevel(); $caw -> title("Angle to middle of text"); $caw -> Button(-text => "OK", -command => sub {$caw -> withdraw}) -> pack(-side => 'bottom'); $caw -> Scale(-label => "Angle to middle of text", -from => -90, -to => 90, -resolution => "0.5", -orient => "horizontal", -length => 250, -variable => \$starting_angle) -> pack(-side => "top"); } else { $caw -> deiconify(); $caw -> raise(); } } ######################## sub save_label { if (defined $label_fn) { write_label(); } else { save_as(); } } ######################## sub save_as { my $SAref; my $safile; my $home = $ENV{'HOME'}; $SAref = $mw -> FileSelect(-directory => $home, -title => 'Save As', -filter => '[^.]*', -acceptlabel => 'Ok'); $safile = $SAref -> Show; if ((defined $safile) && ($safile ne "")) { $label_fn = $safile; write_label(); } } ######################## sub save_ps_file { my $FSref; my $filen; my $home = $ENV{'HOME'}; $FSref = $mw -> FileSelect(-directory => $home, -title => 'Save PS File', -filter => '[^.]*', -acceptlabel => 'Ok'); $filen = $FSref -> Show; if ((defined $filen) && ($filen ne "")) { $psfile = $filen; print_label; } } ######################## sub set_circle_radius { my (@lf, @lsc, $tf, $bf, $i, $j); if (! Exists($crw)) { $crw = $mw -> Toplevel(); $crw -> title("Radii"); $crw -> Button(-text => "OK", -command => sub {$crw -> withdraw}) -> pack(-side => 'bottom'); $tf = $crw -> Frame(-label => "Radius of the inner circle [mm]", -borderwidth => "5") -> pack(-side => 'top'); $tf -> Scale(-orient => 'horizontal', -variable => \$radius_inner, -from => 0, -to => 50, -resolution => "0.5", -command => sub { for ($j=0; $j<2 ; $j++) { for ($i=0; $i<4 ; $i++) { $lsc[$j][$i]->configure(-from => $radius_inner)}}}) -> pack(-side => 'left'); $bf = $crw -> Frame(-label => "Radius of the text-circles [mm]") -> pack(-side => 'bottom'); # Now the radii for the text circles my @side = qw (bottom right); for ($j=0; $j<2 ; $j++) { $lf[$j] = $bf -> Frame(-label => "Label $j", -borderwidth => "5", -relief => 'groove') -> pack(-side => 'left'); for ($i=0; $i<4 ; $i++) { $lsc[$j][$i] = $lf[$j] -> Scale(-orient => 'horizontal', -variable => \$circle_radius[$j][$i], -from => $radius_inner, -to => $radius_outer, -resolution => "0.5",) -> pack(-side => 'top'); } } } else { $crw -> deiconify(); $crw -> raise(); } } ######################## sub modify_fonts { if ( $which_field < $number_of_background) { configure_font($label_id, $which_field); } update_display(); } ########################A sub set_graphics_attributes { my $i; for ( $i = 0; $i < $number_of_labels; $i++) { if ( $eps_file_label[$i] ) { $scale_eps_x[$i] = $scale_x; $scale_eps_y[$i] = $scale_y; $shift_eps_x[$i] = $shift_x; $shift_eps_y[$i] = $shift_y; $graphics_file = $eps_filename[$i]; $eps_file_entry[$i] -> configure(-textvariable => \$eps_filename[$i]) if defined $eps_file_entry[$i]; } } display_graphics_file_attributes(); } ######################## sub set_page_scaling { if (! Exists($spw)) { my $spw = $mw -> Toplevel(); $spw -> title("Scale the whole page"); $spw -> Button(-text => "OK", -command => sub {$spw -> withdraw}) -> pack(-side => 'bottom'); $spw -> Label(-text => "Some printers don\'t print exact circles,\n so you can scale the page") -> pack; $spw -> Scale(-label => "horizontal scale", -orient => 'horizontal', -resolution => 0.01, -variable => \$x_scale, -from => .9, -to => 1.1,) -> pack(-side => 'left'); $spw -> Scale(-label => "vertical scale", -variable => \$y_scale, -resolution => 0.01, -from => 1.1, -to => .9 ) -> pack; } else { $spw -> deiconify(); $spw -> raise(); } } ######################## sub select_labels { for (my $j = 0; $j < $number_of_labels; $j++) { if ($label_active[$j]) { $ct_clear[$j] -> configure(-state => 'normal'); $tf_clear[$j] -> configure(-state => 'normal'); } else { $ct_clear[$j] -> configure(-state => 'disabled'); $tf_clear[$j] -> configure(-state => 'disabled'); } } update_display(); } ######################## sub set_positions { if (! Exists($spw)) { my $spw = $mw -> Toplevel(); $spw -> title("Change label positions to fit the sheet"); $spw -> Button(-text => "OK", -command => sub {$spw -> withdraw}) -> pack(-side => 'bottom'); $spw -> Label(-text => "Use the tickmark scales to determine the positions", -relief => 'raised', -border =>"3") -> pack(-fill =>'both'); my $fwt = $spw -> Frame(-relief => 'raised', -border => "3") -> pack(-side => 'top', -fill => 'both'); for (my $label_no = 0; $label_no < $number_of_labels; $label_no++ ) { $fwt -> Entry(-textvariable => \$begin_from_left[$label_no], -text => "Labeltext", -width => '5') -> pack(-side => 'bottom'); $fwt -> Scale(-label => "move label $label_no horizontaly", -orient => 'horizontal', -length => 250, -resolution => 0.1, -tickinterval => 75, -variable => \$begin_from_left[$label_no], -from => 0, -to => 250,) -> pack(-side => 'bottom'); } # We want a frame for the scales my $fw = $spw -> Frame(-relief => 'raised', -border => "3", -label => "vertical scales") -> pack(-side => 'bottom', -fill => 'both'); $fw->Entry(-textvariable => \$begin_from_bottom, -text => "Bottom", -width => '5') -> pack(-side => 'left'); $fw -> Scale(-label => "start from bottom", -variable => \$begin_from_bottom, -resolution => 0.1, -from => 200, -to => -50 ) -> pack(-side => 'left'); $fw -> Scale(-label => "distance between the labels", -variable => \$delta, -resolution => 0.1, -from => 100, -to => 0 ) -> pack(-side => 'right'); $fw->Entry(-textvariable => \$delta, -width => '5', -text => "Delta") -> pack(-side => 'right'); } else { $spw -> deiconify(); $spw -> raise(); } } ######################## sub warning_window { my $message = shift; my $warning_box = $mw->DialogBox(-title => 'Warning', -buttons => ['OK'], -default_button => 'OK'); my $text = $warning_box -> Label(-text => $message, -background => '#ff0000') -> pack; # fix needed to get around locking waitVariable() call, which is never unblocked when the dialog is destroyed. $warning_box->OnDestroy(sub { $warning_box->{'selected_button'} = $warning_box->{'selected_button'} }); $warning_box->Show(); } ######################## sub write_label { my $date = localtime; if (defined $label_fn) { open (LABEL_FILE , "> $label_fn") or print ("Error attempting to write label to $label_fn"); print LABEL_FILE "#Label data for cd-circleprint\n"; print LABEL_FILE "#written $date \n\n"; # Write all of the variables we know about my($sym, $val); foreach $sym (@LabelVariables) { my($eval) = "\$val = \$$sym"; eval $eval; print LABEL_FILE "$sym $val\n" if (defined($val)); } close (LABEL_FILE); } } ######################## sub write_configuration { my $date = localtime; my $cf; if ($configurationfile[2]) {$cf = $configurationfile[2]} else {$cf = $configurationfile[1]} open (CONF_FILE , "> $cf") or print ("Error attempting to write configuration to $cf"); print CONF_FILE "#Configuration for cd-circleprint\n"; print CONF_FILE "#written $date \n\n"; # Write all of the variables we know about from the SaveVariables routine my($sym, $val); foreach $sym (@SaveVariables) { my($eval) = "\$val = \$$sym"; eval $eval; print CONF_FILE "$sym $val\n" if (defined($val)); } close (CONF_FILE); } ######################## sub write_form_data { my $FSref; my $home = $ENV{'HOME'}; $FSref = $mw -> FileSelect(-directory => $home, -title => 'Form Data', -filter => '[^.]*', -acceptlabel => 'Ok'); my $fdfile = $FSref -> Show; if ((defined $fdfile) && ($fdfile ne "")) { open (FD_FILE, ">$fdfile") || die ("Could not open $fdfile\n"); my $date = localtime; print FD_FILE "#Form Data file for cd-circleprint\n"; print FD_FILE "#written $date \n\n"; my($sym, $val); foreach $sym (@FormVariables) { my($eval) = "\$val = \$$sym"; eval $eval; print FD_FILE "$sym $val\n" if (defined($val)); } close (FD_FILE); } } ######################## sub dummysub { my $dw; my $text; $dw = MaindWindow -> new; $text = $dw -> Scrolled("Text", -scrollbars => 'oe') -> pack; $text -> insert('end',"Sorry this function is not implemented yet."); $dw -> Button(-text => "close", -command => sub {$dw -> destroy() if Tk::Exists($dw)}) -> pack; } ######################################## # # Documentation # ####################################### =pod MANUAL PAGE =head1 NAME cd-circleprint - create a round label for a CD =head1 SYNOPSIS =over =item B [option[=value..]] FILE =head1 DESCRIPTION cd-circleprint prints two round labels for CDs. It uses up to four lines of text for each label, this is printed in arcs so the text can be much longer than if it were in straight lines. There are four additional straight text fields for each label. The output is in PostScript, this should work on most systems. You can select the font, size, and colour of the text for each field separately, and you can choose the background colour for each label. An image file in EPS format may also be used as a background. If you wish more complicated backgrounds or colour effects you can save a label and modify it in any graphic program which can read PostScript. =back =head1 OPTIONS =over =item B<--config> Alternative configuration file. =item B<--debug> Enable debuggging mode, various information is printed to standard output. =item B<--version> Print version number and exit sucessfully. =head1 LAYOUT All layout is done in PostScript, this should work on most systems. The result of the layout are two cd-labels on one sheet of paper. On each label there are two convex and two concave lines of text. If you have a very long line of text, you can use only one line and make it longer. There are no limits to the length of text. However, after 360 degrees the ends of the text will overlap. There are also four text fields on each label with normal horizontal lines of text. These text fields are specified in clockwise order: above, right, below, and left of the central hole. The colours are done in the RGB-model of PostScript, you can choose them for each line and the background of the label independently. You can move the circles around the sheet to fit them on most types of label-sheets. You can also squeeze or stretch the whole thing to correct small errors of your printer. =head1 USAGE After starting the program you see sixteen text-entry fields divided into two blocks. The upper block is for the arcs, the lower block is for the straight text fields. Each label has four text fields and four arcs. The first two lines are for the upper arcs on the label and the last two for the lower arcs. Write your text in the fields (support for cddb is on the TODO list) The Save Image menu item creates a postscript file of the label. A file selection dialogue is displayed so the user can specify the path and filename. Font attributes and colours can be changed interactively using a dialog available from the menu. =item B Control-l: write the label to /tmp Control-p: preview the label Control-q: quit Control-s: save the configuration =item B =over =item I Start a new label, all label fields are cleared and parameters are reset to default values. =item I A file selection dialog is displayed so that the user can select a label data file which is then used to set the label values. =item I The current label data values are saved using the current filename. =item I A file selection dialog is displayed and the current label data values are saved to the file specified by the user. =item I Load Form (Paper Layout) data from a specified file. =item I Save Form Data to a specified file. =item I Save an image of the labels as a specified Postscript File. =item I Launch the predefined preview appplication to preview the labels. =item I Exit the program, all unsaved data will be lost. =back =item B =over =item I Change font family, font size, font-colour and the background colour interactively, all changes should take effect immediately in the text entry fields. Note, perl-tk uses the nearest match for the font. The labels may look different on your printer. =item I Sets the angle by which the centre of the text arcs are offset. =item I Specify the size of the label inner circle and the radii of the text circles. =item I Some printers do not work correctly with circles and produce an ellipse, you can squeeze or stretch the whole page to get perfect circles with your printer. =item I You can move the circles around the page using this menu. =item I Select which labels will be generated. The input fields for unselected labels are disabled. =item I There are many cd-label sheets on the market, so you can move the circles around the page. To make this easier, you can print some tickmarks on the page to measure the distances. If you have the correct values, you don't need these tickmarks any more and can save some ink. =item I This allows the user to turn off the printing of the circles which show the boundaries of the labels. =item I You can put an image on the label. This image currently has to be in eps-format. I thought about automatic scaling, but the program would have to know the real size of the visible part of the graphic instead of just the bounding box. The scaling and shifting should be self-explanatory. The program gets the bounding box of the eps image and puts the image in the middle of the label. =back =item B =over =item I Select the application to use for previewing the labels. =item I Select the application to use for converting graphics to eps format. =item I Load program options from configuration files, this is useful to reset the configuration to a known state. =item I Save the current program configuration to either the user specified configuration file or to the default file if the user did not specify one. =back =item B =over =item I Display this man page. =item I Display program version, description and copyright information. =head1 CONFIGURATION You can save your configuration in a file in your $HOME or ask your sysadmin to create a global configuration-file. =head1 FILES There is a global configuration file /etc/cd-circleprint.conf and a local configuration file $HOME/.cd-circleprint.conf You can specify a configuration file on the command line in which case the default configuration file settings can be overridden. For the format of the configuration files take a look at them. Comments start with a # and blank lines are ignored. The program sets its internal default values, looks for the global configuration file, then for the local configuration file and finally for a user specified file. Label data is read from a similar format file either specified on the command line or selected from a file dialog. =head1 BUGS There are probably many bugs, please fix them and send me a patch. Thanks =head1 AUTHORS cd-circleprint is written and maintained by Colin Tuckley cd-circleprint was originally written by Matthias Kabel You can find the latest version at http://cd-circle-print.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Thanks to sourceforge.net for hosting free software =cut # END of File