summaryrefslogtreecommitdiff
path: root/drivers/xen/privcmd-buf.c
blob: 2fa10ca5be14c3dc632172852f0aac62769a79c8 (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
// SPDX-License-Identifier: GPL-2.0 OR MIT

/******************************************************************************
 * privcmd-buf.c
 *
 * Mmap of hypercall buffers.
 *
 * Copyright (c) 2018 Juergen Gross
 */

#define pr_fmt(fmt) "xen:" KBUILD_MODNAME ": " fmt

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/list.h>
#include <linux/miscdevice.h>
#include <linux/mm.h>
#include <linux/slab.h>

#include "privcmd.h"

MODULE_LICENSE("GPL");

struct privcmd_buf_private {
	struct mutex lock;
	struct list_head list;
};

struct privcmd_buf_vma_private {
	struct privcmd_buf_private *file_priv;
	struct list_head list;
	unsigned int users;
	unsigned int n_pages;
	struct page *pages[];
};

static int privcmd_buf_open(struct inode *ino, struct file *file)
{
	struct privcmd_buf_private *file_priv;

	file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
	if (!file_priv)
		return -ENOMEM;

	mutex_init(&file_priv->lock);
	INIT_LIST_HEAD(&file_priv->list);

	file->private_data = file_priv;

	return 0;
}

static void privcmd_buf_vmapriv_free(struct privcmd_buf_vma_private *vma_priv)
{
	unsigned int i;

	list_del(&vma_priv->list);

	for (i = 0; i < vma_priv->n_pages; i++)
		__free_page(vma_priv->pages[i]);

	kfree(vma_priv);
}

static int privcmd_buf_release(struct inode *ino, struct file *file)
{
	struct privcmd_buf_private *file_priv = file->private_data;
	struct privcmd_buf_vma_private *vma_priv;

	mutex_lock(&file_priv->lock);

	while (!list_empty(&file_priv->list)) {
		vma_priv = list_first_entry(&file_priv->list,
					    struct privcmd_buf_vma_private,
					    list);
		privcmd_buf_vmapriv_free(vma_priv);
	}

	mutex_unlock(&file_priv->lock);

	kfree(file_priv);

	return 0;
}

static void privcmd_buf_vma_open(struct vm_area_struct *vma)
{
	struct privcmd_buf_vma_private *vma_priv = vma->vm_private_data;

	if (!vma_priv)
		return;

	mutex_lock(&vma_priv->file_priv->lock);
	vma_priv->users++;
	mutex_unlock(&vma_priv->file_priv->lock);
}

static void privcmd_buf_vma_close(struct vm_area_struct *vma)
{
	struct privcmd_buf_vma_private *vma_priv = vma->vm_private_data;
	struct privcmd_buf_private *file_priv;

	if (!vma_priv)
		return;

	file_priv = vma_priv->file_priv;

	mutex_lock(&file_priv->lock);

	vma_priv->users--;
	if (!vma_priv->users)
		privcmd_buf_vmapriv_free(vma_priv);

	mutex_unlock(&file_priv->lock);
}

static vm_fault_t privcmd_buf_vma_fault(struct vm_fault *vmf)
{
	pr_debug("fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n",
		 vmf->vma, vmf->vma->vm_start, vmf->vma->vm_end,
		 vmf->pgoff, (void *)vmf->address);

	return VM_FAULT_SIGBUS;
}

static const struct vm_operations_struct privcmd_buf_vm_ops = {
	.open = privcmd_buf_vma_open,
	.close = privcmd_buf_vma_close,
	.fault = privcmd_buf_vma_fault,
};

static int privcmd_buf_mmap(struct file *file, struct vm_area_struct *vma)
{
	struct privcmd_buf_private *file_priv = file->private_data;
	struct privcmd_buf_vma_private *vma_priv;
	unsigned long count = vma_pages(vma);
	unsigned int i;
	int ret = 0;

	if (!(vma->vm_flags & VM_SHARED))
		return -EINVAL;

	vma_priv = kzalloc(struct_size(vma_priv, pages, count), GFP_KERNEL);
	if (!vma_priv)
		return -ENOMEM;

	for (i = 0; i < count; i++) {
		vma_priv->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO);
		if (!vma_priv->pages[i])
			break;
		vma_priv->n_pages++;
	}

	mutex_lock(&file_priv->lock);

	vma_priv->file_priv = file_priv;
	vma_priv->users = 1;

	vm_flags_set(vma, VM_IO | VM_DONTEXPAND);
	vma->vm_ops = &privcmd_buf_vm_ops;
	vma->vm_private_data = vma_priv;

	list_add(&vma_priv->list, &file_priv->list);

	if (vma_priv->n_pages != count)
		ret = -ENOMEM;
	else
		ret = vm_map_pages_zero(vma, vma_priv->pages,
						vma_priv->n_pages);

	if (ret)
		privcmd_buf_vmapriv_free(vma_priv);

	mutex_unlock(&file_priv->lock);

	return ret;
}

const struct file_operations xen_privcmdbuf_fops = {
	.owner = THIS_MODULE,
	.open = privcmd_buf_open,
	.release = privcmd_buf_release,
	.mmap = privcmd_buf_mmap,
};
EXPORT_SYMBOL_GPL(xen_privcmdbuf_fops);

struct miscdevice xen_privcmdbuf_dev = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = "xen/hypercall",
	.fops = &xen_privcmdbuf_fops,
};
'p6[%B)Ãt^i_C2ߛ~CV)H7t^et j?x۔1Yg@ `40pq{fdԹPQ+Kp<󣗴Fhѭk0Gޜϡ$n奆lrMI@dTUI:zY|2:iR* ?;s. ~i|g4~ud9|;*w.CS' fdJ鑇j/Zfx{ rak{td{}3lAt0^۬5'9Z6iyCfK/-p~(Jكy ]GWp̎WϜ+|c[&,Ϯhm7:KU`ߎTolE0\zц諒P -t<Kp7]ߦAR&V3x j [Aa5uO%\!7}br7bWNHv{^C >TTհH1T;IZvd "VU7T`g_j߸e ZTgRDRxLo+;Nf<'vkFYU4> c+ޅhu*A{-z 7\Z!$3/>B(q]^_- \ѫ.;[b"_{6LlzcWa8!vIIta^ r-u DWH|d| 3 H#K6KG lS{}ߕBsne]t uTdL|oz͠OԄl햖w&HA?_o!uoG:Y t8kTlH08.VzgAf#bBT n* "IF6IRwS*VHfS"eH_6)f6Km{jOKN^EO75dJVHj!.M&iJmU+ÿ !T=>+h֛DjסiI>n12mrhJl݆Ox|la !uMt+rT,bBK`bU40A|\"Ɂl?zj@XH ϯ XyKJѾ6}8 sb1u­ncH=]2rcȅ,KQ#ecyc2m@VX͊dTtn+Ur/Y?ޙr0#pҌFx;*WQ="Dx)uz^D^ۍ==IϦkkn9AϋlKoFLd<f<e0vehrR;X(Ȉi^7M_n,ZPkfAYm`vvoı~G;L͑Nĉ𲟬-*U9~1x?"{TrQۑm?"] ljv] -(4@$f=MȊQjI r~4##?^ww^6h &(Kc5Gs%8ei[_.Hw:,Pb,D0W8~ G9l?f?8 :û좳5GקpRIeS{>+&3 t=s.BZgʝ`p?gl3\a]EFҙWB&ŸG80AKw]Ь(zұ+D&rr\tBwE6ޔٓg&rf.b\Ԛa !$Jf#" ?AYTeS QLVǞT3LU]O 6`V3IQ[;Jܿ-T۔S%$Xo!fsDK}o|t5Rs~n{;Ud5;N+3'j!.0 ȁ{;>S{ DZ Xa4ņzR vlᙛӇ6@hKGe)`2{Iwky0[sEc[MBZ[wo1laq 1wF.nG˲~ =Jyd6ީ|rܵne|+lj94t1/"V@8|A2w&&9yǖ6fsՠUJwM>%MnWt64P[nWHv};ڑA丧_='[2ӯEמng`EQ+ȸ8J7 {\k3vh5G_V$_*UU%:AWޚFr|L8gӔ mFi%3C4*|' +@\K&H{E#m{o"ރ]\635թ`;E(7"HjZ|)RX~w Ȥ덨=`nmuB(9x 0gSz52JI1|l1_Il6yCSā̩D>8r;~ 9-P{ȶ3f >KhgujB3,I#]1F2ìjfFD-\N{vX2!܋V?;4_pxsj›sΠ=҇s!˔^kt5U${S@U1l4@m NE /U?R22"1MmnKGŠ Em`dMCPK-ΦYB2W}V;Kʕtyu3myy3 r"69XޖKs#HNvI4ȓI < h몛HC9*0,zϳZ~#E;n0fpZL 瀰 9t:WpAa˗ϙ"Q8V OYp ZtSxJS&. b$}m)Ph]]{[33zbΘfi-JZRr:>0gUTkŸ4;2MlYcFጬyr 'HFgH1 rHqdbX`id{˂B$0uP zjRY6.?o6k|?㰇?daQsɗjlm0'*+kd0)=d~;tpHlXm3v\&q!A(1v{&{)vhXp)nYC=c(j6G[/L'짝 R9犿XcnUoYpwMFfiF}}T-mzF~l6rov $=4?inV)!zB˚8/vԀB9z^t"ϪO.9ǩz1cl L Ho Yp02d wT* NzF)N9: v9bo1F3w4f^;h6~G jtT`OU˚!Nf@J\dHs;K;/KؑWH_ގo~c0L ?-8N_҃!hDT C-taѶ簸!8)Y$nEϋx#rUECM%qtG yŢɩ_@~I0Hɍ{rП3^E6fay wj18Uqhkꭽa(f4"ԙé3.3_2̜1p!"Rh6Ƿ.Pom͋]ߍy%Ż3$)6,އܛR^G!iMlIی(&:OGb5#9_\k}]T~m[x-ML֯3Ô @ Hܷ\W}|ab ~r o/ͶtR'ɸ"QjTㅮ]Y_}:zjoe{h>!=3JƄ9i&Z(gjžt{Cb U7I|WINn_ Z o71r8ęP-.8TpRF~rq3q0Xz.^Sw 2na5W<4H'zo6+"K픽? 7oCFtن~̛/aweWLp̝?u%/Y%d܉fw ُ34ۼeCGN4+}dYҨԀ;( Y8!GF.35'!\acEIqDK>~ftUܢT/o- :^[";`HJBNR/IFЀAR_= "t)GuCҲEoEkylS m| Qs)l'ҨR(CUʙ晤veiʋ\0-˘deDY;@?}KF:˂ɳ-EHwIy$;`ּ|h1y)͐+äx׼ofwȂ r2x5\fH*W{cy6)9D5⚷ (_)w‡~יZsҝ't(e.IPx0$*,RۈGCKqLoD}( UYf?+F}<-`+aa?z(ɍ'uO;֤.]aCXIRg3ǘ=)FXfo"DHHzt'+Ŝ0|Rɨl@? (MmA s+<[UЋBG)fXف ˭e O/;cSr!1fO>]?N^f9RK¥*QdV.G-Y#N5pIW ڡb%dPה wMC-Ж6.>M';$cpwE^$CY_5YYz6szݣ$ GpOQ229T|[1ޯb"ǑgE^qK F.iN'& \޻<X9Ayck[S޻__C^E;;+|~ZDy;yǻ ^eOT6Y7X=6Z@_Wne@oc{l_O]Bq6ÙTrϜvl5\HT4k7'E͏i( vN'H CmIt!q7KvO(͐ {.%cr'(Aϋ Ͳ{f4!Y@0,$Q)v`j1 9Jl^5Iϩq4W!r,f;'ޔn ƞ^ ҈ zXug$2Ij;`%{%ij(#EHq@ի83ԭLZݧ(N2ibEB'ەƊ"ڠai3cf:-$g2Z ],*s:T-Z[ߜN_I\aZJI xKIS22os>}ިwݑ<]Sٖ{6n)íH>'KxIb~P:79:gٶW$cqƵgByF%k*nFL\5<l$R9!x<)E6H8 G^@Q3l3 HeA $_X9_g2k?bSrU7葳e'%6=S3w~$CiKe;"S+^]&e/ltk$~.W-To`g$bNQɄnߤay~J|1Egxp=$&}h2PvNNt?rge#yC~: QO$jɎFǺ@Xj{l xl^${Y3 -$ߏUGMz71ίyRI3u>,?pPsL!LRS$#:@Z sdf5`jRN:]p),N#l؏e;]!$qD,x>&Sh1B|$; rqyh% P9jeһ룗4.z L+hLěxXJM')J蒓~{ջNC@6 :Q5'~oԏ_ϝ;"ϓωGM2ʛB`OX! bĻB, eq\ "(djhh˯Viv.S%VN?RiK:X }NBð) V F"_қYe t.%" `}h:0`h4"8Xf+z]GԒB"ے fV^RAU)Fj~D0-d3`U[gΞ'0()&CZ$P/AF=X}ep#8 譌,Q*3t$ATXɗʵ "--xHhXk1-w~ܓ2d,ҳ 7@څђ<\m獘]@ӑ4j{ )fLJ?o`afɺwG-`ryQ9KMfJYΏT3}/ 4=;{H{ Q}6qwe=aaV*:M#譺6=onuk@rȝI53'k ǜq??^9xwwvثE;*G8ˈu=_ȑz/dE˳aw{NE[kⱘ;=zDnNZ2JmOeRSrT-9&&|@TlԠBql*wgľqB Y)0sJ.Ne9LnG{Zrq@Ow1 Gaظ؏V7γ.\ms<  ?8ekzgNIRq)+`fbʷ^єl 4L/6ҩ/9tš'TׯIa^jVQ**=5FZ !p\mEvvorj;KsVyu&(W$Hj VxQ.Y*.4w$$3[OZ"au`jSp썴 o1Lq{~ew룓(}R4}UC8g51*7rj*Z*`K5F8hLW+DOͤ`RQNq3NE;k5PtbOǯ[F)q=5UQ+Uf)[ej?Lv1s88byC8!$rB!poo NrrT-/JnZf{_,L%d7Ԣ-Czֻ~[R:Yzޠj=t픕jvf3e3N ivFtQync{$Ȧwv.n努vSS E,ջh;|lL#XRY[ h:RNU0ٓmV6jq[qG4ɸ@dR,/)TV9[Ԁ& f~E˸ \!C+I\vHZآn^*P8hzcD^$%hqוaMA>p(VG@n[užcq4n. kHm!?;GkckmEdnH-|ȩ5ӊd2C@c$l:?!גSC?K7Jpy/!t3kR.VP;NqA*g3ymRǺq+il,>0YE-$`mNщƠBS=5,(!i A3Y[Jx xernru;n?VW&Z\Д c d˓/E˧ڤBwmn9 J ]S䅶Ƣ:; \pw.\jWlNz In: j2wI$~|ggwq ׾µzpYI0+25 g~o}{[RprcI3JlVZ d&z~JUjQDQ1-[o\<\3re$|m2ST?F]z;~"r pyڛݴuM5}CkǪz>ZX[L'IjZ"=Z 23&JvѽثO&!711h>HwFcrH%0$Tu?L&FAsש/ Unf 0i3 p?+!궚' "wʴq}qw>3n6=BJE'&5v:yE)&0(j`X<ȫGLn)Rp~ JX˒EA7ʼnʶ͐'Úu\r*gbJwb.cH<'9=fl7mcS!)dٌb"A'R{pրbVHo*d%WgwKadpy5]=F;+XAy1O m5b{p[xO P˛SB5B\5 uT)]sTΠXQJ%dCEh}<L&oܫ*RpqrgsOx-իφ<.t!^QieP^c)Ŗ*G92KU<%a5 )&:Nttu0'I#~/9 w ,Y'yd6dG P$K\i0 ˯`鵺&ZJ>31i' L׉i5^^7ћdXD^*ȣu 6^~ӝ-hNv(U`< ~/yRrͿE|x#g>3.jJ( _j}9/\ ٻho݅_Z˹m71H;>3X-Hr n-`w{>GWDjeMZR$6Aa }<k݂XbܬspY#w6Zm ( \{V!z1fU;$3 5}j,̄u esQio9oC jޖNduE˾gCLRݦQ'M;Cꂙ_?SӋfJ/=Fpk;O\ 7mź7𬧷j jTDIO~BąssA%c3i{i׮fnXq:bvUn>Aj=zh#wA:9ZX4ksd%aFHߙ_`%]#ZW- J+//,Ɖ.Ey&u8)W1 (6 Z,bG]s}\d2 ݧ|o7>G~"41aU*٭}fL{r=iЎm;%tj6yLCrԟN; ,M'q&HBCs$)Eӯ5EUAy&j37uᮛ_ߠuH˚o;b&^y2z@0f+ p71 K@G/\m I%_$+ӿt7 I.^觃CDzbX5pKM{#[MGzQM,S廌%%I+xKY|dc"Yfgk(/3 (hVC 餔 _zoEg i룼Z|nhqV mJ{]m {O\Mjd[nvF#!W#ղO6*t0d"M38p8Q<`ֳLAM0Sf- N-D$T,CfwnAݱh =.=?$=jV:Uz?" >XGO3kBP9xj5J n2[j E]Uk_Te@p /w)O%cN ǟCBfCoS*fƶeN=qSur`=fd& $Ym)J9kߋ/KKNR0u1=&y~G"m{1KqC9O#1 DU%X-V1D̐v=!D 0^rSǬE\[W]hhW(݆kkJv0l7ۣԎt[Tw}X<2vNjf8P*!ɩ00<1gg9P&A܍;қ :NvGRJoo*-I̚62I<{_T{/Y N{KUXQZ` UPҤpǔnq^-#`. S֬aC|l\x^h/A3Yn;]/U0R5*ZFO՚*u+-UtmՕt+duCը g(~IuH8No~I FwC&twdqx AdkIٖXw/b!+)yKޘh_eK@p42AIA0A!<@ʥZm@ҽ[*7UOz8D%  gz~UUr S4Tڔ`9 /!E\7N6ػL&?ÛԂ3z!I:0J8Z{4 EE#}o =2puaxg nҿJŧ,+CυK:+;"ujb MFE B6ڃxW<;N E&|kC4ȬVIɁ|(Д/1SX{=5m8e-YPKUKM&Ǹ0DVY 4GUZnUzp)xS77%ìLӦR+@ D;3[0# hIgoljGbϟL9ۭCPɂSR'Aϖm#+3)H4t]%ɟnMqSu-s3Mae寜(iRTV0H#;fWVzkao:PZ@q\HR>WIJ 3=iM ZT]lc&H.6 i}4sԕ҇vN\3oͤI\F:^B5 nkAmtG@O{$tE~s4¹҇7|qL!2m$"ypAl{R8ȰIw1#8 W?c ``%AHP-TJi,ԿDkQ򥍮aT{oC1)q/Ea !jGAr_CGv1or asJ4j4ߑ?`h~B}|԰mY\ D)mrS07.^z.r`k2 nVj #oޯ; g?ʹ?uПwyI5jL&`-k2qu7R1g;0~|mٙggBɎ7st!dbp;K 2-b ؎}ȩS3DTJ2 Z- bt^|bN\Ze%(TFˏՍSTڛ6pEцKGg9.ڊhEYRp>Mڡ_0'{./Ǎ߸醖oH S0 _)˵W ;@tW|l?-le\ߏ=-k+E"aha(՗d9I]BDNL oxJ.Mx.g_se0jNCOo޵b5bq{_ȈGg 9uo53[Bg.7I Qnŕ|*BZe^LR,E1>lS 曘́7_uI=g9 ӒkyN4_'XԐ#CWCZA-P;NŬ`}9cri[6 G0h\B0[ īn )K&pV|4xR9,][&Zd}((;qp'dIO6zF$ՃdMh»`&?ZwpHn\(>̓vS~1ВTTaR<Ǩ||B g ɤ1Em? 䍽eѕ;[UzFJ-} 5#=#lyW;Y,M%?sS%4K{BHRYl`IPՊ槕wIɸG 8& ;wwȫŋ%"ϒ7=eVC[{ȵ0[NҭwQSH@#\H^kKQeqP'Xq ._6Q*hvCl^(HA"qDLw8(>p^Rgyp x_' )m{ar حd'AvF~x:Z3BS{"LCʍYC̃}rgO(8bH,ή_χl$cDE'M"ⰐbFr(N,uK՘B rk\$LuRܯTdTUP)J&7\h!cҩ>rfUWcS,ϣ|ի}egl?nQaxQ۟b/"pu;s߃ Nr^^]A,Čhnc/#GDcVG=VQ^\s-aot R|zo4k}TvJaH*̽ի*ma ZUpqm/&ˣ6=gQT:;RqPn FHc;Nj]zg=)\-7^I[ mH[T.$>9&Kт^)Fɤ$@cɍ攩wXhw=DKt28>ykb?p v?~rG$gCC*+\D.8c@m=lԆۻD-jv^ܨD}z\dž.?;gСo("gs.VQ*337qfh'V.;#5Prkń6NQh?w` ^=vc.P[<Tk=R9)^0:Zg莽ɩ?E}Oj+, ۞IPyl^襚jjSA}1OU _{o:A9wRJ]ņ*Vɦ$+ Yd[iw dv Spg=2UOFY%*W`(0 q+smYk\R|[`QxzW> J'.5(.8—& &cM `RVd"ZXZI t9Et0Dah8gޑD,Ca;=oA3K{osԝp7?>ȗjE*6Od-#g{N`ޞbL`ہ&ud9>+μ!t>L̩Řñ*LWV\WjEpg86}[}6{sKjX80%>0&N̤L+v ~9 )Ȃ ú|[`6 d&~G9C>dlıޑ&l#$|+ctxunl@ ]N ;'Wsr) Vc/Cqp (F |ɯUr`zH>$*fSAsܑ`=Mi7dfbVsOU8@6HmekY-k*+J4;YGA|t/9Go/|qgtWݤ$kqBuyB@>Z҄1 νf{W->z[,wWn!^H-^.ѭ S/lF}vAV$|?$` ҫĉ]qA\ Wv9Bΰ ֈHd 1kYm w$@!sCSIr]3XUkzK/ܛ4֤`@ &ciEnށkT`AEhmAtj@#fxzq,U,-B sYN6)u%/\/{ځ `Uh5# ?zl/匡UNnIߨill4[D8.?'`/= /h8ױGޒ߹fi:G9W60orqkFyfL뽋f6|Uc6-C_ɿ7mMFM al,ȋwSˎ"M>ZMGYI52E$ Z=>PtyCv\qxtP/.iD3Kʟ _?d풱1r,}%k˜1}f_8=pÁkvGZ= |·| ,. !XB٘BN^R$yGXH~S Qdc^ˉCr*tEKqOVlm3W]$TJE`d]CɌNűjؑpsNRPN2d/mtx;XNttf%q@884Fd  iqmk``>MGOZ4A3`4L+׫OfFSS?>phx{ FZg;9F./ļ§DbׄQ&z&$DʯF+=dd,Ζn%::ߘ0рh wPW͇۾,Üjl |^]f>h6b9[RpL&#P0VG[yYn9&9''ě}GAR{6ZkZ#̚j\D[We3 YRyyM@Ln\E n.A,7KC\v ;_=p.5a4wmq5Σ%@<燝?%aJӚLg4 ijF1tQ09N64-0{7J0vzO:{I8G[`p3 |lD"'NpquGVtHԫ+`EKtRlҽs_Ovɧ}fW\rYhm=E&r{fUKB*G)j̛c܁״Qf-GuqI),! &(jƅŝ  Yw ,d^EXɂ =tv&ᦣi,z p6pռ|UWS+a(k}k/XƘmUx(y"ͪoV<+Yެ.8~[o߼jMY(౔ l0=?r,ZǕ(*5QU,!|*}5,-|T]ܑ@ Rvߟ$RZ9>c&Yn(iz Cm93q6zE |AM<*y.X>ޣSW%wd㼼2 Ef3Uq]P 1vnUT!B[#wEzY &{}jfW-J|xsDx&ӢՊ$>gP* 4Rd\t;REZdk Y@VƦjgI5%8'[gK&vN}o@3dc0'׻rPr_0Q)XOfb@n1OZ&ꛒz}B;3Wz@pPJ- :vd467`odTœ4!1|j4sm⩨*X7/m/%_,r92g1`nRU>%K&8b(!~uٷO9UQ')f+HZꓻǏWUR]5-qR^45eӔ}zX19`P{1d7vZ(Z=U-}qPoQFQ8ԴBSn7)6X eu jq9S'eT%$QdnqضgZv~Hϱc=ȽX'cM,)2c+S@40ѕpA SH_<uF z=RF4tˈ,Mm?d%va;Z^nE 򃚭!9\zOFPrp)iCu_x.$W \PI$|?S&.9T;Ƚ}e3})g}2 5u=ICL^_HhZ6-j׶KFYͅ=nߥCvaU`Zꖐ,sg>(+p;rG5j8Pe)[:C.]ړuȲzY88h|v8/q׾iNw.D|v6"MMdH 5_PYq`+9dy{=@ JԽGjU+":[#a*`y6D.A&;q$Ý|g(t5J9"K| Խ93irѬe:hd.H0Рѩat T-A_ {D@aݠU' JwШU_ʽoTAC0K*18TR̰&6C"HV15>\p͊bjASq\]TQūmC4ÊNB ]_*rvqId^k1i2}*5LRH~Υ))PLWq@#ߑ㿜K2=҇ݒ. PU@;F=W\}]qojp@\K~>VGv<~'=3RC| v.`sD bAZ޻=%%tӷ`WAԱԇ[0k̯u˜+mIgtЯkzu-u:W-[RSDiރ^7y&]lK?qWR#SSi&YwIcBGxkUmi6``=:̮UW΁''ehn>DF[A tlOua\oGrv0Ix0rzGG8q"\)\O0(@PrXa=ǬEbUz[sv0>2%% x)QjFSWZ*RO$nQSVQqK.p ' W][̈*G~-%3?/.GZC7|;皂g2`N$mC\f}|6*ҙ[r~W}gdwJ )xvj.;|rUJi >#>#%8 }ag̚=Fi9^[,*Hf7$)tm4w i%nJh OVԎӔ`Oeǭ泻  h]/ Պ4j֩,; g("6a2bG Qq_"to'Էikdӝx,@"ao["˩I_|Y 1B[ֶ5qI1(η:erڥ XAoQ(s;HB`?E6o Qw"[]<1+GDhm_ÕY^Bޒv˟~.-óЋٚaic> k.2n&I4i)QY+o oEjrb#]_G A .aXHg׮d;0dPձx}.MЙnwHU#^Zjdm\BJ$;zi׺()Ͽ +zxo_G9gB>di~ަ_g@FȰ8+dPժ[ Wg=@k'+ۛz(b㹵Bvn*n۬${ KVz'%Pٯ@"}]5N.8.kZN=w$R|.e{a>|f|&nI"T=; ڬDz5TFhCkUʹ_]jqV}$3A6k/"؁J<*vi\kj\CrGb׶g3+ڞKvс-L]6vP(_y?u<_oػhr8:hd2i9P-D[Ŋ40H 3'eԆ7B:$9}BR:ueAJLAJS*NAdž) > =4o2Gɕ3%l&HM97mI<5,?y;Q2adƂIa_kR#ˢ[t ܀t^LB86áwYJelVJ!hq2T5YbP8%5+h4`筠cjɋ@)=6QKZ R~{SmN =&iڎ^Y-J Cz?mԇ\R ]?tȖѹf3&A:ncZpͦ $%}qsb =$ٕ$s}f9`WD #SkGIG$ ^`M#?x"iEriMVSۧ bKXz6Ǩrvpnfc 9j+/챻x!q #JK$pZÒEUeR|!>ej -fY*g=PlO+TjsQ>6~jwzat *#I@?`h_s&DSC 4YٻqWsT+lB#z릮1ȿiȪY}}j<>p8I \-oT"#dBm}㋰Ѐk{trIZF@O.hǧ{ٞ " o ֿF^yV&rB*V]yb>\znfs uH l3Ђhp;TLh`$SJxN4&@P{c.1;Er~\KNk3JExKKJ农7_N K%{bI$ u[;%dh%]8OӄbixW+<_! OU)q=:^Z76ٔ\ 6oܧT14])Po#{ Ya,NwX@OTc&1%6Y`XD:@]EHP ngKE r/]K^Reqj_6..ke3l~w~3G+7Tj@L'b_̬w/} Gv^9uVb##+/vGxF1|RnI5o!%}Dow ӌ?ima2tMLj#6hj%lV'`݄-x5r"H@2{ŝ3?^lmxY$?x,>j,h;umm݋ mcY#pLZf 8NS[4ҝr[ۮ":4ޱ7VG$~;e$sYQN5b`?߽{cG-[a 9 IIڨ+W r5RH:?HɅuS׸ûkec\D_]u|?n RIA^."*ҀkA$RC~SUOVU SX5"|dRni,q#Axm?`PPʗ%*;hM'ͯ#9Frr7S-nf3)%? a=3=) kk) l7C>fZzjRLRcuݩZ3s|s=N#ҬvJ#g=U]v[eߋ%/ˢ}Nh1xᢷvleWv/`ZvOZ2|i;uw0)YZ*\&nMc6#f%8,J@SXK˜#hKN> 3Me)x?UqI9 i-0j }Z3$j]OS"D[YF+^<齍Jd/ x wk{>L960. FGN|2,z[KM@u3;(`jcʊс^;}Z']vWK )K鸄7nt\LrbozƉFyPd4]EG4I%\ӽLMy.|ˉH-'!hf@7 .xK`\V'nC 4"98K`sP_lE(sSFV@DIFs=HG!iCI-ht9>OZ"vǠ_ݻ.h7n]FٕyU\NնKi*dYo]QT6ZT)vRVyx>$B];?wb1Ooƣ^Zv_cI[{,]8zxCB"Y: $B=A I,!l`4kn(`=ww"(p"|T^E\v?vt5*|{bҺIkSK;G0\_;g x$DTbuQ+r /[bL 7:lhjcN>}B)v@a۹ܧƘwRO>B!.2m  /~'ƺ~xpp}{~$, rf'&Sw X 7!p<:"ºIN\Ӷ@SRnk3w9Nۛd>+EoR`5} m=ml 9w+n\p#u恡%Ff TbL4f),J?#=z"';?e.v.xc/*x ZԓKT'#1t s#5iVRm`,p|z7]|ٽ{# @f٩VpU ^>Iɻ3K6W1p?`bJ_&}H7 I1-3eu"4Ÿ![ޘ͗o һ` #/gv0W?'R,hlG<(`3 >/|%̆mBf,R;{ד)IO~|l"MZGv40IDi!-!U*4 PE~6y/AY:5QGd>lus͵\簊0]]~f>m X꿎{99\g)1s\HJ?t!꒝g(SA¸:NMN'©i~IG(I"Fօ[d_: [0ZoL9OWw`v+h<1xdI#$YOX20Tv65xyy9wlf&/ibı9KWI|3|1q=VpdVNֱ[$=*D֜'*B1}ȭZܝ4|G'][k&\/O#Psa-^^N /2RJ.Xqws _tʸ1:.ϵZkk{t\i[T%[bSҝ%۸ Z@ǒ_&Z89koh[JY:'Vll24lŢ^{@M j)yQ@.6XЛ@_Wv5jEx~[=*ekrМ5iRot [z]ZÈK7^u相=P7T}6fd%珎Gt={"r Jպ1 RYOtgGD.yVA$ &vhx.nG;q9vfu9꣊Oͼ%5% ^ȝ rvNեc--5otnp~|1^"3+Bf6N!${30!t#?K~k`V9z[;7γ3CzDO,.>u`\C~};=|]OzⳝS㥟CS tJ|n.NJj}WcKhy•lw7QҴFe{Zzd)I"y9Q/s }>ĩ;>P,~KoH,zH%JO<nitc䥓Z9 4`a즋.<ٕ9D@q:y'1ߍ! [Vy;[acDasA&J,Kmథ ( ✲x; SQGa .*H ( ?6StbdO!i*=[Rt"sItwg2xξ!Ɓ@&ba zL7޻_vp(W~ZჹG 7WH+ZS7#$A83U%Acs(м]ْ_A9=T `'<] ]ϧ !)d~{g OI>4p9Hymo /lE d =΢u;641ڛDփ/!/Nrc:1goxK)>.&϶g,e=IMEW_] bl 3s2wҽ4gtĬjn߼]xX&җNDZp7C2ǭ5_?y~ǜQ>)+4#)ttc=?.lnɄ4 ^RsܬNlZO|.\lyŕ?GI|JǤt %&6PW;W.^P|v"W5{&H64._LI75Ͽ ^ ]++wA}7.k ?ÿHuVgk5u'@ /bTEΐJe)lژHIA,1.@vݝm.sɕ.!2y/R0259lL)HܧV&U'G^!N ӘďfpqEr^M8ޤh4߻qTbV^0u8z"]y>~{uv3vj%zf#5<.0#Ѵv7 ǗfsWmHeRDCn|$F6XAЏ*!D'J oG=udGW@`z[h≖umUݤM8~#ih͜Z ks"Co^|*tLfm'k%y KC+.\]V}:_G!ϐUI h4Mk;(U}&3٠`{7E-ݨE?@?TdZ,:`6x_gL#30WEz?~E m]cQk!ѾɈbYe:UwbiB>p]4v9B7M'NY:5ѽ׼(Mgx{fY5]8l"J6i&ʷG*W9n3Q 1&X^4l9ZrI0LE@ 84S/ǔtř_) #!T`c6[*(:L%M1qNTvu6ɛ@W@RMcs98cֈ/cufu/V"ǿ\>JW?×,wGtbNcnI_0vF 7k2VXY(>%upр AD!% C-Ro#d1wR'}'HÓ@Hr߸ CU=24=ڛH2$:SiNפXr"yZ!ƿ n:I[9THG< xr<"eS"Uхf0wFϩŋGsK8bT/ք<vx<ї7w1k2Q~*%!LfBE?noRW+{b2IoWտfxQ3$ &$_?Q%)@pqIź((r e]l=fsYhIѦdY'-l| +Zdhg!-h QQ tcX]M!YH搄 @HS'Yܚ'٭6ҁ%DzP7=蟿׫0%aFo_OZ(/Lń "Ṅ1 퇸^%F$4ҀHPI(p.)̹#)NsGQxy bH*k'ՀvY?萡13SgfC>dgÀ9sr:CxpsCtrp#q|=&2vk8k/=;%X#ҙw~fL"&z+XИbӗj3zФ"!9"qp5?+Y? h/a`086ȲC1*J0 5m!>8>_nߣ]?,=}_ʥ_Ɵ!_ѿ+5lřOl S71^>uM&N:( ,ӣi;\o E&(sFPsvsϿD7O?]idk?RWR ])dႆ]PH/Rrrǔq퉳qm5,^/Fop?d/*&8|h]c_2+2`|w'y4Oy-/n:Zezz+g|n"#bm6GK@ٮ)z.K05w̎z6 //W Y&%a?c|GzzU\Y H=DzBE䱏+ڑ+UVϕϕOTժVQLٶ%mb>z7r@ѸkD6WV-iR1:HOoڙ.4}ts"WMhLXKuTEM5[4wܝI+'{f6"/ r{ۡY{:?٣/Qw&NH#r70Sg:z9C&|aHc~G J?\3>. `(0-ʙ6\dUrQ P)CI]-`8CBP "tOtsѝh۠jKN"*5ܝ؁;{r1;^ Stzwr) Qɯ>#gY8J_գG< ~;=_~Rg*8TYBJ AG1h;Amc7:){&&S2:[˝O |KWygV3֥?wB?"5b'9R\E9GfBbR 3Uޖz]yE'C!.0eJ$?~7'uG ؠ5@\k6q|Lj2?oskp(>y1psg>Ϭ?}oNWWeY'BU գU')Nj;q[9}KUW s <)3#, q$'zW8 &͋}t߶Bq)&Lv(HQlKb$ƒ#Rqrdy>UU=!E焻H`_*/ (9%kVN^Ԏ8tAl=@ '"XK/`\$ʣ,KUJ`40}&<=܍ 2QyM0 (UX;AvN|u*F$ń<8kYj~ s Q+)E:;Z1J鍻<+Ěsƭ>({6N(<7Ɖei\:m[^R2A@„ϰ(@iQSq3kԹAMS#*'2Aq)™^LB풆Q-O2KpСa +WgPnvہ|+n6hSj@(_)OLbA/}f[KP?`/}+`0a|)O8߂~z(GMI D7D5-R^6cQUKIDURkiHv`= Gy^{R%B-'nZ۠+e| m2?JMp[hU?=V 0lOx-Vgp5OF{>h<PI9΍edQ 9 HT J1sN6y?xG󡓘VrZ,}yѶ<1=J<~ߤOm->9u?3N~/'tkyLZ7*4a{i>“^|0 jNZSǩh?W'jZskΰLDKziQ:.+V=.A㼯)Tv[S-.8nUFRG섬{xptvxѾ@H N5K˹NKк9|af@NX\~ ipؼr=]4\:5V:;CD,lJQy6RY>+V$#J_wUdUκzI 3|/k!qჇ[S|wOʫ&o@Cۈz/n\*@[=v-cRlj2|.HV#b9Yv+M.I2g& *1l"hŃ-P.31hnI{nwۡDM _8.y^έF;ϐ&[{Te5,d PS&wu7a&Vł3Z`jЗ].T檀3ux_qWEoe~MÞ.lSoY!ܤwZ>'%Fh)i@K #?!N@9 D`hg kHϼ=4&V%ǩ OMw^Gn<< 4Ӡ>W˂^Kk?;_T#̜k-|^[ |ĉ[C ^(~M›xMpЛono5ִ6 C8~g{র8wvsZ!p1{oۇ\i6{{F-{;v}n}^}t-;O96[o-_N[ĵ^Ot\tTdkS~wi-V27^߾fݻ5urQ}\hD57;JAۃZGLjB%ysxYUot-ީc:P[z>)je*>l-b.{{ #_d"(}u'6+(VwpQ&s% 0%Xr8NJyJ'QU?t5ϷFSkiM֥(@eGP =E'NuSE oU (>W . IäK$؇~FdL|vE5ڙJ4]4E%;."g1WϙS-?tN} LǒYzIX"i$5wnyh^ǎ)҄o|+\ 'EٗyDa6Oۃ{{_LXL  ;f~Kg(/ bE5 7tj.W_u4/竉 @ {,L>05xmjqMpIEE#5I.ˬH̼bEqPPotBG)S,)Wl G5OdgjFT?,;(w1Kqw8viB&uO>n?e3$EͤdNUU$#Pֆ0.4,L_q1gO8VxA.U+YN#G:}It c'4$U^-%w;> nzQO"O1w v&d8 5YјlH@@"E+AE&U5A^b\r XPEpMlLLKwyg)om[udOky)(:8;[z]om8 }U)ƯM~ٺq+,;;%*R`!iKHźy$ m͗8&А9͎ӬU6Z9NVsĽ5jaǣƟkntD|\ӭdY1!{xeI#I6^-Ϲ M.xV/m̓f[z =iF3Ok_"MӨSN2?*'}}^7FH`DZ _66亅hIGa1 ^UVn1u^bPS˻}hNWշމ;i S8f6X/֬wl~Yp"r9_?\??#~أ q*ce0PłR( ~|N$a\!aJhRj2|NOE~A iHz2BFIjtD)`,_3If&*|է[wNS$nz) ؉hD99a#a`11jKC-DO]t.F):Zq+Td#;0{'Nr/߸b9{8rhd)uשR|v,U7 :6 (>o&D,:Y8V \ CB I%z4iжEtOG\∽;|<I,B >tYqve` !Vyb*J8qEO|!œV M?8jFħk2=(QK QAeK@Nl,f;oZkh٬ȵY![+[d~MGܳ\ |Ag(mⴸPuЕ'+MS]Io}?C.LB0J*js!s0H^f8&}IP*ZVt[8ݙI3)h#1-xu8 ,ຏ!K汓VKE9k\"oV7pNϒd R=j 6)NhGҢ/ 2fn#67t.43&bpHPI9Σ ՋEyf3-q WGŭsMEN!A.#L|X8iQ>`/~42@\wl& ^.ԁy$_չ*yt}t#[ ȅ@+1"ȓ@X`ǘWR)f@ ~nEu{%LD6 ץ9@56;>VSYOo+3&mx/?vC:qۃ/ ȳZG鿬?1>aHn8;b1Cy2BQ"Ubs1D( 0bqd;?̼PmЪdrO Te v"\Nm܆*`~r&"p*:a 90:ʄ GAkȿIk KĐgGgV%VpX¯nW3*p;cxH<ȴ ;"xhuNBNՋ|ct*jKG!{ U9K֌+!kLǩL P"gEkX3q>qR{I'?{RԐ/𹲎Y+ p2ߖYqS&w)&:MwSʧ6z.r Q/3XB6\1%!eJ7E CK qn2bct7\ߧMp&"[\I3vj}$ \җt 0+Ģl BXpOKx 4j~{OO\RUj.Jv!pzO BVɆ29@GLɩU=UjDߩ#:*_>}JsMun4"ӮykRڨIn"Z,SƸ$s`LɌ<1}Cyr';MV4{CCy۱ly$ &g.Q2Te͸xag(̐ # i\Ӿs \Y~|O] &w *@Y)Q -@xKe"J,Tq3}}ZW3 hu_"3!#w=7vG,y 0&Xq&YfF\H>J3.}=Nkԝ/.Bu S 3nWЙ h8,t2Ojır)*?C ) IE"Hra ۏjm Vf]ﵔʞWԉJy6M!{eurڂkF:L?  xEyЂKs63΀+T]t0Tѽ9p %^Q33N`ĸ,친gs.OL;"ٹrɕ! #Cچ{knu%f.c RFI62`2ή*=d34\~ J:| &6%9L¦=驐ӒY!i r3 p躿L `^R9=_=tΰSu{CD4qV ۛACP7mWl=ZD8|1*+9;1<4,y4Ud wZU/82`!?Y'XJZ\3\Eiy%뷸i]{-^N3w3L֚"vQ`iQ`W`SSڱ1Y4ZnTC-Bo4jPYf0IQKruVNRrn^jJO:Y~(D=9>r,\Vi%{~k%E=tɱ.n V]6%.nI_~Y>$3Xvpݍ[N}0^O۰;Eb!+OFlOKc]m>宱4=#]T>ڎ19/;3llIR1 MV =Yb 1 M$V22_!L<5a5\Rnׁ*$_O&!ZQq{zWn p{iPJNvXN9ɮNب̅&'}i&\X[h S$׶yUPKW6Ҝ0Dc@x3/[K21*M3 FġEG .d'.\ .R&/g*R?Oa}QqÉ^b ;Hn=:0 ⫸yKhC}xt1s/ jBb3JHg;]ꍉݧw̤,ԫyUcsi+F1בnd(vPglw ,Mi!;5)T%kpR1:zl"tmJ.giV>dYq`mXWׯ`I^ :I0:>9lliت|9 `́4NyReܺ}5c>@<,&>7G$Y^LV@Z\ +31\Ř;N!DZ