summaryrefslogtreecommitdiff
path: root/scripts/link-vmlinux.sh
blob: 518c70b8db5078715be6f142f6103a714b6d3063 (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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# link vmlinux
#
# vmlinux is linked from the objects in vmlinux.a and $(KBUILD_VMLINUX_LIBS).
# vmlinux.a contains objects that are linked unconditionally.
# $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally
# (not within --whole-archive), and do not require symbol indexes added.
#
# vmlinux
#   ^
#   |
#   +--< vmlinux.a
#   |
#   +--< $(KBUILD_VMLINUX_LIBS)
#   |    +--< lib/lib.a + more
#   |
#   +-< ${kallsymso} (see description in KALLSYMS section)
#
# vmlinux version (uname -v) cannot be updated during normal
# descending-into-subdirs phase since we do not yet know if we need to
# update vmlinux.
# Therefore this step is delayed until just before final link of vmlinux.
#
# System.map is generated to document addresses of all kernel symbols

# Error out on error
set -e

LD="$1"
KBUILD_LDFLAGS="$2"
LDFLAGS_vmlinux="$3"

is_enabled() {
	grep -q "^$1=y" include/config/auto.conf
}

# Nice output in kbuild format
# Will be supressed by "make -s"
info()
{
	printf "  %-7s %s\n" "${1}" "${2}"
}

# Link of vmlinux
# ${1} - output file
# ${2}, ${3}, ... - optional extra .o files
vmlinux_link()
{
	local output=${1}
	local objs
	local libs
	local ld
	local ldflags
	local ldlibs

	info LD ${output}

	# skip output file argument
	shift

	if is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT; then
		# Use vmlinux.o instead of performing the slow LTO link again.
		objs=vmlinux.o
		libs=
	else
		objs=vmlinux.a
		libs="${KBUILD_VMLINUX_LIBS}"
	fi

	if is_enabled CONFIG_MODULES; then
		objs="${objs} .vmlinux.export.o"
	fi

	objs="${objs} init/version-timestamp.o"

	if [ "${SRCARCH}" = "um" ]; then
		wl=-Wl,
		ld="${CC}"
		ldflags="${CFLAGS_vmlinux}"
		ldlibs="-lutil -lrt -lpthread"
	else
		wl=
		ld="${LD}"
		ldflags="${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}"
		ldlibs=
	fi

	ldflags="${ldflags} ${wl}--script=${objtree}/${KBUILD_LDS}"

	# The kallsyms linking does not need debug symbols included.
	if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then
		ldflags="${ldflags} ${wl}--strip-debug"
	fi

	if is_enabled CONFIG_VMLINUX_MAP; then
		ldflags="${ldflags} ${wl}-Map=${output}.map"
	fi

	${ld} ${ldflags} -o ${output}					\
		${wl}--whole-archive ${objs} ${wl}--no-whole-archive	\
		${wl}--start-group ${libs} ${wl}--end-group		\
		$@ ${ldlibs}
}

# generate .BTF typeinfo from DWARF debuginfo
# ${1} - vmlinux image
# ${2} - file to dump raw BTF data into
gen_btf()
{
	local pahole_ver

	if ! [ -x "$(command -v ${PAHOLE})" ]; then
		echo >&2 "BTF: ${1}: pahole (${PAHOLE}) is not available"
		return 1
	fi

	pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')
	if [ "${pahole_ver}" -lt "116" ]; then
		echo >&2 "BTF: ${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.16"
		return 1
	fi

	vmlinux_link ${1}

	info "BTF" ${2}
	LLVM_OBJCOPY="${OBJCOPY}" ${PAHOLE} -J ${PAHOLE_FLAGS} ${1}

	# Create ${2} which contains just .BTF section but no symbols. Add
	# SHF_ALLOC because .BTF will be part of the vmlinux image. --strip-all
	# deletes all symbols including __start_BTF and __stop_BTF, which will
	# be redefined in the linker script. Add 2>/dev/null to suppress GNU
	# objcopy warnings: "empty loadable segment detected at ..."
	${OBJCOPY} --only-section=.BTF --set-section-flags .BTF=alloc,readonly \
		--strip-all ${1} ${2} 2>/dev/null
	# Change e_type to ET_REL so that it can be used to link final vmlinux.
	# GNU ld 2.35+ and lld do not allow an ET_EXEC input.
	if is_enabled CONFIG_CPU_BIG_ENDIAN; then
		et_rel='\0\1'
	else
		et_rel='\1\0'
	fi
	printf "${et_rel}" | dd of=${2} conv=notrunc bs=1 seek=16 status=none
}

# Create ${2} .S file with all symbols from the ${1} object file
kallsyms()
{
	local kallsymopt;

	if is_enabled CONFIG_KALLSYMS_ALL; then
		kallsymopt="${kallsymopt} --all-symbols"
	fi

	if is_enabled CONFIG_KALLSYMS_ABSOLUTE_PERCPU; then
		kallsymopt="${kallsymopt} --absolute-percpu"
	fi

	if is_enabled CONFIG_KALLSYMS_BASE_RELATIVE; then
		kallsymopt="${kallsymopt} --base-relative"
	fi

	if is_enabled CONFIG_LTO_CLANG; then
		kallsymopt="${kallsymopt} --lto-clang"
	fi

	info KSYMS ${2}
	scripts/kallsyms ${kallsymopt} ${1} > ${2}
}

# Perform one step in kallsyms generation, including temporary linking of
# vmlinux.
kallsyms_step()
{
	kallsymso_prev=${kallsymso}
	kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
	kallsymso=${kallsyms_vmlinux}.o
	kallsyms_S=${kallsyms_vmlinux}.S

	vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
	mksysmap ${kallsyms_vmlinux} ${kallsyms_vmlinux}.syms
	kallsyms ${kallsyms_vmlinux}.syms ${kallsyms_S}

	info AS ${kallsymso}
	${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \
	      ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
	      -c -o ${kallsymso} ${kallsyms_S}
}

# Create map file with all symbols from ${1}
# See mksymap for additional details
mksysmap()
{
	info NM ${2}
	${NM} -n "${1}" | sed -f "${srctree}/scripts/mksysmap" > "${2}"
}

sorttable()
{
	${objtree}/scripts/sorttable ${1}
}

cleanup()
{
	rm -f .btf.*
	rm -f System.map
	rm -f vmlinux
	rm -f vmlinux.map
}

# Use "make V=1" to debug this script
case "${KBUILD_VERBOSE}" in
*1*)
	set -x
	;;
esac

if [ "$1" = "clean" ]; then
	cleanup
	exit 0
fi

${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init init/version-timestamp.o

btf_vmlinux_bin_o=""
if is_enabled CONFIG_DEBUG_INFO_BTF; then
	btf_vmlinux_bin_o=.btf.vmlinux.bin.o
	if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then
		echo >&2 "Failed to generate BTF for vmlinux"
		echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF"
		exit 1
	fi
fi

kallsymso=""
kallsymso_prev=""
kallsyms_vmlinux=""
if is_enabled CONFIG_KALLSYMS; then

	# kallsyms support
	# Generate section listing all symbols and add it into vmlinux
	# It's a three step process:
	# 1)  Link .tmp_vmlinux.kallsyms1 so it has all symbols and sections,
	#     but __kallsyms is empty.
	#     Running kallsyms on that gives us .tmp_kallsyms1.o with
	#     the right size
	# 2)  Link .tmp_vmlinux.kallsyms2 so it now has a __kallsyms section of
	#     the right size, but due to the added section, some
	#     addresses have shifted.
	#     From here, we generate a correct .tmp_vmlinux.kallsyms2.o
	# 3)  That link may have expanded the kernel image enough that
	#     more linker branch stubs / trampolines had to be added, which
	#     introduces new names, which further expands kallsyms. Do another
	#     pass if that is the case. In theory it's possible this results
	#     in even more stubs, but unlikely.
	#     KALLSYMS_EXTRA_PASS=1 may also used to debug or work around
	#     other bugs.
	# 4)  The correct ${kallsymso} is linked into the final vmlinux.
	#
	# a)  Verify that the System.map from vmlinux matches the map from
	#     ${kallsymso}.

	kallsyms_step 1
	kallsyms_step 2

	# step 3
	size1=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso_prev})
	size2=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" ${kallsymso})

	if [ $size1 -ne $size2 ] || [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
		kallsyms_step 3
	fi
fi

vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o}

# fill in BTF IDs
if is_enabled CONFIG_DEBUG_INFO_BTF && is_enabled CONFIG_BPF; then
	info BTFIDS vmlinux
	${RESOLVE_BTFIDS} vmlinux
fi

mksysmap vmlinux System.map

if is_enabled CONFIG_BUILDTIME_TABLE_SORT; then
	info SORTTAB vmlinux
	if ! sorttable vmlinux; then
		echo >&2 Failed to sort kernel tables
		exit 1
	fi
fi

# step a (see comment above)
if is_enabled CONFIG_KALLSYMS; then
	if ! cmp -s System.map ${kallsyms_vmlinux}.syms; then
		echo >&2 Inconsistent kallsyms data
		echo >&2 'Try "make KALLSYMS_EXTRA_PASS=1" as a workaround'
		exit 1
	fi
fi

# For fixdep
echo "vmlinux: $0" > .vmlinux.d
S)h5Vg>om6uˉy-.g{ K UCφ{' >Cl0}"+$EY4͒r_|d$}aAt.UVםɲAvy#[y1/D Y|Xc=2@'?^ ._YϐE=~[nؾ>8ۘ!ŖQg/=dyp.oMmڨ%aN($@<c'5n=px! j 0hO_y<*ʸv'\4tuXȜA;< Vϱ׍i9)HݞR慆[&1>H/Q3-3Z[EHjq3QGG \~!ج\#KzMK =Zoy;5a/6-NQ=Ӄk};M wI$`nӽ^+7wuχ»^g@* DW)kN@Z[ChAB T Gb8n&;̂wC6x{]p7'L^~G{0ddM]n sP=j"޵arwFA3E*U/pJԯ>ailG  B$ E_-XxѲt|=ś w lvD0ӸvۂN2Ym T}QD= ]z'Ke_F״r!ӏ>[\.#?c-nrrN: QTG{@ϯ;5Ts؃5(FKBygs""@tk(\i (BzVMHV4ԭF5jtp D9vH"`$G}z u L:<%/g) H+$z0( GgPI#v ;^2 )lr O5ΒUk#8VĤ ]4Q74d'?; IDŽ8&{mמ>Bq? 7a]|ZkpsG }Dۍu9gy/Nn~8fF;_g7X3ؾm@p.w,v덆7,k ur=2'J_}ZtDh=gcݵ?xLCϳeQD0RPXAH???A8^hBN[~q gߗ,!'}M vk ǖ;9yREV zHl!=;*<:z{}[pwy {Og*8M PSY)^æ1M#GhK9^-GaB6okmLAc~ 68gq; Fl-kI|jȎԃvcSΠ{3XZl4ivLo%n +"G0Jiv?m.=\K7a!TޮP7Y077z079C*ɵ5lsvȠ+=GWZis^)$PAۊCY@〠GzE<ðm,\"+TU d_Dg\T|岽A4wC[:J](-iƳ2 &׈d4G]~3oԐf)mO˃!Ti E<.E{c?8E4y<;lpN& AFX,4*#5pe lˣ8<l}=Bu盚 XӃ(D_x*r#((9o$pr. @g˙vL\/dž@'DRT @Ueo_>%0P3z<9;vcs193|[ʇˇl ->ʸRMP26=pOk܂$QAT ݮ]~H,gfomTZV!qۘpDGx]X҆jr;PҚl| AKS_}~[1Qw0H|Z ;bm=p'?g'2 G35]Z+HU5wo@, ~:xB1p=f#i`W;˿QS>j `0UPꗎ|K:xQJXWᆪTL9eg՟$YJyZѩJ%ԱJ#vta؟G&F% c؎4 6#eto"&LVsZ􍐘xgyy.Bmce7*8|k,K[4)[|C7|:5zwvZ2s qWೀEZ5d3399,v +m"JWp-( }[27Eq'gRsf5nQ͚Q%w^sı=q{D\nUsŶur]9r {ۓ?ns:\Ùxl[XN=Lu^%pi4ш ůfũ_9qmzVΎqf/mmKnY@Xv\!uW g&99{,wk-Bd"Xsu K>G/!sFq7p8I!Q z,g~sgę6.\[rBa4G!/wX]rT_Zu(bak2=:tvwᓎ'^2wFӰ~~J>vȚy&Fkw%=zd{8G6xWB硣Yq]_`T9*`Ԥ Ч^AŽK8VdQȝ囌^T *t3zm5&4pHEry7FZjF%wsĶonκb0lnO|h)~\h>Q~G4}w'G[gߍb[{}h9VE:w{hmbZQh+Q<ϦoG*S D"̄S>^0;6;y0&/A,Lҁ^~~}G7KC'dBپ!G4Rr'NH+?`Q/?l>]p#)?{y#j 퓍U  .JxB:P8Qe")l-WfrV+TgVٞ!,Y޻9-|۽7>_amNg8ܚz)s=_kMשOVUpƐa@G0 ?^ϳGLuw?1;^]FǻLGleo1<~ݛ~l o m×o)0zÈj_˙f)el%R,;J5Ysekm2!Hm*d _sIEz]R'ksR"nH4(HgqjEvׅk3TȪay.2JA"oJV=ǃNDAׁb\& {k? 'é5RV_]&#_fc@+s pT&-no9t}7 A|' "%ecW*\—]z4%7|n!vktڞkn,qPb|`cʢ)2YrTSCܢdoL+wD{p2oc/K8")XRU}>߿Elπ3U A}2'E})wRn2E'd9sYdD-U]_Q6*fUM]?ˡb^GX_NHfB6#m_ f:u0vLȀ6On}˳3˕!?@ܸͯSd,c9~>cwf|.'Lp# bE@ؓD98PT&Pq,/X:2 N߶ۼ[-fa.۷Y`eMlY=jI33kmj~l3⤩CŴ4{Ŗpg^h9*==lg͹z=R!Qc_8.B(D({ 8oi_Hf4ew}[q.Au'tY0[ٱ3@!7dM)r@%ȞP2xf %\B;43C摁(UQ5ֵ`^"Wu+2ˌcU-z;QE^LѢ-K55 FjdrG%$i4k Q##q3qf4cNA M]:R3ZcH\ն7J b >5 of[ VڢIKw[y߄w ٮ`lZ*]76w7ȭWZYd6ʦ*ew^|3K"?ΘJF1,A+W G lgs-){?qO:pG8erYZ_1 qu+4;6Scϴ> zK>cDhu2)9p4bflۦ#cqZX$FBkiз%'c (1$2@L$tv] 0 @\}{]<Ы<+0uw"~~3+a(;\4|HvSG=&hCǛtx-S7LQ0ܢ}L)vt%@M* tQ췿={18E >a8v'կ ch]ҁˊ`ᾌ5t_`RâRܤu^ΛI o$R4qp_tsĹC|ժhj Ybk r;Fg73|z"K(R&zרZGu+<yihAͱ*ǐ^[oNGe_y|a<ڕg-"CQG,_Y.Ǜ:|s2jI$jW1gϥJlHtUz9k"A@Bfٹa8CLj˰Z6,R,͚6&KMv4Q6N 8,1Q!%W@c&[z)w`c=ХP\ȏ֤jݘ>xrN;=W!c]Uw<" 38:+"FY z0~k;Tum.*\<6K.s,5K2"?џ#_f䚒0m iIkϹ8o3[X"H >7X7z6QjG_V M*㵂fA/gw6 c[NW;N`|7,D9 PiuR}l||ma(Wx/\&y~L-AՂb$|ُZK#'fp =W=t# TY;A>@7B-}g3bE3)PVQF+l JdQAj 4?IhW }dz9ٞƫGgJFrHpo'['hw0m'3~ xr/2Z s{3woƒ~^gj-fMDYXnwfO%\m#C `U!z[߅ EԴº>@E*N{Nj1[n#,Zݲ94!Nj nh4^ &4ab/U=ӈ:}tWyw2)֢ a&!_W[kLoϏ`!Cv8=lnĘ ,D 9>$-\Bz\g+ I)x.P`IU!+/GMOof'ySTwh,t|+##mЎȣjzr?3^ԥWQváWW>_ LhL"'cûgpׅ=7`2Ha j?Qݎ%7+E`26% aㆿ&ʶ+}:jZv=-DPHT[ Q&Q]d`@AH#B_AɽkQd@F_\DvbHrէ6˳12d97j qq30 ʚ1U]h56hceJqO|p] 3 "$?ː~ӟ"(VƵ0*w=4~X2$Tl0 !0rYDuW]>_^uGskjoGE?2wZ`A>hLu :dm/&zPԱ/XqE=jxUE~5ć SC:mOub($i$-nZã2 *\Cѱ'@pq4c)n2=m:CtA?k[!@O,_-Vrqw #n",'hpO7*X7+u\!.Cr-NCǔ*ezzN9b8Tl [\bLEBI(RK%C%6(~0a#+ J5^Ӵ/)5?S2 ߝp` 3rځ/ !8g,x;C zSfԦl`1~.(k BYjC0ݍ}ݦwCڜ7$5ҩ@IDKh懌w F}A]AV9U) -N#@L*óVϷ~Laj͜g(!uK$ȖaOF5>ʪFK%1"63x),{kq-.#$e$]%n,CdFq _8Brz7 ӼsdepAq`a]{zÌ<󕛒Om6;ݱ; l"atG!\FQWyoޒ^#?OYCs'uOFcnɘ2>U7o";S&z$C~zTbÎ 1F!|h1y!_58[R6H`Aq'Ucw>r|dAGhռ߹L/Dp*=&ץn:7p]w2'iBF?IF,UȎCEXo}fmT۳($@G퇴ĘoWV9( yH@$(*?iKcWfs:emcX%=|ïj.낑D,6kt9گY;(+}>~zkcڹVU躕UlwѩSVmפ:/:Bd"4>M)NK_xGFZ,p9@ Ŝʮ[ zkp-d;+nȧ0r˖\#{"0dkѲQqWmv{ 5GP˰qLlO_β\0N<f܃s[p5T`s$!I""yɧu 'OE>L~a3˃(Kp.O#cG%W(јp_uua aZFTGЊl{oe^/3{a]5u':=?6N¦ _4--x$QQA^\_N`,+uvhU0Ng]>>L?4.2ki[6~#Ө8J"H֐l~T 405(|<zk k!eE2'|)<,#/(|JW |-Z LcfXg'j(> g6/t2PxvqSWIj3WL)6EGOGe/M.Psh/p4#ϲƠ p9\u F@=>/I,DnAaԻLhqlTvx|8ge: ":`'!, ,ń,BJ0dǵ۠إа|ަ_smLͤ0њ)ЮJ.*ԂٮVb'"-麜nq_H؟ h0  "$T%襞P@/ 8][Dðξh룩Am=@1LQ2^0\a~s/X8(.γEDA?/t[_'}?j*DyϦyQZsD-esi^NJ&(,y6g;KV\#<~S5fH/Pඟ"I pԞ⡲1F!|$a;cT_b@n5Q~Z^HV=vp33/\p $"J&s;>ܰ&{lިD9J:aQWM%, +Jϝ4OrAuV'`8ٰ҅˓œkwØj8*{,8)b4@,:R䕗P kӄ".{SW9ɷiL?/taLy0= <y,>Ц k3te`D|5ЗqF<^ X5g c^.^$̸ )z>(l5w0K!HOqKS/vRW^z, UyU-I7sEXGwzְt'iw+rxK}DRaQ!i7%0uFlK 9J x7 .~hSCddi"<(s8flTAc͌v"<1F6[<O*&$7dn,^ۘJEcmj^i+. ;)ӏ1\hU,U{`RF)ֶ!QzZp~'*OWх-i}J 0կ:*=G社 _ |) 0P 7kG4V 790/.j)QvBUf膗>lcaDۏ5PO̽pK¿YO|lP^֑HͲ/:uϠF_t8'VɿTsoFKېHSߜcD/H Qss̰.9 &胢SblC|y+G$v`.=: Gٮs/ Z*Gु{(,fTs<>9j}0G|,x }LDbGwR%dF2eMMa zv-}4f^LeԫaP11| @[AU#;eHOFˬu0H9Q3J]'mpk@,Ah89HˊlQ1"g^nPADz(8$>B'؉ Q.4}Gv/lQbX~s@;Dr=}1;'v nH=OSqxIl1i)僄ŵy.TDFGʩjory#u~<:XZdiC3QR-1д9c/;?}?]8 [Q[pxj5Yt=`B&.iMlPEzĤ G՚xK Jd({>_Nq+Lתoϫ78fݠQ.k[?{:􁙃015&}f$yY}^6r}ݿ'UUCF6'D>vHx|ch[ 0h J^Qrf *S,^ث#TbJ1EVv_@)!5ItNi{CBW?afT-YMG8+|;aO|6Gk98SzBY{՝; PaŃu\#kB$BbGƅUkQlYo;X1 /@ rm6HI6d69MfgՉ.wSNxȮVo-̴UT\эjɼeb1hӝ6TcMg@ eqC!q\Ȫ^H`҂V**Rՠ1'烈o_›S`>q~m7q2(}?'cd_z[ L9m٘$ ;5E£N6̠! *'Jk>|#pPO(CwE? 'go7±u<_&{`ҰDRr">9z֓QNyKgOіʳ1{H ZP6xҳp3hrHDEV8:p0v_ppGh[;Ehܕ:w\fHdU]l'P!xTB ,MBgHw:ؓX%zonZL5=b;";X_R‰"}&aˡkgO& D U}bFE7K!S 6&,I,G4r`n _{o+97m]; hv .kz: Hbհ__ -BsK@9|G&dO3HױwsH+'_שEV3:V8a=IQZ㨧5Dx=.!oV~kۃJM^Z;dZFF=/hO;΁a @ )0B2ruEHn_BL}v}5ά"ADg5pl|YKc D&羱03 6KDN?iaI~v@H?rVV*>Dd 8g={G$rvX,U#GѨQ(n4Ubd`Kc)02w֒1SZ u=dAs&1$.0"= ǏYRt'w98m{ " k XG4zUB&!~>Q5Y0a,kc''8V7*hQ-r| 8.]7 ,0r63GJf .?rhi0715k'ˋ1«J1mq9^A$/P0~y_huz x?xohpʥUQh v?ϵ!0^(f,p.W ~Gy]JZ֞!fLݩ0fuclѵ.:6('R$Xwz I Óbl- Ed/g_V5:"?e8dP_g>:&*D6t:4 ZE " CRDg ~O\DŴ/*Ev֬X֘t8v۵C Wzp/;zC iv^ӫޑۢS[|NdD:Lz, :dU-;. {>#/]|5ބZ 8?vqOf?mX,JC~ 7;*^cg1d$( )A0`RȊx?H ;h;((ju;׋2xy^Uw ?w4DP4VFSG`dr 0LTfP즲:4Ò=]}>0=+s}(v6SVE[($C=k Ia0J>k%i`dO9ɜMz ";:Sz  2hHnxE Zog^ qȿ-ƺ i}O#.3%USUi /D_[K7SM4u׻1wǽm6iZfق1;փ\!·ݷ?͜2ɒOI|ڀχh tu ECK}7yOmr\󹄡z^;_06ϧtMs(ӤVbΪ"1P;]) p$EX,=϶/NiCsZع0欻^aFkb6lI+5GEi ZI{390~1PdRzV?dNjf%jl;vxfb?oJ|#q;9z(W Nel5#dlJbɲU$i珒{(GT\h ªFC*w',˫\zb-ITɃLleTe&h(̠bf@^P.I~=4TGf x(Q{\Js6@)x6t˖d.^Eow r5ڹc}1 +"AB$: 'TzHa:—&<֥lh'pj8 k5eUklmlM ן{ָu& tb, 0QGjV,ۗ%!$8ႝsmg8?EAg0fvD3~T(sؑ{[]\Ä}{.lTօ\eZj"j݌,q*ڽJ4ڴR 8*i*Dzqy=5|F6/\0p5X XCumLmjfBZxE2>2:mU +KkWMRe-kH ֈQ8; h|UP`TSdS[Qgt={+Enopd1CyL2(cFs2Or|`X0.5LngpBZJYЏ RH!_^g"P:mj>$l<B0 Q#gf(XKPE%\g5T΅ ɷ"ΛLPN{{SaJd<;V" ƣ,koڵWHESrpU;N ].A%zz@A#So"~(a1ޝ/}fـe&4s;23'=|ؼ<\xFdqrEZg-[vzkuDmbRf5SZ y D_0FECIѩBVH-@"-]{V v@0AAh-lJIAp)X(:c/IS挣 Wg-NeB qBxwsˁuD 'gC;O˾-}wDQܾTCw=&|G5[moQc8D$pȢ)Jej3S4zjZrML8\:QNJh<]j.(V+ʳpB\'b''cF \[3:,T: :iYWm@{>$ Y;6xN3Z?YW`FKc$ٌ u٣BӡL ܖ+tB,X,讛㷏J89 Z!Hny$ K]9:6Ya5]kjC:!Q_;i]j"|#@G= GO7v܈^'hQ+a0y!{.qr*pe'_m[H;%4w4PT ګiڅ8Y^~ ;zsq%wDoҙ)nª0&&H+JK.wDPT /"inOe7XODbWWd65 D]}/Ba:Yq}8Ƶ~1R 9bƒrB ol;iA" Bֆ982s8B O&HTf<LulDv\y$>֕\yrk x8,v˞j C!$CU`1$'t$PZ߮Q@S RX_?+?(frM讫GEs\lX@ΟE?+Nz`o/WYj +?ʷjX Hk\'\~2Yemeߖ ~gPn[rf9hE)٭9< X4J?c/?zjqm/DS ڄcϲ>Z b8Aթ]hĉc5F0ZK`ㅓC?}J]78;^H;( رҟw.,l8֙V6o'=-2B[˾qHNGZf~B 쎷4.ͪ©_f2Bq!2x緟 (ǒ;2!]o&2kmKUqJu)>lc$@m9`2Yia"ց$5^8׭Yo*KOaO+ȣ X/ $9[L@]^Tc$!rd"zpQE Zp v-~y Nr~ɢ|t}n*2;Fvuv֗,mSy1j@Y|?}S!`d_~~1 n~]_pG#b[BI~d<u sLl#$ zR??edWҀc}b biZxa~͝<K YOi aoE!d #*<>ϹNٻ%XWK o*#EO0_䀌Bf8.UG夎`.``VrgXyv #ƥU@ˆ:jf! ٩LL :;nNP!ޓ,w3EX48"Z()l'o8)WyI'nv Ooe/'xX`-SEOֶp0Pi'RdH+_ad͐g[ٔj^77"D>E*۹ EWpD B+AtɛF'?׮4{Q/C6${jKrM#dT{騪8G6JP`𒸸ki2*ߠf]oJX^ĘJ rm6YX74>֨ikA=+RyTW}zq'i)|#*s6PM KV,jηhXT 9=W=wo ^'6N#kfCݸc26dUuTZco~X|tP!Jvj 4oG;6+a:Cs}D|PL_X/S ',\q nc!l*;UA?p_L/),vïVodx;J \iV"6u@EkE3[Af; EShF#{~c 6HBNe/..p"!y4(]r<91Nj.'Ч̯&Ye=GG:#\GV{1Ȭ: ?Y_wA;Cb:]TT5ȡ8qduDd$ ˊRJb,E/=Nc־;Ř@"1JF'|m?[͞ ,|J PJW^{%(P۪/Y( ;I{+ b|ڰg0YfyJqT5:,u X@ 3~ivg| Eyu=`pZmےH;5j{Hk_[ƺZh Aڱ| pҰϽ`7)(RxxPVn]q xe >'3ĹhGkyv- F0xޖgT)8%1 }x^^{Ϝzl>&Є7"9d{@"ij|NĝO$ 5P;mk&ʡ4nKu%Gfh/x~ֆ=>t4XW2Xj[&ci]5Vwx%ÜA<θS_l0Z`KΓKeCA<( &( 1aY-^4Rk^YE5LS9Nr]sogdO X|qX·v'gnhۧS)&xzwYxx~w}soorolt&)\چw1z6T#CVPLhvAIjw|:R(h|\+bb.k5!ǿf};x'*ZW%9\TKjkz03L2qe\ۘ?(aRJv& F]-8pNM|mJeK"G$Z64j9npr{5BsǍM^(5gO6+"rM}}sQړEhny$ 6Q֖, plӃ1BDFxrO]'˜H ?G]AF$['\.&i`p4 -&2Qkʷ>b/2dk:y&.j{rQs8YM WI񅣅;Ns A,2uש#A6@.8vw2kFY9Qad)q1'7T\ĚpcKgMɤAv?-k&2t>{>:ٞX~p7WْCj[qomk|;#]|zi:~AftYD7/;8k_M2|^kNx #?: txsy-x;uF϶P],s&ԟzrFtdr4h [B4x0a071lI_ݛ4LK rA#R&/yygYlt--j>b=sE|^##v0gSinG;C!&?{ }6B0zxf| S.o5&I&D:HC>_&ZLl NTpC4ṧ+Q N|I(.Q'_o0/X@>/HuY"TIPå_p},n(i̳w/FS|Yp܊C75شAYufiaKDY̘ epWN; V"Mh}ۻpѸ8dN-ְa|LB"FA e4f' ;%&8?z~{tqs?=ύsgQ 32+m1d%c9s ;$\ĶK5K 2|.pwm}f?;^_@Rlڰ(p9.dݕev4yxx8w5A.KE9fT]ɮ߀s{MD~Y`$$!zS_hF=|֪Hu/ST5P\ D5zviC>g,{ ̭RH^cwNt:)$Ý>Jiv>%pxo0b$!j;w=QXC OK؃kDPdׅ--SPM ;\-5]h\C7- 9;Tki^P/91*}r^1|w"u Qso7;J#ʃ{vi\4jlBL`G}MwVm-BM.n.Vz+"FbI׿?ror\Eֹeڜ_kW^2sYWn6[Jk *M-P.*Vcl h+5D|Ȅ7і*W7=s a1 Gge$O:!=zC39$<qy5˚"W2Ͷzj|+IXXY%cxQhX)@/[HTZ#WɼuZ :/!.l _.|m6_sNN@I_ƢQ Z=۷mۛ^P8fy><.WE~juU9ʽ^٬GNr )F()Q5Jchcثuy(C=Q3ij[y}qc~oD#n <GeF( ௧o"z-u*R"A_R3tB/yeȅ.&зS0EK_T`M5ǜl`4UuwNut9SgQmj>^xֲ8/5D A3[WDG%eE ߗ-q,BEJ%[4t61Ոv86rnNۿŞ{>{S7Ž*I[4ǻk(ZRSm57rr|Q5elVIW&@E#z<@%x{JX%@d{ J(4bpמ̗a{4~>:D{$a׻JyDxɯd"2S2Mi`w|+ĨYZ N[Ls f*q(,hX\TQB5r툓+R2{X  WTWoN}/g k.[DDDVF;tD[P1a<ae(z]6 C9 `!"6Ǫ TZP 9~H#PHw*G.2REHN OJRn5&)$h#B,jt! /_x23Ig˦M0\YR缲']6==3A|أUF.O乞(5Ej8"x'IE*kC$_@HdC\#W -^cz?APG$1M}f9;>in}eju 4OUL_;Md#P=WZVMw369-uG2,?CWx 7Pk4]E̯#噤= 4x}\,>vM3t4xކ_\/fSl,`f9}c M_n$1z`PA |Ďc /lo`1[p۲(qKqp.!R*!6ъ9Dq}ùmj|}BKgzR_&/QT@'tXY)㮻m IQ۬q0Hq[@kst+%9ikBJŭCf{bG=8sju!ByZq.anp-mIܕjf1}#g ԙ?}y'\iq(` gU@hr.W|@"]21O١G~7|DH,|D&?O.GhюB7pJ׍d xW96;.0[g4y}<:\.$O16?" SćT(\PR&O )oA)$JPKdUaX~GC+sOu2(WC,=b$lOG*TjE1D̠gzy0- o{ @u"Wy)^Ė:]pҽw2CBAH`. Z?b_c2+G͓;XIga="}hOtQAh"X EH(_>:"AP'A^ad!$JDI>|o_{1?τ nK ?bJ]J<<^iqcq'@TNM! Qz T"˅A? FЙ6Pֱt=39vK#ȢP, tlG?sg)1L#\F L/R@G(ֳ~_XKfz_$x~{=/oͻpv:]o0i_ ܭ_)9cb ۞_aANg'k凐:/M'0Ozqy{.؝uޚF׀[G`?gv,q.KkTYsMe/ p1SͲp0  9ȥbBfK<m .מ51Q;MޗVn:a4_ ?lUC&FTh}8MHa|mo( TċGj׫Qi/b/B8LŤՊV$)ɘ4 Eg[NAZm'jRMG2}xf5U|e}t8mj((U?RiAxD}Xr\߁a>܃_h>dt,j.~"(zTI9݈_PAO:կj`PTIU$Fp̚M/nM[xzz:?/5Lt0CuǴG-_ڀ׫on}0k:Gwg]Ͼ3mRFIRZޗYE7}Gʣe-y;Ƹ1~,Qc3v=h>rkz]OCi۩Kb{7:U]d`a/>++m-#ӎnq.rXw{!]n$3.wYf UAtX/Wo<}p)YG.*;TDK⺽t7tZ f͞g#Xi Auq9:gr . A/^7A{k_+NzƮQGg<\6oEem|a'S}$JŘ8C0#}?) N /7W +Ҵ=5v:GH ~OG3NlBm1SF[F=h1r;{+kAAIك/s|;/=Ӌe%Q Z^CܲpFį՝ڼ+pž]4/\{Q/ ^?l֡mg8u ⚙3ӓÊ 2Kz9+ZbT^kO"n>ODcQh)KsFXt4P2me0/Ѣt_,o&;?; ozeo `쯉^/->^+9?Jnj` }ƐV\uHPBT?~ ݾolyWB"lKH Q:8oeEn5#tvlr"& R sWf_ ӥ9(ܟ4y9˒_?pkHDh=l\R`!dE,g >~),EO#IX WI zϞD@tAJSήn(Wg}*Pԛwef=s%9k;s%P33kۖ&|vNJL9l5MK#͕"ʴ ;w3/``l36b;#/۟D6}~Uw 5ղTOT ڼ`L]fW*H{X@zː {ڳ/"q$qAMb@ lqnD +ғn^X"X% ։cPi |-Uq[9D,Հ{ %Өpgx9nT"E]hV {?DՆ[%_MpBm5rS\Hь K3feH\{>Joω[jw kL? ;T: B&Wqo]cfܫ_JK5;=M=W.5xahI`-=;wYtI j^Qȉx@FU?f1⃤^Z_rywWg+=٨hI} [LF"&|s\%վkylqq"yj=6|_f;r%ڗQr?HNG9] [_?RO'JWɽLW#8q g[[ys=8#O5>1p˯ݮޞm%6<GZPҽaJI"3PpЇasa*石x#>_Yv" N%UPR+Vc0&a}i7J<`X|Ͼ+78W ֢[s?ԹMm,mZAl%tKs|trS.@cl; YS$w + 2hATHH,li鷒@uۋYu9dE)=Ym5A<@ V6P8wߣDNzb=Fb)QPR  `2c?MNE?Rڈⱞq,FE7:`>}nmhnZNIa{~y|T!&bEDf INbYۤiܵk]/"A`D2U> l7EbC \f5ScՍn ܣ.2q5:]fGՒVͭysẔ4暊(Y#M 6+Q~qEtԫ2n}`({Cc~#QoF/lŲ2 $#"!\ŕu߃GcN_FdyclǸf׆T˻>:r>ɕ%пvRή.Qn!w{~:'\kg~Nc^cj=,YrqŅn}c5rP& )„#P†s]rn -¦&T%{eU?o\b)"+2*{+|W(c[t%|%PCuε[{uÐeipveAWnBv<:[vחXA4H iw^ܛ¤VM ڌDS>""kG?9w.P(cs+3+;ܥߘA}l\.*~tj36BX{9t>.2 'رĜQCjֽBpr0Eb]Mgl'$IY ]+GFM韇F;+6l6Ys^_S ~*uϭ}2}V(IOA"M_@ۓ>'IaPu|y^}u/`U5exҘ0)>e d5~\t[xG'Mw®k刉+u-53xI[#SO d!;Y 3`qkl"%8%L mtzo2(XN0 lH/G"SX&PP7ޒdd&%t =% [.=&n2xٿծbwQY/9 fp|_\!6F&_CW_8ne|Y23st ڪ6@x|,9gȉǭ!+  `-̎@[fv7aMГ[eFG"ww~_?n%vzxb.˾9̂14_tƗ}cJ|]ヘ g2AcdԝSTpt!щ!hO|7J ",Κi=8p&a }<'&n"rZ`4aƖZl-^thy\E(øo}l".8Dco ԼlCe?6drZ9Z-4ƃQ3yS<"L㤱c^y6j޳A6 l5q pe# jP GP 쫀D&ߞF[FqI>CeRZe]Z\I$BV6Q+QzԌ}A (!C7'߿[Mڰ~oM!&[-~wL!  `~0gˌr)JMF;l99.I5hl\+KYɎx&9ﬖ?|'ùVa + +ck׻?vN;|:>cfLΙCPXnʙC#FK ).H٭k1pRk mughꞑj/Gс兝vdC\nfk`j޷\60Y`jjƖع|usȋp|QGcѶ;cpp}7MrM'@Z5s9``<=|r娵8EoNyX<"b"B 2~vq}(HȞTt_W3ucQ\0c>=;!sۥ{Ii\:.s}MyqCw}xǙzԓ/bMc%LÙXsYeU5H!"ƢNyר9nO/j5w|aS*D۬g:_DJNts[^^uhwr V̇N /E gS ǘ䗄:%Z Wq},fLb:3KStqÓx)-H MJIi˓O0سWϮaj2K~N\xwǻg\cP}^B) uE*)7} h_s< {64n]2~e{DhT/_xox6RxI__N lnxj}xVϦp8Fgx"-lθ]ǝݥy&NR^R}o۲WXr [fL!j_c!7P  <38~ b,1; '4w^ݙv2fDCLev q kB*^~cʼzoTϫAUY"a)nvٚ 5"(A@zߜ. e%\\v4p@|K#/궟]tl{^'3k=|40td3*=8kE3^I*d@x"+|xz]́Κ⚵YIJUp_I:Y;1Q Ϙ,! aBA.2K*^Kbd($Ĉ 7}^og6Gz*}oǮq{Xnewǜx6?^c0_'q}ΤG44/F!K׮sk[ں\N>ncw8Z:JɽۈxY#~b2e&)*[laiq(^H5QhCH:g\u#Fv=ArPĶn6t5qgG& ) `)!:I tɣ:h0D8g@@SZT}jѵJix"'VɇV"y.wsnI8&c!cT1 MOz3_1 Qr۽_EF fK=N9ɱ lW]048vsǡ9do gľJ_< StSn!uʹ a S ې3 ;/յ6o6i{wW,-ҍϴ)HD*:1? wdJ֜zz0'Fhw|1!Q 97COnp6aY.#?U*aC{^K6h%"Q[G45Qu2Qe>3~nю,E 'c*qk5c//?WCf߯I5[$IkX˓?x{'G'̐@u1Lvm:FK )-, mD ku1n#ԃW} Mw+ @J`F^;5$ OYc߹f~NqdB#l:~|6w  6Xm\F[bVKoNOvG?k=bQ! :e9-Gbt_0( ݡ 2ij+{} (]0?qsףP,Ge_ . "`i&>biOI ߛ0\ 5jԏ'΃W?h3cGM^r2cDlIcι㣎Gn".Q T*ׯP\;K${2ۆ |6nٳ^yp[?JIв"qQ8rjX[;AE(')gP CjO|Bcb]z \! e2zm+V"Zx (`:2"0"HYp0R|RUX۷X2Fq`P9^AP_`k3{PSQbXj VJEXf!PAPr w0C4 HtŸCdP2y42T0Cq*鶁f 0]8ûm± g];02 O sVo Hlx Tr z v4x.'Ch:Ș]Qvpx\^Hе]6t866sKKmWk"W[rOPivjtIe@D®!PD|L|ۆ#|}o3c-p0*U] |$53T /N`ĺoE |r:I5_[|:<5vKd tzz&3\7jf@>24R4-)PD$I&A|7"N[Kg}U~J3R _2߈@I,|s|wn b pB}9XwzQ(lE8WQ>(:8050#,t)C}Eg pce$)~Mlټ7C_r(ϒ88'Gv媣K9gE7] v}DsO&uhX8yv27Xu' =LsF<ﮫ߷l#cDxM;d*b:N4`H/FVXPWAv H!e/미<<$71~,jى`(n-嚽d:M*ikeN06}oϑ3bUOӂq^ˑ53Rfwy!TJ1gh=[—ϿQk]`0$5C_3M'_!!BR ]P(?(ZJ(#B`4" HSHdJ |@(ȽJI,-PL03UU u8$ϷF(R`:x2PAD7qi Ii![M¢m!0Bv^R" Y'O F @HhC<<}_1%h=:t߅f~}kTd{3,x>kvbÎ}ym8- x%~vtV"Y ޵Ko ;l8A!NUmQ?=r<3~]92aN*Q>ZMwpJtd5 @<ӨC" 48ѽJCC{z3<:{?4ќp iw{.i{x@P>~_F&&1cC8ҙ;oYqrMp9- IWͶRNe/ߺb]J(xd'dkWqy~ [ FqBSD6 IP(e uBZAHFe?v5_i$ $ ;Ndx]f4ٸǜ >˘%aw,}7VJZڱR(~b85*0Ĩ3?=;,wÅ 2 ׈ֻ7,,pt[( _% Fw2r6U6=1}ѩ*ڽ>d~1| rl}]ly7e7iTpvQ|:& ]~zRX7KLHp葴> T`h@ uh,wEdz̍2d(J1@2rr?>QL̝9s92'D?//,R,d'ñXI= ѫ}8#9.aWXCm¾g.]8iڴ(M`lwY@7bsWW~n(UUG_Ǯ[{L(>=@9o%ASտ ?'/rC$7U^0m]??Vd*<+qƣʱ,r\|cgky}VR9Vm idD n(EK=JS ˾IF4jG=ʈGY$Vc|ok5+;{j#^ ! Wyoeb?TS_YHa?-DL^9'gqkvfmAcoIj\nE˞+?˷ XqQ?g^];}zvs|,~~EZH6 K~1I*!#PWz@X@Dh X(A312qBK Bix僣MF=__Ř]T~ s"DHMBQ&D-{&:&H CSayڭ*D/=k}_"!" ʸgr¹( ~o 1j=Uq]^{WB MSQ ۨ.8ڂI,DBZ\v/&B]V ĺ!;qgfFkQxyI?ߺNR$3c50?\|$qq:G:ӘR% B:zm@ҠKĚϔ`>t"cǣukB%k>GGA7.0eoϫVj<8$3 q&uOXKa<'t+2aGβ8R%ݯ)hD%bzY<T>>Zf|[p,n L HzDf0L_M=4`QRrϾt C31Y*H^xH}Mk_@apC3=l|a]nb7};}NGhߞ0j@v6 ԤQ̺:qL5NCgL=" !9xc|kgٙELR1c[Mcԍ0d?֭5!Tkn@3!?`tЖE?twL JsiLc8_Wkb`ue1Ne(k8a@bIF37O3sSxF&ZV/"tIǟA(EƗ.p ?QHs(n|%jR` kOƓ8Re[1(A-@>j*/yoM-pe@Ⲏ}ŶD_rzlom!H*'};wH%2m:_7; ߤm3*J;}yur%f[P"퇁QÇUވ=`H-J;dHA8(FKUCT{1bȏRQ?9%a^;?'3~W׶SUE DU`&{yẨ`EDGWXv\ٴ.ϳ@89h֔a~YJL_CeT=8&H%~Po9QMeDqx}/[Ѽ+w[o"2]O/̚B>6Y = !JdꕲZP:X")mmaޯJsrYaS2-S)_]O y21R!N ,@Bbldemv:#Q+ @ȋ#?Y:Kl[S>"cr bFu@%vɯ!L'$a9QM!=on01Y}.^L|vs,a'pL+KQD^{/ێ " ,I%x6ʟFm[Ioϯm/BC&B0 n-W_:/Bgw dw8s*y|qƖG辫 ft ̎phU-6Y%Q_F}?Z?8YSs.|ȟ6#PzKb$T>t7n>unw gu;HNl% j%VߨyV{ȀBEccAFnLp߄c+gݫ~6 j!IZFԋ)JQ$0T X \}.bT$F,UQnO[=?sK~ xzu4oɭYu3rK%41G(5Mj sPR0pA/Oǟ|t᳛j Oͯ`u6pX?;=ك|~00Ny#