summaryrefslogtreecommitdiff
path: root/include/net/request_sock.h
blob: 144c39db9898abcf8cc8582597d04a912ef53495 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * NET		Generic infrastructure for Network protocols.
 *
 *		Definitions for request_sock
 *
 * Authors:	Arnaldo Carvalho de Melo <acme@conectiva.com.br>
 *
 * 		From code originally in include/net/tcp.h
 */
#ifndef _REQUEST_SOCK_H
#define _REQUEST_SOCK_H

#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/bug.h>
#include <linux/refcount.h>

#include <net/sock.h>

struct request_sock;
struct sk_buff;
struct dst_entry;
struct proto;

struct request_sock_ops {
	int		family;
	unsigned int	obj_size;
	struct kmem_cache	*slab;
	char		*slab_name;
	int		(*rtx_syn_ack)(const struct sock *sk,
				       struct request_sock *req);
	void		(*send_ack)(const struct sock *sk, struct sk_buff *skb,
				    struct request_sock *req);
	void		(*send_reset)(const struct sock *sk,
				      struct sk_buff *skb);
	void		(*destructor)(struct request_sock *req);
	void		(*syn_ack_timeout)(const struct request_sock *req);
};

int inet_rtx_syn_ack(const struct sock *parent, struct request_sock *req);

struct saved_syn {
	u32 mac_hdrlen;
	u32 network_hdrlen;
	u32 tcp_hdrlen;
	u8 data[];
};

/* struct request_sock - mini sock to represent a connection request
 */
struct request_sock {
	struct sock_common		__req_common;
#define rsk_refcnt			__req_common.skc_refcnt
#define rsk_hash			__req_common.skc_hash
#define rsk_listener			__req_common.skc_listener
#define rsk_window_clamp		__req_common.skc_window_clamp
#define rsk_rcv_wnd			__req_common.skc_rcv_wnd

	struct request_sock		*dl_next;
	u16				mss;
	u8				num_retrans; /* number of retransmits */
	u8				syncookie:1; /* syncookie: encode tcpopts in timestamp */
	u8				num_timeout:7; /* number of timeouts */
	u32				ts_recent;
	struct timer_list		rsk_timer;
	const struct request_sock_ops	*rsk_ops;
	struct sock			*sk;
	struct saved_syn		*saved_syn;
	u32				secid;
	u32				peer_secid;
	u32				timeout;
};

static inline struct request_sock *inet_reqsk(const struct sock *sk)
{
	return (struct request_sock *)sk;
}

static inline struct sock *req_to_sk(struct request_sock *req)
{
	return (struct sock *)req;
}

static inline struct request_sock *
reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener,
	    bool attach_listener)
{
	struct request_sock *req;

	req = kmem_cache_alloc(ops->slab, GFP_ATOMIC | __GFP_NOWARN);
	if (!req)
		return NULL;
	req->rsk_listener = NULL;
	if (attach_listener) {
		if (unlikely(!refcount_inc_not_zero(&sk_listener->sk_refcnt))) {
			kmem_cache_free(ops->slab, req);
			return NULL;
		}
		req->rsk_listener = sk_listener;
	}
	req->rsk_ops = ops;
	req_to_sk(req)->sk_prot = sk_listener->sk_prot;
	sk_node_init(&req_to_sk(req)->sk_node);
	sk_tx_queue_clear(req_to_sk(req));
	req->saved_syn = NULL;
	req->timeout = 0;
	req->num_timeout = 0;
	req->num_retrans = 0;
	req->sk = NULL;
	refcount_set(&req->rsk_refcnt, 0);

	return req;
}

static inline void __reqsk_free(struct request_sock *req)
{
	req->rsk_ops->destructor(req);
	if (req->rsk_listener)
		sock_put(req->rsk_listener);
	kfree(req->saved_syn);
	kmem_cache_free(req->rsk_ops->slab, req);
}

static inline void reqsk_free(struct request_sock *req)
{
	WARN_ON_ONCE(refcount_read(&req->rsk_refcnt) != 0);
	__reqsk_free(req);
}

static inline void reqsk_put(struct request_sock *req)
{
	if (refcount_dec_and_test(&req->rsk_refcnt))
		reqsk_free(req);
}

/*
 * For a TCP Fast Open listener -
 *	lock - protects the access to all the reqsk, which is co-owned by
 *		the listener and the child socket.
 *	qlen - pending TFO requests (still in TCP_SYN_RECV).
 *	max_qlen - max TFO reqs allowed before TFO is disabled.
 *
 *	XXX (TFO) - ideally these fields can be made as part of "listen_sock"
 *	structure above. But there is some implementation difficulty due to
 *	listen_sock being part of request_sock_queue hence will be freed when
 *	a listener is stopped. But TFO related fields may continue to be
 *	accessed even after a listener is closed, until its sk_refcnt drops
 *	to 0 implying no more outstanding TFO reqs. One solution is to keep
 *	listen_opt around until	sk_refcnt drops to 0. But there is some other
 *	complexity that needs to be resolved. E.g., a listener can be disabled
 *	temporarily through shutdown()->tcp_disconnect(), and re-enabled later.
 */
struct fastopen_queue {
	struct request_sock	*rskq_rst_head; /* Keep track of past TFO */
	struct request_sock	*rskq_rst_tail; /* requests that caused RST.
						 * This is part of the defense
						 * against spoofing attack.
						 */
	spinlock_t	lock;
	int		qlen;		/* # of pending (TCP_SYN_RECV) reqs */
	int		max_qlen;	/* != 0 iff TFO is currently enabled */

	struct tcp_fastopen_context __rcu *ctx; /* cipher context for cookie */
};

/** struct request_sock_queue - queue of request_socks
 *
 * @rskq_accept_head - FIFO head of established children
 * @rskq_accept_tail - FIFO tail of established children
 * @rskq_defer_accept - User waits for some data after accept()
 *
 */
struct request_sock_queue {
	spinlock_t		rskq_lock;
	u8			rskq_defer_accept;

	u32			synflood_warned;
	atomic_t		qlen;
	atomic_t		young;

	struct request_sock	*rskq_accept_head;
	struct request_sock	*rskq_accept_tail;
	struct fastopen_queue	fastopenq;  /* Check max_qlen != 0 to determine
					     * if TFO is enabled.
					     */
};

void reqsk_queue_alloc(struct request_sock_queue *queue);

void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req,
			   bool reset);

static inline bool reqsk_queue_empty(const struct request_sock_queue *queue)
{
	return READ_ONCE(queue->rskq_accept_head) == NULL;
}

static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue,
						      struct sock *parent)
{
	struct request_sock *req;

	spin_lock_bh(&queue->rskq_lock);
	req = queue->rskq_accept_head;
	if (req) {
		sk_acceptq_removed(parent);
		WRITE_ONCE(queue->rskq_accept_head, req->dl_next);
		if (queue->rskq_accept_head == NULL)
			queue->rskq_accept_tail = NULL;
	}
	spin_unlock_bh(&queue->rskq_lock);
	return req;
}

static inline void reqsk_queue_removed(struct request_sock_queue *queue,
				       const struct request_sock *req)
{
	if (req->num_timeout == 0)
		atomic_dec(&queue->young);
	atomic_dec(&queue->qlen);
}

static inline void reqsk_queue_added(struct request_sock_queue *queue)
{
	atomic_inc(&queue->young);
	atomic_inc(&queue->qlen);
}

static inline int reqsk_queue_len(const struct request_sock_queue *queue)
{
	return atomic_read(&queue->qlen);
}

static inline int reqsk_queue_len_young(const struct request_sock_queue *queue)
{
	return atomic_read(&queue->young);
}

#endif /* _REQUEST_SOCK_H */
f"5jX jTW"%W!tP`*d1su|_!Z3$Lڌ\ 9nT<)G4(W#U?^3mH1ϱ Iz:VUNFh x%% Mtfa="MN\ MZZpoߵ/cl'<];~sdH8>A[LYzi ,D7N`u3 l K72A:^]֓.xͦYwkft8P]=կ`'Ev @^wVpN"9XKijWnVOrKҵV#  Iʭj>w<^uD҇}aѵg/%k+>yϡ# UoTF4P|b韙bf$3;|ZfWbOzf]=FG@3J1k#$8tf_<{`P b]VMKC]s!%|J& ]O-apdك4nmPW%^Njt eK&Q /F qh!@L7MW6bA?GgLa;yV1`8y]s0u=+7+j~9%^H .N¦47q3wҭƓ}1r2rS<ړ* IN֮nhNɪ T@(JIh\ҹHfl G )EI89ΐӝ?;8-&$ gF 75kGlkU9Xfa1& ԑP2\v};2UhǞn*,ͼ[|yΚo%bE!>~8sIp.WJsWp2L,qf'u^`TQ0${4(Z^ hb=-=v.Hf):ySzKaa ?u~|p~7P̂kSJs%7}0}A:{[ӝ|uz&SYV8CN4`f`1+Tf&ٜga/h-=^Hg"oEZ |IA\-җyJzdfn*0ʳYPs~f_җZxdhɈعú+BI* F9` C)fz 7\:࠰  cSp$,J#(c?fĘx,!̼Qe~ȶܒ M]1YNw3v(*`mN 8HyꍚxHjL!u/V<ĵVv>3dd0_.CE+5BzYJiEn0cFZKf'5zfv ]9W##7N a8t1/"VhR6݅< cB;V%;~[҆n~%Tǣ9jWF2lg}[jHvmX&o/.m+a_) 3_r#69qXfz rYRgt ⽼5u[L.=HVㆦXAY* j/ȻkT$fd/)MVPC#da:ffKȔ='SL^RNCx*/Q& KVp3`j^IՕ# X w9 빓SLJ[Aƈ݁(Q!IUb^\ ғ<ڬ `\l8 -G>v7)1_\[[/IMHoĵ.|i9=,6N`IY(Xrl;c5fl>~jdćȀS}f@ܦH3qZW:2]ma1\>:q͌A5}Dc !wP>kw3 +uNM I`lQ)L;ju+wP"[`Tԫ&e Id 5MU)|hzHK2~r@,Pf4R㈅|&ny;K5ssVJh WM!nDzw+V՗Ҹb{r/ {>F%c7z]܅ =cͥ8N$w*<%v; 5 +2#wy$@_ߧ>Ob9v HIkP4B+Pks/< n[K-q4Ѹ=5&͊=u=q>uWB˓VQ>sD]jGyaO`T@ի+J݇E3fd׻~rw\PѸ/+e!??.1uރ+\,HA|,s1%)VhM[>PǪk/aQ+c֗lJR3@&?U~kR2 [e];?8pMy]mGrP5WUcЂf;MA<js "{K=h4>*~9-| ܹM?T|wv> 5Ƒ!DfMO?5iI1")Dv+O'F A $==3퇈`)9 &F_]r]g?5̰aAW}thۚ7uAw֯ C1# ATHxTC ~b ~:WZ?N&%(]. FN8A"t,4;bxMos{42sY,k S hySٓpnwh͓$еb+ ?X0UDžG'I렄 @u>zi=0긇l[#[Os^b|qYXC"FIV=CJD]DU.V~o=wx]=m^2wO`t1aJu}Tq:QTP1Ֆ*ۤ\ꤐTDP5F-0Tt: d=}Ѱh0~3&w+N?%($EinWRd tg z:?n|k 缱+.Jj?sWxD>)&,twGRj9-c'E0$r}{ ^UgĒ&R4cw5}fjEp6@cvrJt 8ԯMNׇ_g&x/4 LKJ|b ],@%\;+k\9xfm\ c/d i|u?us*ZԕS '?6HAGN`]fbKS ڮIvuNTwͅ+pl*MV] uD̀,FDZ,R(α`»u38u'mIg5rˍ~} RAyƁ7u|oK#G`HR8jJŊ֮ךtͦ doiޛKGOx?'uob/rSzuT~. ;EK݉qg/VZ|=\*X.RK6z$ Q\p4&G? aWkF1 =} &H>^ħ~fR8n) ?BL L<2%_O`Wm˕z4ը17+5r1_ Xn CǃNACU28 4ZRQ"p +Ml08N٣AIsY>NyNx(?~I$Z6bo?Dt,޳3~64%R0mAR$4B>eo& ]ݝ$}AKJr׽at2%U Iy/I4W͖2$'5ޔUei(fuuS?R}gh=\ΝTYMY ZZ<%c:4&/X̙"rWِ(iܒ :+\Փ𲇃 nKd/Ҁ{/<}+r$EO0-xdW~ɩےOdpp3t`7Ǩw}sLeY瘤OsxVb~&~؝s0 lTH]xh6ĕiAڃ`K/p)][^T CbUb\gbϜY< t*7z3ʖޙ؆$E ˳l-RuRC ]mtfcs![|1ewb9m"Y]**c2w)Y-ݕ^2&%吨X*z|?gtG7}VQsS1~Ҷ/?lܰHU|؂``:+ <_c3@>{$ ųߐ/qr7sjmldɴtTQ_lȩECiD-h }\kt;X7,I[$)FSoSUw哑,>tG7b<&•3nܹu`64)GuU]p19i$VY(%VU 8ziBREx QjCXqၞ"j9RT*}wtR<ؠtYgMx+Ly4a|$u NפjHdܪ4r'?J{iY%M>*{_˯1jineYi+'sZ+дi,XįasFmc0f71iOLvAdl,2/3!wLq=.68ƪu`AMÖ^XbUѼYpbtWCe.;OalQsLHk`ő_DAya#4L譌,R2˭U|M _VT9GZDz#c ֆ7d wj2=)Y"=Kr'{ fj+H]N`3BmX4B0S|Pd#kOhde,9 !47/BxjI`O ~v^t 1_5U1FM/O6c'1F˝& >5CqA \gY"i\rlQj6:H) HjqCnܭCw^:^`3̑,G5f q)nvAŢ>TF( ?~lw=m<'[4xCw2B'nZY 4 ~|Lڍ[jmP4PVQ_ji)UXz VU.q$0+"k3pGúےiUkX$5<[ pΨ[q'to珕NLFm7{#+?[ bQ>Ώ2l`}toԚp=5j1mֹG][J-WUPi0™@c6'G](~!\tR"(|)V*iTX-p ң*~UL^V؁F^+_dOX) D[x!z,q (ر?(s?2_XXxY`&G"nL\KZƣ)'?\kT*{3SA7a_Q&{hjUjGi473N&-^inF*x0=h ܾCx8Hͅg?%2]<}OpF6g$sO )pK8h,Ğ#N Ρf r<%@AiJAլ艗G-~9Jsp~l/MfdGFpܞ`XHv~ݭ?'ljܟ[[AN[CƯUM-Qcpo-澤_=1l{ѣ$`N#av4jg*uĞH[%Wf_nRqg #2}n3ڪCLbE/ۜB 4m58N_Eb 9yK=|#O7zǁB?R MwIϭMQ52x4 \?H Md_,e;:Yqêu\%c( 9"ZeVjnhV0wj#`/aŒI{dҐ]e{i7 iƀzKD4ԏ)g;Фv ׫2NPn92\L$(%8%B=JIy$_nz)YJb07wx!}ڍFd7 >{U->uMs{|8rB,Ŋ;4S4+Jbgf^{[E"[.g5[-+Y|>U~#DOvLZ58cwl?x|8O2/&6!/EE\v2J_j/gyQB7TDJ'$Ɵ&(wjfPyD[IHoF!W|Rr̦>fjrp%tw.嚪UL&ԵԥR^_[g|rRV~wܭvq13eL /ι |Rd 1ckѽپBכ=0uŁK^: )O)&Wv4'b 3v/UYz\*t09MmX\z ˏظ>ޘ(a.%eh ,JĢ8pen06HHe"\ɥJ%)K_M ;$/<؉/1vx(ޛfk eܖzӷQ(|{БjR#mcZo}2J6lk94P4->u@N4fo:hvjܲpT0 ~ tP rY}7(rvM ER-ZolnUsb#3 LGZpHR^HvtgS-k]MF$7={8))`o= Sِ;]N>9eHumC'ʏ^ sn FN]3fF ^^n>'87Z3mt vtV&PZzuO]Ow-` ,_+ PAW҈+2/}uZjڮ}F?ap Q`[(5NfhH&tv.*!buUg ' hX2FzYU-c:z _IQϮh7{ ݝkk;S}$Q M*d.@N^|J ܶ[9ܒĔnvM}\B'.=>-r'Čh*;ߎ9>$5hl $ے(􃂉 pd&yJrY{+D% I=g#tyN./dGt[D3nmo reFN[sۅ׌ _qBz0<3Io7˴5' ~eYQk( m[R]Yl OKL:& O$+A "G͟UH:!(EA^&sgoU`[!ٚL})SJL0'KI}>Pc Sod,)-eIb2f"g=5Oy ? !U(5p­vWч{''qumہTZbqu_ºM.Ts^0,}yYl"฽.6:ih8g$]x6۷M"57ϑLnx!ŘL^뤘~lLc&M4KBfh:JBR~ulA3{RTbBtm+D_UG!~IɆ1ݠyCFV唄%%N~:L1OqhRzםNڭa}HrfS 2qeTzUӎXuw6-4GX짙2fA"N?;Ie7Yד^HL-vrS-H!gZ*dj.; kZQZ+_;WC pu[Xf{42*t7 |/9R5uQǪZδEg) C 3-!"h"}6˥J!nJWhTgaA#u2@k;I&5tv|WꢥGdV; WwVf Om3!;>8 n6iu&vH1F^gtXgv]!Y;GcbGbKR9/jeg ֶirH;.VActΐcП8kD4ɆH~>HG1S_Cə 'd^$ }GngW7Iѝ!ZdnK{k.]{ܕg4rQ8RA'NSXθk%P$_lN@T+on2dž;W2f^b ~'H,2]B`IS-_4`r}ܿ(M*3Rm5% 6 $=&aJ zWW>tXzGI{qPw6Q@tf@j<ܜUCP.Hdxۻ)Rhx?aT\S,* #TJ=;AȾZTsf\G~' (gl\+G_yڍ:e MM?`ugTM..o-1zTG 5LW Kz!8X #x2po]G'a|#::xZOf:9l !wRJ1V1+ @I lsp3^p-WsQz`v2S^1O+>R4 BH|3@QJAgi-fމ<Sk H-xU%-cK{ץ(|P=8Rf°sJ5g5I RnM$k8'ɉ!*&(XtAx7)S hogҷfx[VzރB?B^=$ !/#epDȜ tΝ!_JR3CDOwjC˓>e7Yf-pȤ03آGޓYfO( lKϝHf⹍M{31ZA=;%cgMͅy=!f=3T4p|dWېGyMt'8f,mN+9)mPoU2+fU5뭊:ʪ3tI!AB98!g^^IN"t(:c6M4\l  v$34T&wL$,F)L_r \^LN*xK*jKAeҠ\31Z>td K aRfz,`HhuKMb9\*%ͨjIpFJOdI7ǖ|,臇gofI[ń G>DMNr;He߻YG@OeOkYMdċLd"uꮠs0KZY'iAF3:ު`[yCSBnT e%RcZ// ܼ_<& B9͝N!wBLaB"pV(i6&NtZs7Կa碮J;mCیWķM@Zr2{(;@K&en7ܤ ~uWگ4z둒C#Z\;.Gqu;M{JKK?tvqS:[v|QtP FS$ u5n}|p߻ƾ+ďtbYx'UҺ׭j\/mnl"@ %uS} }NUI*DR$ 4Q|#N$ANfœD{#r!=COBmZi%oq29I&GFt7wr}`lFd3eX^[<0Hcr,gf$7{ #Qݣb'i= lmA:IZ{O PgZ >Bor:|zf%6 n*U!=KASًE3ɫ! WŚjQ2.ܬ(M$DDB2TU3HN٬5'3e4jΨZ&bWQaj#A SxK}"mvA,H, ezǟ:|06fs2 Qł{$  h]Vn(.Z5|k/KNR›v1=!}3~'"]wȴ@9d$9 K^ck"똸c("=ĝ\>kJLjccjLlmԖـ:h^tzݻ=}K%)SCAgM-Ie7}=,W/32"mڻzf>Ϛa0ҒL51fv I#kt<.X<9JhH+նj IzǀW$Ԡ3NNpF;4hK|׽l2|-(^x0ZICUV=X˦; ;2mOəaA2 Ffѵ`EZ#0,6.#@߻utOܲB0;}84 s̃8^XLP+D'sAJɢڦLW[oɷv&AşH% tsk~ҕ56|J}ّ8E?Ԫ 3HKkIT6m>@3'S2IBYL&s8ڵJ 6twvkKrjOA|_kWR 'eltj5h&~ʐWBAAcpCzé1/v貯\Ǽ\"^~1\iɼ_w( }'?yQuԟ//EI "ԟ*0URΡ@M?Xsyq-Q]4m#ΚKBu=EK8|},s7$V** Z4( &&ƄWZ%u+詄MхKm3N $t0VFʵ=!цNǑ96hE"8ݗTصoGf*9ѷKIwDvLEZK$|ܬ6b!rw*p o$ -;$,' Ȫ -eLoJS²GNteTV@SҢu]/7Ibm^ Q}{_ĔGg49x(mA]s3nEv( ]7)2~ҿijZ.Ou{k-_˄2MWY2#PVK,vK/M$AsȜDnfSLT[Dڢ:Ƣݒ\/4um0 hUUKN@n~1d99~^MG! 0qҔn5DWR>p][z ܢ{ X Ng-!sC o|ZƇvMcخeJuX K2~z fJL>ٵ$W2Zà;Z=ɶR.]8_JEѵOtHACtrRCeMh,t@niU3PNQ7.->h  CBȐ2兎\J.OWJ kKRh 5tBQ321eė7ͳٸ>}5K+b(*s 7cM94'CfJ{tm\as|% V%A;Hfs[uQ\YX@^+]U d#G 9FūZh$<4U^׊^`>q$&S^VFS ϜqeO{+9S~mX6ݜtdkas?7ϡIk-DD#;n=:_j~i̦Z[{6 o3ӀD,].(s*bˀ܅Э n| 4#)Ƣm&ͿlFE/ ` iS )ݑa ӰH 0X8&lH`h¥vfD1 J-~ׁæ L-^Uvٻ>"oU vRG]ehǁ.LCXCL}^|ݛšlxFC6c >5k Gic1Uힱg"K=dDm>T_.kNjPN AFUUJuFeͱP8%w;r[*(.dPSRQ՜^0eO]spY3QMMkjh^YT=#CԸ VE<]qޛ_KpB Zӡ :*X5GX9?)(EDIx=55N{8MN(\ n5*u4.@ 7S{:e ʵCuU(3wl&>Mꣶ4?9lfE n%ȼk_û^4]͞ n+]L#wMV i9h:;=HZ&mlC*px?;]Bs;p:4Rl|HZ~AstsL֒NfEH#]H^kKAqWk`v$G$eILFRi$zb,~n<ۍΦ $R; I! w1E9!ei w:qA }G6Ck.NW7 [bt1O/pWmϟ{VgWCznl # 6O[w?;I@d.Bp|ȮKFdMDRP  EJI& I{p(;"+4\_>oG Ye*JYЇOD,&;afYߦřKƝ=S;,;@;ΦH9^v]sP;O QƑmXXJݬϥ3x/.ypH#h4ș \.͍Oq@IK(=`b# }]z\J?җ{1T'@Bn0Tr2D$e2UzO@qIS{3E"t6B 6.ݫ Pb.TNB$ɂ9.hYeT-N@u=E\W\gRF\RdN+ӎƛN9D׍=;D׍uv Ar6y۸H %+au؀6j[rJу1Uh}t%|Ք| y<=7ǥ󤁐zo~םO0`?ɖ,)'R,h݈PgIZϽ,_`d JEԲ,A-< itW3PZɃh>ǃjHڠS͆[8hs#M 0ܝ(F;$æ,Wvc^]C>̝pXm5 ^0|v8H(Ei)Ώ _E ?lN>U>Tc~5|DvvK&'0e9H;8{zAH3y db3,ioL$nO{HP*5F1=5#RmooZ_mX3kq=Sú{7Pqo VUDf%s%>P$9!|vf!P`zhHWc/VPWzA:i Qm<!/P sdOF[']þ wK?Xi6ȷn3ZR& @AZLFQє4CgBH_{~I'>Ю@_z#+-S>ɮAnyRڥzwe{.?w0ʽ!-5teN}v- m [~67/iBk\[-l3$!ҋZ;nAÝlY(ѥ4s;K7IoߵSiJcɅ n&ͅ!HoMlg;W_6Umc"f!b)q42YEHiޡ[W؁ 62  Iԛ%J$ݳh Y:J[ !eZU҄EsD̅^@!^sdd:AE ; =;V>tkjmҰ#UUTWH.ivM3y5wUUlb0,$S϶ aҎl)%&GA6^!bl*'(~e-wzVP)p쨆pj;4o#ms]8 m]tɠ&i}e@o5~`V:Ay2FIfݕЇwf X L%eO1G/0=X -.zf7թ :/%[VIǘݢSyѾAc{ؙ#ğ}MAu Z쭃懛x;̢޽餓0IsIޅݩYTө;-mLu9t(\l/P\ۯhQu*F=>1V}\-:oa}ݝ\;/'e.Q^i4tL臂W>7'V03s "p_] 5)wad1/1.xJ8O*O`c$*LW30K8Sc:X/H&VWz' ױ[Zb: i_gt KRHS=&=q%ϕF >,/Q!ǭN7bQB^v{ 8Խ䙻?tCgKĊ}Vf=mT5X4ƀkL B֦*shpSF4vLu ko$+>eBfZZW,Aso K' qxf^j+BGE8 a愿Kn'cCI h$pS whF*hH ;GP6AFv;l:M+@P|aKNZ3H34$ F|PqָSv̮4@KHL,ByK25:&3 HY2M• )- 3&EsvzR QsL.LG߭@wP}xYkѢ}Ҫ&i˪ưS8C֯&v? ts t+و듫ٳgABprhxCҐpRmTk劚eL09S}Wݏ^)p y(l&;~7Ri_,66{||.V=9$1ScIǕ2%Dߐ $eN;W}"At]O7~oCNzk7sk'Fq63Dz(007BHT \\Hlတ^\&+H /3uՖ,-E 2̕tsSO_XLȢ@tC[AȩCf6r+ ?zl~$M 5Qojwv}ޏNT%DR!m ~wG |;vgI7'\»Рg~s9QqgXoȄ\4.[u. ɍWJ.>@&8-;6F0+"G-;$2%kuip;sHNE.xM )j]Ѥ34͒Ih@Ly~(ӹOV {nJIlf^#&¬;KH8+e]veFd&̘ˁi2hmW>GOZeiA6`43~X jN~^*!zx#꺇'ۖ`Y]v-@Yq(bv []v ,It껑%N?<mMiiX6@t~n=,6 b& *Ax3g*/p:^RcJD1m"3,&eх}P0[&) 5 7i}FN:R|>D*ku\j|EOpz02!D]VS GUBI. (yUt xj$OS[r<̌5 u"]z0i؋b3˛]OT+?a$}юdM>N!fa-r-j-e}S@?wIDWKZ^;nwojdK f?GIqw q*>vT?pFjF+UJu4SU#XCLcKMJ 9mIO}o'J}ctJ4* NүvVwM w֚˄5fgm_fM e>sYq"Ìf]fN|cR-XЏ!@v6`0td!)T-Ɵ!SB=9$3GCS݋ۺ P?EeKB~MZ[/jiyVܱD\޴bfuRUIorIg0dy I[Gj=!<D`R< a2`pV]O90^ݴ&ߧdRA}#2H=<> %oIՒ޶<,6:xt 7DW젥+^sH8;F fWh`@'G[R55+"ݬ/CIc+@W̮C؍le핧@[v)#BaeyoU, Ȍ̲f)IMx}|21xYt%?k/F=Fas5r:=AJ˖uh|9ȈmӯV/W69ޚ,@n'^U~/)r2D$% ;sH*CByR geHkޛ/i< -Dd' >ҝ8mhZ p㛼Mo=ٔ&h Es`w3T#,sِOs_ߝx?Ĭ[nPW+:‰Hc-HY/I~=ۙ^T6 g#9;ZŐ\Llw ԟcX]zH./9&6@Ѵ$><ω ֝8cTXfK,1;qbomT*^'Pr 8.^JgOlB)=S^k0Aϣy*pR҃Sฃ'2?u7~Х;$8V2@WH_S|9=xx,pjK23Q7UuZn\t-"%}w45c(.A{Ϥa|V[tjR0f{ov$͢G5ld}3Ҡ1fuJ Fu :6T*y]QC Ӗ ;NdeKpHhu V'{KVd»5 i5+hm^Myhdp :Wɕ2D޸?1wd2i49Vr8ѱr6>%Cȶ*}JѠmA: h<|S?abJ?jx@ w<-l?iZ [LO'Qb/#H&rбQn(=fJ{g eWd[Pst3^n01oQb .+ZYRu7e+ّ_P_hG30>'=O(ѕ]>H3Q _,mѧ.LBgd\]/1zr/'E )=Ğ{Pe '硤2a-6Y Kde0W+kϘEGC[cO] ub;.jC&,{B/]0m@ik@ 7yutҋ($!TwEXRUqQF#P< `7!7]Od7ᰐ?uW -[)?tc~7t\LNk9T U=D+^ STUP׫K{cW$+Q:dY>z:-(3uG8L$2qՓL61Vl>4 &BZ UJޗ\D\g"gFUZR^kkM& σ[xQs)uXNZq`Ie#:˚.ئ.ٛ9Zƴ5wĮ1dt g.)$\kH8z.l4LQpwTL!Pe! ҽfe]!Z03Y7(LQI$\Q`SwOUn 9MЌ,3wG_yN/ iH݂yśے e;з 59'^3:$@,dNY>zu0•s9>=0'udS{_ \}㵪̪Y;L?t9$JrPpcy!mF/ 0Zv'$zi3p6v[~ayG 0%$ X#0yi6ihu!? oww/O)2=2@|CbꊟIjcR- ꇟ:? "G}4w[Nq*gL_KluF`B i 1ۓْNP0u+ZBi/܈ b>,6ʝf[.%z63z5}& p" G|^&ٚ#`{BFRW`=_ߪJf8MPF! k.O$U—bb`*:H؅[t⿰X?OV6ۅڞS]B {ϗ(N2zJ@sҨ0=ԥt9x ǔh_I۬Ai4^&"e"ҧ|i1NGWL )FOIlTgJIu`Y=NQkmŸ.gE91% zQfdBZ] xZCp-OX%Cr):V^W* p?XT߫$O+!kY0$:L sqL|sQO;6̊_zzqsP{rجRLQJMU| 0/֖gYWk)nכޘ&b+\~:Im#9m0g]9NB`'f@&9ɾtA#>I'ۈ'Ps+͑v_ ;~91 ;D9,Mj`M{d^-ؾgp0T,W c}c4vN4x-3mrc@~^:7 T: ](&p1/dJ=l7G4䢪RjtgvCaa[~HnԬ19?.Ïپt5l]$.FzԛQM$c"K]wdKd{r~7S1f#+ F4iq6"N/U+yelx[N&*`UƍZ9);;}t0l|ITkl3QrP`͝Avl{M5hT֬ TOB>,n5n4j94{ g(5Ro箅e:W@fqfq<n7ovO?^.5oȔȂG /Gmo ē}|6:ҩ[ra_} dxJ& 9xv f_V=;)"$"h=)Vo:QX"}ZX8LME!/+`IRi'ax +04)Co6܎$ДYϕ]OK=~kX55jh 5k5 YNKC{GԆ=3N Wt(!ϏtfJo8ƾj.@GS v Ԭ2Ծ¢-SC@㚸<剹r֥ aoFw;J-m:Lr}ug\FQ|\aؔ#?ȚQB 1 #jcwQ=Uz⯙ 5: dc.ڪUQk5h<de!dOִ+{[ɑ |뒧hq8iY8j[Qʸ{'h4Oaް!䥉l,e3)948'%%dKw35z1p1W1d>͟z#±V_ɂt{ONnu S ^~=.h!~{4~zv {%?+UHL$Kc褙MѨ_!gKwB: <PW?Ǯ84i񔳚(9́ oIy^piEƅ6?Qɓ.;ԗKB)bK X<Pf{B$ZYK(F*Ư44c֓ay(>KCrwGO Z/rw.5B"̰k}-q661J Ň{Dp|'!䎲@ߣ:1y Ҹ-הndŁUl48-XXyӐEk#UUWN:pS#jXT8Cᔓ9^ZI'4gsdR! nb&<{Jm39БR}sP[.\4py6MkBL>dJ;M?KC!w\9Göí4!:]%+i4(X͵S< hMSނ yoMcǐ`eF{ys \oӚ <7 1*q3Ň-۷oL1vE!6fS$o ]m8Z|!Fd[Mr'MoJnR6Oz?ahp[PC5䠇kD%"-\d>s?_zڔz֟k:d, {+vsu k+fN'Yuu=R=$7@XOr'D{&H ۶&M3VJ4\$HYN7>TjӵX|G搿|9@2Dv+ycNVOnߘ̚t vERƉltXyv=G~)ozg1/2HZѮl&k- 9[_ +lNwUW9'78TwVN׍5B\Vpc]?(53"1jpceUgR|1>!ueӼ]T-!% 7 ('9iҞ2}#7MɋL FOp&g:N%%$Qg2 i n'i!b@~Lg%]=Q9*+酅8[B{){=9・k;@QU{s&j'ӹb?cRӲ=-@2hzY3*|!OޡsQox3RlkFR |~2Acm܃S"k 1TG ɽ! 6,zwT&j4zx<ZDrs$ه;k(O?as ] IQe~grC4CKL,'MsnCwyDЂT9uť#9\ 첻r=RI䕼SƫlgzZ 2pKŃ!E3|/ݾ}s_i|^FJm-OOBi.4UHzl;+BůYYy1Y@ݙ/;k{T>삡ls} [9Kȑ;ޏXl/Jsd8) &=9jv[S{>_3Alɹ7p.DX ɴa4u~ϻF Io2C)wօ,[cz7#/c~!^E"Wr,W[k>d3?'(=P /]!5]ۀh*Z~л?p^ex$^P[C宭r5FvO:92?$٠eHoN',J'.Bj>>i2]=:43uui׭tPxpc;e 9 ?zQ] =;J>Uʙ\ $oo jsutW䱅һw==JrC+ m91F}l?!Ob\ж8ؐ;-ny3 ^72«EfHRQ\U>K@[ 䲖U\<dRQឭUrSdqdž.|Ad\fy,u!A184 Š6N=IUb;r1-G{UE ý\3H~"xb~wkDV;mȡUAITMfTFk@=Ud, ~_()D# ѯ6g`Mp%A&EP_ٻd/hmdg/=k-n]*Pg!ANTԑ{5?9OhMֺNLğ%ݭz=A:T|m31ܾ9zY"is%4Z/ĥ* FJ¹Y܏?z&hMT$ V-轂xt~ٹe#c) L4ŰتjU52?rz`ƸZx %uѬb-PI tH|7WSҟNhXW|FX̿'줃IV4"91os2M4HZ MKu2FŸ<}kٯ--9^;i%͈n @\P]ɹ܏hL 9z *s637wT؁WD^t: GXۏC&-@;('yCgS㐛8?zZ#dǠ_=h7y]' ]"e)u)$WLy}$‡DbZVǩ4M)/u{9_VՖ {S|7jBҸl&m®OOQA?`> z֚zOJl}d؜z\ NiL_|Chc.说98/d_#w+mⵃʼ"jsi/ydߵv87~<]Z]<ڡj-`hcLd>;ycGtaZjb,q57XZbS);TYGNC#p3cU 칋-kb*'P{A:夁T;{PaHbP*Hp8?ac﷡*uq1F3[+4aKُ} ȍcdB/Ga P8)޲p3>Kf9^C15b^R&H,(+AB~@*Yqxar ҉6>[r6w` d5ZGZzWYi$gzs}N6VhB18>޳<\b?P}iV:Z'Oֺ ۧ?K7xg.32bx++zpi nIY&1BpAIG4@ezA+^OWrcKϷ?^_NW\&b KEp@1d:ߒyr.)'2lcf̺Lo!2ՠ.#PXs;RI2[/qEk^w4ַe/%Mw6^A|1b͔/j(xgI):ub~V" 1?|ξ|9n41EԸ~zOGh#QcgQkvK*W&D| n^K}D8u>C1ҁHwn48-$.QR0sKC]iDlF_6L"M7b,nPn$#d.<Օ&/&7c)F#G{IV4$ Ɠ!$$hL3nN+ [k}tf=5dArI+$L0;u&K&XK4yC$!. Vg?"결M4o +òi]Y[ 0pAǬWn(x0J%_]aĂ6 bh0FarևlI 9NGJ7|9/yz$l0;AƗߓZ9;\,ӏ􎗴jN=&a*Ə= AQ:Z,1wkhq'OLwF}u/gr!;^J~A`+,BrHÇehEW\ڋwh{? m{0㱧@^8&_4_&iz 7XN -$dbc;X!7i#'l u×$U6EE:ab]+c4ĈB)oD Xxk؛2gY*#G,͋L̹!ꖥ$lˍ<0nLz L[3( bc:diO665+cB\EɲAHV[ %*N*-`-=\r]1lUZuNJG9> FU 6ˊ w񰼁j!+ei1Uhso\ޤ WsM@ѻQcݴ#XT<CgoT1 ݅ /#-+jwsY;Y7ΕKsujyupdȩ"(}_w,]ӈGrP$鎨.xU/O:oKgṦKGCk* /;eju=Ș5j5x-b)x`j ]5J|J/gE~ވxr'4(ק$(kأܻ;,xͼFm6Vٗ v oT A$T74ggurcZF#p9L0 @8֎U-VSأpiA(cJ BmQ_C~{|^tܥ$M֨v%$oiFCԡ fNlE}wٗܚictYS$c:͆?l|N۟9z޾Z_^vF#v.=n;2Y4Ґw7Ngr0n=4?4ٖD\a40Tm~+chXਚ20=[=8g⾅TחN|' mG;| m\I}|88y4(!P 5(C:sdl|9ϩqD.H /ʚƼ[pZŁ5qsEp1ffu9Ъ< '/N\' 8fK(,DSiiNА m6 jE9#,N:븠@+5t+^, 'QL+e$KTJhHP=Pppېq9.7io`5'= b~K=uyЙ`] kbRI-V:?<)8/_*.'{wTÒgS3ٙx彿xFQ DŽHMC ؒj+Ue8Z3* sda,&>VE>G\/jL^ v')DuI:C t*gDj R[JǶW\[85Z[tCkDK -_>%Ŏ+AǐemEy>q K7|[v X79ѷa'u{҅z0'6bǑ<N:QO(IСڲkFk=)b.Dʡs#|TOO+>ʻ}rU޳-#'*¸*Nͺ kɼ@3-Ȑ;\1ɸ\#a'T;`{dkzZڀjOD'/ kޮZ Z}zOFدIvqwwE[^ @~2^LQiĎR=A%B-\(̃WӢD7 q_Q6Rdݠ hUx %༉4jrk [pUOU@$ @N%.$-%deC) GTP >SP%O->MscP#߀{Λ2{fS۬i?,P'GG$rt8>AD5bEf lP9ϰ<zKjIHS@l $J wYb_Rnf jLjB{ٜ h<2PyhyT# Zg7q5aޗNײK# F ;Kxc {ݝV-娎K 8γI S*k`iL^d:6čsK>tpJke۸om{J.mu Gɼ ȅE8Ot)ӌ4KgX|y`>Z7:7ŏ3?6S ggp!V%;>v (S&Fy4HbPu>{D^Yx)Fd.ql=t0ͱg nw/:|s~At 1|}' p4 /؞Û啬MFi F8͹*~{⊮0@L3L,8cFGAf oL[$|^ZJ6 rF?ɲzGsopia7cG 8@?47=!JB9Sr'֣6p~okѽ>t'dm\#nw?= dYsgRGbBuӱ8_&ct4O]Xf?p Y`E$w,D~VRqـcD҂^(6߈.%yliYX$uF}|X;j3Ⱦk9y;hL6K,u-[3Z[jaлDYb^k{ߝ|t˪o8[GWz4␕eYln}6_~89ďf/LsxsrE}ׇ'nL^y[xJ\&Yo뼝j! - 8^+67EQmmB| 4J8 u^a1WVoЋ5?*$cA^?T YDFkT;yO⃴wL5Gu5&SͱN.3+e"lt-VXo?|}UDo;/^XG;Z2uY0kt9 s3-u# "Gu! -S?i`6b'_Z7*^)@N݋1k{;{]eO\2S $ +p">YӈOZ&$[p)7=:q0@%-R:Ğ91$&J8$]~cKPтNJ<8s8猎+*D7px嵺 *; .l2Oa>q禟q=v-le^*:^Ne8ȜI {ŵ\CZgݏϹ/ i8D~x%0\kRi&c_+5_PUSާhMZД<8!׎6ϥJwl\Y2oK'Ʈo7F6Շ ߏ[|$Ƽ'Xu{)Q~I44Oa?<3μG4…%-NjM' fdkʘ_CuCZ?ڈ♚ tH\aZYڢr,[rm̦ rN2obHtjr|xPMolqU5HF[pV&/n |C^$Rl:AմUT- >,ghcwYcE4l(Ģ\l,3j:|Z/~is0hfNWtip / h vRIÈ@z]ʈxvA3 N.zw3oL2gt]c~U\9aޑtֽC*={BX%ˆl=lMOl[ ա\=fQbZ4qT,y{|.>}µ>U~ d]NAGFGSeH-uF)DX2]5MP-lt]iG1vW0Dq'JXYIf1MtXl]`m -NĆXhG;qϠHA?[n 4= D:nWc,ei_=<Ƀ/$G~&I߬AWhneԝ9,pt67)xim 1YfM@V\(n21YpײiH<1 h>Yɫr\uߪf]fD.w|}T+xSUTCP,7- A/m۵y'hV_.>b`"~;- l8LH=L 7/_u|84u·j![hpj>$ji|-isl^\\6n?35ZN H3V˜`Ek0N6fHg{@$8Ρ N!&RH!0pQD=aFHPD5M@Ct dJ bs5d yNRe =@38/&pF Wl-q54sb=bg'a?ϩnuH\B>͝huk[:uN!LZE^vsn>Vm;U9ǭ+q6HDۧ9ur4e1J: y0hhV)}NGAztcmC#=-.ArEP?a;\]!yՠց\d$o%|#ٺϭ?kڸFk?\վ/ _{tq4կ3'`܁ E=JGU\"ߏ(}x Jc }+8:rzTKXIЈXba8~S,ҩEу'Zp&3G_:^C{}p>QQx!6LDV\1]-n]sOɇwW̭aԶ.-)t򷓗'׾pM)W7)MmjKoPm:whRvvvvmxcW &?VqŋXxmYM θH7M'`5'L4K@:ƳIԊ{)>1`k%73*0S-p8`Y99`]|/q;,H;dɗ̈] ݙ]0 eyk_VsM/rߚ7MяS~"yXo-^ݴp_oY¥\39eqp9$!t,68μZAq 6m0:8w~ۢ'pm ch}P?2