summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
authorChen Qi <Qi.Chen@windriver.com>2013-07-29 10:11:07 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-08-16 11:14:15 +0100
commit2ed44745024f04aa4e00ddba3009153c6b47c8e9 (patch)
tree923c8207e50f06c2a613e887f4ffaa6a3ea61589 /meta
parentf88a101bc0caa7b486527f0d337406651cbaeb0d (diff)
downloadopenembedded-core-2ed44745024f04aa4e00ddba3009153c6b47c8e9.tar.gz
openembedded-core-2ed44745024f04aa4e00ddba3009153c6b47c8e9.tar.bz2
openembedded-core-2ed44745024f04aa4e00ddba3009153c6b47c8e9.zip
openssh: fix for read-only rootfs
If the rootfs is read-only and the ssh keys are not available at system start-up, the init script will generate ssh keys into /etc/ssh, thus causing a 'read-only file system' error. In order for Yocto based image to work correctly for read-only rootfs, we use the following logic for openssh. If the rootfs is read-only and there are pre-generated keys under /etc/ssh, we use the pre-generated keys. Note the pre-generated keys are mainly for debugging or development purpose. If the rootfs is read-only and there are no pre-generated keys under /etc/ssh, we use /var/run/ssh as the location for ssh keys. That is, at system boot-up, the generated ssh keys will put into /var/run/ssh. [YOCTO #4887] Signed-off-by: Chen Qi <Qi.Chen@windriver.com> Signed-off-by: Saul Wold <sgw@linux.intel.com>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/image.bbclass12
-rw-r--r--meta/recipes-connectivity/openssh/openssh-6.2p2/init22
-rw-r--r--meta/recipes-connectivity/openssh/openssh_6.2p2.bb9
3 files changed, 35 insertions, 8 deletions
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index 494664627d..116bd226ea 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -262,6 +262,18 @@ read_only_rootfs_hook () {
if [ -x ${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh ]; then
${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh
fi
+ # If we're using openssh and the /etc/ssh directory has no pre-generated keys,
+ # we should configure openssh to use the configuration file /etc/ssh/sshd_config_readonly
+ # and the keys under /var/run/ssh.
+ if [ -d ${IMAGE_ROOTFS}/etc/ssh ]; then
+ if [ -e ${IMAGE_ROOTFS}/etc/ssh/ssh_host_rsa_key ]; then
+ echo "SYSCONFDIR=/etc/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ echo "SSHD_OPTS=" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ else
+ echo "SYSCONFDIR=/var/run/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ echo "SSHD_OPTS='-f /etc/ssh/sshd_config_readonly'" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ fi
+ fi
fi
}
diff --git a/meta/recipes-connectivity/openssh/openssh-6.2p2/init b/meta/recipes-connectivity/openssh/openssh-6.2p2/init
index 6beec848df..12fb79bd7c 100644
--- a/meta/recipes-connectivity/openssh/openssh-6.2p2/init
+++ b/meta/recipes-connectivity/openssh/openssh-6.2p2/init
@@ -6,14 +6,22 @@ set -e
test -x /usr/sbin/sshd || exit 0
( /usr/sbin/sshd -\? 2>&1 | grep -q OpenSSH ) 2>/dev/null || exit 0
+# /etc/default/ssh may set SYSCONFDIR and SSHD_OPTS
if test -f /etc/default/ssh; then
. /etc/default/ssh
fi
+[ -z "$SYSCONFDIR" ] && SYSCONFDIR=/etc/ssh
+mkdir -p $SYSCONFDIR
+
+HOST_KEY_RSA=$SYSCONFDIR/ssh_host_rsa_key
+HOST_KEY_DSA=$SYSCONFDIR/ssh_host_dsa_key
+HOST_KEY_ECDSA=$SYSCONFDIR/ssh_host_ecdsa_key
+
check_for_no_start() {
# forget it if we're trying to start, and /etc/ssh/sshd_not_to_be_run exists
- if [ -e /etc/ssh/sshd_not_to_be_run ]; then
- echo "OpenBSD Secure Shell server not in use (/etc/ssh/sshd_not_to_be_run)"
+ if [ -e $SYSCONFDIR/sshd_not_to_be_run ]; then
+ echo "OpenBSD Secure Shell server not in use ($SYSCONFDIR/sshd_not_to_be_run)"
exit 0
fi
}
@@ -32,17 +40,17 @@ check_config() {
check_keys() {
# create keys if necessary
- if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
+ if [ ! -f $HOST_KEY_RSA ]; then
echo " generating ssh RSA key..."
- ssh-keygen -q -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
+ ssh-keygen -q -f $HOST_KEY_RSA -N '' -t rsa
fi
- if [ ! -f /etc/ssh/ssh_host_ecdsa_key ]; then
+ if [ ! -f $HOST_KEY_ECDSA ]; then
echo " generating ssh ECDSA key..."
- ssh-keygen -q -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa
+ ssh-keygen -q -f $HOST_KEY_ECDSA -N '' -t ecdsa
fi
if [ ! -f /etc/ssh/ssh_host_dsa_key ]; then
echo " generating ssh DSA key..."
- ssh-keygen -q -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
+ ssh-keygen -q -f $HOST_KEY_DSA -N '' -t dsa
fi
}
diff --git a/meta/recipes-connectivity/openssh/openssh_6.2p2.bb b/meta/recipes-connectivity/openssh/openssh_6.2p2.bb
index ab2eefb9bc..c76f9ac7ee 100644
--- a/meta/recipes-connectivity/openssh/openssh_6.2p2.bb
+++ b/meta/recipes-connectivity/openssh/openssh_6.2p2.bb
@@ -86,6 +86,13 @@ do_install_append () {
install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/sshd
rm -f ${D}${bindir}/slogin ${D}${datadir}/Ssh.bin
rmdir ${D}${localstatedir}/run/sshd ${D}${localstatedir}/run ${D}${localstatedir}
+ # Create config files for read-only rootfs
+ install -d ${D}${sysconfdir}/ssh
+ install -m 644 ${WORKDIR}/sshd_config ${D}${sysconfdir}/ssh/sshd_config_readonly
+ sed -i '/HostKey/d' ${D}${sysconfdir}/ssh/sshd_config_readonly
+ echo "HostKey /var/run/ssh/ssh_host_rsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
+ echo "HostKey /var/run/ssh/ssh_host_dsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
+ echo "HostKey /var/run/ssh/ssh_host_ecdsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
}
ALLOW_EMPTY_${PN} = "1"
@@ -94,7 +101,7 @@ PACKAGES =+ "${PN}-keygen ${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-sftp ${PN}-misc $
FILES_${PN}-scp = "${bindir}/scp.${BPN}"
FILES_${PN}-ssh = "${bindir}/ssh.${BPN} ${sysconfdir}/ssh/ssh_config"
FILES_${PN}-sshd = "${sbindir}/sshd ${sysconfdir}/init.d/sshd"
-FILES_${PN}-sshd += "${sysconfdir}/ssh/moduli ${sysconfdir}/ssh/sshd_config"
+FILES_${PN}-sshd += "${sysconfdir}/ssh/moduli ${sysconfdir}/ssh/sshd_config ${sysconfdir}/ssh/sshd_config_readonly"
FILES_${PN}-sftp = "${bindir}/sftp"
FILES_${PN}-sftp-server = "${libexecdir}/sftp-server"
FILES_${PN}-misc = "${bindir}/ssh* ${libexecdir}/ssh*"
BA|BxBQriW(PRQT# Es E31LP3qspFfCJ` & 8 `&`8FRs L3S 1DAqG1C1KFAҦ`#`@"(Z!qd  @AAED $d!TTa`` Y$ H!X$Y!%!!_4AdhQA &b, I$& b1(NGg c?z>!ok7Q00͆9`d3 5!o͛?*bt8;D`]:,_ Z8%9a5ߘ3ZtAzh 2ȍ?zMYޘ,$x07 @ɔ=nD8LC.{yi&(K=;b14L |o blDu5HD4>W5!cw!-iDfjj"?(iq i`F ƶؑ?trt79 FDؖgM7$VcK 5wAbYCnEz&->o˵!8~Z, h XYSHL.5\7ɤQҊ`*}R>E8;oζj, ^ړ8C^!8z.>ƒJZ.,^48+BGj#vo^ m/-嶶ⲃ;tlI4l_oU}?ckoF|g8͊(Bfx5x4]:OR?=O JX߬կGG#' e?\s-C⸑sS`J3 y4U% z$)Q4bQjsrFF7voP8={4D8 &J)L׵Al呟vx\B ך N%)NJE$74&xj~$^ >0,{ZqwXV0C})qdf?\p`#VI |d^cnT~eBg>AT "Hm-%  I8a2d){?ճQnj, \bPЀNq|YrQS_Gd);*?TUOkT}Ԛì٥'ջE*?9O;xZx/&Sn8d^ R(m;hWY>x0dq K5w]P<~y6qK^eKpɅ~ƟᘺY诬Y"X12e15 I0=~lωeltG݄ƴۇF:X7/BCx["ty)g4Rs@g,g=yK4hSA j 1b2b]GGj D$WcC3tY;l0.U["hz,>bo[8!#! Jn/LrB#<2nG̸иVg^SAc[64696D;k8FOZ3ġIm$*!&qSiU 6,Wi?I6?A;{=%O7Yl3& $} bSP%ik\~jTP_˂TU\8cxHC寨EbuꦚHY19 MNl2ᶗI[;3a'p +H*+ YAw ;$vŊkza9vtF}߯lI 7Z{4j5eT// _ 5ДQBGup;`~I/vCV+[XAdN£箽<{e"0Qϔc'b4Ej~?lPO|~+z}7KhJW RMN5z]-$g.⾿|1PV TmBLNf'DEs ._T:8OۺBe2^uF'<β}㍹^*1<\z~=)Q2/f ;¹fB~/Hzkm;>ъ-ӫkCް >>3&tXPnd߆|;aN=O=ji=ڳᘓIQj6ڞj#C_<~8EyVlpqٳ}T+h9s2WeJ=M >3V" ڛLc+Tk>Ȑ3R5F~'~eS{CWyч\ J!6#c%g@rm~*}y?8k3$$X_B {-ȤN \~*lv$$L˯ȽѲ 1$3pkڗzGW [ \&Dȝ{(@8W*\~ekh[}Tl⥗[mSw+Ji|x8A$ɐ7sQFRJCFݿ[IYm> L3SUd!n0?/-W=3@Wq<`(Yr|yݎ p=qu}upa?>iKڽ9^9.5iX׷x>dx)h_|mk퍫 :BL9'A"ٷ"okIvh%~. RcQGPH2=/'gJ้7̛!?G5/dSTDǖ_u 1=;Lߙ>b_4W) ֔o>g޹PyҾlwnG܎17)Fqg5Isz_ YZ(̮RFũ6BNPG$W=S?sb[U@Eࠬd@L co/gvm~WdyU|<;<l?rʽ`s 1Ӗ;ۤb5g[o+yZm=%UL=Z-Z愊YB)¯4*.I}~ fR\B9cv:T+}BΏUЅNE'ހ`L5Vj bqXS%SվRMɿq@mO14h&(  tn#g_ F゚O'bE .7S.v!̝ю5GD<31-ͪ~K8mZJ1+, fl &ɝ~ IM[1~A8@$Ʉ$&+z߇oZ]OCt敪 shmz9$Zk Co|/7wez?/޶U5E yf1@SQI>kM"n~ Tן>chpXIPB[tRB5W`e=N΂{ƵN5#GQ}*{l;Jz&@fd3 w]%ղe|nvEH!3aZ$ۊHDb !VnQhGU.C_=;%2CjgNX>v !!Mm4@%!wb=m0ˤ}?!41Jc^#j(&cQ")Ma̹N#bI=PZFvX=/f'%Ώeb20Rq(cCT9;_|KA T=qƚ5|yQJbQzsSeG&BPQ0Y2,@#b)ٸp)jE(JPq%10  A $DBk"-"RR(~N /8%-@JFo%(L~~`rƥ@=R 1!R[aOj7tOg:_2M.WFυ*&ĭ6oH'jK +papzdJ' !%!G j*S N[Oa6BR`YADOqc.p @P2ujFfl zt?pk#|T!OzJy;vA! `Nn?^ӂA+] E4CXs߇6,e$R( ($J CҴ&g;~ # ($̠U AD%~=8џXSKT OɤHBxd#>Ә`C1S˄Q9f~ov|&M8Pr>>(]orncp#sK1m)Pvz =uzlF4Tv Fq8IB"͡w[Vn_.;oLp MC[zξZȻŻcq9yk/ mmt86μ 软II;D-P5V2OnzN' B%%}#m[*?.blwcBc/\j^_ ǚUz pN>=[c`_(7reL8nfkتa@?qe}eq&CJ+!U?oI'Mv %_8x>T%~Bn3OTd^Rk%Dl覘M~j*JܴW]oa$-vǣtHRs>*e\1 BdwF-:1W?%95BЖVlݮAtiUoqR-jSshP$i6گ]Xj3^Fv BA@1 7 4x[-b ׍"YmMj6յXcESdƇA=5MѭWペ%n.޺gg 'c]Rm%D\m'-ӕ")ʸguH@mg#ِhiXؗ_HyNkjLjE}(`te}䯃bd?u&"ySvW P(O: Ԛ@jF[*ŷn]ͬw"5"f'D7LmZLU'f[Qgk%lq˲ju TnC.g~'m?KY]cLi1`f #Hjd"erhC(5m0Gfaּ߰\6=f|:Iy^M1v><6$EM-i׺QeS,&2JotZ^1#ҌR>Rg#皏/yokNP؍e/AoO{6c\ZpÙ֠9m )nFUզh-:ټ_f_mrǦE7+ϕՎK3+esh7g;gOZ&e> -'qXNTt8yO;9RC]/I`3/Gxucqq.\r 0m{.K2@~(?%v%?*:XiMFx<֝&2?3-B. #]jdD\+ 믳(R8*p/V^;v@Uj+݄ͫQaweͫ^yk,fm% Qj}Ew~݂Tyb)ř2I AD11D߁_W+GdΆltlMA1qC&L'4qsvs tvjbF{Ox0*^[wOB!B]M>S@(h#-^sZE;d%)SZzpLo&u}߳\v֛d9 ^l^zaor6Fpl5 kԑ:-qilfqF63 בWYQlƏSɲ>$@b pÙ =}/jws(,pg ـ.DOI@f߫M*0qI/ľ~:L`ɀ.cQk5ȸ1} Tcsi||X]1ӪY5UUQ{L?8FM ޽~.8)]phkP~f_̦1p*IQZ"73 $&i i r J(iϚwhi܂6$5SJ;&a +d}yjM@foy6-dz5odz%@$_7/画yp "s*>U6шim믇_Ch??kۮFt"'@wڹ? a.vi H-D,8`h%.KIz0fHVۮt@ fk쬘o'FǃGs1tuv҃庪C?d+32F)F찛m}UEF ֨wkoճˣH_ۥ N} %:EŔ:ܷo䆃}MecG:ͶQ!_XB ]t܆\Fga|ءw(%>+/7k/}ٲ& S=^^1y$NnOOe C+{PΞ3 MCUifwwP_1YHChjb$Q(*V =Q%f(ÑGF ZkUG./>^æz\q$8qpWK깂m"U91eWXk-`gQ $V^U"$g ¡ ~0Qxy`UU-q?46 |Ek03*0j{y7<}6s_QGdgbgkO;\~DP1<-Iۄo5f Z=3P}c jα??2jVKcDV5Ͼ)68uF[J?^_e|v_\7 HʻnV5XdB Y,J/6~W9 r'G\bXCd5m[n4]$ TƏU^ܮnsctd|au2!vuΛe\H74O$UPSUkd * d [<5x.\$=tl⋰?UL [>?x\gvV,ćޢVXV4h H(vKGX\C Y;jzu3'ܦI>l/P]sg;[[8z5H&0[$"YˬunBD:p;/ *!=!-Bc;UR9($bnmwee1\6E7g"J_*ɷ`7Q s'9{!;k!jG!8/f8h4n4ܮU\)ٶudRjc+J[D" `I3F`y;ma|\XJ%=ș̻,Izz+ !ɴ\9EǶ jFͮIMjUq3e/:vNU=ue>qsھ2;4GpW,z=-o3֋zxzwYg=Oe)t~pYN>A2MaFlc~(M'c.WBΕUUUxv<;AI7k%j^/G&@E$ @dMpZxg yqөrN3U S ܟ*G&$/Ot XyCQw XVӾ٬9]@ cV, 5Z9{'B&3NQz¨v|r!Jh>B[/ 2ΐ {~iT:,ĺCN=ṳAϪۀhW]1->x跧Q)! V*$&JK`i2$cUj*1v*==gbQ[[ :EܥW9{݈̹X{D`X_yvyk`!?/W.747\`ʅ[WZxew郈)j$i. Mgs}G/5ss(g4? +VqO,UtfX 'ikcٓײSC(\[ 4a.ҘX [MZy7W*n*ϢY֑2A8$lDƕeF?btQ~h7]&B3Z7^m>\Ї ]uRF*̰'#aenn#8pA4*,?hٲS81 /F=GqdmI$yc^EKt[T@zm=jV|-[wTOvTf$Hy=Ǟnfxsg.fP7 9KhNb}"X";VOCލ©?Cihң]sׄ,щ\@igF?Wj3ʬPIW|S֒7jQ rZ2e-_ M6H[9.юH=ѓ^)D x5e5_VXuKm|^rQF$v\a˦EAtP&i> sHֿ<s:D3kzE6CQ;kO3[{Xn+㨧D_=98&ff9f\.{O^o·!IF\r te@:Qw9I$Ȋ9oDNCoJkpk]>|T'(ݩY)v9͢2SIR-cF= b98,JdQYDilbfU:P@!-v5f!8"Nuݔ6!_+ny@G|29gsB4Eƫ q vmk"`:`K4鵉֒IC< 3{->&M:'@ۆV{uk8^(!yѱ(+5pζ݁47q6knx x`pKתN}Uҫ]UZP(Z[m؏M͑T z@Av]1ҵJ%D]8 ֩>AS'%}< ч޺U/j<"} }PaT>HVa3n )"ST|(JE j{|m]7m:0B@Pᙁ ?%AY9AU3kB CpBL-ɦv8B͇Hg׋{ Kk"TmxdG&8;_o6|Li)\-'+hnrg9>vEZUldƒ⌅JO" Yϙ pF@¤Fwb竰,I0eG&GBر_1E6 FwSiG^5]i{l&L/S ^e#smzѣ"s_ؖa%O뱎&ZؓlvclQΝT%U@c?-1dH8m ٘g_XF9GjRZi؈Uf[]3lDLZ2̶"#㗶f8&x-i 7i!Yib٪$p66ݠU}ŵ6:H2RX&!#*XCt&6Sr.LgQ߶%6 Dch@D%$"6<ϙ02md<ݞ6Ȍ?܇kEm-v( W~_T,æAg7&+l2vf$A$._J_mzY9_3:s0On2 g`1d9QQq'3qo;% 'i9J6xXu=GQijVOtaha2uIW/b{_fU=mf:PҸNn 5ъC6hcO.JҶM2k\BʑmD#%[N$ڢ@b4J~]VV./ o} |'U[TmLYVztPiJX~LգL7}:bOfNqF=;C ĽAνSfׅ]zw:Ϣ쯅ֽvV_1(L?߅֨D<9l*}V9P,`6 cm$(=r#8̄LdZVAA|ryrբ53ow-oOMs#Nڶlɤm|:Z,QQqN J:'lXOc,Uc>6I7%8F嗲$bGn-+{c2ծ<ܚHٰExC&ن㨋Tl& iW%Rh6VR|YE I\Cy^cTx-QQb,NCDZhGc󮫦d!&ʚysOqK;9"[+L`˃؊,=4UV4{#h=ubrPTf*{yh 0ⶤ42k-4'LoxGs,C$RM )1()R={yߕ Nȟ|C'|G4z+b :Y@"D&+Bw5qp+WJ. /x"p}BHGh][^!?rO(>x\T H1QU46*u:8Fr-3۠#rUĪ>*cQ; [C\, dG=(O]\w$T&ZPgN_Z]:޺5^ Fgc-\bDokagͭKH>B95]$flCEMGHKxy5 ʛ'(("Ju.5+wR/ƕet3g4RewEM7Osg,PpƇ”ƩXNDuVDKsPF g7c}x7F.wa(BqtrAQ\FRm| v#L߅q~Glr׆lau\B.-h1%]|Y"ǮsOf|>I?kAm.;~ʪOCݩڇ(^i#v{DG&YWO5H#7|͂mM N;~*(D)SuM %ǽp8TbY yg4PQ/?&7O jj t#PoݪPJ^ы]843e7Kh^:0Ze?q|SʍC3DcR7Zsq/QYn}`z&囋0j?^ 30"Isl U ٱ%)r6RՠouZe'oo {C˦U\8HͱUVC {PpvDI/#U툉 ow* ůbL:nI 2ba<1 Qh3)9|4vv?["q0\B!61i"#cAC=j\&I hreSlrL0dϨv S)m$,/ sX*_!1>fֆeUm͞!A$$Y|e}#:}<6ҪV(' uΦՑ!icц\QFg*`L"b]ƜF! %_|,ٚr_˨9~LߌU_z%P6O"0'|y2۔ ˻q^8;-kTW^HZJC_'L\UFC]1gʧf4\VB+UNvL}\ZnZ[]z>W g6KTT.8gDc(Li[^ \OFo>W qԛLQln/)s4K+}*18cgihIPYdB4BE", b֨j4g3L~^ߵX6Of6WXёjDM\/k_c[فpI͸'ES'RDZ/|7uE&uDJ.irtR#9a'- jnY!3kgyto [C3pD;3UwS#nY-ߏmqKTͧT@C!V瓻:qPӫA40HoMv+R:G 69(U[>]0c?m9>_ʵ|{,(6AB/w񀫨kROf鬖4۶P=9znw()&ٮΥٴ% igNRC 4E^-p=He~gޗ_aVLrK8"W5RpvP2n+zl}x>ӿcUb vi]bʡ,a~}f.~M40C4tb)͆;C`mPR\ C/ 1e#nQMFkp@>?R-"*EW[\̷s_\~?o|n$],E<"EMseTˮ-YXdrVK_ld`;o{=p*1wd pldg8<881ɣect+Fr }}Ί=yo>V}yrj$wF=dϣGZ§?! /5};>1yiN+nr K:q}$3sԢ f٣G M!HQElƝ߸|2>lZ~\2tS fkMd64t>VB@>w:>COO:vwslDE/.]abVM%QTN,a6?S͒YXA}*fsrt2NL֗>nD6#~NctXfO$G3hm$beo*vQ4YPnf,/QFa򚘳'_6 ˂خ?4fgU6 |,F{΢nC[һuO\p 3ŵ=^q0+wk_d+I=EJyi]Og aioa㎶žN:JV4Tv]aslF=oSX{H:<(!2CLTaE~u 6ا+jw;^N;_ަhG>(9 YcT6ZauUTIx5FXj6=e]2.V% 3͵~5Y#ovuʉR]| ?4\s!34\qw-S6楀Jt1HrmK /7TE2w`;8~cm_\'OcͅY(ͥm"n xX\J‹u^óu-WlYd/0ūƗP PM ss/(,@dvS3S=U0yFѫ/-:bRn5O4=C_i=3mӺI:}y-r4#*fywsIJՏO&`Hb0pL^ЎF3YKMGÏUX&Dx'WC >WOhq95Cƛ|fAfhW9B08a>zS( "KiM@<5!& 6 C9QFTp9.1잛"-~\"D>a$2uEH' Yg2#\EthuUf`q40X9 #t0ƕ,iQ;P$AZN83%9T v;/tR{\4fAgz@EPyzJ]MˬF3ؖs5UW=JGio[a}ǽ5˽bo~3# /z=; {Kfȳ5Y=Iq"E7_0QLO/}Aͽ}pSʮnxn2iݞNeK᥅aaCCg!S_DzZyLƈjjߧn;/^E2>lp.׵F6ErS,dRƣ_I)L#g`#zGqZZj쏇?~\/^X:2+/K̴Ϥp`JSv z̡B9n'iSҺbPC\ٶp qxm0ڭ1%/UTQɪU6S)깈jj醂Bo< [^U^_=&JfR (BZo_ 7yhzl q:MnT6It;昚/ ס|41! [*&\q߶zypǫ:5'!B "7 ZQ¹jAou=ә"SD[AgigɮRE|b5)<ܭ1@(ZA2?>OJķK~-{>60AS~ȣEXǓN 9z/Wg6rꦜ!U!$?ɿN3`ݦ{܉2_-ф|`Eppw4vY,m o(#- 'Cq~#&ݴp82']*DnB/ϟK¶'wAr;[=ӫá^KUQ|ٌӃ#lkjp:PB/bLH@fBkpD*OdoI6ELiisRxՉ@ī:)O)"g1 *f`B>+V}4 [?? ³iPđ"qj- rq҇t~}E {f}5~{?]͖*UkCJ_cOUKtx5Fzm9fZnQ3 ap_T g7* ܬ-ѡK?sV_#dak`p-YV8; @MfS4QOj]3ͯ{J1"HbA; @HCTt+Ԟ%{bLz1W8W'n2s߉3#7}6#}F c<5jBo p Zԅ B6kLEzt'4WGo 蕒[I4[evˆWnX;WkGw1_ \>s~$-<=pz9(uNJ8s /ߖ !YZweeQFd@LSa q0AoTӟYSFɷd¥-Fpvs͵rU^Oc&z(ϩ6ʜ"k)mmh+D[n 3|*}R+* S}nhfйhԹXEm'I9<i;"O.ߺ%@Y)+ )#2!Äա@Uz}!8Ѧlf )ƴkv:44V<^ b:$:,FL@s[Sm,օDktyfٌ+*;hK YO8r`(p 8*{(ǫyIOJlm(6ظoZbv̡m#+L+㢸X+^P>ᰲ ΋;oTUWzEb>\1|8c9o*J]a~F9d3<_vs'_,PӈVtoM <)L+}k ̼?g4t2/iOϞo+g]\#"_]9&yUFT/K]VE1*;7U`5/rzhEfpvq:՛vh0Lvga%~6(礞w[u[=O~`u^F 0>f?(`x'aJ0 k&[^ P"A&SX6r6>+j½˜q?Tuv[U 7[ccYC϶C84Ϙ,/\h/tr桹Y7:Ǣ5ۑ) 6}3NɎ>MkihMs& bq.&C^ cj:'#Nbj?W}V5,;-kͳ*!ġ(6aUw?tuaIpKe_BdrPv|Q*ՖKتKixn{hYĀ #hZ j\ةǪ?U #; H/G?LJyr B<.2%R+ffKX2R%\e*g&._$זѤ$%`@q}oݰ{j(O{"آ 4NZ3SתmM7rաv߳v@SM:w5 ^mѧL#,U-A8gCi饥sA*iwQMh_4U;} fHtz.=ѫll^C=2 Fj0CСԼƩi:@ya& =gw[ j VW nP]OawOepHHحCa2 4 B0"A4V-so,mx'*N S'q%]0{w LY8Bk:- 1)9 _*ߑjt @M/uI_ eRv|gLI2Z' &u"TMP16ak.AUGQmGYCĦ6"^l:'rs|,(2eF&{al 6CaT? )+> ,o­Ib W߼ /Q*]Чm~p*n)\{l]> q"m%m_w Dz'4߫5MhcUiMWiw# wk`ď=)F|CKgWS\]bā棉b%3).uüg]ܱuewL]I/B#Uߖ3+a.eG"!NfzpGVJI֏bG$zKx~qZs5eओjROKiMZ( Q;Qs)&DnWk1O]`̾nc9띴5GB\s^6VB4 eki$anM9K)@"Vs%Ѭ9@lM$F #EG>[#rD1NLɺ:U|F$-/JAyP>q9d+qoR=^3]8*-g]Cqc܃<ͺ=yχ<71vy^"l5=֍1+~򚾽<7+.|O3挑&89,mnx/lBxM 3 7Tp@798ro]*|`r=U֯+>ס6iN CaTB }>x@Q }OL~k܂Zfv~$l'KX~9$,~P 5yտX029Rzy%ꎱBGepz\FG^xW׉G:# SbiR̗:{GCmRgfpZ|l.8lrW陃4CN5Lo1KۛFuާ+h+-k{JY#IqWT]Ϭۙ*637 =^dq.J t9osۼ`jq !@SRnnQvsB4^1ӷlqrW,v<}،m8M*$jr᪯Ov p-] | ^;YCx& /џlgq~.sF=~R'#.s/D6kI!(vne^5LM &NDciS\~ka~9Y[\? swQX?J_kҢFpb~G ¬Cӓ,|Y~?Fф|xEѭDDsH/8g%`@wLUؿ=wWcMX貫*)KwQ]UUQCs;c$cźW؉FYl8V9jձ]Σ[=Nq8 /9yj?d;ʌ B7N~&' #L"n% jq8Ԛq6p#{]>J+h(sRNTê rH4Yijmt:*rr0" Jo揣oM~iW0Cnot14=%$B*3JS v{b7k~n`j'_A*j.z锑q /%t [,y0tGO(+ٯ[ZdcB@Rg 4WFZH>N>Bq# Ʌb JpQ$} e]-. uȗBi{*Q! hYx-}WKkS$:NDN'CsLFf EHDZWΧG]h09sWg.7y?cg^Y6yaQdY~6YGdjQ(;-IC'G*^/i3Nq=$`}8ŧ<9\!f@qHbΥtЛ'W/wGOSͭU}.M8uӬ|3&Xk%mA}h̕iE_ќgHBw#$^ q)W c4U=ffُ<o^w#@Uw/-Rc˴ގE21:Bq򆥿lsKMRhC(N0Y !h7qь| p@0(r )!<{B>ti#"(;Ι?U1h&CB*>:oyZ4x LB&Uk m[I$>clNX!•؊d@bdI$d׎Q`̜զZ)zhW֩NHe\v͵Vȏ:g?>x:4wӿNt 8\K)l_\0ڃ < (Nm6<2}T!O.ԛMcTn1>8h7Rq ^R=*4Rw;LZYYV%QL9ІӅmWvii;CnY/ aTgYDOPmgapKaQ"ڍ aF9Ď hJ"C9ՋUٴkj4umx6*G:5~+tN;հkj;&6'89"fÕ4H%"?Ad)ppAa Vw.z;z0&H:#i<}Β!I^16M dݪE J_XOE~C voTn]Gl~n ϮJۃ^!聘JÛxkS܏^/&HI]lavp7o?8쉕ClZ=u"5M\Zؽ0Vr0ޛ$K#oElmX;X%h``~猋2AcDwP5DTqaeBD8;@Î1l`o(n!L&Ų=!On}Z::`o K :+4J-HچR n2ϑ6ԶU#Lhс)S *}Hisz؁>AzŧKSVShlDk2q4#SYj~^c~ά 2 *oؾœNFgЅnݎK&%By~߿9@Dj& Vx ֭؊[}K1c:8_O]#{P]wuD)=$CsžS~N|mӗ/TbEj%.HM*i@ʜM#|)|OiLo~!x@m+PIZ1\;4 ll~QtvKL1Yd,=łJʪB,GQmJ\ lm8@5=ZDOJ``Y7>,U[Pl}؁I,v쳝|4v wx/F'ڥg#m$_t9۱1Bq|j?evd/PA=QM "ȇ=lHy#m:`;%B7Z/~:^O-#D?WH,3 Lf{c<>MN;z:~;ԽH#.ryRzUm:6U )u=p*擟^XˑQ_rib.7w?[٭a|#zs w#9b_A_U<9`;0yG1zjІtӠ3DWm9L0,C6|@kpya/\lvP%1p4H`z|×#9I:H'fj2hf `fm^嬗ǍΛPsz7}eg~e; 4oqNNz@AzS_]AA!Wc%Pv(?G]5/z7 kl,44f;fET8> :Zcg)cp2kI\3)o1x3/S͢8q&({\6a̦+S,s_`:ϧ8Ȯ$\~: ! Eyڐ>F8rƭMAFdB~RBwEbZ5nLppϠ{<8}>oOnχONuv=ˇϠ28L>cŌْ&w֟w;=}q~oB 1Ur3]}F߉c^Vb/3(X1ɾQ{pQ:WQ*?ut5mj [7ujby_[5oFGu'G-el]0 nsY}]FuDJF@3P"LA@4-Dҍ($ eXX!!NZHgaAڬMh}ٳ;zv&TwoT08Xbʠ (ٙTBQϨ+'Sv2GXKOQw7`us4Cbs>C:g٧V.%Q#AxQyUsGGѰ?8.@aoF߈e15!ATD[Ɋ{s>>L1rRS68! HCF `BH9.IHѻ%2 Z @M8\Q&IrN&\b" u biβ A4+\W(&~|0 =~(:*߶_}cV2?V'o۪B_JQ'>Ge9ojќNs~X,(4wY.rlUU:K_1EP{fOrݰdVY~7ޟRa~?nӤ7߿+zpq CMz!ȨtDž1ń&N!{܉~wiux@ݯUtkɨ;E{ǁ72;ƪ;>LJT)?_FE9YG- 0!(q|s}/?n?+uCOȖký5&<#]]Qɑy*֬<1TYF'4vwhZUyd8~WT"ӮȜ*PLܼJ"=CKI3G~G M gi4Hl 'LO -XXai*Z Ќ44m:O{u\rc@d"@g8L)# Gmp0A0 00){Z 9^4OIk|t&Ο7zf;Qr)t~:!ONr9d˚^[=)8b|4YϨd ww!P$ 8Xj=S~үAa7@7 b/酯KV;3#h%5hAc _sLIА=[z 5shĠԶ3iKR.!3ZjJM&=7oی,s"{0dgv7w[21AC54qob 318@#),/5t-Gv'< PP#MA괗HZyvaF~(!%ET0!\_8RsaC̜SHfaa `©f~7O~Kp$v[>ȗs5rM,4A₣y@6ݽ_l'Lȩy-k0tIֺcC0HAb(mP%|%.GkeP(^} Mh헧>N:Ҙab@;i[Fdq3 VaےgeoPA T4'Ƀ|=`64$֡:TwSI{͓o Ƨigxt8)0XJo\5S*-T(/ᵛ ?Q] !$cL:lL Oll8*Л`O10WcG>%cٲ qB=hNJCiOd'S H ca~Um#^]Kd&1ޱJ?ɐ'$0p<$\p>w(dFĭأvėQx1],&Z2B;Mk"s1`lR.0dŁmiȓcH61' ȐhbH!a_1LE~Al:DHN4#sVQ]P{ r28h{펵 -kp<%Ĥu ,YA$ԙ_]q$1 IwE5݊M`uSit% F:l2!9qY6L\ 8]1nwˮ?hz +j 188 ~0))%цSung,ʬ̨\"05TMf{ 6V+Ԃp!CJ\l"uQA< ;_szEzOpn0q!!PaVKb&4$` ;"@xu7/609I!~;ȦV0rm 0Dv̇ C>//O=S]TC39;m⿹:ZP1uy}S$a|q5f_`M:()($&)"uHHd& JH&x0w;Rۃ+h @X"WQA7t{z%'wChc/0: [0/hqz轩9 5A!A0݆}=nx(yOp6@$UA7 O\xX~|!JXq`/Ɋ&,tn<+įdru tES~dXJV)ap9(ngabk)Dam g}ٱNV-)E7Bð#bs$!v tLbaogWW?G-Teȍh9jپjJ.l:RS>r~eqWt%VxgW{rh#>O8>]1y>Gj!g+8~,~_k[cm5 eXگOR;-#ۿsVΐ?"zqlF}i3f%fݖ8Vӯ]q5Y.8m>gZ/I6C,(d,_o%wr?͏N]nBywv%QHlZ"[D"+IO},E‡Sr.=Wu?x^w<úD?p~uw#ISc/֒I,@I$ޝdTBxPi8T"12AaU9&oî6yj>5o! &lXᇞ-.L?h߶bDd&N# b7hXI[dzbBA(` >X||z7/۶k8}meQP=eO4 lsx$LFIe=ZXkLQx|@J*W'r,AYf@e@P`CeazFl)## !1ъK@}IՑD"QG"3?r6û {`>?蘆?$5ٔe+JJSz4ŘEaC0l&/ke'M|g5*M&F͛Дf#ASwB Gzm,`!ѡ*$P@0FtuGlEH>hcs]HNp!Pڄ(w[jt 4?,:g*< '6qgPƗm3H\6XÛmdUUrrNňr1hC"oWHD;-ԙM?s͈1KI,Dׁ-_\]?` ЄF8U:ujft1c aϐ,D]ț\ǖrajx)HD;lso=҃&|دoqAȷ&K΃O`Dzl2=>T@Y W~t dϏw.x10ѥfM϶ort:L}aJSeɓ55\x>4iT<=A3nz^K1v! ,7 2NtbV?zڪզGJVYwT7L`ilkHsa\ﴹ`q$#krrOM3 ҆TOkM@wF-aŤEtNhȂoNm8KB §Beҍ.ȕ̈́CZGFGΕR\,#hKB= $S]BRسB(B(>QH3;޸jp.`Rp8&B`Ásȉu6L/9ztqS+!70uR} {ޏ~ݠ5iʌ\57Qh`Uk]0.IVڗ\10ә? S:[AD,4,&7>b&]eŴ/vw3ԅ]EA顤tbόxB4^sޯLm¾4V mh7[-C\Xola"~:s?QE^Sh꧒X*G0DQY@vZJSr530<eHlNn4㡠O335z7`"jv_7E҇I+,<{&OuZH$4m( ֣+bi};>=c^qFH`t_CHƾ|g7 `<=DXsK3v+EbhБbvҭTd~$Hu[kqBBlbgq5߮`}nv_/T#d/3MEgvYCd5^$:J5|:V!4΢Wد<[myX g;ZaE BE8OIWc:Щr'®tsu,-Rs+Gon]JfY!{(^Pۖsbx7D=yMU 7Nu(F dEc%̮b2?vCHqɊ@gPy/?UUC3|Lަ3W" =ḃ 3,Sݔyc9}ߢ 6 ׼}rXowF*06`I-wwJ>|;= uxfL +I)#RXvB9lm6hYV~߸^ 1c{8^s {ḯ#cNđGG>%BþVRY}o6GI70썆wOC<X(1+C;+ x0I1~y_=/GO?$=L#]&fIL\?0^V#m  I[,G&k\o(/.}qw˳pB:];`t2-!U *T׮i7w9W(RRf;j%)Y}Vtu(=]#<0/ިmBO?& O\e]5߿?Qt,kY=T[6M>6κ[ZB>9ǟx믚xv5o^ܟ}Y/+\ S_g˜59=6V^U#X­0JL TZ#0֔krKKi7L|+겕U[T.ޔk߳~}33ʮ ?~j돿1h͉F QfǞ:걶em2R +`UTَ3ud#U&ǟg*e_aP06 [N늪V DHWs*|WziFWR-Dzm!uS>W/;?  R4NiV.{*NG~1a?|}Fۺ?Z|ሙWg<]}{ns5^ ukCs4~QgB>,YP|yS|;Wj&%/8^z,_Eb^s1ZucNntڟQ@V@YI,/JY>Ì`ecNn=hhɨ#FӞ)w;-d:f[_RU՛2A2m1*X td_qm qm:>>꼞|;31jҫ W" ${?WTc~ 2!# /5F}ÙwA! g$ťDŽ.-1V 2ZJqze\S{VX ]KnrbKY.Sͧ¹~}+Lm(;]ZU]|oz ޸~L??G͝`\Z ;3j-a[ ~xbsש7w=[߲,km0ʿ7aoBf]oν~=oq/;4|٬{aV;OoBӳ,oRZ>?wjHwAj*kt×T?.ח*?7_44o^ vZRw< |!UT{!RH ;]7C}=<$%)4]L:uoA>ӿGIoF݊]dCEP `B&:CVg/ 4?1DlbFdFCYT1 _Nei"`f9uwUon$o& ns i;Xo#?syֺޑV*GVt`U]Oj97ǧv@ +6}{[RYJ`yj63#|iT%m4 [cF>G*AzVsA-d>6:̺8F C 4D/E +M꾳}QF]~ ֖4D++Hĵ%YȮx8G|W*>4͂ ?m`-U݉H 2\StVODb9l6ΪJ.z=NijPLVXŚ, 㾐Atįt X<+WΙVђ~O5ٳv(F&t9w.qd/>NјkD2{Gti= > 5VW?QrmZ:엄G/FO5y+ϿIzz4Zo(԰g>XD sEREG&QNg#©+NXG zy-'=кvd eq*bT\\a /U^-b{KaOau,V &S?Q ^DO8]m+nimnG3kMSS+  y}¸0+w(L)outq{dw]3F\MʪALꛯ>MٵvzSJZ31kYt"*Hi7XoaQvwN}mƃUK FuRhcDm~3ƺH %\;@8-7?y:ã pڍzfnaw惿<>ջ-ۄ> c"]'b%L~~ԬgF'R\J$D!JU+G7TIEꭴ%8/ Yi&⏙8yτ؅KߕM}eh`3]]ʂ#UT`$/HNqrzƷsQ'O_uB㧝pݡaNn3 g RR[H> z4A;cx_; h.Wff>whQN7 ̩M 5BqC\s֬jHՄ+zѶJ.\B%Zj:e{hX|SKOqwenT0MhŽ]м:a$7. z柋s2hRPQe3:yc5$A4&g+廤z_3q1Jm W\_Ϭ$Ct"$'3!س yCwa .Dk)"]Ő-k>.h+SToq^{˅:wö+WhTZV|F"إKGL@E09^Sh(7fm{P#vUm~ 6NlJ,62:H3ýv1u+vEc',xp7#Sȼ!}P}Qa>-sy㡘%7aN\ǧg/B7RMȍ[Ijƣc_j:ӳxgZf0ݺ0N-)O([,rJUN6*BachVeQr!!6Lr@~H԰̟,l(҈^%jӷId hZdGr٦=z굱uma6}9wG}WLaN0p4ġ5ӑxOh_Zf`sqfa1oْVD3FPѺ@Pf՘cX $eo\}搑CQ>v+T2j9Ss&!)*( h31%h2+22j>X 4C@1% XCIaAHYE &J)VěHm"dAYI9G5kCAHHeNC*m-܏37cm #,g?'Ռ?S_‡Y"Y T}3Gs')G!mFA\gC$P=+IpJX2PAoQl̘>$St)(` 8 P0c! D7_얄9,`2bl ۘ0ɭhXa& )tR=aϿSӕYMqg5Sڔ|1/ﲲ;+9ysW.YhQ !a$Mѭ df_n_PI<ھ> >/Ԑ @\{*h)n8 QY imztm5pff FI*xjcЕBfܜw3:VMRVSRCBsQK%Z.$$iR$*!`]'.v^^kYHaH ڥIAV"wX2}S /Xz6"PF!l.BhsuUQpCEa!Z8K.$DX1%aL`V Z0iX]acYj@w-%S:CkL\fT夜\ҋO9Y̻̚b9ֳĬhyƌå:pf3V6-sfΖJыUiܧ{ 和cD14W`;QOV>Lu)Ɣ][Y3"