summaryrefslogtreecommitdiff
path: root/include/rdma/rdma_counter.h
blob: 45d5481a7846abc566a31ecae789d3037ab8af06 (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
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
/*
 * Copyright (c) 2019 Mellanox Technologies. All rights reserved.
 */

#ifndef _RDMA_COUNTER_H_
#define _RDMA_COUNTER_H_

#include <linux/mutex.h>
#include <linux/pid_namespace.h>

#include <rdma/restrack.h>
#include <rdma/rdma_netlink.h>

struct ib_device;
struct ib_qp;

struct auto_mode_param {
	int qp_type;
};

struct rdma_counter_mode {
	enum rdma_nl_counter_mode mode;
	enum rdma_nl_counter_mask mask;
	struct auto_mode_param param;
};

struct rdma_port_counter {
	struct rdma_counter_mode mode;
	struct rdma_hw_stats *hstats;
	unsigned int num_counters;
	struct mutex lock;
};

struct rdma_counter {
	struct rdma_restrack_entry	res;
	struct ib_device		*device;
	uint32_t			id;
	struct kref			kref;
	struct rdma_counter_mode	mode;
	struct mutex			lock;
	struct rdma_hw_stats		*stats;
	u32				port;
};

void rdma_counter_init(struct ib_device *dev);
void rdma_counter_release(struct ib_device *dev);
int rdma_counter_set_auto_mode(struct ib_device *dev, u32 port,
			       enum rdma_nl_counter_mask mask,
			       struct netlink_ext_ack *extack);
int rdma_counter_bind_qp_auto(struct ib_qp *qp, u32 port);
int rdma_counter_unbind_qp(struct ib_qp *qp, bool force);

int rdma_counter_query_stats(struct rdma_counter *counter);
u64 rdma_counter_get_hwstat_value(struct ib_device *dev, u32 port, u32 index);
int rdma_counter_bind_qpn(struct ib_device *dev, u32 port,
			  u32 qp_num, u32 counter_id);
int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u32 port,
				u32 qp_num, u32 *counter_id);
int rdma_counter_unbind_qpn(struct ib_device *dev, u32 port,
			    u32 qp_num, u32 counter_id);
int rdma_counter_get_mode(struct ib_device *dev, u32 port,
			  enum rdma_nl_counter_mode *mode,
			  enum rdma_nl_counter_mask *mask);

int rdma_counter_modify(struct ib_device *dev, u32 port,
			unsigned int index, bool enable);
#endif /* _RDMA_COUNTER_H_ */
e3cO}?TG Nh]8s 8= /"IV깶C\f]ŝ,YٻE߮zѝ|$k HTU|apphqFr- #gNT1I̴`9~/bdš uUw͚jkgn(??Ss~(ashmvx?\j36-LW*~&+|ꋔ4_*HAtMҁ~l~WRh/$%,gY_/q!^@q r̥O4>OpSՉAYetv;V1!ag)|!4tjѬ<EA>@fC'.9f?tsA$^p)no. ,キ/]<+֍qI" IL T=2oZn~x/vPxy(D(5>W?vݕkōbRU`f_8ee[rr>(=fI>0v%Xob"H*Y*:m/c6⠁o|=D4-gFҾ 曋#.SlTY*U*$XQplIgݨp$[+mXé/3?}W2wnz`E|0"1%h N|GOwU$U5@дWQB $ԅ":nI!o~]u .:up1~O|#*mN<;o-|o;7h,,U4}07$qX"7b)3z۽`zs^M0qtWmex&V_ԮJQGi(O+:Wu-ҍCeky!ѳ.p $ oW^d9bstvړmC&5Ѩ]~}T,9y.Z ,Gsηwj(f٧$!"#zȅ!.g An&{ʩX\cupoQY{N3s)gPkx5̏>r_7O/[P8-iŅ_DboTNNz! -T-Y6lTcgV6cL#'v-1XX7@7yu @&iU ʅ <_ER+_7jٳ<,iAT %$5VIɁ]Je @\ [CV-Ų[-hr_fn#bJkKPʀ 1hg$zV lE80_2c&B8.ΰ\kxg>($ \ȃtlrR#J֐Ϭch-4T2^ Q!K,A{Tm8po<Ǘ3ynMnj A}2=2!Lw*I=ۻm_ :]u A6@E AQ&tV}8fV<#bt-'CVtDPA] Zjy%ܲ/:-ɥۭ.S'0,e˥v:.(=UBSP^ %aUJJP*mӫ+iGW Ρs9/91,ƟX4+ Vغ*CR\l̋muU`Ƭ-ՇTdz=Mv;,cN-2{er]aȰ;[\rk+t{!,kضmi4ǿ|tB/}A+ 5YhN+!uGܞwR"{cy^eWz;_ȵϖK8(Rڧ-9 6^BKktjӌ$`=øEv_6ֶmNфxU4=o/>KuR'F.;@~Xw(:gvU.}hXe z"4q QjΙ߉.Yt|p`;]1g%=y⾔n †^K3u䱭d7Za6\)l;L.{>*݋ߩV *ꅶCR@}9%gkNu(kKs4yWbb^1<l֙2$ Wfbj+Mde[n3z8l/ֳV*roGTup}j$MaYЌ!Y+ k5 b}a05h'<iog #dI2/S˃㺌'Z24QӜBŔ/:!6CVbHӉa"0ai #uǙM$TșfU>EN"p-PP "!|~"d>p )>RPR#i <@|#Ѧݲ~>CՈlw<\xMJKayF굥! Ea>/oG(|9u_>u^9.sq3ox(k2IE.?d}nWl`!/ѪQv'Yf0u̢JNdeߍUc:몬ezHFs}G>To?*u׿$I2ŀ9S4 t\~M5u\(-pq?A@DC},as_ҧﴉ qExo~͞ r#׬tKod2H ӝ<0CE^ dHP&8"6 CwXs׷ŭ ۿ% TG(p@F?W0yfu, Hr:~=DuZz[NzJe~bV`3emKi/$C[ xtǘGq|Bn\rtytE^o(Qh]o[]O݇ek^w"?{wƯَ49Ayp4_o9jb>xm]b~ uWҡt篿@cǭ첪|f+ۀhe5Xo'# ]_ O6y93lÌ㩗hZޗScpBX^[+#xi ܪɮ+xoeKDkGhůwW I=DX#.f|5u; ROϿ|t e_PVP)Wg@ARzb,J|^UP;sI^MCU|(ñw7w ~0 1߮ߒzqyVw U+ycnf=-/_𠽶 _nq{{rJ%[7Yf0%/~dzظR~8ޭs ʲԲĺ&x;!Hr{ǯ'cXcn5?_%&jWoTklt>p_cm!Y8SɭݴT{.[B_鷗Wk8[`q};QJ]#'{ƱK/%DrzU T?j7="u0T(:Q1>^wwlKpn%є~Nrv׍Y^ҬVMe?MvܵJ|9!#+6Z d\DX}6d'r1zPX`DbP_U=Llvp<|dbq`MFowq١v/J"aB#5r{y1 |$ME+$,NUةt_P1Pr2!/_`|COv[jUVmsՋ&  AA6 (~!IC`MUQ{]Xn]r"q+[ex6XjbHUb ffog?/ѷB@% WZ紲ǔ"/K. b{׻L99Դ3/b-dFfݱqCYV1UFb~f?+Tҟ p=htk]^[G?>hbOqtԸ> Ӳub(\Eơ~;Sؑt]r}oHV$4hMT.{ )nc2"*Q9ط9nE+ ֤&_reoͣS@q%UX99TPy6-t"vuL.(|u4Y+E]tf:.#@8TAU\,t—;byWœ.ص7A: pYF?Mj烄j" G&5h\3 *:|v?5k"ZbVrwIMGVz|bN +W-,TPpuS֞Wnd&[ oo]UWW?ƶD޿Ӏsh>grg/+ _D]8B-,u.nwO/V[~nEҺ_6'65GjmqVdώ{H;"q{8#:*:WGh8k1dU Q>'=sxtyIx:x6Sbrfh.Nuspg96 coFmd W 8l1 o >fS##CQ]"#<Fs# ˈ퇓apq{F凂@;ش?;P_, 'OI;7a7^zfu_oۥ)₨'L TG JIZ4AMFgbj؝h)h*#էͶv'y] E8)1~V*24 <}R'@xR P!C^^ZWL !b>>'aNЂF" bV {}ȠLAXO '`1/poMI诣,dy{/OFxڔa#ZE7(yQLF[߉o_ĉ$9U_ûn40y}adc<nЙr6=볻zY,0`9M~x]L~ z;=UA~{p}QsѲQ/t #*%5thɊ\ё#<螏(?ݲX*G@Ht?lIt(G ˏOӎ=nSPqjeIu× n?_wbzm;i]1xxuMKWf<š:)ݒ㬹 zu3O|cFBՋ}*(<  =uDYi\NLn;A]]qpo [m7g+J?T(Ѭ \)g]O ]xyB Z5>G[' Xw"$~uaH[IћlUsN7 DL 5?q0t#&wPOEMHIKuh9b2mÛpN|zb1:~>?l.Ph}~3LۈEg.|V՟|X,Km { }w˫\?ó*B "Z0gh#/B(;-1"nx0 ܨz63s:ͼFpnwT +E$ΨYs`;8 `A)&Gz`mi{-!_b#Xq_D G$x|ZM3r mx<|-?ou9oxΠ}??hRe$L2=VӖ ,:ÝH5=8\$|_>oͳwh֏5m;}2v)r_6A]8ZGwl5_sե9i]p@iyf!ŏ&M~m¿RJmDE>? [/}{7xd8CwESWjk_#_z~B,£M E=C\uMpaQ g*Mg?>n2ɻKg+r]O?ʑ$ø0ÇS h2 OvktfK:UeBNmk0>o:VWhE.P(WU;C)j;apRlZZu+eqDD I#r:זZs( nHi 庴CKfj<{i[;Σ,A!GUpU_X''?"#Lߟopѡ"ۯl}[]=?".7sws ھP}6oAt4?8v\:2SSɺK|[_GJ_,qpWSg1ށe69zeElE52`IB];׍EFgBer^'u0W]g-㨾ϧk 4[T{`nMٰ@ -trV{떾nkT 펵@o9 hzk(PkCq?__e]6קw9u T ?L?h"DZww&1SoH}!m=54a#;f8n9a76_ߎxrwhF4q42{|ڹ9vfC#'(Q?)4MV@H{'RT[@vvg^a_8^kp)pҌ^> 39j D2;',2 x 6-$pXnS|u+)&T!Db O_}>W'p?~m \)HYGkBH9˽eٿ]םADm"XؘDCjjzHQݫ{DdRpOU smEm?V~ooGGsd(;s߷^#eG ǟǞ=FwGOUSF~{.{y=8r`N 85|f1+sqg^MKyD єE^9PY5j}wrs mrAu˽A6p.P}CgTƆA?o :֚p oHwZ{3w26]S~E1OUݳXFe/ !Cn Z.̛ZX4UsWMXQ;|~gOWmwmѣHu/P ܛpp<Nx}PS ۪vM.=/گ9uWntc4xgZ eȋIT=M߅jc#Ÿ(w:kp6գ|8]ÛZݖ3~r.M2=͛[iA:s%|-Օ;ú>t[4I4-7t0oKs0 ޿}*-#k=s:luw F1vm9ԸOB ?J:ǐ3OrwnEow6zx8qܹҞCm M??H#'c:zU'huXj5EM)vY7d\nۨݹsUt`v0jV׿Tyh%1p'.bI]4^F(M5YwmJsr\U2n7f*CnoW><mOxO/cW4zO?Z'`nHy~hiP`A!GتP) |w$G״ywH>[p] _tmHXQ =R^C|ЙmS@!T 8߮W (PZ#`,BبmsJK!b1(D{D@һYXA@,@[,PYr>~/( |y^|k8HC΀B!>)m}biʑ<{lJ8T=VǷd㿏ɳhؗ ~ފaE 0dxѡc₲Q2$9kmNIsEdT#~ZEMޱ'] %{(؉2Cm"d:#Y9*:Jrpw;Ǩ(y~-_|~8߯Qұl^8ᱧN-U{$9r$Ǻ6+uT9ĀR:t"w?F2=.R.;TZoiX]g=*O }d^IB4,C<086z̔L nidx0L=}Mm<AR܂:nXjcAb "H|m4"x6Dl_"mStr5?*w[얬1T8מdwW-+E0Rw+ȧޒ=o^l3*23S(zZwy"0)8-gN]Láu \-l,5X8k~mEΖސ(6% 7FßQ֩ѦΨ]Օ{ky[9 ="PY+v*ÝA)R* >a=k%k0b4°j:zԛb[9诅p"qt8&u:b"Bw?@}"h~̐àNSQQSv{($S1xmj \d]%jH-w](lzb~9$v}L"VVR!gwD `-1fE^}F|&5e΄vo7OC[|XlŤ*2pfPC裲*qS#~ P|EsC`HuX>wFŭhrd@Zi~v?OxK4ZӮ Ŵ4:d"4uBHuܼn'Ug;WY zg|4c6solY$/uma}!5 /Na)J ުj:ç/ &TyJXo5vA3<م67JQȋmyVr6 %UGU㎬tOfqA'xF$ƾrA4O\|M}cA5mpÞ@# GȌ؃mУyc[2v\g-"E•Eb_Ƅ`vX3*OʹU{'F*L~_V3NS|}^Vڵhfߎy1U"Q&"]* ΫcQ%w=)4TER6|U*+kg:#i#x)<v<[ݪv0$]dB|l3tti9#̜YT44++`IjFf?G,(ـFa =.TMQD bUT7h~MxAMzXܞGUwҚ!$%sBP[u)'6^l:.]eۄs/5T[A⹇ڇ!Pֶ p c.U;*n%5򓩆]2=$rURP Jqw9-ݮݏ(;4Cӵ~]. 9P7Ku](x/.!'D[z-+s ~vwBC|=t*ݷoWӯ" ^-oTCYm *4텿O d:Z{mH0!6 dAA\]\ *VVeVk(LUB_U^ tBOu/8y'|PoN\k*bVpgD en&qDA*ͥڭ%=bS_"ez"+:v9S-~o@}Sϟkິoj9̎B"WҁK#,zỡsnv\[a0/هO(D{;j3&!݁Ը$0B ќx ²p5*J(_rlS`DD t܂/BP]f[myeɯǖfXu0pm^%voBכo^"#rRx׮)%kvg7T @n,NՃ+9ATs(M^˩<CH~gj/1Ӄ̰{fLʮFUdi(aD⨤d<Z/z2Ay6Unp`S-hkR^d6iu$A XmΟn8]],wK/mr[OоoŘ_AT}{s1$;iON 4V4@]/,^Gz)@KH H*0 FBE/h9^>].MBBrO>䞈х,`EP~ns h6A>Z̴O׏n8saskzp09OsFܯ/uy?Ax!$YLC!=ӳӖ}d#_qDV)MJew?ȯx\Uu0:@,4 t[҂"{>yZф>6!@TZ4OL V"t-y2Kjl$uqjvlmCs;T G܈e/w4nB GkA͈Ne%n @+e.EA cZJV57,vWI䷞q DQ?̽_ |8<.QHġPUT(RP˚ϲŏJ4ЁT=jeA[X@::{皺'A?aK,zaSo\h0WH}`"kba959Dw~OACA^W m;{֛4-ykk_!}uAQ`U >GV}-o9nA_+!~86= y9ޓOoߦ@r]ǙG&gyWBpVgc2)=H4J?~~"*wΚ^ābh٣`4W;6@pN[vcӲʤhpnal}5ee y&8hHP^M_vFTۘ_ΉNϞnVxa]`_d%vWl `r*5ɫ:)#u!37|x9Vypa2fw4^m=|KW-22*lItk޶V/vh{w@|nW63@ol+NJfo=#f[ ]5 xB5%SbmFb981/w:ØmzdžUpYC2O"QGh5KO.Shq"h/1#[Qc? bhơi+ CMҖ)pcE{JL[c Q~AhQUQվ𺌂O,DQ%\A@R$A3 .k6*})Op_b=:VgZҨSCds]u3H]6(o~ V;cro8g}'Voݱ )!BC#a\..҄/ !:X9>(v __7S_%XJq*[ž0z19/p;b^z } 6Tw@:]* w@?x2u ( rC#kjttyP*^' hQAss QL{9Q۶G?3 OUhΛXN7Ldy5NN +磍HuYs/|8ʐo@yܽ a'kdGW7++LCfq"goʜdr'\lrsЎ{'X]t#Lj   V9AT<4哚A"Nr#%iAjHlG';t%x˩#!xYSIq.trPqMČV\ E1yfaΔ8S_X] [^0 sʉ =\rbD[W&B)×GV_?kYy&#$x܃|ˆ#Oz"![djD>s0kc7wmk#p;\ldbL#Ӱ4qp9(,C.o>:]. w*"x2IoAΌ8V3ZB@_o8o#N9M2G Y+vM[1!rpw& CIY3zf\6'0Ӱ>MPBFt#%뀀[һ`+z.BY\9x8I;`@dLq\;ΤCϓaİ9G1O0ӥA]<$Cz#I?Heܹǯ.}%bAG8Y_aҢ|W(\ېD|k ?]Ҹ[q7gPh~fp)}$4ULTXg]'͝_y1,/b]LyijuC% ύuE"ضda\-GK(+#ՇIKef73ͥf(Hdvhp`bt<QHkdY2e KD |9Ma 6UҙN4x-@VUj#!7a'#[pV 2Gbg hl 9?:9G*LWe-b)Zx|Cu2t:nB@Q#pI`\u!kM= ҆ F\s0@z~dEM|šxb 0C< t%IvQlDdhkՑv $595 0cU9^BE0 P.~$ *1g I= @XwiMo$9JAITuѕУ~BSP2Ud6Ûe(pO{oHC/3ȏ =(y1|GK1px(\yGvxQWKfV~b^ߓM]kG$]F6+A,'~sFV+^ML9DŽ.F[#C\)Qfۘiޚ+*!Oʹu#{?4R2BIcpxxjOݿsm 37Mtn4wbf 4T|=I[k|Qx[zNOB1zۧpO7KkqZi{H\/}`-7VNEE]?xڥ7/ SC}osʹ%vf<& 0u2z;,}p Šђ4A/ퟥπ &DkpUk8_ыHr8r Nm/}\F}k"+ǍX,ߨ yy7ۿ‘:O\n?DJS[u)c*'$" ޡOKGF9;^5U"uOpD B6;U"E`8@F?!n~2/0Eo>|`!U=Ϲ:*phQ)bW"qAƱWp4Gs+rJPDáԅ B v7=ИAXgk"HBZ4$ %TyܲA[Xwh92ZH?n42pB ;0.J3 ɉw n_ǟxu}>c#Eaǻyr9g+zwU$cj&FW\gfvAjivK6hsU]CGn)UXKعevLNs|EHv||i"` ᅼQ^MfаM:ms%"Ĝdr*E7o#H3%'1nb )r*oc~qŢQ3/'8+k 0dU8!P$F6eEjxՑ@76*ȷ~3:I%W:9nsf*pLh$ #\\jvFwF7xxnHyqajH"RX56lsi E.^*GYѩ<%&=#3 TS}:}H Nb1~1~ǮF:!}"'>Pȇs3 6-L9l狮ip5iz,m]m㊜3g8tO,"z;MkUo|aNit~K훏˲oADۺ:8 9e*f.cpe&[Ȱ&*900/[F-,"RVt\1!:eGujb0{S<];0s҄_8X. Ĥ,7;*! x}ܒ坸*vxk彐aV|=Mx6Xp]o_L=[7\$՝p,E~%\ѲQYӚQnkwzѵWk7 @x$2qm5Vs1m Gb &@DSZ{c%54\1SFjZGI,xj!InjMb9Ifmam! KOeooQhx3`XKsVd¹ uccf֦aU5 Xv܆' 55lY-aŏXZiヴNJ8TIf>¨Ve5̘C6te4ffAT椭LcF;i2ȂIf࿒ ^"w4`D#?o}!Xj^$Ll,UWL6@N43kļ;PHA?"䞇p#o/ܰ"e(XBwaEt[= ӈdt}[aq[{b"CBU.\y" 4 ]J{ztRg[#=? {0Iaua\c\~i3 !n:>scF UN3"ugg]X>ʏx8!^Zb J BKC֙S؃G:*וhS<y(wE_>\nŻt#gv:6kƟeeLE1kcU*'*B C~x(`R#r,8a I=u/'WNa)KMU[. Tp|F,H lPA"vzO% PrÏ ,Ӿ.a]Wn!dhbT!!Co4~i]bYłY!]K<8ŸdtՆ.zã]V_gfub g ԵP~P+ݢ\Qf]UąrxQ&dC-M$ӤrIutM|SFZ'|._LW]Cd߬,+u{(2v&w#\ uA\S|_^'=r(OTR>6#uH0K&=Ji3-UK_֞D+T^0S}U NXxnl%MHD'd;$Ï*Xgȹ ,h8zf?nF8@j(Kx^8YizŠ#ؠ_#5a& 'C I&XB:(Y~q[!-n햛#4,"0==PvtrkJW5B~%w 4-t)kY 2ͶMI[hkb|' .z0Tok;~EWnFyԢ hf!&KyGEmqkTsuEڭs(."kF@UsÄ*9C9!eㅏ[SD;.,i81#{,3uٳW-:"r蝓V#PU WPQh>;$0\{\?2zf%\sbaAaJ~HR廹Y/gʗ2[e=g:rWAts< 8]}~F4c1[&<5#gu_F*=FAVNrN|G n[zH P(NST7DHĽhzARLLoj-mԶ #⋮v:niJ p0g<}s42$f_8Ao$?^E!&:ps]-F,\ݺ?AVFxMk/}O_ʓ .z 4b`G[YdqBg /8asaYb `7N}4؉&`S\>0gO:Qȷ$ya_DD|snX`r<  S'mI7Dɔҙ7U[qtt^oZ+MEQãCeRSh. ^~ mUEVV/\B;)p$^o63l%7<<=H>V1#T̍LRAr0Zi߮q-[VHآb ᄥ 7`3zWS TXmآTU)HXpuX CU>b\fi6QEq#n7Z=LAޢcX*GֱG %O5W#$&V׿{k_?] C4$S% is{G#X BY;¾_;Հ[2>qLE{ȣbŢ8X+DB%eʇ`;,Gex{ج/n0r5 R a*[j0Mo͐"^GKT״v<' 5 |ځm%qGh%pxcU(HB ̶Q !AcBzKϏ/vZ uD+ZAf =ՔC@a-r*۠uHbʠZsj!s\p}mX,Y^n}KPkry#Lr(NJP!ATy PP>ѡ`q2z >U ! $̔HH@h_^D&tlԉ~ַ|d t.(D| \/H$-7^_nqӶޗ2(M"B88 A *]S @K~),xNoXhOho> Ye`#RB+۝,x6lh:%58V@Y '6,H1 (RHuTHF\}a7H* @afom /_%24f'v<5ô˭H,]BNyAL8?fnsg?P3p*0hy)֏,U/@nvduVLҤX"IȝT Ӡm)#ACiL ښ.poгy>gR݇""&Lgp) ƌlQw<{m/42aJ:-n`@/PzK"J!g,W*2F?<ܓ,DY_ic긏Q׿ y:~lm-/Yh\3fx8t}hKƫ^AR.ohgWMrs"X.{\Zlmit5F,)Lqg[7_q1zEIY˽m|b4f#y{W@犉8˦*p^D(@R镶&w̋Z]H}*$OW$7챯m+v\|7+QȯI#VgYEVMxLaM+l<7k:evDae&~=񏾭2g3lTTe"kū-缆YK`4L@ fDB{T)ΒhcT.Ynucϯ}u[e\£ % <EVMxa CFqm i yz9Hsh,e9f]S(tBHnkl5Ϡ^pPK~-]71hbE`q\@63W5K5Uy uW- lNhp8{ChUSRgA:D!p.qˑ|dٴ SJ@줸X <,L(7T|3RRuƖ ˻n9+.2Ev ڿ;ֆ`A{}_#HiԧAcN}F;lLYDO=_zZ50";Vm}Tʖa_O$7@Xǃs<rrUQbMW 72}/c!OKYK_<вˤ/@ B Ӱi;4(Ɩe3P D]d`z_( A)2qV0oZEo̠AV @ Ȏ~L.LilK>cE ۍ=,-emg$YVƨ3ULi+)lA"J ֻho=37B|/1* Ƿ UZkpMvqdGF(!ZD`T aHa2LJJWM^AQ +$mcKMqh`$"Buγ=p#HO zO啽'(,~`.P$x [/P?f3I Gsp) 'p&DM._[}r UF. J/_uv<|Lyb-`C|('}E`! U7 ] tnrzdШ0o|qǶ3cI܏H+Ps V3|"Hso=(QT&Ł YL5|Y2If,ZHj5 ec.װYt%t+S/łI}Oc5鹪K6r͏tƻk0, #(IU-1]Ұqkqhz(v[j׶<’EU{e8CHNUW~?_B \jx$`*7gA壵uV<|2;xӚC+0 *=P+8-cF]z-b)^Ƽwx̏EVRэmw=Ʌ<.:~C<QJ,|e:dzgHs_"+G l{(G9x$|q?sab I*rR{3#p8ASSZG 2+N2cf ;H!Mӊi%g:"M_V~<ȶǫʮqMK"Z3BJPxEZӔ͜GC>y^/&3"ՉVm & sY@QMl°URdnl%܃=7;zҦaDo4w6`u\/càXrq'+tֳT>؈w^ V?0GE\*) PCB߸d0sAHMs8Y\ ~{G]B 7_wpm1)'=t+*r5:\x]y!Ch =H!'MHc ܸػ1l`u6^k*zC]!/COl@,mZ;)1%iOg{ފ$,7׃޾PW v7ւ7~pik1~v}X<p`9\82J3Odcsi`HoS(4~|l.n{ 2(Hw y~#bd![) 퇭|_dq*0{^ȏa,@Fq~K'Ce=b =E:T,4ɝ}AvTamDT]D=Je˃iH8E}oOΓr¯Ozv@E.,UV*|uc[s^=k|Җ2^|Qr0AT geŗ$Oib0s#@plG0ţD UBhoϫ4k]l Т܅^wXNEdFpu:zǃ uݍ*/%ep>{Xit85 2@˥S0Ki.sOvG׷e}Dޅ0$b(zjꑈb`Ьt_ǯj#ʡJ'|ۡht2Fr#tȊ("AE7]?o4,pgSS!A-j2,X >_1+&HY%J.};;vU!џ-7"V*U{z0~vvgzHGI#_? 8Z9"T8[bX%Ko\4gL<}J7fL6:4J [Y+ An5S;y/9ZD+s}TG?c1EMT%wφ.p<ů[T`ׇG,ۅ#`p:*wR*y:}S{s^ϽYHD]X"* kYG &QXfg~usTfʺfjJp|=GPRzRζ*N]#H"iA~^Wc6#הXVߐQ|S9@~~knz8dnpG~ t$J[v8)`y(gnPŘ=c\{C8mbpOw+t )>MGW׺OH~*ݷBB#%E_-wϰľސ-_p1GeQ ܣ`*gI(;2PIr'(kZz vr}PO'74l˒+酖~"NqV0@ ߋw `a Ū`P$rq||XP9rzSVXQr?%+fs>KY]^~%5g>i~ĝmL _)#U_6,Q m)|G9Ԙ9@hj~<]ǕB[C]CX-ܰW0  @ R(5Ϭ#/tu"C2EC`k\<{nHݕssrp3#Gזa:Kxú"Vu ?k&T D g{hOEFFO*LE8:&dӑq߅KixQyw!7 A4qUPsLL)@ur~S `B$Nd8q_Uo˄E˖T\PX7 N)XFsqF}1{LpywR4gn~R`y70goӘFbG"| VrA9z!2%:Hz6SŘpBƘxwh f« jv}za`%^Qŋuv0`G$C>Yz\-` ع(p+! |G2@e~ZX|{:-\?crǸAHfBB dLODrL:ege'@xK85C#:`EX9mv1yڻ\"Pu}[hE$~_{ /̢< 펃c@5tMWlqa n ׷6WvP5eK7}s:Nq2,O+屾3; KQ`ҁg\B/k.Ϩp=MjOvN b%vѪi ,Few}3_z8pf<%񆋑xɱ0  kM(lSc/>pIzss f~{yꟛc (=w$+&?eQX_P>>{G,@= _;zF}*=$pb[b}VxMEΏOe9z&J8'x/Zujn.ωՌNayg!A͝6'x!LүX+Jف)]h_3e 󝑏&;Ma~W֑gyZQ2 f|y;_%)'d-;zv.$؊[cIr'䄃{l'糹L;@IрS[^`9yk"ybax2H3ܦfŇ$0Ff!S @D"An˝̑UYG;b~xc*J 6ؠ)qs=eAciLHkeb`-E&Y4,'0!>Oy`^v忛LēxeCXi^6,4(foC͞EVњ˅ױtzH T!/+Xց0H6' Jl C2̉DJ)Ǜ㽑Ŕ1$No%x @<ЕCN-в;5r1gҊ7\H%u6S[<@9HBsUDyGfV3<D d֐[ʓʢNg~DZ@W梛u֏B! aۣzn7c9ð^TVsSSPIЊj>vg@e 2~!hFp*ئl`s%lAx.`Ό7Z=nc+'O'5XQN7oUE75@}$(*mTo۠RJ#Nls<#kƯnY*YXZSfHZŮ@bdN&ɣE O?MaUB C4A.ȳ#: "Xec_>0oV2tO֌Hk]`Wq}lbV*U`z^9bce".[߬]Cxr3pǰB>_(R} zp˔ll;M*R6s& oT*[YFJ.{ d>?5Nm$!҃EǠ6Oc.4^]}EB&'<_Ixi201LN1ߙv 2^Ҵ{P1 (#G*)ʫ^&ra(,GkdK " @AeVѭpߗ]k).[24d[$5<l֮ df吾G!yu34%eVjŠ7[#WgwH<*¶6`x.up|晍[q~Kk&|;H󺞍OchQiP~>AfC9f$>lQVFT%I^"~uvo@,11eL TD0>vM/Qw%L}Y1Cxی泘?͘mʳX@ _C&0zAz@>Z ϫ[ ^Z8mx8Eˁ?kBK{?(I07$M v#mo豍LnD‡ a,it_s#Szp(;If @L ^Ɨ`F[ˈ(ML0P>Ͽ#b0K.5t o5Y^2A5pVךdw6@rd Y~Mf.J(YȮ_2&(O d X4}~=Bc5kF= e5[1ّ9f[W3SxNC\Fh ||ކۖ~ER6,!} cIz;H8‚_^9d ÈR8M/=d nk0f`@fa eߑo$?;HnO2-X2E3uQaȆRćh.7b5ۮ4 ҼûSxڡѪE>5Mf?LgQ6( ʻoc}* C>d ~0jY|tk=qRxۀT\Nz BA!Bfs1oջI5|Oo?h\L7OgK9}s9LFN~\MM}ӡĢ5asgTy SHpp"V?+q&?yQWzQa7<~a rp0S/s2I'6"͛hZ$";{F011↢o:bwШ1DHspY.xED! @r.) 3P!4һ:%H뇛4˜^:U8H]'΋T%Ga6J1ŧF2N\/t" F$MG?{OP⁜#ó ;% cPe2& ;K9js < ^ 󇸛!Ö!>:<Fg"FB(f!VT?!_)jeew;:h7nj^)P$huc:f#1m[ɧkHu$&K&K+lOƭKl&lTղQ@,I 3d5 D+ϜE7dqjl,6!j %YQgDԙ]"힞(8GeTʙ8NLN!`g@j,2Q#eVp%p0[aW񹌩s5H.á"(!H|j`y0Ѹ~7^Y=G%&oZ=bqtF9:K‚*u^%#jtY-w`9m Ri1XMhKyomrdBߦTP)=aq!jQ4%'  z`pު& @4:t@ݶȅ>:8?w:(> ^C9OьD޳S՜"ݸ>qXőD3:lL5Tf~|B80%Au3x? DZ_ŚxN$_jؚ 2._ۋ<-iѴ.ZMErݎ}զX.))1X P]ʎw(XDBDנwHo]OHe,3~4Qe]_+}Z lr 2>,KM)t!hc*9ZSsx =<]a-8{<(ũy>W.<^P@`Eܟޟk.Lg{-4Ȫ=RؠX Ѻ^K_D=Ő?R\& B-=cƸ6LdTȈehb0ܦԊ`Yhm(G sNdd1ޭa˦jKAn:|zM `Xp 5A}Za&%!)n΢'Wy¾.iPbD NP[H0;DxԠu k5Z SJxᆊ cN#Fv>]b0sEiڗP4|znE\T4:mqM7z:zpD1ٛJ.pԪˊ:1 qTkr|_\}t C٫!x|_ǰvdvħ[(B_`s4DxA4 Rf2Ma3f Oh`VWV1Hf@RX:> ^c^%(N!,rҗ J8oaOЌyȃo6r;\4~e JxC-PePDB,l ߈ nǮYhisaƊ ^aDy &[حk5/!&d+ψ3qB]pXM! 6e& aduU_f9Oc$> ?EM'qXzJܹK~>vʸi#,u+o:5ݡт[8@rF/ooj"*0wL9{z2\"J,ݟP̣O 1Xu<(ݳzbEʯ':رaLލq.9̦YYK~\\voYJ@Ӎ;5w1+Qc^R?Pt9cVc`fKՅ\3l7fuɼCBh< sٗ$P رZò1N].[i%tn̓Ꝩdf }eCl(OP 炇vSWH~g)~&3n\K,8"vx|70, 8؀̠- ~ǡ>UP$Ge[)$'(# Iq_mh`z2.t4^J^NjZ c~):FN;[?MzY˜!Nʔz[auQ2<j 9=3t^d}\Xldy!1&{}0V/ͨz13)2Wa52|f_?Tχy+XgnA&TGt9GGw^s4>Ls@)RƤn2uC849=H|mtX?qۨ/Ob$U=(%~,u!,Xpf7rӘ7>|CnwZJ.ŻECNN!|xr $W[\-ژ<]KηvzqUn ͏>2мqUrG[uz_( 412c~5$bF:" 񁂞yL '~r̟Tߦhg ]X? S FM \UCW}g\d_+P^A7tGFuʬ/O#>n"?vN*oHk0w.rƿAR&w5Y׷U1g\6{L$@=9=*d ;zS 2vGe:JU)}?O[[{JR!Cpw(ݗf@#g+q.6a̟oVDf^]9RD\jtx syM ɕvktSGq8Qh|xLCdHr@I.!PC[s3YCkv=b6yesX }d񈨣)Ky',(W0pku㘵M+|T\]}bõ|g+ҧQiN cE'CUh!]EPnkVR#|E^$`w1,i$We[wcj%ޟ75 E 0P-'ց{L z)UXk > ˛dR1S$.q{:rŮZOPPp[cՇޗK[`!DqVt.͟Uw[ө_F80X^O` hxÄz1M͆ϖ |wE[W3r&90(|O8B6iFv'uӶJ@(ẼqfVFQ`9$/IuV4E[œf|tf*D}A(>c6F,P88,Z'fst`&#C DwǍafVc5*?س=jJkVГDS 0{*o{M@Ð{D%!æpP^?OGwW_7D2e{ F_ ^eQX(1G=M:~;vG#ifOb٥LY;8rn5Pًb%XDz>^~f>6UXoa~L7}Qh4mxcĤE6D|Yc!pr?Ac9Y ~3@Mt/]}&gȝް~!r!?<񜕳@ F\X ߳Rtbz_\{c28|0+ow_a>^_4 ;=y3z{7\<b"햝XD!bA0;M|gs|RyWWsLwdPodr\wY'1awƪzaqZ|u #?Dž_u e'Ҁ.&yX'DVx?up8_Lm!`DwIHT!`% 5qQD2]`Nc+GHI 0q67G}]u݊:5\jRT8||1@lk#VBn120^y `Ο쵷LqMgBf."7g9ЦO&v\2s @e1X+4V+cva>OoCl6/u-\q7 Xu9S<^Vr1Vnȱ[%\rFr+ED `ob#s_vwGx')Ζ9os^xG2VSs̻[>Rr縎(|j1q pc*҃2ڲT ^K>5eaNJGsZ'kӖ(q8N% M>ޯ1XcĵGoAP G2Yy153  0pڞEIJ u6n\b?LZ⻍o*ۭ-FqqN\7bY>0膗8Hr796-[0d@4qR^Eo `8Yya=p# ϦyT>99"CK\8=N".㭲=J{( *(Q?jdޠ2gʶO~2fmE`5-x˹o.EPzT<~QZC G[{8"hfDq+|pf/B86CbuC$0=q7kD-c.,ælFzך5~x>2va29' 2[ |pjZ\Qvs3Vh3S#$T8:X@r&_,uX1Tj@o c뙋 EoxH=1;pTln^҇c ;y]#}L1[˟5g&΄~ƄP_VYg+0#}jޗO8p#ӈ/Q!=X`MM5CE ]dA7Em'e<"|=sXyp]k_ e UnYqctbٕ; /%+(ANf6b'> xm]q)j}%KǕ}@Z::yW^1zZy$#ļ#G։$8\5rzۻNw"K ˤ3`랂o>'l5\;:ÍrCo&C;Y QWz" r[4h0/0=<g>6PNo|i\y5xi/v0² vN!/>}!9>HH|n+2ԫ~>;9K!;\Ƽ!~xpim\o|{gj*[3 z8oSƋ[\޼,Vs@8uhDZCx I'5V..+r̓IT_AƂl|=S>¡W kTz&8Mܮ ̸c30`; y7xk0ļRF@(ps /0-XR PiܤQI {zߐ*C<.5$,B|ʢ)ta >oA+ UW$}5sziP.")з_{/Cʀj7xZ3zaŶ^V S̞JQYؑ+D\}6)* (ߟh5+ ׅ^U!b~EE=xK%#D/穩NiamN=딺ձf3$mi5ZR2鵀 ٚ]K ֜KذypK>0@a&ZL4TJuX9/QקA E[zҼ39Ժ1 $!yoF2NɮRzgj &_]dr),'3!F p0:Hn9X$A,ĺb:Tr.teOf>6e f3Es1Bl7y#ҽDR >-2Hx9#iZ:]ng0 ~3FFs_1x5qoڬlPPi]ٜ5H󇛟Gzf"DIp` תJHZ6Q!r0C߽W$$e 26&W|2qQNE bb~ÿʯoB>G's%:fsI? vH+_~HRBDg"M^׉\s: *δd`.G~n8`(d$A,|n3Ϋg+hCƞ jD$C?o nVpe\YV!"G!`E6$c\?&MDQJ?MD]!ߤ?>$F`2_NH<(;7X ]nNf+ԉR6nT=y߀+uiF(n=]W=ΤAMBioz!n% ŢxUxMEe -zդ\61 NLevߙGpMʭ-ZiuW뷊ZT!=: 4+n=Me &`-@hMmAl/Câ6[ ir9$C쪲F{+_k+ܗZx#J!;# JiF *_*}iʉa%,%Th(3@wz?C}vVf>T69AMur%ճHh|d4q{D%2ck5\3V9=,mP2#in0%9oq",@K ?ݏq 0 7uj]hEFb $YT/ԥ>9@Mk6ljS:2. 9É{ɘaბ88>~7BnŅ~3?T+4\U ["O'V:gr˦@%/ϯˌM@ EXAj+Q؁ 8([W*4GJg|hεΞ76@t. eVsc\ޜGEۉ@ JT(@pM@q?YEub\3y2T[Ko&=7:t}f}ԏZ{.Ds1b_P̴ 9mhFz a4~#Ua}/ PHd9L_;.[x[ܘ ɪ~/8:|]flTP H({}XeX"# CD$aCs(80a\^]-)#?\a>V%*js&q81hb?kchڝY!f=5ل9Yiü?Y/W(U ?a~@&mjALCy| r%g dMI5pn/ };^vR)j6 )VѻdgED'F:>;$~' ?*]GNL4?TjMM~#&KE^lf 8>&2ͭVM(D]JɢeckdA"ŒӻpC5TP䀈;YS0lx>-P}>\h YaMС9MA.w*M 1pr*qAQxm'Avos ՇԌ OaG{ yCJJm+x9C-ꊚv|> \t&_9Cp^b  hQ;mtC\5#S z^sxΉSz} 0[TTðeN2uNbۊ\Y f|f+`(Pi/ fYyLxb4go3_ ZZY^G.9 ~͘@:r;ԉW_G7admta*^"eƨ!8wkaa%H@O< ,r~BՑF\-x ~Ȼ0[A_mFCDȾ̡sSyyG Im2ܟ%뮺ϘN2!1=G鈩9n^mc4vzqNe5ˈ#OHi8+0c.t'N2pvt>[\ܷI7A.ş%ARefo$,4]EQuܯ,w/sHSL3; L]<\$hs>4InBQ]ҿeL$7|nS IrDBjBq 5,m9 2(~>'k(R#:>$ x>V z:;HsJ/Zs<;M-s}CeV aפx%7܎{Ac咺 sS%Pzp")$ 3+2T<]*kpףH7 Gp -ʠ8M'Ȅ+zy`U S3@GnьsFYe QKS@PO-õb-ƚ:{1n(AQx[;gs93C8u=e4nWDqK*_Za((rFEOrx}F=|yQ so![OĂ;I&jL>5ֱd K/o+Y߁=1?3FT3+Y#HA3PГG ȜG+` 3}PJ9%#eMvEob 'd]qC;g"ª*/߭JH,T䆨??#p J45 @ HK܀[kSGW$0c[~N[_eW&N " SM,#;YBL_Yɲ-K왕3M_A7\kv앿,boAfu{g>;FP{@F"a"o_8V#Df}ݾ_bl䋐|t@b8p즍PvL6C'( 5!sJ+0G^vTN3h[z{C@ ujkނD VMM*:^Q{r7-YemUe_  Xkc>~UݗN8 Luw'`X>`q0Ɖi4?ӸN?v? tEQj& >IqDrbO „ Iф9? |4||EˌL"&1>%@Æ_^3P0$'~0=6g,V,̷\A?ҫJ;G9P: }󞸉]yfb3vIx_m"rq#&䒎9[zxUFg#᪟晆$ ?@gO:z.o7~'@?~< ޲z 9VGb-Nt"EvgXu{ϟdEF:'\S 2T]hF2 m17f2 z:n<_B+-Qo-,;Ц Owyj)֛Ay$3;Ο[ Rz,;,f$<2}_{|qZY](.ݥ.[ZrS.s*U Izp{}˚ es;t]a*ABqlc"5{:u}¿ð %*0+z-~lOP zTŝMi*\1f UTL'"4a8Icؽ(s!_^k"܋Fxܶ9' ;"{<1_ɺG1 r(pJ8Zqzz2|it3.Ma?zC~sx1N֗I.7HY.vjB󴹯DZgwRYյ$?MrI?7"̠=ܽp/'kr4S{oo_Q_RK'=N~Gپ%b3tCVBZ+;~z9(<^v<]G S?C+rc3ǮNr3_^ixeHu~K|~e{-VSQmt\d~]>~>a8+Xz 8yQR>c:?sQF?[Q;Og=e)^>[):GY_М!EsŖܤ DxpwAVY882?ܶH>iSPo~vuv 9'ZNzF0O~v<^YH^4!6}.C ӓ)N8\y]9됞DX`Y¾Q5jrv͈mz%>aUBCt_! 3ok;q7t(=BxSW92 /(Lc>=7s]Ӌݪ^+̪:RP;V0%t~H#I^^!: MލU'~cmk?2;ϬL;qrhWŤ.巟'rMgq. ^.eQRvsO<<'|#æwC.F`'m\V3>^wϩgcrSuBnѠjg〙<,]C-,\<2۪6ktlѕԋqkn7}3[p?%cKsvvBD^˽`Ialt'8< P̊JH]f}^/X 8=+MmQ9^4ᖟϲ>;t2\G8 ft9:@tbY svFn6ff rMH`7x@}^!Tzz>KOzȱ(՞1{p>Y[͚S/_Il[!97^FQ)w(D@KW}6)Ĝĸ*?LS=CځvC?W:nB['] ̶ _ ߃` RAdB )@CAPJB,.)%@HZǡ=a3DѴ˕59_Wȷ@`[[ܟ C!HeF־P ־{" $ , WV__eLUE0A]痃/D^&d1.>$@f!7"ٿV5HQoV])?/M9۶oMa.?xX%@ل_['/OG[?gUmd;t B3*~mpwKŦ-/xKr_f49duT1zzdUD 5zuxrCǁsvNݕڒVgeMJ9%IDd!ͥ1fu8":~?Me#_*ɻ`FӒ2i;dW4ot>1Q@Zygq\ yxY^.{c}U|}բN{W5,|OR\5{::>m\jj>wx+뽐bU&YB`/;*҉7zGNwHEoGc!9WZ7CJA0qfxxm54"Thw;q߮֋;^>l0Eeٗ P|xޯ&"Fιs&W :$09I^Ck`P:Ekh o\gc9>)Y$l)>nۯ蔧/[CD7iobg$fEWMXӮ6=a); -V߃B=ˉ|2. '6gG<ص'.fz]fp9!uWrJ٪׈aB9cN[յ)7y2a{E:Grf@{ڪ+t=r)͝K)piDg 9ӎϽ sRŒ) 5f UD'c޶sחl,Oy"Ծ$ZKfSH`r&x(~3FĻR6LBkުԞ.ƍ`FL-Gĝ3sHe̴^^)H,Fyx8'u1㽸~Gڪ,Hˡ4k=Q+:~(- ۢ2||C޲VW,j* apl xI_k XlC(P*^ &[~z8ƚmhrkbdxؽ-f#c?Alcucn2\~c/QczG5p=~=G=. f74-:r0s#pxȾylި*>M[KGoj0КЮQ+2[#V?GQ)Ljޞ[4wQRxq2\{~G`V}u`=IGH'/n5Ԋh)COVtxˡev0#䋆v~/.h{cOOՓߑ.9ϔ5RD s™N>_ZGם2N*@>\zPskeNDE\¢| iuVoh]9W #qvup"Z2M`O$v09_Twvn=r[wm1qxz Fe9oGӗ'n2M*ʫYłĜ ;|0?y7Eyݖj0Ɗ[KA}cYm?DaWs"vՉApNvyg%k]P}ly#`?"'vΟi$4tQϑu][c/vҎ7}mEӦXq=is,?Q ` lJ2csvVÃ>C6mi1%E=>GnIT02|a&̉Dہȑ2$W4HR],Lm,J12L$޽(k=$z%2ۯ{>grGg:\q cHQ vf v6~_Oe5~GA~hdrX»g#w~`׶q߫=#dG \ME U/4B9D $NE&rvdl`''Ȑ'~iRQC 2$b[?idOҏj`> R}xzs"P6珗#uG6qCȄ1Oæc4}=?{A#/׋W{p$1li8+45CDuЍRwZ<}(xhN/Vt}NxsB_7ol^*+C[䰚4=IfSYi5@0 ff xy_{&𮺦̤eh Z,"%X8w*~?NI$!!+\py,~(lm`i"8X816J kAc^R99l5G{]$<s;M#Yo&u*˅7hpJs6@bmi#Q`a_bF7-8mM{swfGoOܭyu " Dq:5Ϡl'K_p&2E+e # ל'-[G ZN?w D#h5w)`$r$NH9x#s?fpۜ,(gVG(Wa⠅ 'lB6%ȟxPh]QrC6ar$e_ e X͆(M,ѐe}V`NRq6"&LrdMz-r&21Xn&61P aB_jmY{3l`V>>hk{aQ#MGkB`˞ }`$EEA[5Mu_f"p^1$Ba!8>E8> uGR96ߠQ0RVM 8dy&TN*ra*dPZ5'j!1V +1h!DyJ` ;"j@oM}*BRCT9E.Py:^Jϧ~@KbC߈P s(OO]$.k6b,v4ŐDό/ Pn+^ 3GFiXs:;:F{6P__֪?7Jc~уQ?(>Nx"X/Ҋ1CFD6B|#LaJZ$ ÁD(ۜ&G_.8N<[Xkw~*aq29 /gA th(Rx]aBELm<0}=g9TvDeQJP%4` -шQxtY6-*OHW!A7= Qq*V2 :,I%wi2y;%sRpD\RpgvcĚފQn^˧eT4<|wNdJ +Z$͂NPz97X3G:њ;IUo;k9Zi s.o3Ud<;-!"$1V$V-w_&I(sZTt_BBUok?!Q歳MW]_(.Iv􊢼P5dYlA&pRhL"]CdVnLi%