summaryrefslogtreecommitdiff
path: root/net/dccp
diff options
context:
space:
mode:
authorDmitry Mishin <dim@openvz.org>2006-03-20 22:45:21 -0800
committerDavid S. Miller <davem@davemloft.net>2006-03-20 22:45:21 -0800
commit3fdadf7d27e3fbcf72930941884387d1f4936f04 (patch)
tree167072cf1e60b6b307610563614b435ff0caa52d /net/dccp
parentc750360938b403e6cc193d293cfbcb099dd6c60e (diff)
downloadlinux-3fdadf7d27e3fbcf72930941884387d1f4936f04.tar.gz
linux-3fdadf7d27e3fbcf72930941884387d1f4936f04.tar.bz2
linux-3fdadf7d27e3fbcf72930941884387d1f4936f04.zip
[NET]: {get|set}sockopt compatibility layer
This patch extends {get|set}sockopt compatibility layer in order to move protocol specific parts to their place and avoid huge universal net/compat.c file in the future. Signed-off-by: Dmitry Mishin <dim@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp')
-rw-r--r--net/dccp/dccp.h8
-rw-r--r--net/dccp/ipv4.c12
-rw-r--r--net/dccp/ipv6.c16
-rw-r--r--net/dccp/proto.c67
4 files changed, 91 insertions, 12 deletions
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index 34e70fb89d4a..47de17208d7a 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -192,6 +192,14 @@ extern int dccp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen);
extern int dccp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, int optlen);
+#ifdef CONFIG_COMPAT
+extern int compat_dccp_getsockopt(struct sock *sk,
+ int level, int optname,
+ char __user *optval, int __user *optlen);
+extern int compat_dccp_setsockopt(struct sock *sk,
+ int level, int optname,
+ char __user *optval, int optlen);
+#endif
extern int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg);
extern int dccp_sendmsg(struct kiocb *iocb, struct sock *sk,
struct msghdr *msg, size_t size);
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index 80d450ba6219..8a33c8498d9c 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -994,6 +994,10 @@ static struct inet_connection_sock_af_ops dccp_ipv4_af_ops = {
.net_header_len = sizeof(struct iphdr),
.setsockopt = ip_setsockopt,
.getsockopt = ip_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_ip_setsockopt,
+ .compat_getsockopt = compat_ip_getsockopt,
+#endif
.addr2sockaddr = inet_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in),
};
@@ -1040,6 +1044,10 @@ static struct proto dccp_v4_prot = {
.init = dccp_v4_init_sock,
.setsockopt = dccp_setsockopt,
.getsockopt = dccp_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_dccp_setsockopt,
+ .compat_getsockopt = compat_dccp_getsockopt,
+#endif
.sendmsg = dccp_sendmsg,
.recvmsg = dccp_recvmsg,
.backlog_rcv = dccp_v4_do_rcv,
@@ -1079,6 +1087,10 @@ static const struct proto_ops inet_dccp_ops = {
.shutdown = inet_shutdown,
.setsockopt = sock_common_setsockopt,
.getsockopt = sock_common_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_sock_common_setsockopt,
+ .compat_getsockopt = compat_sock_common_getsockopt,
+#endif
.sendmsg = inet_sendmsg,
.recvmsg = sock_common_recvmsg,
.mmap = sock_no_mmap,
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index 7c8233f6d3c2..89106c7d3247 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -1114,6 +1114,10 @@ static struct inet_connection_sock_af_ops dccp_ipv6_af_ops = {
.net_header_len = sizeof(struct ipv6hdr),
.setsockopt = ipv6_setsockopt,
.getsockopt = ipv6_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_ipv6_setsockopt,
+ .compat_getsockopt = compat_ipv6_getsockopt,
+#endif
.addr2sockaddr = inet6_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in6)
};
@@ -1130,6 +1134,10 @@ static struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
.net_header_len = sizeof(struct iphdr),
.setsockopt = ipv6_setsockopt,
.getsockopt = ipv6_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_ipv6_setsockopt,
+ .compat_getsockopt = compat_ipv6_getsockopt,
+#endif
.addr2sockaddr = inet6_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in6)
};
@@ -1167,6 +1175,10 @@ static struct proto dccp_v6_prot = {
.init = dccp_v6_init_sock,
.setsockopt = dccp_setsockopt,
.getsockopt = dccp_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_dccp_setsockopt,
+ .compat_getsockopt = compat_dccp_getsockopt,
+#endif
.sendmsg = dccp_sendmsg,
.recvmsg = dccp_recvmsg,
.backlog_rcv = dccp_v6_do_rcv,
@@ -1204,6 +1216,10 @@ static struct proto_ops inet6_dccp_ops = {
.shutdown = inet_shutdown,
.setsockopt = sock_common_setsockopt,
.getsockopt = sock_common_getsockopt,
+#ifdef CONFIG_COMPAT
+ .compat_setsockopt = compat_sock_common_setsockopt,
+ .compat_getsockopt = compat_sock_common_getsockopt,
+#endif
.sendmsg = inet_sendmsg,
.recvmsg = sock_common_recvmsg,
.mmap = sock_no_mmap,
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index baccaf35ffbd..59b214995f28 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -455,18 +455,13 @@ out_free_val:
goto out;
}
-int dccp_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
+static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
{
struct dccp_sock *dp;
int err;
int val;
- if (level != SOL_DCCP)
- return inet_csk(sk)->icsk_af_ops->setsockopt(sk, level,
- optname, optval,
- optlen);
-
if (optlen < sizeof(int))
return -EINVAL;
@@ -512,8 +507,34 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
return err;
}
+int dccp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
+{
+ if (level != SOL_DCCP)
+ return inet_csk(sk)->icsk_af_ops->setsockopt(sk, level,
+ optname, optval,
+ optlen);
+ return do_dccp_setsockopt(sk, level, optname, optval, optlen);
+}
EXPORT_SYMBOL_GPL(dccp_setsockopt);
+#ifdef CONFIG_COMPAT
+int compat_dccp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
+{
+ if (level != SOL_DCCP) {
+ if (inet_csk(sk)->icsk_af_ops->compat_setsockopt)
+ return inet_csk(sk)->icsk_af_ops->compat_setsockopt(sk,
+ level, optname, optval, optlen);
+ else
+ return inet_csk(sk)->icsk_af_ops->setsockopt(sk,
+ level, optname, optval, optlen);
+ }
+ return do_dccp_setsockopt(sk, level, optname, optval, optlen);
+}
+EXPORT_SYMBOL_GPL(compat_dccp_setsockopt);
+#endif
+
static int dccp_getsockopt_service(struct sock *sk, int len,
__be32 __user *optval,
int __user *optlen)
@@ -545,16 +566,12 @@ out:
return err;
}
-int dccp_getsockopt(struct sock *sk, int level, int optname,
+static int do_dccp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
struct dccp_sock *dp;
int val, len;
- if (level != SOL_DCCP)
- return inet_csk(sk)->icsk_af_ops->getsockopt(sk, level,
- optname, optval,
- optlen);
if (get_user(len, optlen))
return -EFAULT;
@@ -587,8 +604,34 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
return 0;
}
+int dccp_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ if (level != SOL_DCCP)
+ return inet_csk(sk)->icsk_af_ops->getsockopt(sk, level,
+ optname, optval,
+ optlen);
+ return do_dccp_getsockopt(sk, level, optname, optval, optlen);
+}
EXPORT_SYMBOL_GPL(dccp_getsockopt);
+#ifdef CONFIG_COMPAT
+int compat_dccp_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ if (level != SOL_DCCP) {
+ if (inet_csk(sk)->icsk_af_ops->compat_setsockopt)
+ return inet_csk(sk)->icsk_af_ops->compat_getsockopt(sk,
+ level, optname, optval, optlen);
+ else
+ return inet_csk(sk)->icsk_af_ops->getsockopt(sk,
+ level, optname, optval, optlen);
+ }
+ return do_dccp_getsockopt(sk, level, optname, optval, optlen);
+}
+EXPORT_SYMBOL_GPL(compat_dccp_getsockopt);
+#endif
+
int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
size_t len)
{
0c)vAiN/8iS+ }7]"4Uzp#3ɚ12y;SLA?E?mR_^w+b52s|+)|:GĹ=fb~0@nz}P_ /hRDD8 Iol |@aw@x9mڣSDAى[$;@#EMhwO/#@@ 1~8IR l2jւu澼 ˢ; YON +J f01yƷE|{w嘥И";K^r(#\S=T-͐1(o@b Hty.B^C`i4V)6Us7su"wЇ&b>P#+XAMi"=̂xp+s`5bg0߽ye"_n]Wy{r n}ئ5z1]Pzghq'£ EAtzr\ f)(52Qp6e8>ozJ#O~7׽'*寚EFl`p?/dEW/cl#b<=}^LJi]k:DaGHǙ>9$UDߟ@}ܷӨ!*aW>ٚߚCA 9G|D܁. cmyMO[sFϐ/D@Nw^-*BR! Rs빢9b]a@XoeV:j$p'pytß1,E7; |A0ԣU`ɝ" 9+(ygR0&AR[h b]͝EwaތUuu'3 aFRb:ALLkኇ EF9\2DPP_eaXtdf:*!& N1$[?Îzp#yrtmppeR2E7cݘUDI÷^)$8o̔PIc?L%X#E Z=RB3JUdt F zTGee |^UN]~uK"G_S!Djc*߅vXgWlĀtˢ멓TDwʻsZ I-z ?{zKz %w1u%!h7% 0(qk׋0 @2;,*lWU I*<kPO=eф$k! A63:Up~ӷcRE1^بu")GqFhCͅD%3/sW95MvEDƽ=WZ1[ڞ! v>kNդzƻ*ږ=Hh^·{u0Oxr횩p}@~'"{nޭY9Mo<U:w,ǡEv˄h!VPz|(V,LM@⭢H>) HbɯRhcی]XŬ063/t$Tqp.w/>P#,0mJ A@v06s1HuC9g.+0c x 0ӎ  1 b + $XG`]V@'Y<;WS]4#9C"5LJN3+YU;+{"r[τa3KD*O]  vdž@Qw& CWFQ^!T nx Dꃇ\33Ì؝gS G7\ X4<T AFG}OuY[ne@̈́7r4~NNlH KItu!%0<-K!~VrM5=.(kC5Q]@B!yEvJ@}ͬuB 6={ ,;p93)`$" ÄC8zoĝ͇@!ih"Z>.s,},/r*%Wf]J6T22$ VMf 8Zw"E>t 4Lu#*k }qB4rDY8"mK /Efb.֞[iK\/?`x^hw 1s?ܣ5q;F[D\;KYK2uE{D6꣑@J J/upmn֕խ@'B#c狭,~2AyaFf^ۛ&=I9Ü_ 23 ri?,!szXxDf3FD ZLF3P9ꣃ$k|,A"(Ѓ[]_ 8详bFFBD6|UӇD e33`Bŧh{H"zacbʆPlQkѹ ?2;|@X{ %+<07l&xַ}8^}S8PP@+2g.U\hvoximzKkL;S)!Y~[Z Y =754Z Q>UY6WFUƭg6vNW3J KF׆yzYڋ?r³9]W$ o $2pK G~{i((8וLaz[ ]qCdC˽Q/IQt zK:Z$L> o/γPSfx( :*y&L > "ep"< yMm8[[bLv^.Ƿ>-u`lK5Uy#&EjCTXHH餇0ŻK*k /p5@} M$5OcҮ%Mv%Fq*FjJ1T·c$ȴˌc9B0uJ"k,BQ9[`D!֕L .p*%i}Q$]l6/TM0iT?Bg hŠ =&yog;DNTNzo#ӝN{+|-*SWn&/2;>|<x9飧=ft." d՗eAxPUx66{aȅ1K;I@V,}iLLڻRڸelFWZ1 ^Xכp{ep;AFٴYr32ٗ=J˭BYlHKO#pxnכw&-kjF2X\ n,qob+"2DxsH1:)[˩+afC = #K̚y5#QmUƫ4eIfypNl 0##t͜a-.>$5Fص$k|AONT*57_sOrۥ(Dc$Ӹi,wVUæelQ8k^Zww'^LZЫJCfvF3 V!W\9zy젖 2-5 jV&9~ppN wgn8GM+ôOrCFQC UwP*23(͙糷Wɯ0M}%s|رtPP\#q+(TNi~ү;f>Ownx<km  76p/;ˇ\7JL3[Y2QxPmU1f,z)lic_GQc6xu>PMMV?0Yr/G6pH p9NN$^\vAmF'p&;jtQ{56UKF2} 2~ato$1g5#,(EPk>RY͇L5FE*ȨY 1xt?uH :<¨B4Tܫ/chlVR_ǠꋻUkY+[YE@;SDx*BP;KՇv}Ht%X0Y%wG ܐ&hOl%1~VV/pbD%e !5HmlHrWt1*X GOJ9'OۚgfR4?c>EsW7zíQvO})/1UK,m &$)w` YJ@`^8MjpgrT9/+[R$8׻MH*)ޢmwe&mǕ7+\AQ)Qz<" b +͏pr{GxZ8.j$şၛ3* xx@1CEtO>Y4Q訴ȭDv[g{U"ň4LӸvZ!S(7g!g܌5юΌ@,EuvIV*"DYZ4,+/W=V9?AQ{i8HH ^Ur.$"|GYK%?^< 8=~?"Hv|H&=r]L>\udqq핕NqfH齞XLm="( \Nk&#O@)?qK m 9ܖm@CO1؆ڼuB5ShP$px Qa3ejϼ1HWB"ه *Չ!3[uq;3ρ\Mi0.2ԓ`]Fl}Eb6gg{.3#=ux]1=G/R<[ݤX+}Z:nkcDNMm-ᖏJԅ xfl A:0v#j2!G}W `Eq GIc{G4o6wJ^˞BJo'|uYFRノ)d"8a}Ѹ9|NoV/tWnMo潷wo{|7;[V lH([>Hh]t }p(T9w cc_>ۺhr(6&C7#1~WDBkJma4 R0| '8p5F~=շ>m͚ i_#p':zz|r5mqH}UaqKFl&ϟľ]?&xgD&.XP("<{iLӻoMČx)j% G=2/V7ZrBI}SR\PPyʚs8V^6zƷ# s yr L p{d鹿1p=ޯm/hJo\rوۀibUZ #/Ɲ;>X\]$Ln¤V W_:W:ujU3}C8[D0\cǤ]|k.(ϋؐlg>q9=sS o,r`"fD)9]8<@"NH!vX f$Z./T`*I PS!dD'i@m{ 8@V ʼQmR6ۼ͸DQO%+M$A}so }ZaރPcC_XI@/!(g\.Ii"Lᔞڔ tY"wX?`|u(&]*Nl(m7QN|C' |]]YEA[Hxy=΄VIi7"8v=!cu T2REk!(niEQ`RT ^v% ) 0G03D[t7 bf1|Ip0r X gwv=AD%Ix+W}wMc|<ܷ٨: eiVKuZN."v cJ_N`Ϫ4FXPFqR|}oqc{`{r_LPi8wC o86&GnC|'}!B/::oV;&n\# <+u.[6  O rz5ixlg]UjZ S>Z_ 0*EUOgT|:0p@ X+)G edfNXvM:)8ZIlT<:qKFrAB]~X mc^t"a1tJrt1Y5(_&_ɿoful5Ԁ*N A/gܖTE$1B0 fr Jcz9νfA"W!E~?*Mp tü 0nu¢TjI g ^>J O|LM!QV=Z|[wf2t9aYadnbI]͵z U}ҞZR}m8;ljm!ki/H[ 84#rqNN_rr>vP̎Xۊ5,g9w >Jfst@zڜ,vݤ `Wg@]Úxa~>2֣5]sS,o~(>tݾ f8>o *<#i\ Lf]'Kh/T!sᴈϊ[LXRQw==O?H@,@sFwN9Kk- }]ݷ]9 $D@T,9ÊoO@{B+ǒKb0L'xh9׶_#cc) =Jlbrzsk:qK Ho"n<ػe*V !"J;JkE8̲ :I~>N$IW赜 h&C>X0p^n;x9CRB/z`\%D&BN M{*H8͐|J+g?Y'IjV?{2Rd@YɽPyfe9>b'84:nQeKJp#P3kF"^eNĺ6&]~\ QE4dhPp\G̮G &xT&0wZ2kK*.w^|@Q6DبD48Uz3v|s= :X@JhPX Bttw db-fÊf\3USVXMpW盥XyFE"l) r e6HE=7 wrlK YSҹs `;%ɇ5ᶷkfVb5.y{f}O=5zW;F݄qc"{b=0( E??KkgFp),ܱK-@ݘAnk->b3UiRl׵z%"8U*E9g`~gBZd+ ʌGcaHtD}$}/x[j*0ZX$ r336 UQusE;z9{2J:vS~xk1f*#g{&45bǍxG8A mD!X"%$1Sdh3~?g>&\jȿ.̋3?q,0”I:4?WwFX!<q lmO Ybt5~JRa՛NP&r8N_M(C%׹xzD |òF,.X8A mx#'΁dѡeWL@4x#'LRiN?-?LS@^>x?%;zwht8u 0GLk6&L7b\oGs>Lvag22ĤzS}.kXi0y<_܋{ӣ ,VN>7* $M@@@>0)a V`47}yT/y**bXŃpna+T9 W ʔDR+ ¢\P(s)΍B;~.D\.4͏+)y36A`g. pxC@V+É[ka1a+!+i6uػ 9}rD5R"pJ;ϹI.E 1**<@QGc0cm=|mi8iG mѦZ!ˉ2h5&48`9,W?ur] P>&;M7 ubmj2,T= 'd5Ceu^95jxs) p =쿾#.CT1ծ$Z̍Gd错=A]-#8[$Hc=j yǣd&P -m FQ~#1=+V1Wۧq]47oO+zdo븍WEvrO _J36'8 <_~8YT.Dž%߮ܐd͔H;ha q"G,;8a_ iYC c'ĻkA NPeswWѭkAtO~w%?ܙ̡]p!0P<;Νr1h+oC44 z?ZpJ# xV3F6a- JH#$%Ǽj>@{~4I!9a CVRۗz&uт9Y-Dx柇%tZ?ǃBF3SW7¾E6>4>8OߙϥW܌8"^w_L/ro `KYʹw}Pi h4TH`u=A񥎷#l(TO6 _ 9! 1~ц QQidEd)@_ VHY>HD}g>?`X (_+_gdYД|Kv8B< b̓r|u^O'du!ID>n;Vk`0Wť"*|$@nmѤ-r>'.X!DAQ5S0:V܃7߶Whoڜdv;iz)萤uCdTF80بH}ϲ *FuBu }5@ۍ[vGx v?/郔{;8X%A8'&{njT`mPĒhdXčGr-ߞXdZBG[Lɯ#Їs i0>qw0Wbs>f2T d1 *VyZ:>8/e7lE,RwiSd*̏ M:хiNq?3͒Rx,|b|+ @%$od@盈L=dK ^{-;zzS2LEzdG$Ȗ},o :\ @]8eזr ,YN+ dCQimjdyQ5aB;W4H930i $D=p YlzC㚠8Xv0ꈹ$8o 6[T{oH4_u/7f!W{Ȇt5[>:{oT ЍwNGůuѪ~ BNfu2zfīrHD}7e:,%0U;{X\%@c1 FU#d'-Ad(#AڈcF.P.VZEi{8zf/U@mjJw.N^25sgw*9R3{l/ؕyUЌYIrml"8(yP]T{jlb<%X=:)q3Ͻ!(`$.uDMeK*&%L4acZ2rq8#/该Q@3@੯jD ɷ0ff] liK*̧.򨔭{C֯d 29$sҜ԰gDL/E w۪5{&#My ? "bSP"9PW!߯`YJ]fUR<۽遑,8eXĄ,$ RH01oX\Lѧ|۟H4M4s:D!y˭ n!{MQ]~H|~ĸ۹(ΖmFB,]jqVm~5I ,|T-N:)Nf 6 Pܲ/ iA(q3U"oEэ_6Ok|;21þzY _ KZEBzGny_8t-h頂0Co{#eWϱ$Y@c'N1_(ccwQkDʥ]%pۍAMO<9/0%{29zZP8ot  ҧ z@!"Łn N|U/GK&MBbJ> 9)o( >5qxvyR~ڻ۰_"X OάЄV BBjTb_\S22$&0: ]fǵT СS ]lnfZUGh"Kd&iT]^.oc?VbINnxОï?LzOD'ٺr.L :Mc|7XP*c?iqbV:'aޒhރ[C x[)t[q PZ^)ǻn Lv6˰pdTRxz||^uĖU@PSTDlڱxjlhY֜1FAaIY}q*QCxnfZh_3غܡ}>"}`qxF90tQlu%;verzqA-z kf] \gN)QSw⺨sR[Eާ𡓼./"p~C 4>Dv5/xM}"HK/Լ-ä7u`f&8e#\{iWAߚ"@uA AfX ے⦫}u3`*1; o$f#; n hX%s_{`s.߾_F. ,Epg*ACFtt@P"'쭌 R;/p%e#wW?]|4)tt'[7qd@%ϠTF5p K'#'H8z*@%v E^G`ubڎ$#Acys:#vJb8<F@!n"-Qt(Q>@=ѳ>CQm25bG8׽"ȥCk l/vSXw̐Al]D;㵯)>~q݋&&tuexFќ뾫Hڥldi{7Ky:B*#[Y9Z{31FVb2:"␼ \b1chM@8frf_`W5X|X:dU$ڬ uCKeb5TTnbqU<ᇋơ1 Iս\;0 +QԷD=4lY6'G`2̩c*ɘr5‹$E[UZNO7<vr}c8h1f7;afPOJgl b4Qkϱ1giVdA=udfQxjDYF xLjx*}N3<7r}B~G$yy  {ENrd;2Nl|LHtEKtl? @AHLhxC|韮}omR.jx4$X6ylXnk4ɛ6ncAoLzu$:[٘fhTہ>9|$"{*٢(dPÁHngj@*dǢA$H[ |X "&̏W j毦1ějvo vsZl1/SQ zWSˈLz@LpAdPR/ %io2]1HwX'vcAijH$UL Tlhh( k,Իlw!kTXMӯp7B6[U*mt_cfFJooSwW[3ߜ㮦Pl(|)굁tDKCpPVO肚\~OoNLlc𖱠C\eO&hɻV$0qi?O؀P#A0fp Ƅ7Ćg"732+-=Xm/|<X]qTU.u=@}I ޮ+MyKIh^_:zAu"+ê 0rTT}.dA;\ w7e+QPhW }|/vNgKGXccH^@ 64(H3G`ڶYkh  V@)IRpg (:}zL E76Ajpl9.yT}t6 ?[{bM#wM)Q&d It%a 5 Z3O3r ̯ѕ~U˖¡-^v_L'KMe{(SOL돒[L-:O+ |m.9Q@#ttYH 80xØs8p@  ڗá$A >/R}{xPB z >^Si*;130=@/RUHB"fߪVÊ_>:z Fl&w㿉:wr׼$YTKqNql OMWI&tCj㺆Ͻp>.RK "-my[GH|i=Ak=!}*(*գ4-}'lDGj-ӂ s,, Ī& \q9rJ%/=@!^N{˚p)O=H7ԉni Z&-L4ء21 RL?޼me n0Fr6# 1L9,5"U$]$|mRG?7w]-c D?t!9 ǑTjPS?if#iӋ~˖12 rc'܆apEr:>*;ߋ4r[)mjR'~ B%d!s~P&B0v=m-d3l^ B *$́(qjByrݼvw c6#[CQv(?LV7"86.JX2˾#rLq+K^0"KSƕcp~<尀G؎CX( Ztχ+\t/C_Gr`^r̘fwO9_?VOp>8Q73/Q6st߼FD<БrA;*#29ud#ng\=)$aԃOm> ;̰-(Q& ^ep fj(i™wrN3SX_~Qp_?A2+@$#  Lu0ꯃE ܩ}Y٢b!(%쐁Q.ӳwhK&:0r#LCQ]ج#b7шhXEml31&ũf`Ppu $oGIA;Ө[_T 5i4g;m2pPj;8ۿE РJD S^-hhilKx^H<űWDtgT-hP9EF/_Yq9OC!Sٰ1g 4 uȸp+5Oxf d?L{:~yX煐x2<`Cǥ}g2ў8MhT @?=ِ&$o5u&~}©7AAm}|7k"@?gi@BBw7|7߿;4xVZ#z nboW=vْv> /0mBk~3'9XG$[H"BpXR>iI!2P߹0t;Ay`@x^r\?@0ЪCzƾ73_~|?Wz`gR8v^$#)ȗ"ygƧX[g/DҨ DcAg#8njr`8Q!3##Fu;nʩB2_1u*@R_l%NJ7vel!CW+Űv*mIX} %J0{J 9T]w*6F #oߏ|G{FAfɣleeGTc ǒȠ]Csk1\K]`T5nH|Cqb۝@Ynk0§p8$Z|$i-1E)x,<1ab3!ڄ8sCxr !cp&,Ο3+'<3|!Q0hG=Cr9&5GP'#H\)Ml;*XA>CwйeT8'N+e;>x8r|KuoPiUozsI`'! z-vG:.U^˰1-}0Lػķ}`xDyP.`F1a2p?#$>61or,@`ݠ(I7R[ÅSga·O,H%u4`.r))E;? ts&j` 6s i L^{@hܸtmC]ߤ+{v29qT7d[y$Veߤ:}X4L:..( "qO9!h908XK[9莉ƞ\x/ZNl/W} UZzI&$Ge%9爛 zÁDBƊښ5{&VW:Զ ,hޣG 7iLg ! I9s]1u{w|vÜ.,98LK9GcF:L1| ]*9.?j^wV@iֱRp͡ߏ"4c3トo[ Pi,ðE|򛽄Fʨ׉d5bJ/%>$@&4cU<f;rWBkxWӍeP )= -{aIe05#\qu)tpY-9v㑨6=8`dCа赸w5KM @jL9m85@X۰!v/`Y}͇ln]R$6شfQj"ƃ쩁oW`5 v0$@_=aCHR%Avg9OqJΥiU ^09Zp۸lϊ>Y:)#@]C :=Dfvwdb P2@N v$cC=\|A(!y.u:<-vӵ b2]|5 NÙ6Ϙe_8m6U<,48=U!杶Tx~6mm(LfE=aqA0cZ]v28WW[֌էlDHǶ#ӇѺ+ bdvwì ۍԶw[ .[2Tea*|mQkci:5%9[ aqga-g.7p/}`, U:xSX ִfk,nZzaˋm1bӶ->m,l?X daA c0SՍ`>Dv7+[pèo\ff"6BCLrm D2F`wh=*s8,M:>5z:  ?#Z{Cw㶛hIvj?Sڅ'd8a~TU6G-6Dy'FU'Hұwp6ߐ}?Yqn&fohq< /K. ?$\,{ރ<YsSB*e~ZpB͉OI9K( Z ~m8I7H9`7gآmj[DItV}M۷2cE2=gai˶MF{,z@!Aȭr ,l`Pp?R d&>ܡ29S,@6= ݦ A4zU,&AHuZ ,S󓏮5#Rh1iYg-*3II*Z)ߥyq:$n*}:ADSfnߵ EyADFDظMCnfGEV  82x!kfdxf~5N,C/Ux3 ^S =ٵS_/'A,|c[Cт_aPCn +*|XRp+ԘR~d"*^ IYYPimoaTí?;Gefo(CG(JRb8v2A4_f]0uͨeO1*"p~ʿ?>o{ygUC`Hv(!k 6$v#yw> 4O836BI#*1*Za-):cBo.aXY!_#7P PmƜߤ')RD( B&sUgm :ik0n>M 8T>'쇜LͅoNO> ml%(0قKCt|f`1a o.e͚OP}ݿhG.Xz"y,/O@/ T)@( %itz=O<е*,†ӋB yDnA_%^e5pMWĬel5>1b9\pi#asD|Ή<X}wzMD1]7c˪$6_$8"?8B`-~g9΅elL_P_PYN?,jn- RLSתW",vMz0\BG`ėjI:sg.0Xx z`H87e$]K/=Jkܮ.CQ+ y-`zQ& g@;vh>X:ɘ>M8MJ79mz8 5@yr \[r_pu{UxK%е7ÝNk3cKvwy<Xy5 u|XdԦ雃p[^ruCsCZ G9KdǸ;cA #+*$J1J(J|gF9ڲ1 E0v&Vo_Yw*c?R~n͡ngiON#fNӽN=t2=̕j '-Yl>8ܙ0~;Z|8N*MH9yՐ>#-JW7v5*ETWոKu-Nӌ jjR7g!_^A#M>Y>twlAr8Hm!- `mS~Y9[c pXc!PDgHR $-_Ӂ1ư_z%&\D_`B?sI8:8|gA.T|TK݌ b效1s(d oMrfb\vF6'}>k O̵<3r Ir㘜?;fR~꽐AgEʅt~U~]OV*3BGo]tjAW(Qòu"$k$ì~m{0CbQy%R{@*E[ &RmF1+_cmE[[NzUqA}J?&=p*/fZAu<%U?./B;̜5 :P8HC/%\?@Dz|FRj\)^+GyEpwCpya˖/MRMC*aEUt-'v%<ԵOE0?P- =Tށ(!.@&|9,t)STG[%QwAcc4n=0+nT{Ur+v&B&]&k%`SjGYzDUYemi"dȇMIKrJ|뇭Z3+8[8B^JER~_T@}N҆Z1gq;^8D8Cô0& I&}|Jci%@DDqv^i}e `4o!y?һCFB @;gE3,Hkġ'z=VT3fYC_Ww2>S=YpsK@D" bm2{#6ܚ+%96G[m޻Yeb ̑l5 :;{n#@PƓzs$EOi <75>TqH7ֻb_~iX>=@lÓI]H) 4] h,~y -%,qX.HZ<\"86̄Pw.3Тp[Ћ r&7?mo"/yyC~;]y|Yc$h!x$r/鴶?c'0(.B݉oϛ1B3-l]fA/X33 d8~}pq1aVy#hcR#gYOQބ@\0P<#c&- M̯A)CT)\D33s a ?Jx6G $ljX/-n{8V`|q}0֜fq"9M.gクDᑩ~V+ P+{O`rTJ=~f`{$I]өg*bhC_sO9y?q҄DFvdkx/ddᬌf~' @?*lI/)\.ۉsefa%I:{c{ȼdF6TzV?k϶,f@N8H(? N tR H3*~DRU|%8N8W9!*PďBtC\V%K4|L\å2J"d#PpghRP# ` P)"faG g%R44{taԿ=Y:/..gd_eD/K躡"B"#׀n=>pkCE]͟VBO5C VB]($?5R2TO@0ۂRP'TK@\?#r I~PЭ(Ĉ$05vޏg߬x/} X'݉te i80gfP/l|X:d;g?~~_yS`#0058_o/p;g+9|xl]'3 =:#V?2f3CaRaz>ٺCOZTNtrcu?Kf#P~/im .ALNXb$'T6i")ޒ?vvvz&=Ռo=;%,mnGϧ&b`zGe }9F~a˷p}GMJ]*) wz1- L.;u)7kxY^i.tSosWյʃn>ٿ,Mc k2newGY6r5jv]n:j=z:HN8 ~|QIz }AGd ^pyakv[ʹϝTvU!-f#w=0ӧӣ)tBH/}S{  a.^ꏆ?Y]ky7Vtd4n~=Xs U FT=5o$~_ShApAOrYgĔEe;d Ձ;|gQL;Uy~oˇ4^l>lPå&)&R$7~k/*3eumvU֠w@ G8 yOzz";?.j-KB>!Cf(  P}.?'җl0~ ou~ʉg]i=WX<LWy<4O7uփs\`GڊM{LjVߪd*;#^Μ>Wl|AN;Dž͟7gΡc4e$qm˥<+Vq]oXHST.ve_@. Rn/eu԰^_̣<, \4s2>^QHX֞esG1! lH#u#tzvAGt\yDH+$:Eg֌8=˰j1Fs/VɘK+9#;ܾac_a,fx Vd_ l)!engtuhdBxn h觊(lWiE{ j4mj/pxR#go?\6Ge7u`($#:>?9ڈh-:Wp ԪzP~+B -0fkd-6;(< c2IhʿQ'|@->wzޓHU׻~2_2Z^@i@X[^D3ެnԜMxq c\d}IC Ag,c{~J@nlځEx PKֿuTc٧ʁIm^ͽR^= GZ-)yT0d'X*g} =ݓGE}W7OU/OӉpZ#R`h?H`x̴S({ǿXi8Sg̎xK9y@/^e kO]31_|=Ǘ\q6Fߣ&D|q[Go]Hʈz~]}1#bגжXhKpqgZ^xABu9aQl?GE%xs?8xn:c>۟/Gb$XEQ9 M4Q3?Ɖ*Ifh"jc@Q4'#eܥ'E ~ (*H1!4еIW %*Hh&(F>j`%Kr?v<0>@(χ!P(*S`;TmSoҾǞӏWt+6X߮ 4G`@937 `L36sle~}.ُ6{J_-|(;Kl!,2aP>|d{a=U[u028a@1/\tZ3IsH` A^W1Ԓ_n`?X 8u":L'}́<~#?,A' ?z4U'^8uś5Tbs]6}?K T=}(ٝ.ٿ|mxc/؃' ojI$Z_>*ಣay]%^Mxƒ#2(Ere\C7 sK@$ӥ?G\>Kj/x#.JtQ#ogmPj8 AAP{pyA?9*|l+k^XC>1Mo0(\9rvT $̴dۍ3\IܯLWf|QyQ(1Ke;+!ۿn3o3]@z0AVfvͽy e,wt,9.(/@X`gDԟA4Y fŅG,P[KTc u*':H#x&T-SD3LHm `Hln89$q׆J'.zko,Yb%cjRYǓ@{-v>G@ oEݰO+-feڮlo@AfWXM"(P .մMbSvpr+Ñ 0 Qb i_28"$A h b2(7J4PA;0]J}-[^^1$  hGBpeb[Xg7lłvMmYE $3r!@ ?;L'Jd8Yxdg#,a2:n9JGgo(1>HrU(|0te]wpv,㚍 -*VW̍VC]7rtD?GPĎF??[K \Ǜc:fτ"E$(s7cfa,Df6K0r2^7|IVRuviZH#'$WٵC[ABxف8Yϑ98[*%el W\|8K}&XBbWb+7FJށلD/]W𷪈Nة\Lu3}]c0d@1Z(x0g\@ n\|`(lʘA. $RqPal]=X<~Mq16svyZ^g)DJRC.,G-G:^-{fEue-Y¿i'uק>Տų>cJ6Έ'(C O1+ OŤ!˨Hujmo/(-'0z´\I<@fI|/RHA5WSű7Isdkn$vMmwτ(ZǙW3{14ӣ3bR'tȜ{jÐ\eGEXȽ B;ݮrcø "A,˿G<)xdwN0p>BU@ЎEkp|nN܃jO2.m}t2S-{l|=Ka~9>o~PIMm;X#oqh9`>%̞>ycȻ0nϝ/|'^ni*&/aRͪ;B BlD~Oչ!M5i#^|6R~@Xb*WЧ{cz4ȾcZ{Xp!?4wX,9Y]VM'Ȥ'S{fB'0/㝌5|\ՆZw%ȠW֐KzBEai{˺koPNPa긗MdHĠ=@% 1b 'cTw\1{"j.lǧN`,AsX*, {m?#"Hwǧ<T`#)W] nIR[ԯ*$y4aް""u((yĻcO1W31 {)nv5! Pm]%0өdMprg'_+6 1^!e AX60!ӡ$|;@ht}#kf=Cdr}2~? >:_Sy!V!!!>*&JEV@;Lf@j8l; ;4 6>@3TM%$z4bkY Tkto[F4 ItU R *P zaCJbG1L%ō2Cc!`` ,,XJJkmj|xUA7" n2)dIHg 3Z`0F`a7R2 "2֎o`Q(13ns̛aD$ t#AǯYIԞ@D3#OW+?~êAZ~0?)5=_\}45}y?"?S;@?7uHt`; SOn_Zwki[k9vxoxvY2>;\8YqBĆ\<׈az[8='j+U]A(tdۉ2vny&ui uXp$ҷRb4̹[+u"QXW A3Eim $H%7f$7AMlscM91x8tAjɣMx2r uIl 8a-X$y0[kad;tTdX(p{}jtو-KsռGmXU>P$EMNL¦(=jI:'={i>! ׄ-TT";s'4N= ^"M׃;'#P'3У[gxtvsb6:Sacwg7S{"oq 'p/us ㈐5SNԂ0Uf=;UZgmga b(5*G_ًjꕖns6&ޕ B'Rͨ9H%YW?OM1DM`cI@ g TZCF&tQ5@ WR1;nc/DDR~@y;4 Q@%Gf1dx`c34p:nTvGe⛲c@h4II&=8f 6򹩹0~ ; h.7JhЀc»U _ S ֠G\uZd϶N4 @Kg8znвOf>HDp@K0TxI1ƾQ@Pd~BTJ'*kҋ_!gErٱ򆾦한/{ຨ׹Ѵ7OeꞟreFR׏:be3^N08jV*?vZ2=7RމxeZ3S8.st[}Uw9l-ҍϴ Z^tkg,нmo+쯏8n3v[-I)Uhl;5| 3|sBZsW7wYB0^02 UM%4?6>vN{|=ZgxH!{A׀\HI9.">'ĎMMBmAHC4B9hfd`j O'OlO!/g'‚Р!9e}/y72Ν쒄::æhN̈\,RkiH5?X IZxV+;w mO &C6r nqo]3\T+b z0F#ј #uf JY:h<Xa#{<iHz5L^f9n/w{Gv|\._YDapB#HXDAZ6 ')J>98 f6qm> $Nɺf g#$wR[I kG}Ai\pz`:S+TݲA ?^9KnE,W`#YIp*;Y[bm[("H>F9Ofq; tq maӠ3'y (((j(j(j(j(QEV ":w|Bz U$}`8Ku˭h`;h>>?69{BfD]tl*HLo˒B\귷xQjVGjh4 '㛮D@_J5 MAgm~jxroV8okn2wޫ} fSCBB2B`Ra hBF"%ZJGtv5!L2LL4443DRDJȏCBK+D- tD!@RQQ UHR!HR-D4L P ""o :'xu+yyD=}^Is.NT=ܖ }B'zקǧg rxvHOHCLhQo%ə(7z6 bDHe[ 7<4'7M,M]Y0pCb)m`&H.-̣%>]/Д ٥AgʷZH,G &@{8$;xׇ/DHAM D R""CAS( Ҕ Rr$OP UAU,c@Bdl$B5UUUQ]DӃQ_UUTQTU XUP"HPz-MP-R BBF b2$J`**j&% 4(UTְTzR#C3E`ֵygJ&bP?.j!)vDDD4d䃙6!n~V $$ ЀzԨFWḰ3՗0%@T r'mG f }T\|]u0Y$QIh@O?o[ͅM oNpX˗0m'OOρaLP"oDA`< `]~MYc;~dpl(D!%nL DA&h@qmvБ巷 }b/gE=ӟ b(~bq}m@.%0m"\5{v5C;Rse:*H>6($3h^/ @>ϣ8{* ͉+s6jƷI C*֮psku++3`TD4d/'IG"d_ە4zϵg{.co<u B qI$+}C1V%Xa%b\kYUf6_FUASwYۍWց0#ݿ:W?hpI9#nvl?] _=NDG}Q1Zn_p| %!?Lz$|@& ƽu*@%%IEp$7ڵ\\,_}"""j q{xT{7w=O;0CY1#v  P!L @͆vU-Ƨ*y1u,I$6GH{Ps)+͖;a< G1m0E/n R̄3 qלB[-'/ @DCX2cU {3Ԅ`͸/{j  ʞI)++ETF<.y:Jl](bXYyhfxrXL$(.gg`2 `q@GQ\{f<ez|Q Pڧƅ̧pB,QHP'區\P{ S)B㚊&5M#u>? 6