summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBodong Wang <bodong@mellanox.com>2016-12-01 13:43:13 +0200
committerDoug Ledford <dledford@redhat.com>2016-12-13 13:39:50 -0500
commitd949167d68b304c0a00331cf33ef49a29b65d85f (patch)
tree88e16c2330da162bfdb5d7fd75dbdd29d3cf67da
parentca5b91d63192ceaa41a6145f8c923debb64c71fa (diff)
downloadlinux-d949167d68b304c0a00331cf33ef49a29b65d85f.tar.gz
linux-d949167d68b304c0a00331cf33ef49a29b65d85f.tar.bz2
linux-d949167d68b304c0a00331cf33ef49a29b65d85f.zip
IB/mlx5: Report mlx5 packet pacing capabilities when querying device
Enable mlx5 based hardware to report packet pacing capabilities from kernel to user space. Packet pacing allows to limit the rate to any number between the maximum and minimum, based on user settings. The capabilities are exposed to user space through query_device by uhw. The following capabilities are reported: 1. The maximum and minimum rate limit in kbps supported by packet pacing. 2. Bitmap showing which QP types are supported by packet pacing operation. Signed-off-by: Bodong Wang <bodong@mellanox.com> Reviewed-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/mlx5/main.c13
-rw-r--r--include/uapi/rdma/mlx5-abi.h13
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 8b013f8b832a..6c194000903d 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -693,6 +693,19 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
resp.response_length += sizeof(resp.cqe_comp_caps);
}
+ if (field_avail(typeof(resp), packet_pacing_caps, uhw->outlen)) {
+ if (MLX5_CAP_QOS(mdev, packet_pacing) &&
+ MLX5_CAP_GEN(mdev, qos)) {
+ resp.packet_pacing_caps.qp_rate_limit_max =
+ MLX5_CAP_QOS(mdev, packet_pacing_max_rate);
+ resp.packet_pacing_caps.qp_rate_limit_min =
+ MLX5_CAP_QOS(mdev, packet_pacing_min_rate);
+ resp.packet_pacing_caps.supported_qpts |=
+ 1 << IB_QPT_RAW_PACKET;
+ }
+ resp.response_length += sizeof(resp.packet_pacing_caps);
+ }
+
if (uhw->outlen) {
err = ib_copy_to_udata(uhw, &resp, resp.response_length);
diff --git a/include/uapi/rdma/mlx5-abi.h b/include/uapi/rdma/mlx5-abi.h
index 3ebf3db24c34..fae6cdaeb56d 100644
--- a/include/uapi/rdma/mlx5-abi.h
+++ b/include/uapi/rdma/mlx5-abi.h
@@ -136,12 +136,25 @@ struct mlx5_ib_cqe_comp_caps {
__u32 supported_format; /* enum mlx5_ib_cqe_comp_res_format */
};
+struct mlx5_packet_pacing_caps {
+ __u32 qp_rate_limit_min;
+ __u32 qp_rate_limit_max; /* In kpbs */
+
+ /* Corresponding bit will be set if qp type from
+ * 'enum ib_qp_type' is supported, e.g.
+ * supported_qpts |= 1 << IB_QPT_RAW_PACKET
+ */
+ __u32 supported_qpts;
+ __u32 reserved;
+};
+
struct mlx5_ib_query_device_resp {
__u32 comp_mask;
__u32 response_length;
struct mlx5_ib_tso_caps tso_caps;
struct mlx5_ib_rss_caps rss_caps;
struct mlx5_ib_cqe_comp_caps cqe_comp_caps;
+ struct mlx5_packet_pacing_caps packet_pacing_caps;
__u32 mlx5_ib_support_multi_pkt_send_wqes;
__u32 reserved;
};
~X[#ZAky˛?64`Kvk90ی{(4ڲ~6:y翞W??X|Qѯ$>~F^zsj=M}x{uB]]Ku{7*Z uMXWJYMӔ'F{}ŏV| ^􉩞_+JcQ"OW:Z7n(+;۞Os OȈzXmSD=;}ʼnd,:psʽ [Ai>>Sbؐ!xfA" ٗ`ەw=ybrt<ZJ>y=_KcH5IxL!Ӎњ,%yF/+lCDp$Ϸͻd  9Ver9V^ά.t[{Bn+߳>Z/?™f@H=s׹y௴)>)#PDHa[VIh{)ޣ~͟P6*@:QP]Fqճ]g8O$5/FPZE^/ߧT5R|v`#=^#uk"#|_H۽\Ԏt˺CPm5:svV,_柼~WU(߷㢻u:y5(]A~x/űv,ٺ9e4V>[$=ZdzթuZS\a6-]qniXZ͒8t`_w]wpj_67We;w3[IgdҞMn¢Qv+vXrd鏛wHNwXs @~z%.#bq :k"_ldOOVJou>: 1q29;^ù7Go"9ue7Uf^ )d-6ea}2DB*EITY.UK.ngs;_(:R3˔DH\an[j\VSĔ<.VRG^~i`P n $"?bA8Y0daGj0rzic$=$}Qc啈 O'*T^/wsYƎ5p{rHG,AF?qɎ*.mo5۶1bn:U1VFHbcV^⬑= v.Jn:(S|VڪmUVgn8%$~O0Ɂ4fUQi{e<8뭌ye5 Hw Z?RIw&,c-vaα2JI[k9TW C+Q!!w5Uh .kZ߳6_ RifHPzq%SgFdd8Uׇ4?˃P)"d4'yMֺk3 "{q orU$KiKƾ=@R~=y_sȄ< 2^yҋ@zI;r$Yob 2G%vt=P!E?ڃ_(  'mW2NhP\./Bm ؋ӍH'X"'Ҋ3}i"w a n9,R4=m.~ec|y'p3ugKٜ~$ LA惐I=[kPUrln-0dD9Q@bA<ܜFcdFۤ1#e@B#nqp@ߛr",v : AʚGv2caY鋼OqcѢ" 4(,O7mCT S$9-WL:gwv9{>p g&b%v| 2]@WnZCP.8(@m 3uHQ"Q`~#wF./qlxhǻhqFa56AqUߪ [/52kS{AޫoL,򹿎zvGI*ԇZ[S )T?PJz] RJ*p*InXbС9ب{$eLƉd?J(C_ƭdR;>}h'GK&ϰN&r=UAB!+DX=O7<h[Pd BQP}0!aQ=fT~sm:re990޾q޸ _ >u/FeqJ{uzEd!>R$*2ۯ.!% Vd}XDGD S_D)MԬg 0>'2R7\ѤsP̹0 aRFE14~O:M'6* C}y4ɼ̓?ZlWը9A!MQh iφKv"~lntϮ_=X_pC5@ KkНB9oGd~L~ޮh7TO?8ksDtD6<-XO>s :%G'(5މ_,:t2}EódO#ps سVf*>;S|gv<+߈aw$ l]GQ4t 88xPZgYu; GMvg9z2'7xyAqO Bc )wAf jӫضwFP<$vGzv~zg獴] Kـ?ջU?q9 wt0J_p;{H349צ_Ζ=p ц's?~z@_9y%[zz7ᛀ-zNK}osa!˒KpQw @eҎ M[)IKƃA5?%Ac2<0am N+׫fK珪B|(C _oU`2vv 5z8:Iv׬(,|<0kۭkr6suUĹU8ۥpw_|6ÀlhPt?#mx'PÆ`wbI{;UbWC->Gu?mPBp?NXi3~u4gxwˑ|&lh\w9ecP?Ǭp?Cb P G^W횙 YXE+ѿ[Lz}ozYHy7rB(b>~ ë}/ o?E[M<`]}k8҃wH,<+ܴ.h#~l`:&W D{y; 0FL>p ʥ;[n {d{>5B㍷Tg鍶vl@"T $bpyxmkx?0a5xGs9Y`(s[o{j/%.ô:ŵB}1pwLD[*:mO u4chGџǛˌc8uP^Ѐ;~[ WNU̺-S0P!;]P UJ`KZMvN=Z7!h7˖eu3TO/3h?oCýg-bѾo6AqxO{DGIw\Û;co%]F16Ňev2% :{B<> 9HLqdjmԢKnp -_^\L hR"AQDEQ Dƃ;W!+>؀}a 6C= K *( \@&83=>djGFfrAX,t4t/LX7 ם.^{}Ln량L=l>2:TrX uw/1;?CJ=PѮ5V]nK:%|?Wy|=P to50jxP(F}=~=w{{wYPNlV|uC:a( UW|R+|=C.lМ#^T^N;'o\1w88vճ(ûr꿖LeM=ulUQݱ`ˋdmf =V6hۗFџ=cu1u;^xr9'Ԣ՛>?ׯsm_CQ*a'Z۸~k3SGG!ql ^=%^܃ T;pݪ#<߬nGS73 7.~Gdvu1ӌ)aSagQWcO6ҭuȮz)mrk&][yl=6=ذrcߜy%Ap&bI]HA̐!K)޺Axo&M[~N5}Vʖg9 ϝO. 廳"Co?JMԝ,c.j'cM@#_D1d'yȻPː2z@v%RzF5`5b I]uIe.;[vѭV-@ ʁnpA\ 3Dt&ALnH/Ugk)*e= `G&!ֻ^[r($o "CݚMtzZI&r2ŦչB BYgZ;j x @SAXRǠG0lDNpnq`ih{jC#ïWI Wr\2ut:MBj4L~Y#籇@` q7 ..v')5 eZ& E&sL[D!c |Ur6ŧUq)]o/?IxauE:dh;7}K/FDu3N.ʉϰ4'_vA  N-C"uYoJ~@v+*bP~0׊MLLb8 )L{.;ԱZ-V7 "&*!!_Yd:Z4( re&Մ5MC@m6B}Z/b0۱~?*(>]jeك[¡‹%2DYBgu#,vvծ7oX;L=S.Wz\Ը-ϕ~2BgYOW +p_W%MNt1:2vI}PlK}j 'g[5  mR}pcT( lUGK‰{Ǖ_)pp;$#[ S-b>˃'mkYGxJlڹ:!A\ z}/z:<}Lg_{5\;A[s7v+uv_덼k!eSE]aW 1 EMg u@rXѻR9Pk)iӤnI~22ꝞQe>OlvHQKvjc8_>V,NYXm9's_90JuAϫDn#:GpƊ<7v a/lƂv6=nJXΚ?ÂHRzCٿ@ $ٻPB*y<}X$D B)_BjPҞwk/]5&w  te~ c6~;1 @>^ŜG֔CeEwfӳla^飏R{Bbp 6/AZn^p 7Qܡ< {ܵN5CA/ uJvG@DG6n@ wNuUw%>VF}e Of)kJ59Q 7O>ob$1}zQ8U(>a~S(3]ߓgujO;BMAk"/mF8_/ǿԼkuX#NZoxl= 8oq; fyEw|3Yi^yyGj=txvw AWE@۪v"Pjwcr, ~{L@_2lo{8]_.͞S *7LBҬ{tC{%[c$} Z?&v <ӷ~=2C==>/[ʱ5 ^o͓dlH[t PK#YEK"Gh8oU$**hbͺv]#anC?fh|"!bTa&ƨKXW|/{YfڪEEm3ɲc}Msa's}趧{k3p7mД@7 \RKR7ZXQV,**"q#,DeoԐ?^μVG\> yԎu33bGP~ćZ;A+=:{Qp3J^ "C}l@ >ΗmvahMC8m[V -pRb:D =h| EfmbN 0|sJ[w_x80Z>{!F8skQ־3} a[L<8ϗ=zta(G^1 mśZ?Y;AMgu]\<9#:;\ Za0 :bDEaSv% mHQkAea= = !|ʜ+K[(IPꯙM-i}7qX/e~EBI `UBa Q<"Gdn|E`W~P՚kЇ;jzLӴgD)jFO0DO9{:ǜ TQhG%KSW~F>+R6 酦0LxXqc2Us^޽ %vI*)!xhs,nqs*&8 P'԰K85-K*nnI"A ݱ,0U.Ow׉k۫ufJi_G jQ %R2P CG tDKe'E=֥•5aT 17ӜB@ݽ @spRL4{O6`%SSh}]J]rپ枫KQH24:VZ}WCl|gæErUۘmwK%K2sfl=0J6e'ɽGz`5Z{#sE3DXg4 ;Z"tgໂ##cL/޾=TMR ) m{L^,LSiA).\\%\FJٔzpƻjS[=Vl NtG~{$ȷ6BƧ!7e1y. {, {'KY-s;Rm*[wrdz3]!Ɇؾ|OV ռ>3UD0ܛ\ "W?k +, .ZlMs ן)Vl"r꾃;%CH_״__cu荆6{a;t.b{<ﳧF7 M=]pcF!S%(IA|as.Q~0AȘ2"~!A"GAT]s?o_t0s٘~L}2KdfT W~_B%||{1[qUr@jHpQۮ/px߀cpm}à/3wS-QWm\Ă@(<}v!E,>uխL>xVgh}{ߐHPtL3Ӿ!3׻K6ىe{~&iKn$GeTly]lG",f.F8JF2ޱ6u8_㩤Pr@y ؂^FDaPL )2?KlK5>_ÙrÌiV@(AR~O5Ml+ v0>k'5Jk 9$f.+||-f# de_=`]tY/;3ףb=+a"?a720u,K J:##2ZiPvIFDVmIqS۸hkN $-1Yv~TRE~I%4M^CzpJe31ITeIlg91ۨ>VԙD5C,DQ,J/ʊ3: .?ZaNK)Uv L+u1u^{lbBhKY&^} g# D?\5A=avQ@\ܖx>;WmikYߍ[…Ս4Fl/d2r?J3p8 |Yup+mad/> RH!0m$O0]U5G^xk"0wsGP{0 vnI8[׀Twr`Bb߶0YѲAXWu+߀76kAؑ(7~as(ߩEO{ݞr)$zi[G JeE@U$LpS Be q5GanYta <$kxD^㒠Up m-VAE,M&8}oE>(=dfb_ y)бQǖ6Ϡ~r>|8z^L>/zM4hD99=Ppqsgqg:=g[e:>L'v#C2C jVH ̠!dy`,6'@rz)xHf ldu''}+1ټ-Ii.qP:Jh.a4CsY˿V=:׾yPAӾBe5?|rG ͬexpP:aNȴ5A|ƥ8;+>|wsnig12] ¾΢1sUP51X92pPcS.iD)"{;{l%4EG諐046Yv EC5gm70 HGԎGWЁ`kn3Lu\sD[iM?h5 4)5*^wuwʊĉ^Ǽ?ԙjofŸh.X]O8{KoWɺqoW8<9iW~佳ݞ~ʢϼy.3ʝNѼ[߾h7irIygp;c9Q5q.)z3G^>}bC3jBC}HPz%Bd%d Ͷc &ZVֵ h0`-Tp{BٛQ{nnt -9:;Ür߲SR)ݜ45_.^H}_Uߢ .LEpuN VpsF}mq5/D[r%45o{0󨹺 ދ3 J]00Kޯ\{<`}ʋ2顱>y|#jG!̽q&$da$AgX#5NW+ \T2=8+m̔ZQg8.qG, F &@ (ہ_&.Fխ~'i‚U8s\*=ͷtEiK9PU @JڎYZ'Qi6ppYaUZVʢV jmLD;~%9x!#;!-`f-M/E~EY*DF <2c. $i幭a]>]ȸ׍iu eL{!.EGd'/R y\F*c $"{)E~.T=zTF? sV=d0}ȠkM i{8Uj^j'p*^QMT"9&{}'_v.V'E7:,h"i^m%:Z) G[+R b'i̭$5{xaΎ%=\ _(_Iٽ/LMn'[wуRJHiѾq*-^eykAMonz_sd fIx1"'*QtMzx01?$@^@ĕmzݐ )w J'G'wd6[dp;),a6"KUH_^˙V]q\xp鮜aDL~G6+̖ztaU[Rd-@My''(c;I@V,)}Wj[W 4۟#>\Xިy="[D{4-e Zer5Fmg @|:wYV.W޻e=Cf\X+. jCyZBZBf7-yrbֱˆW !mSXB:tQiG 1oX B76.уw[ƔK[Yg証[m\!P72(@C Ů3\#u95?[( *ղW, &ӭWUy6-z)Waws>YVxAllUk4eFcr&H?@Q+!y-Ul`Oc&Pj(Taܣ\FJh*bʈX`׸SHC* H|\Mʰ5118Rc99r?\h쳧a%~nM!@6xQwB$#vHt%Xd͓Fgܚvs+o+~[[٦e͛ʓ4jiꙹɧzo}8& HP:}(=̅$6mM YP3 溋Mø.-pӱ]X%GWuoq񇖰UK,m E5+6o+>,klOkk6ڪL u iZ Ip4nn/A-40Uu@8Z\i -O\ei"1@:6MWgp]n>~c;>G`D:Hfos1{LִnfS s%^q (J߁€A:'0ӭ1fx EQ{?*9z6;3V%h&=t֝mw_v8==NwRXL>+N 0CA azܫjųs }(JD= ͜uhGV.RCyXx-F RX~k)q2Dvkh*c#R_2ԊX/PN" ]WA;~ge^:e,;ΫUz}2Uq vIuL0Cɯ;CAaz#$49 vN>{g~8Gv2:XAEE?ZH~e8,Y,D^)*&i;-ؤh 7'y?^wsQ6Wlck%kV:zǧnHVJč+Q "4}T<Up41<|c.u>n,M6mʶ`S ( BK@]G ;yOEuF a"=Gmqày#ppֿLĀBf(_dγt6]vw"cGm-ͱ*SL7k$E+a&!z^P}tNrnKdx{vC|_\G=z]}P?o{I<~P膙kYfIJP,U5bfHnN];t E%ˑ'B_Ql턟8NpwѪ<[G1g9!F;9{.";hbYyze)늓 ܶ8*paPzkeDNXp tTԅ pflX A*6"e!7}W0 '8@@=H3yYLcͅ]<!~2Ǹw93m)lcJz#2Ȏatn\NoG Y6㿚{&p]ms}i"āⅾ@sCϽ`!Ep*9ψ/yQhB>"o4!LJT-a#аPB>66@E=3*?N'3;qF#d_C q[_B½d@0 ^s?*Lwt:MxQ]&؉vQgy RaB)N$)7V~6G`)*?R=z'cFw?ב'>% ~.}DEaE}B* 0,(ϲhBM =Dw|BKޯ6?KU g|EC^1%$ҩV5h(d :lID<<0REof5IOAhz:.V)E@V|"xz/T5g|`n "똂RG˓s axZ0I-5jX3 ù#> mm(V~'4Z P ^57'K0zծ ʼQͷ,Hy"/ְnvMTRZ&ʵ5ljKjeƆ[L$]\5zzP'G @$AO͑DD'wk#'6y -Ӱʈ-J Q6*R.%mp|έUmʾ^3t ~} v"fͶ8Kf6!զ<k <Z@~ds3iȾ}뮌It ffPArrU8yB{ -Pmj!SB[YXZldI[>v@u3싈T'+٭$HGP1EhldZ#uL2ИyOL ,iW/%|uZ;胵t[V~Y:;=u?"T丹\뮖w o;hX8^)v_k _9FuiGمҴEv@g|ݮ d@}mx{,ܠg'0o7ol ޏA$Դ _q ʭ2`.?a s7<7,̗/f|Sd"c-_?oq.!f1o'*~9G8ˆ$ݜ_4 sIq`& Gp1 D^1Yg죐Dm/A bxŗ8kٕKqx\\0U2W0j% mEVM} 囹/os&g_HrWhF-L3*NQ0lzi>Ul-Zc@~h\v֛z9T:F3Xh<*FA u~e{~;5n{!p$GTN/pꇌzۏߦN;,+,,4Wi>szmb޼ SJVͿ\>mM:mv4E] [ 84#rqNwY5kIˣM|E :F_5R)Fs,s)BF+=8EM3FP5xRd^Gmwm}N&F+y::YIQ"u7zA ѓ|t^өO󭮒bZҸ־q4Е+AصE<{xy}.q&D_ R&T,Bxq3@G00<]ݷe.Z)D~qr.yPrpRKO2?B 8H |Z`ΐ{6AHqkF'x C4|$.:N4mqCB8e.y?ll( 32hϲX12j#0n9"x< LfP"uH+Hy4b-h۫,C\GvK(6a>_<.(f@$Βٛ f6a-ʗ`{_`VEZkbL+;Xs8-6۰& ;9ߺW3Id@Y0-l.HmC5P 9*0ꏼ}]`*+61F,?>B,:M ?q8oިUT42hl(~ URuyxW4az{ b#k,Y.Wmc"?vD, R?pkYx ْHHS :~ο?q+:(6pz@O ʔBQ63~lFsӾC}!؇ߘ\@y2~ pP:[A(9629bo2aIEx5D\)o@% qvuCO}8Y\98նKd0} $D@T Y#,z kRҁBd,fmo;K20, =yHґ1hB'Wȴgz xZʌ Hn2\.r>3xZ+j m-ְVԦ.qW3'4d#q`A/\D"ׯ铭WʯXZACRlJ>3G B.ڗ"MײVψAqSUN**P`]p}q0 } 920YSxDyzsp#P3kF"^eNԺ6&]T BgQ@^p2oP3NuR[kk´3iL$TH췕qE%%YEJ('邢re`h sOw e |)♆ ׊PjyiY8I%ݯ7KWFKM0jt ."*OÞ6HE=\ wrlK .ADE|\?}yd0f6j"j]Qd\Â_m*E<}^S-3 qd:θ4x3Dp#sl hIXd12W$4 0<1.^ϙ"8U*E9C!AR j!%b9Ql>v&˅Q^2 RFh9 NSjY`U0<#f7WgVi@GF{4٭?\v?>\IW{$&cƉ<#\3b_GǕ@ikoX"!"CD^NjH{?؜/=SfkiNR8sJQuou Mv.CG:N<7lX+vȘގnT**dmL]J(X O_g]({o4i`OX"LipqLs+\g>{`> U3XUN7;*f(lIBWqQʩQ'eUVfWup@􄓋 2`p1>P^4u{ ~xxloe5Nu֮K囈Jm$\̍p̹))3zZFp1LHl;Dg<)x2YpnR2+0/ PDqޢ\𨩥D퐄u_sDBᚊ+Y 3-T5]xc(o Ţ8ث ^cOL^QHti jq`$?Iv3|8QBTRkL$J}:4""&"Gڝx\*|$ ^8P î(?ux"t {N81FG˓9]p!0PL;[Lm|fƖ:r@OgN ۑV˜ g hPjWFm0C\|KKWM$-+|̾fIHƴY$7~^YHp`jH({(0[%k]|wW,-~Y wL$ . |7yrQ! ]V2 <}o~(E!Ά`&y:QД|wpy`e!v,vѡ߇S=g<~g0 NR;I[ )BEc@f:J(ͤS _\7,[l'( Otϰ-!a_<`"+*e,&s LDX H~ӏC?aTgFCڠZ:qjYbP2:$l.c̬krbW7KZ2@;"?҄`9 أ[e샤!-0]ZHLee0fL2 b]ÔhA](*C"0eߵc#lIqBʤ[BA(Cvu' {-NDûueٕʨ;)7LKl|`ǿ߆y8Ax_μ%~ktO![fYdݶwdZ>!";[@ޙ+s?!#r20 :_7-B/__!, r6 ӌbF"8=Ȝ~) 6C؂"Km+ZM{8z2* nmVmy27ыӡ2sIga| SdW5^ٌȕURrpѶKtn3PՍOכs#ZX=:|F_Y95!.ڨA2*)rPs(K^7i9<뜜}D~jj0R(|}9ܰnl WC ZqfS|?hzr'gƸ]Z2ƄwO@;b] '4eQYRW+DTHq_=jcXEJ _Vm0ek(6i{„FEQ7BCcpq; Ycy >M\]m] LE\?{lpb+ENx}[d1Zm@D(5wQf_|B! ".D]~%JN6 WO4B=_L#7τ1}EH`TF 4B;t`7}7_w=ޯ.l#Z93e^QU[ʡa0* m(euVҷ/B}TOqP\ΝYE )r{-\ iIܤ`b"ޱW<+Os-ͅH4M4s:D!yG.Hxw:LWFy~H|#NM>^  jɶ9ᅍz ES \ cJlp iP mhu8L]8@"YFC2H{7?֧_Os:cqr̠ wpGHMjsyYra=% RHO)9I#nI(J }`p7?[k5z$=z0@NV$dS%+"P:ǒ|20٧s<rB!+n5 rc F!tť #1dGLF$CVu;w}*xdڇ !' sRӯqsU74Da^Q׋a a" !?W;a@ԠI6+S~ar #d߼~)ζJ)%$Y;@Ό&(0: ]nǵT ydIusi`I(ҩ yk\lg.1*?T B7ҭ-VRD7EtU 9cS4V;^j?q_>D=epsC4Q:LJ@RsXQ3gfN6S q@gþhx&l;Jg!qjѲpW*9ʈ$PL1_| #UX}pFd6{9dBw3X{f0%Ð-|v}NnW_&>~q&&tua`0&wB 17Þcjű"f*HB;As3vX j>1ť9oNF:l6jZeqUň"2Bu.K3AfBځK:qV2r>%Bs52^׉>w8BcmQ>u](D62P|3dRaf &b}ު;eMlelÔWY"*+m^K}c@Nr|Vl&5XGK5D0΍혂})޷%дJBA7 W0vm 8/ܨm`2 el"EpyGlJ5d- \މ`dҋ6k1P 3A}=k;xaQdCh 7߉!T,YzsPq*[e/m]Z5UQ͓c&lHٹH_f{caR~U6O_r("j^^fΟ.]Rlϰ)vl%Uf97Uդr fx\:oz>P0\ˡjkq&#X% @y "%ica;*z>gsΊjMk@LU rӥ+~28 iX]BlOjN\<$LVͲYxȏIEf7`iPv'ǚdȪk=NqC@xj W8bSX>ǽ{o<[ǭf(5\cܞ>9֍ :1Dg9ߘ d15vNj_O2ĸHJ|88I1l߉dCxy Cs^ ֮qAA["y,Ai;T3;ٯ3Gi/&ivE83ɉ29jсRwhg9;os IPPe7Z{(T9qEOe]6AtUsU!!%\D$,r0 P\۰bgW4jJ7 |`!nC@P"}attpVF#9j4<.@ " +TtDL6j_~+ 6r\I8-x$P?GY|d@n,WHY4kᗬ]3_/<_No,=1xRH"'n’U:GP$U)W.p V`czܫ5KɗrAX8$ -*.%#X߲"[*U<Ќ8I$6mV}s>f?˃t oPgI"}E蹃Q BfˠME+.H`i 8WqОk@ %[8NȂ}&t^*Å/y9@@<`QQJ'У惓cf[~IeN_L'L&17A>] ּW1Clu:Hipp}W&~߮BfDQw3 qAA)eK7 > 4QDVT‚R>"n@Rp\v _. ϳ^_ݠ59S+l+[ aUAEl|'A\m !!_Cpr(ǖ}\SC%2UXPW n.vB7eQ ޻](PN-pZ)k>4p$x^Nn1qMlTXmؑ_qprޡcCf ;I2i="@>xRQaGC°CXsq7\0\JPXHHYѲQ'8sG0x_+"E,L H./#+GDP<-~+ȝ("e#,rjgnwkxwY$ ,u ;j߯I< F .`!!ڮjpoko'5 CS8/ih0d@o{%ЕV~L*;S\y1KۚRW_Dž_eW.9QAy.gh{"+o Ӈ0pP*\(mK J#1cZW_Q$IA0(9g>k~{mUקDP%u*%_zUؿju;Po;d "%jMH 7m88߅}a;'[-z/q$HRQZCNOHZ~6QPvBXB"Y~ϊ=!E&{=tF r9qks-A6PYByxRQF؝,;c%͐[`LN˼Pv򰂤* ~PZ8|k"}zxZsMPi K@PJ6|u>|iV7;!%&:0r#LCQ ޯf 30^gke`mq&7In`PpN҂0 Mw`KKA2,̕@#^#9ߛqկֿgWmlb4)J)Nx?[? Z#Sʓgyk"u%:hjBP9vFl~g ރ=enԪg[ h?yOf G Y j2.#x{zSxfb0np|D:ﶰxY[Тn 3kulm4-'d @H$k>g&~R޿<11ӌ/Qq6E^, ZkwFv~_W(+rKo_?{'i߷\6/Zي@v:>>̑y&d+H"Bp@;@0}8[6Ɔ5XɛRq7)Hl5*(3;cP"4v?y9 <|X(*^dO=Y*4Sk>K(S| UA /fuNIP~SP?ȶ ȅR12f$nBp}jKh,*u' ~*]q솔wFQw 9]łƒ0|0غAR*@Ly(q@/(1T Ftwkq:\eX+ O=]<"t. 򩭼KN^TX%I)qp{WbٮOqFٽO6c/3堜fzׂ`'= OO{Y7yXˎ1 A!|>8gYq2-HǍiJ'ʞ~۸|_.nf{2&9P!;=0:C}j(yuu'"Y%M8V>k)'AYo ::⛉/ ߍ(qz`s1 j<&-:ޢ|r|c9B: TQ`3X@GibNhKDuB/$2M@uLւ O[]~57ȅ-'zX(REr}g'QZ9Wged$,p4ؽ ߺv(;]2pC]|Ac,.J6[YP+ġir 5˯%F+eB8f_v^6[jCo;]#fl i^ΎrjϰKù$\ ABˌ`0rKaskύd;|gRɱB (S81/R TYؗXw/ӳmargSg<^X9QI$Yɍ̟:Ld*d`P0='#EP9鋌Vh.quh-V331z#:[`'P PS|Lb ,Sh)w׷(qd[\΄I*"fcH[nH|h  ȼQݶ@Ѐ̳vd >>G3q&OZ_>czn[15~"v.Fÿ'?9l^"C@[t6" x&pct2 +p8 Z|XtYeKb$h@c?Fl9y9 eF sћe'h{.%!3/%Q7r(qX`sT:-TE*^xL`Ì} ]᡾Q^k]CLK_ķÒM.[`xdq/"j܀Ņc:rN*뀃hmq"ʄ pf rP@Yn'5Y&{vR> 囇LDEjNE7ȱuygkr7[;Z9;|!T)h2ܸqH\>%Jbv9fuCYk$ uY~P/5b&&BE>&NotPN6#Vix=.4tp[SRXsa|2<sw*=eBO!&Sw5!mcEmMiiVCxyKnm]oceǻ;qO[c8dDOgF5;x.D;8s%GF9L2ǞYT Q6~zKΨHܠ#° u/qY8fǦ@01~'9ߍBλA `a؀E7+2ߙd5bAț}9$/%=ȀNf2} n0+;ưk3zs-R׶r c`s]quRYp;㑨6=pȉE \tZi; Rn0P6Zn[ks.jy#P!FRK)lw9Ca*DZ,OAWK`5&njn9ЄϪ'Dr ZP"nk)Ƶclӄ#p&uzX9>DSbfpsGAIE&Fv)kq5ezZbx;0vZ%m܌*΢N=`cC8Ċ1;҆DO9feú=q; sOD ykcv4aOqSRè囃=(?|1aӈsh{éRƀp0fw͝Ca7˞ٛ4v 53Om, "׌lAވd!:.V3ҭ3or ,\IprE@V$MUP hB̐Io@yj]"[aJ=NYi(Nv,V#8f3G+<r@Y}nˑ}w0Oeie=P&.5L!+Nx|UTl\obt>x<㇩qp#<|#2XMt7jC4X+C^=0ȑ^"xOa⠮;6 /_ aMCA|ϫ{aq '.y,#d,+9kO1߬6 U*5D z\>Ec3`RJk&,I [WsőZJt .jj,>Kva8Ĥ!fv-|Lӎ7,^oGRy;{z#]62yO+EΚ٩s0aRǚx91$"N&z9y#}rL[oy4g:}YXxr1>[1p, =7(Mv 8cXCg~xpˬC{ v^KKe!P4Kx\L;QzhŽ:pؒB菆ȎOkD~"|&GaK>HGHyhֲHq ;'fTqCk#?l@p!Q]8CQp1)91hWQIS_u!Є~ 0Zdr# ^j'tqTy0_>IM qI`ư 'k6~~ f}tXۋH!Ȩ46SS/[ӏ.3y <ϙ#k[bV `>Txs9pr \WC<UnE  5_ccgS\Cd*CA _p,ؓޱ[bHW9e x,s$ JdƧ5 f\~|11%C9s{߶ME%&&)CzbN<'o&3?j>Z px>2q,!o/2{#?WK/zl(f os-/x&p":r(vEaɇ@yOZH {> jfA<[ޟ6$%5ZOo+GQVwf0DΜZ3"w3}J,$ cZgxLJVQГP@^u +j&pOUMj+b$X=ٞ {h5ۦw66w+-0?LD@甇 ?%A~aA~X5^_ 4*B]briaN-z5V:.||/ CA#(mV_1+v@c>-:E6]eJb^ ųԳ@#63_=zi}Fcoj`T`ɈPJDm:6=NFAA?aؔ3]9gZ=9oz~T )s Gu a !h\-jbįgcK6]O"&%JS' n48uEH=Ո܅:g\f)ehwF !ޘSq ~z4Cg/%`BZH·+wOQr(u?-bUdg?#XgBOT9@_OTlWwuuOf7.k͋dH٩ӱw*DU!d岋>(ON'+XÖ W:|8N*xXNus  i`lĥJf>1׎ƥH41Qq=㶈s49lQ}KT? QU'vϻ W4Yi<ᣤ"8#7CiL]a,+P_\06&[6B󁀘1Ƭӈɛ. 4~緡p;u4?8|gA.E?42}Yt,*&k܌Z o;>/s7;pkVAkۍ'p(!9#^=ж4)ޥDgѮsiTY#?MG:j "0*.#s7Ee*kaygMӫaw-TsAQ5r  Ko0 =Xw(㋽Ά1حMH66C BR <+k?I _\rezh8qVE%!WUl2s 2_MFĬ6kf=(`PazK oШzR d@ŃU~\nj\ cKRGPKܕp[x} J+Y*•V  L(a^lXgI(eL5U%쩵!pi =&*CUM0^#M󰋄3hdR\"tGzj0 > 0J 0-{4d!HMMԻRM]=o Ջ9jd嬷UupvUS5CK7Mtㅼ<X閵4? _0\}e~.+d|6XO k9!"s b34Ltnuw!D9rdC_TR,]%cHX?,=f:I] ch铈d+ P6ڙW\ 0H(Jgp&DbD&Q/tK 턷_V]'/wvz$7ֻb[~:啿aR#0 %'eH)  PR%ec"Тt8@d*a=%Da?o(\nd@'2 "jx,f8=R8]ƤVV~!Z 8 9gnuay~r4j9NGKa {m-~.L>fL}^GeXϺZKHH:,!jOD5|wY8j#[cn[dOl &JBC ­lҺ x2Fڦ("k%ޛȿB72,r ˊ!A/SL}B']zzq*.DRE"/.^<;+sX"I*mY8QdX;[oP#Ɵi΃ xs?jE8{KkZR!3|!+)W&DsMEGYktmiZc7Zqʠ; JqWT86D"MR B>aW1?W*4b [c ;~gG}fB3f 'ui=-Vaso}`xEJ:"rPAD,b_MDIT\i)*%B11 ZC5*TzXH(KP+0qe'\ PtRCgsAI>WfH ?}3?߇ܚrghyˍ~d3!=q)T.GY߲SN$MFKovepC2I|JvKPoJ{twl^/7T湅ǚXso|}p?gLOU*#$ŀwӂ]0$@jURg ePRDt,a)A_s=,P(;(% ( eK7!X, "L:od]}Պ(֘PT4.Z pT.ESZ q糣@zmmZDXXDG+UV$wd -$$!(_oO_[sCND ;(:#ǧwZ-ܗJdNu!BXHvKT똿@XG?lRiJ TR #T? iV ?蟋@g3=?"_Û/Qb/RUx 1BpaQ:r=i匆3;Ĩ\9fvp? S=p& #'FsNfA,{tG,~+S 9hp5:)ߟP_?_x&hKf#ڠT odm .A|/^S,lIz@"HB!.z] :aMVp#>+%E:Xzwzڇ@k jwP͆r~ kC]>>o$ԯ_ 8PMZGvS4]LE޻x:wLo. :(1ˍ`ܰnr7 뽵)NG97 ǧ1_dlM]RR_xN1Y8w? ||bcOpG}kiqlLsMQ0nwzi~?fXà!%Λ{D(_"+ڽ>xməsP| nft򫳗.=pKSRY!{դ'g=sYT }?P~۹;Cz*(l\&}S1솾/>IT _~.ogo/i֎oc",<ˈ,':[M7 ^E?%9Eփ̷hje?\!.Ql ;'<u=*WՇa!Fv~"3,BgV"9aXn>PxՀwEtT}z?Vל:uS7|~_+͡_[\yŘ1i,J˳߄#:oǎ*g8tګ/9<̿5˨K" S)~[2tb(˷kE1s%ߓ_]]}74łͶo7$  G?Iz@`;禷|uv]*,Gx:&󻪴ǧ0}n@8Ƿ7-zuYYlC<>cӇj|㻬xYHje$prv0P-X +dcehA98jծ}6QxP-9 鼝\g_  f_1;QΠkn=9 oB|7dYb/xׯl{_{y9);eė8:E~3V $/cgD w`Ӳ?Q5&qQ$#=ޜy_69/[(mKO*F}a.pvWKM%[o CҲ^˒O'%pug^::>2W6{87R6Sάq B6Bs4p征yoE לD2QC7o7ԍ=2ϰk0#\&`Ȧf\ׄrd)Y@ڹ|O3a6%ل*MZ~uD6-gtuDk) ݻ_g)*۾>{Hh՘G.6v똜\yDF棺qTz3y@>0smVázC^|ӱ|VBA٭1g\rdĬGcAfVV 4<òt_[,ayhuExed`~8dyVC0Z80c CǯЮsS }Mi8[b?*ߧ % l` Zo~8v7~U.iaeRv{pb[t{6cYa:U/T]$WpOwN >앞$8EWL_$]:_)6A)|#ԩ.VY3j$0=P 1OWpCΔMQD'̰`V}`j:䜯^r5V g{-쮲VĊe蟡[pq6"mH@C3wgz kFk&R^q'0P^P7\ 孛n#y}ph< .0._o׎˷X2|s7 _ !dCIDTc&ZJ & Hl)lA@ls.ͮH(9N)DD$BRU&d>oI  4IiM2'_Ẹ_ ?vfd>08@x9 y{ǐGߏOW6[ppRCjajWXIGJY].~pѾgWBf)w6R^azj`b⮉S6ީPakjj ?Bt::E$" (?ph~Y}b}IsDԃVkN Z"8uuîN2mrHnjp}'d>]8g8J $9o:*0CnI5m?@ {_P ;i8]vrpC/փ3A 8TMap`#x(m@Rb[ {Tmb*>l91 W&yPX]s}^aD"Z%8!,,7{wƧQDfP `R0$׿m4f 6ZwC?A m#3DsǏo)}]TƬ7B,G콺i齞96Lw9'~ϟ]=IleZ@Vu`Nq !Y?ǹGie>k~8 xz#  "%q #*E J۟@$iQ<: ;Js!%HI'<3- ]@z0BB;I$u DjA\*7}#)gP>w[zÖy% tԘU"-]or͂ )fxfR6,!i Gx6&1|GjlL@P _Yxki'Zkn "WI ]) 쎱td-4U4 ɻE%73@ ^T.E"f!gF[px@"PVH x&7#50[5s ȑcy0,-(rHuw9(O3dka F wUI\6E不C%9ۘyc.gY9;+I l Sޖ|`.6 g/P+($3j!@ ?;cL'tXUk]CZ>5W+i1d[]g?vr){{3zj.\`UA~)+ }ZZ\2= 8"V72H8qR^f@K:9[XB<55_1/vx/j!-fLy jAqD$rQbisDquF|fŨ4Ti J3_CaEA1_h=LI|ӈ5J6A?9)@ƫcZX!32dIK :_)R` ?8̐ʏ-?o|k{DRe|}~QHs_D|WEN[J6L"8`=\lMvDko?hopvE FC`n;iN meG]^<>QӕKs:2~mӷavhu31Ruso.c?o)ŜoT|(Rtq!1'C> zqgG:,o1ێxztt]]9˃;/kLW)]dd8N-o^qSXz+&C{ sWG?U( b(ɻJ=]p_d~(pD/MNv3乜#H#qC1 OcSR:2q~Z1!Yf$:xƝ(D0qubl)-'mH?!F2B1 \y;H[B 4qB %gZoj?5-5Hme.C U2s=K|A]SԋY m(2&ͼH+hڪZFQ'bi^spR,:\NCዺjdNR=j>\`f_]_  :ᜨGs۵;u_[խka'n+W0E/Rw{(&J=OUlaTV}v ytN 2]M^/4VGO\pR]0m\9+*29Ĺx]BDjSR#+omJֹUkfq =ԻXOܭO#WNkr1N;NYko~oDtӲ`@psS2:E?wo0]}7_ɟߺoc퓯r]C /Wm!? o͝Zv1|& 0_.m(.jU)^ٿեtOԩ EhN'2f6٧!7]|BckT^frbכcu5aA;YXW֐Ks (yWK);ZlfkW4mO6 MA=\NA*!+Ӻu|UENXO85   \f1ٷ!cZ :z@C==xfC,>o@^tu1|>:5C.k񘎀i8rXaWRښ^B"XO'%_=~{qzN@|B$%/tЇQUzӓ ^?Em HlֶmսRoFb??'n?2S=V {z:VX D7s 㸁@QpwI !$ff=AhD\i$kZ]B[K{4`M;޲3\Bw y041(3 6l;= 'Z,eT}>XƅsMeQeM®0Dp8.qh`Äq?=h h㈑Hlcaǒ$ c u݄C 9jy8<|P9_})|mn~cVYʝm}\6g O{}jA>_-g(wXtHuZ|8ҟ~v $*x0bQиV5Dя6hkdYDfC;Yj!R:lׁk2Tjש5}˻6}'$q5ˬHq{*f;`3ϵr9;k-_`֐|!s⹻xZ}{svx{*;Y2|xpf9dm/6L\!c9%!3b_?OUuҷn'=b̎3H[x%f`.e[eX q}8qfχ u8ꦂP}N$_Yt_ ^Iܩʁ"y!+JknjNMx|fE bO<4,xana,km#1I MN;7֧Kٮ5q`y~ͼF򸷍bҩDfiL$*qAu~Miw/ޑ_΍xKIA:X$qpV߳< bxsN0r)dy<^c%Y&;k@0#`?Iel9_w>_Dg7S{"oq2 T@MY` o`A"BN8RVU|25c*E!o8BH ^7ٻ^:qw @J7 y A#}-_0^DW۱5S6tdK8k{:kBu) @Q#}CSLE@T@}c6Q"*jYoԐ~{/'fBD%f1DKO;f4y%ۅSPٻuGd~X)+4 kh4II&]Xf 6?@LGHse4h@N1gtfa]/yjkP#. \@ܺ[pa{' MQ@ {v5-"_WBi=kϤjz"M ,ÀqPu9& e98@sxCQ&8m$uaGiaFŌV4xһx "1# 1M4QDJ^Pj(<MJTuskپEe=|;z7!7oHy*2>mv\We?Mm&x30!-,Dz~x59*U |=jSEz0,L0ZJg{h@CIf,`y=` LTAK馲X \Nu.t`Ə >6 v/3ߖ2C]#" DHà]~`9Hf;r; @&sY+ډ߱FEªqQ.KpƎbQn]}ݱN;u z5Ci-nAa l#o?Dp".{Z^kύ~CY~PKÝ,z1\㼾o=-{,^)Jڂjͧ!,~LE˨*Y _7 z2x n(^ x@^^+ h7pZlDVϿ (Ys7Tt9Z~뀿ep],o:t3}vn-x/8lo&Vkqsi[۾cNUl3=#>wㆻ^fp\oUض'J7>,$"jV.ƷGнn<L۳Mvҏғ){UjkM3٭W ~TRy-EeT^8_7gbF+<8~1ynrR"HOQ y5`B_qrDT(,qKNDkd<!ܲB0\mi(@1<S?I2}?i?~ F ]I~LtX/Nb!\f0_s#&X9Ahr#?*~vyXI. oRd)9. UPL2%Bs:/Z))2u AAu JI_p@~` ydd&܆ JoX",S\:m$hoOܸC  /oAҙhb>C5S-wf>|]D٥1zr}ËϿ>I>4: 7I,TFlLmie~Yi/( TOr#P&5 Q8aNs?׎ZP"y@6jxG>ilxYuH2D0 aO1u:o$6Aàx2I!w=#'hD/p@ e ggӷngۏ.ixIHU$`姗ر^:lf Y00p$;oN{(YPL|ѿC7W/$*BV QbC#!`#mTdRh<Y-A#{<pYJ"8D!@RQQ TE!HP!HPU04TLDL1DEN׭:'xu*o/(.}ʏbp;t/ɑb/[v807'uf3A8!9x Th˟owB'W̙_q8u_ۥ2Vx= W@$\ [GTEw7`a7@r8ćuߐ=:/2#Ԭ~U )Rh55'OU"(G&̜ۚਃODA"]Gl_/NTւ]2cd/{t~5a-~:U~_%MsbqL;njErx hjzW'9K^wyЀi𻩑7ff'`sݳ݃-􅷯T_Z 86gWz D:l-HoXPت)M ~s@eN!I%ɞI}?=oHTTIYTD R)@!1Щ@ J 5PUKB~?ؗ2 EUUUTEWp$qW=(*@xȭ+JǏ;825KEST#@>L@JdILQSQ5UUT%UUEU!( hŘdf F J)iZZ&hX6yf^ZP%T@, a) ݁3(ū,yqWM0Đ'**8feoB~R HvpAgUQ=\;eHv\­է^$&('9ÎR '`q]ARu=7;mZBO)8o>^{@=%WŴ"4N2@#KmBFۖ%%dKQnB۔96yi ! >M%IP6:i֩ː~D])U}Q#- PIV1QG/˟?~p|GFxG. zb Bfn.\i^8HC6N J<K0U)axO9@ "fE48+S}kjکkWDMgfҋPPXTD4d/'IG"dX6A<; fVf@ oHwo츄VrDnW08! AY9-P/L?s9?b5 E(  B*99Q !v=Ms<|-X `X27 x7(pm aYٷc$L#-Ժ nHH@$yhp$29 7\7^~OدtLL#ď?) s}Z<w߻\c-oiĥg\}[NIn~shΰ6_V|}:?va7nYzg7R f%Οs#yB;HMc' g__f5}5S?}T_tS}@ Q(y?~vf謹Ԏ$z%nUHJ!meT73gV T^*N(ہ]Hˏ+\suZ @Klp&b ^BdsMs@ |?/veth@gfם@$OAa$|9jUf369$ l".y @B&g^{^;o M5݀ $AADךx#h3V$@Dʀ=H\-ڔU5iĠI:b 1\lfh䒞ꢹVͪxcsbaǍinqD9rg'ǎ1/2NB50fDk%`w#؄\{f<i}cds`7%T{V6e%N;Bt}fÅ)B qEŦ깟wyٮwu~uRZXY(0xBG !yg5fr(2`5Sz߸+Anhfd`:O<3ZV42¼az9s=WVC40pCoN~$=nO-|6o;~hր(WS-RWv>k5{>/&ym3ꄤ2'Q+6?:E-^E<ƟJ A#8N4}-МC|NR6 >JSu#f3|]can0xyu_85$@@KIXQpT԰5HpY{fGNAJ!#Z"FHYz/8q `C=v>~'v,IF =Rf%=JʡD76`lLU)7_E}Z~{׾7CPuU9KZl%!rL0 x@/ ayK.j Y8>J N˚GyLq+{.[ Q8pVknkfR6-uh`CMEāDj{~#vR.r, =VDV Cq ]O3=>ߋvZ#.7/4 ^|0&+Ֆ'B{|`)2 (KN/(1un(kH[cbí2<䈐60Ez(3AK:=w}TM(;}Fa`=])%I ꠌ9s`1Gۅ-rq*"VONR`.d E?R1)P?>B(|ұwx{Dd d 6bؘY~ߦNa