summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2023-08-11 13:36:45 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-08-11 21:19:22 +0200
commit04c7f60ca477ffbf7b7910320482335050f0d23a (patch)
treea3e6f4dfb824714970e71c25b6d1f864033b0c97
parent3d9e6f556e235ddcdc9f73600fdd46fe1736b090 (diff)
downloadlinux-04c7f60ca477ffbf7b7910320482335050f0d23a.tar.gz
linux-04c7f60ca477ffbf7b7910320482335050f0d23a.tar.bz2
linux-04c7f60ca477ffbf7b7910320482335050f0d23a.zip
serial: core: Fix serial core port id, including multiport devices
We want to fix the serial core port DEVNAME to use a port id of the hardware specific controller port instance instead of the port->line. For example, the 8250 driver sets up a number of serial8250 ports initially that can be inherited by the hardware specific driver. At that the port->line no longer decribes the port's relation to the serial core controller instance. Let's fix the issue by assigning port->port_id for each serial core controller port instance. Fixes: 7d695d83767c ("serial: core: Fix serial_base_match() after fixing controller port name") Tested-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Dhruva Gole <d-gole@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20230811103648.2826-1-tony@atomide.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/tty/serial/serial_base.h1
-rw-r--r--drivers/tty/serial/serial_base_bus.c28
2 files changed, 28 insertions, 1 deletions
diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h
index 9faac0ff6b89..c74c548f0db6 100644
--- a/drivers/tty/serial/serial_base.h
+++ b/drivers/tty/serial/serial_base.h
@@ -16,6 +16,7 @@ struct device;
struct serial_ctrl_device {
struct device dev;
+ struct ida port_ida;
};
struct serial_port_device {
diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c
index e446c57e845a..3dfcf20c4eb6 100644
--- a/drivers/tty/serial/serial_base_bus.c
+++ b/drivers/tty/serial/serial_base_bus.c
@@ -10,6 +10,7 @@
#include <linux/container_of.h>
#include <linux/device.h>
+#include <linux/idr.h>
#include <linux/module.h>
#include <linux/serial_core.h>
#include <linux/slab.h>
@@ -112,6 +113,8 @@ struct serial_ctrl_device *serial_base_ctrl_add(struct uart_port *port,
if (!ctrl_dev)
return ERR_PTR(-ENOMEM);
+ ida_init(&ctrl_dev->port_ida);
+
err = serial_base_device_init(port, &ctrl_dev->dev,
parent, &serial_ctrl_type,
serial_base_ctrl_release,
@@ -142,16 +145,31 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
struct serial_ctrl_device *ctrl_dev)
{
struct serial_port_device *port_dev;
+ int min = 0, max = -1; /* Use -1 for max to apply IDA defaults */
int err;
port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
if (!port_dev)
return ERR_PTR(-ENOMEM);
+ /* Device driver specified port_id vs automatic assignment? */
+ if (port->port_id) {
+ min = port->port_id;
+ max = port->port_id;
+ }
+
+ err = ida_alloc_range(&ctrl_dev->port_ida, min, max, GFP_KERNEL);
+ if (err < 0) {
+ kfree(port_dev);
+ return ERR_PTR(err);
+ }
+
+ port->port_id = err;
+
err = serial_base_device_init(port, &port_dev->dev,
&ctrl_dev->dev, &serial_port_type,
serial_base_port_release,
- port->ctrl_id, port->line);
+ port->ctrl_id, port->port_id);
if (err)
goto err_put_device;
@@ -165,16 +183,24 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
err_put_device:
put_device(&port_dev->dev);
+ ida_free(&ctrl_dev->port_ida, port->port_id);
return ERR_PTR(err);
}
void serial_base_port_device_remove(struct serial_port_device *port_dev)
{
+ struct serial_ctrl_device *ctrl_dev;
+ struct device *parent;
+
if (!port_dev)
return;
+ parent = port_dev->dev.parent;
+ ctrl_dev = to_serial_base_ctrl_device(parent);
+
device_del(&port_dev->dev);
+ ida_free(&ctrl_dev->port_ida, port_dev->port->port_id);
put_device(&port_dev->dev);
}
Tw.I$(cK@l`(82"`щ*{>D۳?ͺ8'/\6fg\] @7 @k6..;iN=掮3FR3W>IwdݻqnV2G)Yq+vbHJBdWvDG8ߟ=QJTb\;2h`ZNPO%oh|&=8@@/'S_<:DϪB%5xDp<[.4"tR3׃W5>:j ^%嚅 hռI_^{{`¨qa 0Rͻ{y!)Skd-7xMrj@8~{[͆o&1?lmRۘ v!b~ʶ%Rf%29ڝ7ͱGTUbqO[ YR0>17G'O,AR}MKobR` .RQ.eMۢ[Ɖ_ec71 |۞ɻ]W= Oh~XnJ9nD'^X=(6Hkxix/XAkXJ||n >))HBt2:RgIQSB-,gd>K_`O-~=o}V}#GÞ>%#T//E3bs7#,ݓD fH]~搒Lp @vaXʀ708͛5:Ch 0 n&4c/1`Qr{LͮSP- PXN>,9OFf0lo[`#z}<":0:~=Vw?w~x`طs`Xz9GY1Ih%sYpģb 탑Ʌl[L[4ɳ9ͤК+ܬ\]z8dXkKS'C~U׀`O0[?jl!^ݰ$#ݠ#n)ϓQI}t$@{sK]ܷ{@{/VX 65ob1_3 ?mg(.`u͸.͝^*yX巐 'Kb쥾wzJ7ja4}>6u㫧u0w<ʠ-w/n~8B@:]k{~H9mxw8K EyuIw@>š~NZlk1K@ǧ;5i1砰{jGhk/(=9usjԶ~Gpu.St+)v/-U=__BWOG^?͹ޣsԐR|"4Wpp޻VHj/=q>qw^CM۲ ٳ5Ѱg?d_iZi&U19m{t<0}ߌnqz6vZf8XJL2uC۬f+&=5fn,X9Jib}_?#{E*#f1q+,/sY4i/V%3 4#(`KL;*K;vvC 6Z&AH@*[T֎9рT(XB@1׺X зc$اDx>?811'l@$`>˜(A!z,kz% pM`4!y=RuJLIX{ręT[Xǯg׈o^kgk@}޾T}Y+3+@GBwxXpU/3svЏTMW@YOs?R+it]sX{[6l{s~JK]7gNl-_7+8:B"5BwAII4|h= Iz9*[,ìHDp,&|=v" C8?>X׍fuV,|'g>7M,c6sVU_:\AԼu;iǦ\4; (xrDJ奤r- 4yv"xxGD^06> 溳CĻ1 SkAteҿ5RĄayBmyPdcmFp^Jn bQ`SΥRߩr'f|3: oϹn>$v\w\2By-[:c)!G(b" K~] x0@uBSXRn' 2/c-cDl:eCﱴU26vTtIs5@ TF((ENf9 hݢǠáؒDb"Y5F_Mn 0y= pM4T}aB~o6(2rsChv!ؘ3_뱥hg%qϊ{UDGi ʰJ$+N>UN<,V{6;8PT< O8^FЖ{s$6qGZ.M5aK(b!3FCuiͤj+nQ[ǔZa6 sƦ}C."'ϵM{ܭK;( go{}&?U@$j0C2ζ>@'(ʯP//``-u~O>jM/@HAC,ٹ('5lB€=|%D 7A0߁`)Ab ;~G~~|Tl܂sïLZ\1g`4QqKd;jФ7a,ð:X @et~X{}(!m?Rgc {EY6 P"A)=t?<Dq\fnY| 8aSU QJ#eHA؞+}kRlxdܰ8t2:8|9 isv!>u!o9|rq [5 Na͔/BQ+MQH+n0v8U}1'ȠPiNpo}Ȏ_X۩PޚzlyJ3VUSl!lE-WSC|fͷ'g{֍<-@@LaHHC`E';orMB`.M:5/n(۹.M/Q)0n.a=U#ՌmJK՘{5]nhqL*-Bus:Ctr`.1^y)m~c֘0 3" =x.9MKDf2D qէWJ/@ !ۇfS3"Q?w['`A콦S-{#d}55^kLC=ɿR@ 3+␴A\֚9 z^| M]#et'sKnYH)P~Xޏ7SM>1}"9O'JF6KVwϡY_`Հh(P1P{Ԕe /ƃZ< ~0xAu1]ÆHv 돢.;ATˣ*^7q9A[!X8crb@񫀽5aa6pQ(AejD@|O(Î=7[ VxA)'3E$PSqDRw(Tyw~;C7\7emu'>.s=nA2w띩LB[q'PˮK͇6cd37~JSXoĠ \m=v< Z@y&ZS;:`(E+6 P PB^ȊhWER]d3E6q7$3PU#=@f_V0H6tNⴥڑ1ˑ\]u `7.1T.چ32߭CuWltˢSX67om1$92@}<=LCƋ fZqp zYYzå=Ħz\v1FzAyw =ߨ6 Tg~Xz$X^}88fm+t&y2[蛨jL …a ygip̆ <ĪvjM̄y C.:h ~Po6]ݰm)T\N<69#y޻/.Z&S<zvt+.{S=uK>~ՍVGTC rD` :NO|p " c !B$R2߯ @Vag@gϳcA!Dh"!a SJY8AQ5IװK6$_R4D7!&N qȸܜY,62qp eFH ueבˠ (>K;2E|m4t_٪󴅘)h/mܭO]~ }6x~go]{xUR~ЊAhyEF=' N8 C^r 'DKUl7(X1U n݉#Lo-h+FDw꠻IuH14[#k"mطN$ՅBlP+A\u``nbŁg39lLgC2Z)Df&19QfuB|RWmяJq?4HDwmE!}k`"vrXRզ I[BKK8st}'W.!{ Fgfv}%xcמcZͻ;rd勢 RnЪ_ "Uݱ~e~ *"*Vx_擂vu -'/c6T/ݶT\}cק&vS:tB/3i被%iT!P1"@&"f٢C z.- wSͶuzŜ[K=b8+`8Ckkv@"մG2`C&].}Wpx,wx:~jm3y5$;Jd͵x]csZ66LKѨh VFc&\zpLV]hc7wv˴٤#Z 5a^3 ޡX/:q ,?VFQ ǟaU0 ~gU7"blp\ BجrwtF;U>=-e ϛ1]Y?^b͡*5ACVozM~*>ɪ!pur{5W_m BQ N~~Bשv5Cox㿥n(1;D ƙ?9XQN.tj}9QMi14PX(Z\ܮ/anaPZFn MeQW`$bhx=K=^ۙ:q}BZi.|\ʮ)?P2+Eͭ.R\f sJ {FQ\BFeϥ `]œ˳wEzGf&R}F$̓3P6 X#8d90~M\9Ac413u8R*_ vs፠):SѤ̥Ru\ꖔ yb21*i >*=_E.]>~?+׬>(uɞ 3+\'L.LԮcd_SְJ='VK?Q=ÜwaKrwd}cv">x0Ք1))Qk6C ]6d(m \BسΠ0o/dE$D{M0!lE.ipWlK=-DhxsNf"nڿGˇ0*/D8& <+!` O<8<@ŀfQ517P־$}N9=t{Dz&Ji~?=j[LY.axg\U@" ,V.K(G?`u:'M-5b\~ϧ=ACGў$e}_(9!RHUҘ8"m_յFuӃ{O ,*սD@ 3Μ3L|BW#G;3Ɲs@}u4V7fX(fPBXísp:Y*DvhT"Gspf~e.(7S c&  yb"inCIȰq7PjRηdS*?u] z~ñш-}}6G36J:*҉yQU}8?5,!s ~ҘYaH^1v65O\;ϔ"a4 ]`;HyKdpB3鐈(oYpڑ[Yz`5>Oy_T'}ԭvWuiaJyηK̕ 1^`8:SK(B/{02#bRdD(uɠ1{jL'#MO-*,şك=ƫDP14Q~`\'85Gw+?Af8N{qa?'7s.R A)k.$pA&rx6R~p=]i+e%ãoE_;9uDW*^:\gn~H 'ђ-hP%DFڨ:L-յYU5ayo߅ 㧬tEYp#`7c8/HO3p *:2,E<5sOu;g1wfMd1  >MT\6m@![1gQp^oM+oir An<I@.!g\._GIu1BjpNAQ)mW,?E@nxRS"nB.UngIG (*3 ~\N\Yy]#P oM!ۧ^}}Oo_.y]PHPkޙ$F('njÕɠy0؜ d]+bRcynvKpe,zƈ7X34 pKr6N`:!AǾ&$Ps=P #| Ӑ.EI^R"/)PR !kuS-Q7?tԄ1џBn xUH=[Ys+_4h\iJO3JveϽjμ}=JyiJYSM٦ˠ qCxоK84#<iNͣMwlہ;/%e(PX"[-KόE>. 6/pnTԃlg}2"h.Hsd^Gwʚpt4.lh}nϏ||,@Re귄$,'ജKI^60-:5Zj,!JW:Z[Qrbzǧsb?A{W\r{y E-ꥤO賙m9)0?a!{2<k ~ ho<-bިrr%%" ƒp{_QBiծ5'>>-Y8.8pZ::)hDA "aH9GxsJ};8Su9l*$u,@_Epn4tXRj:$]9cZރמJ 9K^I䆁Ӥv y_"0 9\1#猈Vzê-|6:Qhd;UVV/f֘٥_vZU\k<cq::ɰiRyTs_ˮ8XpW??|R~7$e $qӹ-*tqm98NS=!?xp;:X2ùC-@ *u:-әh|e D@y.^X9{Z͕D +SqMKk O(;^~/PWȺq'zyD 1σXmP,|S18eé;S \:(c_:1dsvwj vu~eZj]TvfBk םBI_-8"w7,./X:W\0r@&16}'LI/x̣(TYenXmv򱽗e,\icf$X%ϝӞuj2{p W8+ *DIDT;ѫ2 zbg(A,Y}Fd$f!Dg-ۯAjQ-Ző-#W 2m^V E3d@0ϐLkw'Bڇe6bԶon$dBxs|6qU+{+ȥ/߷D #Rhv7xI18v5z=g*^'8F_I;7q͟=c#(H(y3~[2xQ1)u}W|#iZg}JJZ/u/[$O{yw__b";}xI#lNhOLH5I8>o=g\cf p<$wN3|tvnzR)p@,Kf("U,T0VkԔpXX=:GkP39;hP~vUp:L`}9rkQp k=-ehuF={niPGU=c~^]`xkN ]N6ChZtb0uË/ p jL Do^%&sFv"FٔP?"[q֦ۧpІhW9F;ǪBh M" ZfrdrDNĕ,1_}8Zr[k*grs,:8FltHFiqu2նNCn\d6$~'&x__3\,K<|VӉ4MـP=#͸'S=e: >93$PZYDhM [(ZĪR,P[ֲ͎C 5uvvO27lp"YGo.4aH(,S8 j9&"le&r@^>;Nyu?> *bU`_N9 Hqh-w2es10&?>Js ۱Q[pxjOJ/NNv>Qu[~=z?,-JebE?6ܿWY(yM]ҫ `Y>l&ɶrձB8YCwZT/҆X*<ËSesтJ *ᬽ'czy82oϟayS,&?G;oidDL<~ڒV.[->WЂ~ՃˏI!ߡ|x3W2B4r! Gٓk[Mm&cA=G3!/P$g 7_סg)i ގPBO9w Cl1xs\~j8_*X!h@f.: ;~݋ߧbV< c}?|݉K oo`A@iᨵ,n"oWS1[*%,@x\:e?Z:Agy(#1kE[Y|S,6 !|?s N5! fdUe| b);y'"fOl귫䤃-]\]׾1^ďݕՏt{zWh${^yq `<`<-Ff .x Kë06XRia0@FT7,)fXt72b>j-, iMYcsd{j*q~7}+yT(wŽKg%/2hkomvwq8Y77x'sL˽?-?N0&Α,7>0 v ABقʞ Z3T.pft#r"t w>jA<&^62 ,{F#MI L>|8|Sq.34ty01T7"HPvK̢b5 BJ9oeW5vt'*}6UF;a v6D|{Q2{EsYEzU2%m?9pxy FK4A袶1f5te<~|dw8{SaILU'G )Dc_Lnw2 +%P&cue/0*'q$ |zD"^`(/nqjZPAo:msJ"lGC#b}\ldteE>?wc ];4&d& ۘWnk66}eˌ%ct$DĀp, EeGwDxvCuHdҲZ:HPm(EQy*op핽E(2h(PhY"($C@E[r|XD["@RwY9D")n? N$ ԰9QªZ60+ ߃CP)Owez`tU-[uZ ˍ)֪ۆ{N[¿'#jqJi,_^9 ݱ:K$YηUavmή ˉ : N\#J0R!c7H6U˫ %(Ta.pf5A\aT1XB{(yCk8R!I|a>/RIz%񜨟Ǜ-*92MK u~ x7q1oa~ʿ8n )˽.VO1b8fP߼L=3(ݞHZP+>d6Kъ,O~pb ͬ,cMAvL?|x#ªqP:wCZUZj+tPksw%P-r83ÝYVfwm:+~e3:M"g D9P: ɣ=mԔ_3Ku ^L'^83Pa}.tOU;JVQe[T: H089BU MA+nOaQ|vnvcs‘2ʇ?JX/W6䵂K(C(9ɡouG =qzpQCgT̤e2_ %aIA k?NdecQ-Ԩ_C7 ZI6BKڽαvcmOuq[0;~ƏeYߺ.({Cدa8tfΨMST0J%lQ׊ϥJ7&F^8v NyrSUS1os}v] ȇ YP] )'d~'o#؉f<|#w&LӾᓦ&OXfx?eVo1nh'b#26*U JkJoO LB *Rw9ޥh|."!!y{8,wHU"~+vCAѨQL_!b3'SAoc942#C-֘GZ6s5`dzTybh?ozh$%=Ȕ;E*K%öϔ6^8:es|FkqJ[wECFW8ٰ/dVy͵&y8` R6<;9u_ڇ>|̽QVyicZrn,>sm٨%q¡ɤ?h_JYɼT*X{EB2>a| hk{KZb*O7|+s0iu5ɿw i!Sz/bdxl =S60@fǜͼ ; Ɛq51ܣ7 X.r-PUhݳ r?^Ø!Xa{ ߞ$̘B(e$t#tC`)w- 默<އ؞+, eM*+h797 YvT0;I#_ys Y)QW):1['Yh^x~N*W FO3@y䭅eB~ }I櫛%+ !JFj<(69Q< : cO`/BXYWSh7?kPcm1A_R=qoF"V"~f6'+؎ #cp1J9Pb3{h IӞĚ=c:XҲzkZ}*mٛ9f A 9ݵ#y@$PPWVp!a F$xAqO[3WT# ?9-B$glzf#4 ξd #dQjO8L劝m(>&W \X i;G[}/! +\X؍LO{:rf"|ȂSQVD XMa׊ d68BC}QsQ3bhrFV^y?~ %dCs&hA"br@௅}>3$Ӿ5 wT N_:Ħ"x4뀼eVC2œ,s8K7&B X*1 FH!|T';[Zĉ>KEq-odsuo.7Wg@ L\ꘐ"aZj4u#b}DH(Ŷ+jHUu[ plZ"NnYdNL\á@"YT$] 0EЪخv$7.3'+ ρҬLPdy*mRJ)!wl(Q>t9|@p69_< rYwa'8֡C˱Ȳ_9V6X{}i0tH9!S*;#N2Û9xSk;{~j~ZXuk’ Q0)h1[qvQo#SDΊ?ј! 4~ ;HagڣlaAV\}}”qa}諰 ]"-5wjʹfj&Ǫb$n$cK63^g?gn|6EW A]m w!S/2曕)w_@QudC}J?siN丙k*fƱfk(sH( aǢ3HG|>ޞh\\*iN/a0.T0CvCKP9>BbA+ؗ3wC}u_t}2o䃘x5$W3g6Kv[nntiO?=E:={=;djE ;ѵnJgZM+Y! =5x+g}Lgzc6z2TwSJjOv.)[ #MvN(f}VtV Ds3PMAgVKvkPԢTLUxJG52ޮYy>SPTcM Fe4 v/%;][DZdUA яU["zԒ5gZ&%4;[.ɍkjSxAmE!+#oI^NkfL*:, ֠$[mӢ gO0p`| +i fp3a[MJ^~.eDͻ05ckˬz>`-Fk[rY"nI{4J"ZU*5e TD$♷O`œofnBP̏@<9 + ({5PgsхD?B|QE灃O3h >h9IzRP JtCфm[5 N$g9xqCgzaC!p,$@ۑ4 Zu Ta9ns݋>=O`Dl  Ճ)VV)dt [1-}qpkV&w7ـM 6j*IO?cw¾ Lr+D5r[n,_6gOSP[e!HQ.k^RA|“$J͠ 2ԊIXsA03yn{쀔B֋G`]QQQttKxh-ةR"N{zsf J#xs$>aW -Wdכ.G`3g?O Z5o`/Q˥wX9ӠK.ϱڗ`zAlq[^jdhV$GU$NTlZ&(<\5 1g OP|0pȣm!>>ˡjNc?2(Axptlߔ"@(JSڋaX(x?텡D&*q6jzYElg=k@r$j0aů.@>Xu IW!r.IgN?.?0|?k*@Pi@+EMQb&ʩn-xȦNZ ;UPxcҢ^o#6 d oh79n,nrܡcC=5-QnI VOmY]e5nlU5cEG"]buwS E(EC!L'KWt wP<H5ywXOqt@ծC 8Kd(7=2[ۨx7-zlW^mNm^t4!ϛ:7[̣rX\{8.)x{wݹ .yK}ЩV.Ve+q5nMq[? S=7T7#" 6Q5sܩd.iHy񸏗yޡ[dPd:43-sB-#qbAl# a{ (C{Xp[YјaOzHIݘ{ 5G^7EƖl=C#'(w9歷i0}t9m~1$|1q‚gQ!6v̾Љl)#u+K*UC,Sgݜ̒|#cu`(CiW&iʨ&何YsXm+N߶7H ?~#/g[Řoc|x @v.vEuuBy-}("{qU Dlޫo9n|,ǓGäz g_F#n = ACԀzc8 ^r&!7ΔAW5v {Anv}L)g=ttո n$sԢP cYd0ՂUS&&3C7Zc!~汱ӫA̸fc h&[l \e_'F*H֛3ԾX2 )2&TF%Jr +AFF?#J^POW=D U ;_{o0ˀv4P9:AS*:bTwuۿgy7eT̀|#J L`ꉥ;v1,wC1!ὥRT;T@[j~[a3fJkyZROY?E8}G.` ,[$%M_!K^ QOWh 鵶MewjtV ADYS7 fɦr|llvb" P⠾uaN8PssGź@cY>f 0c6Y?1m *u!y zK(rb3_tf; P=[\~[Xіy{,᧵ fJ['*"~%Cäe~X-gLC &QlwRKubkxɋ>k!9&њ/b^=<=ChrD9(L // an^>oюj?q Q+ w|1ƒo4&^'s|Zu݂${8xUILsO .2ĆEx_HPwp#3>4'%AG2Mz&ފb\]QP"I6L(GMR!5๤4q mmIArTqx+f' ΙTدUدPlD^2cM|'e#a$;vͺ2P˵cQvN~E2͉f+zGg@-snPPr[+C&9~鞵;6a'jC 3R,!"?eI z*:g 2?\m1ϟ֥b e:.#l:<> ڻ i7=ZqYhH 2>=LcT9ε5X6Giv9|ߏ/r׎OȣaB6‰3-=7wbQ8-PU ;&{۠ Ys,܊H3xP =P?n`3R% ǔB(tԨMqQ,tU9_;Ngt='?kwr}gg5o+cUGG'7ݓX[=>|a_evpFjSΩy߶ (j(}6V0Vk_zf`xf(Qi3U˞n,(Nov8ٸ@rM @\ $!qA27,|I+9/íNXaNL>UwSv#w߳YRN:sýx AvšQֳq-;+{;&]X1;#/1˸cZT5K_nf')ASU o^k*). z!Q[:{@ Y|HlPo/w3v\;a/Y7ҝBt:_i쏢[g3lՃJz~TѫO 2qBQq ڄ*,A<1a\Fnt:~#AF=^|O} D(%h^Qw|vubm9Xb]3(I#e7w4mi&DmYϘ Y* ^w]+,{5m6H~7qwC5|ptiyZQ (P>tͺ6|?MbEB/,xErr,bh۶{-&ݺ+g'y~(Q68n.qL !}m!ofOR^ ɘ oWve:Ak/' GsX" mG8Q`\B/v< ! #(ǿ仺<Ŧ#'$;  ZwRC|)kZ ?8o49UcCG\GGoYMΤG)yr/|c=qK\%p?4h8E^ݿS&_@Ls-NݢQB;~vNe6~ #?_Q2AS8sS>{¦C fSif2>Lo, ,2Nһ@hw_#1HZپ<ͬg;5EfWIN;e Jv}=rj\yb*Qi:atVBv|A\Igt㟮cu 2A3RzQ.u;o;%|Λ*3u)7Y htj" zIxsYŸPNh\pOx2k[,oONX%KsN̖ҷ6Sw+˖5[4(O=hxpWGgU$,ٰ CNvMPe;oUay%rv7㊣-:1ßSIJEB#oƹ0E'ta*ۉ%W7jgHx!ӠGX]O1Yܶ^[mlmkWl5ۈa>X7n"SD?7y xǦY}"rI0úiR>z}Gwu2FO79c1WמYAO<FP\ӋGhQ}j}v:^3:pXO9Iw mhӝrtd [BePX9C z;q.4lGlqK/3Fc4,Ws%kG& z`ωcf0̋F?_g$Ri7q ;έlH-:wwɑdsW ."f9`VҬ3^&+Ns|q᧡E7Y[:}.2f=M+sj&!}4k1Ȥ-ľrcN;OLQG$HwZZy- hE;T01W?F[s~m}&lwMwft0 =T,lܺY]cVi m޳9CA.pWEcz͇KyFZՕ6&>j%\og%5 >&ߌ6!j);ц|c]5O"ks wA)|3Y\v֍ uceGEFtzvEJ_ Ӳ&ng8چ57LcnCbLX:H6Jx%2{oS-r-0N,xô@SaG2"VF'1Ak1WO&Gwve8 ,5SЀ)W=6,c{8Q 鮕'M=_upscgVxs7-z'8: ui,?y:.۳ (9gB<'7 rj%xN~G%l=,LaP d`$(6\YEG'%b9֎ qq\)=C'6N֌@[EsPdPF<~nGJ%/1Hc[|v Ҧ4m\o>k|b:9#W:Yʽ( zhV&_\R4{d\زMҪ$ﵱ!0SgL)F =x5ۓ e R)Y9.rd1<;\73ZGHit~li%KAV֫bkvviNI"ks%)TQ'R㡙{|4f:wvSnSGĤު4R-i 1_!⹊TJ߲'ǕKEr\a%etYDo^-DB3*ݿ^a=ww^тd28x-Ys>["8(bWM),Y{9IT%I&_9&C6N$zKdvI7 %5Պ~4{?bᲿ9S'A&P྄\YEj;$҄Dza !6&XbT,fi/s3YC,rj yItH4k6J#CkHʹ" [WW&G'w`/kV7+/*WPM i(dŠjN",ާp=jTX7Q֚} dFg詵*O^qGtbXy2mFgU2elnK€gmPFnhMUj*CT9 pT<ʥ +˚ i9xT1sNdG<.-K[fJAYgf0Fc@ #ц<Ԡu8nmd"X]4/5Ts.lE/=)9ǁ]C"_]&@\"+{'\b0@@va+\st9lkwiܼ\S"U S+UŽn#dÈ̡Rl~='܄{L?qaljg%U$UF; i>[LT*f 2bB !}U+>~NfKsCr.fe8] ''G\LWnz)%gMC 8M>U~BcQ.$T:A|c[NY6"iRC=l2]QkՒ6JF0 ocD~;kbj;тwfxkz)M]-zʋ _eH&K k8떹"uۜѻ3qf16s!k$BX_32o|,a@G; p?/}D :1 _gpN׫ksd6 e> Q^xxeA[[Pp7(xzXV** xhCޮ2(*[:Ci/att[F%ngόo/+-jF!cUrg& kT n]m`Ijђ l)`^!dG(TU&Tr1{YѾE$&L0) L&A6p.xz1^E_ϯ枻Sy2"'C uo #g~qGz~=(>E:57n6E -/E ^Vi$ڕRcHy ^i[ՏNqڡVTwFi1>+֘p`UCɇmh|DUY*l8{<"(+}+Pu].r%:1󱆶G\T|K8z;,b􊻘!X,3IQSL~~ୠ#Y+vKC0$Q;oq|s.N.\ 9o׹5E:XӔ8Z%cb69vO-ῙExb8ͼsg 7' ʅ\['e "+.˷6V`v>j[0Uf&?N8Z4Ã- ,8QEuD<"pͅ4u ©B+fkRGt Fr_T4t>cdkMz0 H.B4s]^ޱ%yz3EJ qY"-V!ȀRQ\'",_hD^_!&"@5QA&Hf6IYBU#L~7,XX2'`1WZ~?{q6G3 9O눆,@zWx,=[Q3gk< ^Dل̾+ftcƍEiZRCؤ2va_9xm\&prraw{gg?xl: 1LD5EE?^mBMh"}G6 _R!>vmꌲ^mTV\V"V?<ms7&vVV6;Ju΃a:3w3+Zd|@ka.bT|xb3$k{ŁlVΌY&[Edͻ;5m˅qu?OmuOs:Vտ 0y_C3"Uvϡx_%p&gGԂxQxJ.< &/Wo EY(,$2jv_W6@?j#TNԲp?n( )+F5E$QL1( i tjxyb"4io#]TDh*$[Pkl*?ˬ?MB4kPz@f:L R"F?̥~kkmZ> DNw#0XA.O_ʿ.ߟ=% ߫ ѯy;m#knBW})w[ﻜ&v،* * 8< (Fg5}tyOc~[t_lZ\16e˻B1n/^M.RܻK„/zWb;)eyqMЭ'Vwbh!E!snlYvmX@@z>p}FK.ve8W_xWwϷ^BgzYpq(:ρ w-QgK׿II0|j ( }|{#cN?@t!>d "% 'v2azc:_yv\rhha IL BP z/AA0QB_ ?m&[]k/ۋDjn}OV$ai8e^m*P[zwkz]uK齯vy߫_oo (G4M)C xGogbϷׯS' w%dl IʀXBv"8J B1 &0/ΞV y҃@AB%"/M<ɭ a j YG~xiN LZD  tK_ ?d~[t.=΄C<,%^S s#xz=~F y5|neCO싡qu~?j׏ܤj'3 <:#c,c8xC~ }8ueju>}B'r7ÐBE@Tׇ  R>i 5ac?֔Bᄄs „€#rTp."bY:-ߵm5i )-uB3w|Q[Y7_(sI >p돒 lhy{~jaԄw*c< Pf/n L:,G6xkY x>/Pd}27o܄~|Ö<}KT]e94g5eKY-뷦t'Wn4|AMۚ6YCE[_K7 ??w쏗F-=QHO6 j$?H@5 ^w8Lӗ#zs^9ڮӸq>5g#0\g^(@}kc췐Jm)ΐ*?f: h z_ xF].TރV'_L:Nk#F2Ha[tosf-{?S`vN@fUψ*G$`{ }:60}GH[*XaxǐZ ( 2@z`qR1-K_"s/`DՖW\Q >ݳUk VxvLȅÅYWgOb7[霶Dtsh!"~>JJ/l0"h򨠋UW r03||iK!pNp䬘}&}"4GJHMf5%Or;Iv ٹoΝd PGgGȤX4Ff*:*%|9Y.>[@XJtX'usf% PwY{&\ZA7h2zZ4f9˛ʅ\\y9t%<zl GsG>T*%TUcָ.A՛x& |0!w4 2_ex Tl֠XfQcx <e,tƓ*9#ݫ)E 9Q"0ר UPevt6ͺKi4q0g4wG>Qd0]:;+0n[muq{ LgA萝^1熮:cߩ+ h4[tE"rEy>\F`>.0g=na-zM#i"Dp0P4S_m2%jqrIRƤ3F_d=`$3$>,S$s !%& 5 Sk#4QBLj}} ?9I}}1x}Ҹ{˾l{!1X؈pOguS}q|W;7_ty/uX⣥2og ݩEYff}f&cw6;8Y_ʟ8bӳm肰_#f;x  7IVY~J",oG'fDAV/.l=}@2~S z#Ak|w+ƯΞx(m~i?t%}4&D߫a~ϫ>c< .["-k>\~oϭ \"+[ǯ3~P%nzJ>hmd =VB} wH@ψ{OɽjWֆ]&V;lG=V$!w ~1ԗ]ْ!]9t ) FG!o *㍃J0N!CN膜z zfV^\ND򰢹iid+Jw^SaxjBU7H1Og|D1<Tpj2jr :R  MQ?$LtA앆̥&W٫!4v| VaRAJC@}H)ͦ~F#| $oݙ t9os:Q\D0mn'Tېl0ÍHgSO|6 :?:,=iETs- 4Q*A85Dwmbkb1ګ2$X[6!" k_p/ن!5;lZxBd$Ko\rdviVBB"#؅ION;O"adE&ձ2a< 0-+8k0sxO}w_QgʡZ;z !lY jxNI,˞d~v2#=A~ I2/m/s ^ yT5:nGj޼v‰`; |Tʳ*(#h1@+*¯։bkN86_=Fp"A|雼NyAHz D~6|>gK߁͕b5.k/i9?C^?_ enq~= nFcSԷWm>ǿ/NB*=1 X#+gowlqĭ=TxyB8C,po-NzuF)>0,bݫC ~-!*TJ9d!5G1qvuvťMWpFՄO#"Jml0I=-d7܋G;;׼z;tjKjٓ;^BZ\Q"Xj'ae]d#ճ,sj (nAHqq%O0qC=^G츤HeYEz.+ũ;YH+t{DkbѱV׏:s'IsgY|7q66=MUu:15nI'rkHm_%H8V֋FJ}MxAfLЇGFMifwVmٱlY*ÛW!RxT?aA2 ?Dގ>t]@ڞ_!Gܒ[hbZ{+tkLγLI[K+%Qcyؕ3:Kʂje=^gA+8u//5ͽ!{Avs66׃*h"d|O'?m?6un[uZGT09J0?S(GWvͳ+.}jhWoQH ÑșGFuYq|6V":Fx`ELWx37+ljxH k{}QXv~-Ra\`u0vE7HhB+=ES~ϳl#ir?+lT3;G@C(7q`w6q0,:=m/[a|A a{e7.8Q~@q#aJorS,.}OxbX|U\P}}ts|FjÞHHEca8cV"Qq >HA#%븅_'炲zUn ؘ @"5//Q_m`<"‡ɺgJvFo_ǥ_}ߚ v$w܂M` (*BGؠ99Z#ݮ̧̢%gil1b8aϴ#CI/OsUߊy |s`WQj/|FwB1k7lzsjA}_l &f I"O[>;FQEk( ʥ zkUWMk"1wﳳ5?ĊhDY)2rl> xߡ=^f aP ^Sa U}"$ !X΍tnPi^s 7uwszS<}7?L?=9\T8" M*J` 5mlY$Ѵdj{G3:7ЊxmDy\ooCvWv:FB! W@>Z |`b@`0b{p!KAyi3vi`O[Ѥc@ƅ?۔Y/T ŔWe@ qHz1!0@\4t_Vh4B$I|.ΌqspQoPϏWo^Ad@MJ.\0y !dgz=_9? u]d`~SDZ苾|^8l {u\;" ܚ\Ow GdB8tX|+M<݂y  J;z SMaLe<\Zy"K9-X\ۮ],͓p~e=)s|֑x$4U6$ĽD`?)[m~ǵx}GR(s7$[Yc߶~{=?^$\w <&u8p͌,'uǯWszצ_ 4GQ۹^ﹾ7*G,Z5&,t̎3HpZ &SO+^fӞ2nZTp+>0B %}63Y 91xCa| 9=6Xy~* encdðNxҜ`kױLf+ jG A"tvwF$`Dm-A9D\O~8}*d;OnppgΝuP)~?Uqٽs2p5_Y9ĿpzkX̾y:3WR:0a!vgj}o:K3:u",u;첌! V[mlͷXN4( tF,Fj$/9* CDk0ni-+.;+9MiӲQҀ / P& Q3Α1F:}4_r]){wR3k{=Qq:99Ҟ{o8,nM$Ti{L %2edK{ѬO b#$n|G,3VHg`ȁv-yq{s໤w= k}Oƛ .9™pK9lrpr!O`IȲU݋Z/~DAqܸfІ:-2<sDF $5n[AĢ DHm{"hأc|*7 Ati71wTeݴBBږyKRR wsjH^= 1p][u*$A3la5ͳcIg<0x ớbߴ2ҜR-ԊRr58ںY") Pϛ|fޮezњArߋʖ[dFEdB^.l?m5,<-6o&95V7 mtڵW_7Fs>ߎ5e<]eب&Vp}*A}éloI#`u`3'llP`_fzƵbU{r@:1bn^:d%[(Po\shHܰԆ>gpu?ֈA{IrAT&/%@ VƊ>OUY_ߡ^Of/[c `XT.V2zp)d!~bU7C>Ё?*}. ulzSJ_0Ca}7pl yGrނnp}w 7]8k\y;YoxҒϼ +R ȿ`|yt O\,nji/bWu{H-7KtlZdܵס{z=ƼGly{='Jq^[u!9%YΪiam *~(/Fy^3=ޙRW{ 81ذ"ݐ`-naH>v,;'dQ_9O.n1,.D3'3B>~a /' @8[|iDGxT5QvuxavuV+&$Ӭ+1_͉ 2D?^ 4X Y_2T+@AsM[ Æb>} np0Vp/y߼GE"GBq½ܩI?U*>Ӫ+Bs קJOt^p:uJ.JxFYˠ}Pq$g Z ϚQNhy!@1^n0N4xjsڼ  _~Ce rAlsnaC!$0(0<{ tlv!㋥Y$ *-tpc:1]724(,(>8 ;'-A%QE%QE%QE E5E5E!TQCTQCTQH4PP4PP"UUDE*u^z/>M7@ ~1 n GѮd f+h`ȼX!r{}4@7zuOOLgFkp>o$I0pAm E 6Pn1b$ .J`2TeRrm`ϛa۬d\t`>@iL~|P⃽=WF&:GOt$@_& |Kvs#MZ"51a#^_\bLP cpcӗ @᧧MvD')=;_WFy|28 'ߡq܄{/ A!i2%ǃц qreMӚ8s1, 񱹤`æU"D6|8,Kk OnbޓBA:ju_POR['Y؆Sj:E]bNvsnC#ڳمNuVկ,? $C* ttLċB@J2(@ W` %)4NE{pA@z" ](4RUUUUU(0~kڪ~Ut@I`B~5)G25KEST T" T$85 ^ v=k_VbLAK@e +a9 w{oY!80Ɂ ^@FCaׄ4燤.%@&}]OvKMjV*#{\nihiG$}gCg? ygQOyBk7hVԽ逗,}c+!2 \v^~6JLJb\y,]!ъRXDB gq6lSTY9[?{U4@Q%S D^c{8nϧ.ñR`,o:)+̷iJKZѥ#?(P oS/1Jc1tA#viRR{P'Jqn’lowN*U,{]զ4*h sޱksDa}a Acٓ=t!(y-\{u!!zـQx>N.**,&7<,TsSD>}q6W$Z?a;#) /8ެ1`-)CH(@;or?~'Lj3ld|ߐ{{ojU9F%f O=N37ՈFXE]@Ea`SˏGdl&KQH`BŞ`W)O1V7SO+#wuI&D>}-¸a;RYMl"}$pO,1U;=B2'ϊ*O{^IBiVN^0no+Ohr>OhUQ nwR4C*JC@yG˯>pZM~@d41dvCݒx'߼_{˛8_t.vlBH2>|hW!-޼O/hBAa~\LF!tU~Ew εwW魘^F\+Cc&d!p& \fR Яr6?9J{GŜMG ;9eѳ2\` HI}PRsv%8v?M4oDKʚ҃AOLvԌ$2LH"ݩm<y~[m}Px:>k R'|~%l  {D]\)kt ;zj]l 0a]O=е~b @)梏=-6oahKAUwޞ=giR! 8i.gӉQj1V0<-5kexk`oߍ5H+"P$0ٷΦ9: oұW0ĦapO;8Xkק^9?эt~Ӽ oVEB nQ`b2 {mC(@bxռ!R݃p ;x <~p8wA*iI˫!uwkwO~SՖXIce#Ppb"0tpq`յ=>/8IDФIUFY!T,1_e3Ѡ0 UT/"<~S"H`|(+lo='!k oÓCfŬl_^_g;xѥ r;h=frŷVTG l7=Na1Z.I-/˒~ P6=Tх۷`u(25ɵt_Уn2>&h&^,鴺mK(:tvoܙ>@-_70@@^e=$3eڻtZ3@U3Xn92+E[8! aik0Ӡd֒K;XL10JƂpbXB 3/0wC.CTY:="b@{h@Ѽ-Ae]گ/ׅ:>rRH2 $˰^;P)QkS\P%PC3k_ʼT8=dj* ho{ͅ #tñ>.Zs?D儙SMeT$yU۞CTX@V+ϸQbŇtD(+|>Uk+! NQE0353-uLJ&1mweWfh4W[nkV2Ir߼EPZVV.EԂUo`ϟjPb?08_S}z9=Xj2~ @;@ٱJ4cfhBJ\NKuQ0X)=FbImLBeZD xgZc":3%Nq"kL֧KcΊ-W.\5c2d5)fѨK0|[Bp}7yY!@yk j}X pT}h`uR3V8`E \@ wܜ!x.?8Ye=H(!i 7ėKz-[f9-ULbVjX|R""*j,%~/A}GŦf