summaryrefslogtreecommitdiffstats
path: root/perl-install/modalias.pm
blob: e1b61edc02133a5b41e79a09135f3ab672728a79 (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
package modalias;

# TODO:
# - be faster (Elapsed time: lspcidrake.pl ~ 0.28s instead of 0.12s for old lspcidrake

use strict;
use MDK::Common;
use c;

my @config_groups = (
    [
	"/lib/module-init-tools/modprobe.default",
	"/etc/modprobe.conf",
	"/etc/modprobe.d",
    ],
);
my @system_groups = (
    [
        "/lib/module-init-tools/ldetect-lst-modules.alias",
    ],
    [
        "/lib/modules/" . c::kernel_version() . "/modules.alias",
    ],
);
my @classes = qw(ide ieee1394 input pci pcmcia pnp serio usb);
my @alias_groups;

my $alias_re = qr/^\s*alias\s+(([^:]+):\S+)\s+(\S+)$/;

sub alias_to_ids {
    my ($alias) = @_;
    my ($vendor, $device);
    # returns (vendor, device)
    if (($vendor, $device) = $alias =~ /:v([0-9A-F]{4})[dp]([0-9A-F]{4})/) {
        return ($vendor, $device);
    } elsif (($vendor, $device) = $alias =~ /:v0{4}([0-9A-F]{4})[dp]0{4}([0-9A-F]{4})/) {
        return ($vendor, $device);
    }
}

sub parse_path {
    my ($group, $path) = @_;
    if (-d $path) {
        parse_path($group, "$path/$_") foreach all($path);
    } elsif (-f $path) {
        foreach (cat_($path)) {
            if (my ($alias, $class, $module) = $_ =~ $alias_re) {
                if (member($class, @classes)) {
                    my ($vendor, $device) = alias_to_ids($alias);
                    if ($vendor) {
                        $group->{$class} ||= {};
                        $group->{$class}{$vendor} ||= {};
                        $group->{$class}{$vendor}{$device} ||= [];
                        push @{$group->{$class}{$vendor}{$device}}, $alias, $module;
                    } else {
                        push @{$group->{$class}{other}}, $alias, $module;
                    }
                }
            }
        }
    }
}

sub parse_file_modules {
    my ($path) = @_;
    my %modules;
    foreach (cat_($path)) {
        if (my ($alias, undef, $module) = $_ =~ $alias_re) {
            push @{$modules{$module}}, $alias;
        }
    }
    \%modules;
}

sub get_alias_groups {
    my ($o_skip_config) = @_;
    #- FIXME: only o_skip_config from the first call is considered
    @alias_groups = map {
        my $group = {};
        parse_path($group, $_) foreach @$_;
        $group;
    } if_(!$o_skip_config, @config_groups), @system_groups unless @alias_groups;
    @alias_groups;
}

sub get_modules {
    my ($modalias, $o_skip_config) = @_;
    my ($class) = $modalias =~ /^([^:]+):\S+$/;
    my ($vendor, $device) = alias_to_ids($modalias);
    $class && member($class, @classes) or return;

    require File::FnMatch;
    foreach my $group (get_alias_groups($o_skip_config)) {
        my @aliases;
        foreach my $subgroup ($group->{$class}{$vendor}{$device}, $group->{$class}{other}) {
            foreach (group_by2(@$subgroup)) {
                File::FnMatch::fnmatch($_->[0], $modalias) and push @aliases, $_->[1];
            }
        }
        return uniq(@aliases) if @aliases;
    }
}

1;
4 MyHx,#3 ue&[E,ʤbx ة*_GfC'O,d|4q9șj}⢮|(52A)JM;txkg2:ڡ\vP@Vc+l-EM;ְs#ΕfnB/yJV\]-l/X7G\%qh4Úx!>}%ԗ̵ML^?n@&]1Aᒼ+Q"LmN0 ;b8(O+)nk5 2,<54q7e߆{39\htoG Ԧ  _@e)*;ˇRA&-% $:Fg@aj*{YBMJz'V X1x^ׄSXelsMAh/q3ǫNB0;{"D l4cpumz7x~BtpGaq;IOW͐{?x0x̱Q RIy(iD<|Vk:m8Ap9Y$?Ʊeƾ5kY5@@LiroenNV܊YwrwF`0H*}u BVϪfK\wY%FX 5tb߿|XU4s*i,cP)kw,=}, n딶eL"xxW9bɖUwЮ,OAJ@ɚ׿ذ}QQ>)Hs!UQ/~[&0AbnY#q-7HnଔKO${?u\wwev,W!x63 >Lb@i&.@~(\~jK8DPV5SQ{6u)"{X K!# > A<oۮnBD˴ ^H!O,YpO)\92$_dĀIAqeI^򦌖$Rn kM<5,d8蛬&Sٲa+Q!mn@B gB5P}DӮiaBjz`h*DZU<^ b,C٫ 4Gfօg!Z 5[1,N_M'ӱ G[`gfil KMItsJZit ]=wMkK<~_qhDvkS(JlL&WxVCzb'䤖"\LZgDo9$ ^@'nh\/FsʀCCpNǤ88DJWah`C(`|.F 4-A-iȍ`.+s4"v7.kMdϤ9IN*!ݟ;ASJtp͋yuRa8MޯKkCfax=C {7$^nAtyO _X@DF?mY]םy،ygg;k rB=89irpNSՕjamaEdGn XЙiگf~ޚ-^ϬT 8sT _^=,yrÇ-q~ B:+ "UfuFnSzҾ}/ڏ${D.Y;p.V\C]Z,S%*tdbo#߻I)D{*B,3|{ԻrTY]<pv@s@XPH%AhE%b ^o|[/$x"9/[nSwn{Zř¬f_Y^h&KÄCA\mEL$T\pD+Ydg/,1+  ϢXUc ڪ%VmlU(Ie+Hw}\YKdQKE##=4Rl2J|3 Vt3-.qwX}sIһ foa2G~_נ6^($QI\[B$XX.CO沜>NG#0>@LfHd dJV>% F;md~J Hrt7 thADqqj۝WsP_skl1u =,7'y nJ@ƹޘrÃCoJ3-/F*R0L/VfY $~/v(ӘS" N{Ne8ZlB@TȱsPGqPgT}"Jtߥ]]2ch5l[}zb+ V3gu k~ m0%J# ɾ.*qg(gy ZVu( +gX7Bۀ'Wry?nyz?n{QKRFr[A2D+PLPqi05JMC؊IGbz0 DoQuK &|qտs~<ۂ(`Dk7i5 50%HF 3;nmy?O/ Pk~P+F&x: |g_LF$Kh茈͌VdU* ME$=37yAě5䙦z;bk2/m6\'q m;Ҫ$\0.'8c'-POYi5|S-Q5(ÇG *g*Ii9&v,j.Luܠxa'Ey;Is  CSG4afAԞڰ8NӓpY ` j~FK':&D e"Sד{w߫8´Zk`"p*>lAיN mԙrED="Ƃ L.'B6 XPjV,{kxk:)l҅=u57k L˴#|ʋVـ] 3vVz݂2"X{2A0jޢ̿b(̘>2DVBĒ^ç2BECS pVdD G's8+^T$a%سה\…8afQ Ɨ,_X|m@Lݵ* :3XZbfK9X$mp >jsQtc* $ja"e[͞[!DTr__ 7#A}v}>-{5'-0PEd2M~Jច$霱o>,=뢎LxjLEH]Pg]5:ePD.%@(vFYk#1190z1aA/+hO߄ܐWV'eQ$u NIDu߾,@+:QxTl $E7ov}b1ũ9VRnɁ q*t[(-jԯCxMlos(xWkQ]$qCk021blRζ+"A_Rp }}Z -Ɖl.9𖞡ʔg = ζ@|(.n40?01kQgAo”2~e!5@|?NFGGS7ݤv\]Z/N8V$[ ];zYGE"MU,SyyUO,܆ەK:C3a$ɾaKFe6A`gZ˽铁\oCFRE$˨ɩY{M5 $,u5V+.R4v}Z}i|I>p㡿b$dN?Ui2KSژlA]Ղ|-!? B`"_'2`|x{N[ۊ iET7`+QD, -8McfXA><>ѫ|Rdq,0.#Kj}$v6 I J㋡'ہ8镫~ۥoň@|tKĆVz^C좳v1f~SAd@DYeޖ1{+rs{G[`}@?Nx[# GNm?;JSL\Ojey$zh!R:T7%G֚}P2r*iҐ)LR2ꛠ~ȥ Iix4Z1ۡf6PV=o| BU6 E9oQ0OIS13Ę9ʚ,Fj^_; nfsb[!,*oEW 'ɤMA7" ץT=44E%[vO)mUs^ԣL :i|YN$/C{և<k1@, je Q'mk;:|U<=y:ewVAV1OWs2Г;5. HNӊf.3u+z &h×,ftGyD,22ʥx'{!\AT e|k>A;dAeWε-8E5n" Pl#^_ Wo^˒ #ϧ},JnpK84,hR.W}_Ϊ gW[4q'oB,]Uh.>"ny:DLcj'6.MfGx.H'u;5`_ fh|Y)5ФZ m4<ȷ,r;0Nup)Fјq-gI2}cjZ;{_aߡ`I;Ga/\@f,kjHs$Զ4.-le(ݐS븞Q`:Xڍ"$kT;s;K-MSS A5hM۝e!=WX@ww$FB 2.QٻbzHo&_cE="T}P2ǵ :8H.OQC(/=\H ]RzpQD H`jg&^A x_X0 "K6?0"4>Y|>È(Pg(k>2<6{Y e/`m[zX}n5X[L㝟-Siq(>-jUQţ Ubna۠$ j(rC  ޡJzRb)q#rxDu 3˪s|,uF\8I<)sl"]X,OY`LLf4 <<۪yEV{,c<q4ѽLŬ:\h-SxY4ͦSɋ=o"w )x1<>Gٗ9Nƍqzoh*`0EmLa%Oy8B1]wS _yj]qрj>Mn2kWuU\ No~T]:N'!c'I'3Z8=He yEDmBWv_6TWT_Fph!b\BɡTg6mM0u1:i|ʱlEEg?Y}qx#gh}ITɱ^V!eTpXg #w`SY"OapVږZ oO\ -:ĿY )$B3PZ G#ۑqMmAjzZU%;yDԤV}әs_yAtZv >gV6bclHXI3ݕL+iq2j$NiG`Z0)9A]q2D fL.*C*]v^.g;R2FYAxuӌBԍ+(Z Sm霺ҳo:y1U J#d0ܮ9zxv"#8eqjt^+] 2+V tӏ+ARs?&b6Ek^ sΨFf5`BPI+*|ϵ++#===@@2T]nD] ?Xz,^.WAh)jJB.Dz+k5DLMUg a$ʀ+{6>R[njUGoZ=ęL ,C~޿̅ [0wAs%y1x,B2, T/jV螉zn+fN|¥AӺgq #r:EXe&LdÍsjI=O RRR TYxZ gDgїgÌ$t|frRiޯ.haa9V*X_qeK!zD)D9[B0epf_&w=JTD=a{TeX bl*^{eS *d}ރ\iG&.>SZ;n6 ["E"N`94Ék>5/SAQ]ʒrW%w[5:+ OVq`lήsld}X348[Vflp.xگT^+U'T( rGy`/+p*x)AcYHSt[V A!"U-ZuvV)4=M4cVfZI8d<(&o]d'J8ތF2U:j8cHro CB2^{ ֲgHbKu6%Utf2X ,VJPĸw#dڞJ%LFv{%-v(@s%/e_8>^뎫=P&jнljti'dDx{(ɘC+@fŅl'w tDuv|vv#@@q{ @}hO吲Ns獵`M.5lӁص?~q"! #::]1?ŒSS d{˥^z)|@Y?B w;K-8Y[Fɹul5=VwE(߮i񭹮@]bCwdR633GI?PQ~# IɃsbx^S1}oz/Eԃlͱc-_0g#?`3aEeuC%}I//*9Az2ܕ+Rh|邉6q rА0{Fqbb>(ݵHQ.nNY^M7c;@|t||,\4@(QV;:[Th4VaoNW~ 5@:mg.PiT/;^5=V4?Qr6:V m}^}oNQxd(\vi@P0XJy9 UcDg28+K#tM\k:(0Y(ooIT(X:?nWjs_+>Gu|RopmF_U>J|8{MϰcDGoM8et-7zY?lR+2D 6ŤPI# =m(xin! = Zx.s gÀ)" tr7ȹ@SY2U:2aNҷN-#P߫vt+fxT0fmOiY4VwjExHғW+ Avj֭dASR_Pz+~gʂBB½8ؾUOA&Nk5d&&]xC%7e*x5 1ڜrGl" uC@KGgL72+PdZ-@qnp~K1n_횋i1P?͒d'Eyz ޔi'_>ߪ>|Y|1T~n:S=}TX@(+0?vQxƯ+4~JN~ LQ lU6d$U$;Hrv^TΗT ؗ"Ku5¹}+,Ey*63$  ꖪ3l&/v~G\s7Ջ OT|@GD pHٳ#шp5roP{e7P U0;7s,x@$(R&[ d@:2G*QQ龨~L[,5]`KW||{Ȁ6~h"hJobrP@YF$cEe0K20Ap .kQ NJ$[mH| UZ%Fm>9VnVoVtqG54. \>/QeA8"n?uNi4"; tқ,f2eށ9܏VǠiw=]#z` s]^m@BWICR&]f$xc[ ʈk\N phy"? |p ]5LguX<4!brl%1٤oCaxZw T ŀmOg&\kK;7uFa Zi)JOP3\Y &,h4r€c=$>[tG6S/<}7>/x%qIxԨe{tK7΁*M+ӪF(g-M+柀)3 w(FnA\#=/G K:=Ԣ呆8V{IYcۉyڳb0 `m+A6=$!Z3 i=PCyT ,{yy}]p[e%œ&("4pK(V恗_͜r 5 U(J ˥Gk\׼vqY\lFr@F+^Uiׂ/bΊ~<,$#8F'BfA! #'b^bSwL"k[<"a ..jbˆ^D#U =VΘs'M0pu 4e~!|a}pC]2pRNŔW*Kmeqk37"+u̇O *{K8ZB"b pvgLI M+ńoQG{Λ-jxѸ(m2!\D; E-;slY70Dtզl, C!Kˮؑ(m\\eU#U^[n %p^Av] 3M3g4@Ph m-|P gZOyZ6j" 5BXSkQjr՜3v[Mpz">cr.}IG;xB+nt|ǟ9ȡ=@CJ 1ZEQQC{pfUn4ڜyc 9+.(yԃzľV_zӿι fd8 O v2𶉌C\_iϵ蝮UZwn,! Ӳp!G}(p*ZbgBI0{M}zfTr_ЉBbE Ub ZSlSk% -ڝ -LQEH j(qSV$*uyQ# ɸˆԩ9|!U4ЩשFX0-4TelpeM޹%GCp[5 ~6|sfP;WA7?x1W8kqY2 >_puQׂ X,zOfrB1sE΁\q)0 2A Mhio!Z\j Z&l$ MP i[e\0NtQUϝuM ٥Y&}bYI/T8w\@raQ)T9S3=PF9#A;\|6. K`"znQ C($vRV*=?'v{ڂ6Ld[qG3%Ivmd؀ұ}XwIMԮ9u7|$Ё\< | .杶*t5V>kPWQ{;oP\ ୼}l2Nxx2BYص]N1X 0]ȡYg1zv>80]_D%9Wk:49큖9 ,~bz^y0f yE!n;GZol xvS-R&!Eը|=`\>Sn ϱPx"+D)3INΙ`/(*O<H5E(yձS~!2s"k,t'"& I#EWij>E]6-'43@7 ,b={$a^0Lf%&~̛-ŐI :Jjoeo)_i'뫟ɣ*ye"k? ;Rsb?x yLBY@mn]s77qjQa;uٴpl/GL7o{N`ޮEgp o.U8֣x:rc/C`ҭ(:9B2z@JU@;Aۿ{O -S[:GyȢ6ﲯc7U\T%-eQWp W|^" y~)<ҿxx)// η _c;e80#(/hTe|ȍk3aJJҢzQQtx,m0(꽷<%,Aտ|ú07y@lxmt湠uzç\u7th))$!|eaYf XmxXPOE(3DoYGKÐM*02䲬a/Q] !^wڋ?q$Ua}Iwh+ ,\ޮ ̈h^ıo2jBg%&g9 <^qٰnH"AJLϹ1Zo9,0Q;`V*|t9hlQk/Dw\ ;5Dmw׹'R!]T+މ2t':UlԦ~<"c>sM<b|, Jب qp,[Ou^aY;:̕MCQ}Ahr9]60OsWh<)`N}}1ԹeL\N_V3_F!6zJzDĮECe֐ɢV[yP%k[;%a[5H31WpBfs xܑ'$ib}ApKoM]ηaȏ^Lc]p~Կ` yNP]%w_; YVYnE5=sfA؇]`rNB(/ 5tXt@Gַ~RAl',d'~e?ׇfŖx_J"Z]Ϛ"vtO:gŽhC޳#?yW"!<9) \Di*j]"J*4O :1I-qKEZ4;/3Yanws9c*|W@ϛ?΂朵uT9wfu:oJv=.$SMGR}l9yN9$'yY<){\* We)ydR6{~ݑyzLX$e4if)C.A`ZgGTm=.ӀnPBM1o-GOR~mQtH^1aiM_0D)'@qJE[um,rзwL3ҋ]23VjyZOCsrF->gf+#rc6<{RwbDb@N‡M`ѨM.nֽF,` m+8^iGF2Bý;A1<Nz6kW©[r.78?.q5iY(}擝W2/u>:;!QmD>IZR05~|v>>6G I@j{2}T>zdQo{;Huꛈ|I)<^hQ*! .|Ucx*Bp&ݓ, 8b{' 㭖-Xs2đ%2!Х馄'8:nfG'ID95j'HQ7y2oƽ6M%T嶭;Eko 5rIRBSfgy%IiGpTۅC?kv JX)6m\pex>okx4_jd4s{7 B| ʈxgq1">_эb*?.zr&ᴻ &%3VA/_l3Pˑˑh;WVS8Ϸ@OŎM H1d};)t]OWbޡtR+Gw,@vIJxLQưqԹDGn_IO*|sۜcM=nVfC[A*:BI=l栳{4(H \G{Ո'0ZމﮕO8R, /+8nn,2Sfalue7~^m"/R4T8& E1|uscTm-Rp)- ݿguЪUŠ*ʾuĩ90 um$40!>$K<˱A$X<@Ϥ*bpqQѥ 3#VJfO[77Yr(w hmªN5Xpx׈wJgkxǤ5gqTD^bOGlϿ:n>*G#%ԐcMzh92Q~Δ9˕;> Ui:7gnKpa>ˊ7΀hlĬiFmk"~EB_H-|7WQ}oșvӵcc)uU.S܏6%{H˯Fr-w~ݞ8w<('gۉZEY*R0ݙj/Phf2IlObj5&3 OTf%š+vK Ǎ!G'r9zvY[87#F6ɩneq _amIA .ek_{M.L4 Ti_ܖX] =ZN*=KKB!L@:dK? $'PV85+~h`퇺R|k>e.m_IEϼ( Va:>B﫯~ K^FC^#W楣֜t}W#gW%ˠW䐴z uZ}<XkɬXcOakOL??!a[Z8œRj-Q/2Ӱۀ+B!McrwB~cZzdD;KPޙk#Vb,2e?Wլ_шa^tvR:@u˝8w :`]xBZ/K:hۗ+6n@{. x-'uEos:/6'tUC@OO e:IU]-jJb iAlt˼(Sd(°90"fө2/ ! eL++kh:H"p&7z?E)F>heiGoBF6~xs"dpvmyA}vh=l2SR9m "ƵTΖPQYRAE7T_@YL϶|RǢG^Y솠-f;.hQWMMWQFC)) j\Ǐd1vOcXg4oze_eu|R4<+yJB3)}S7moHp8m4+[@𯜖Yg2A`ƢNE*7@4 @ٸxi4DgfQΕlu^}XkDh_W@!E=G{ SV,[bGwBe&Q7fZ9w’tvFg<;,0W,TD|Dس_FS{~U>;,sm5h*=O1(D&c&xiQ%71_mTlpYɳ˛ ʥU4hU>sX8 U)?w=>Sc+:QUBiY_ne*՛s01vʺHj(ʓktѨ1/OMES[o+"1]#+vٻ8aPTONO@E7i{=%9pચs-r<ĥ8qc| g63, ^׮~m(O:X[de׃Qݗ9.Dbl%&\1TEavn"P ˟;i ʭ (:XV0YY[ 1je*Y6};JO!]Ӧ)+tPcEO%uK`iriZ$g4Ǹy;KCx$)ڶ.% ]I?cAk½op;vh[f#>?zWiV B'܃P?PVt(Ko-ҩ@q(zզaH*;i6>:*.x:F*ΘyP5> (J;Qec:vEYRwUINjXLe?3IgOM/TTb<Ǖ76VBz$᳡!=6Gݝ@258V@ɿ.U2pa.b@U2{ХJ>v^kwnLuoihp 8YW^NWKǛ$;XO9@+$Jb`Xv"m~rݼ n__+b]fͣ݀_!j}j.2_We ksSq(Z3=7MUBrÇg/y͆!|v Z{K#S>Cث8*5B ,YūC9M7)!fޚT'[/ϒ32]8d0?Ma[FLԔ9ȼ_a#YWJ00 D<DZ3Ra r7m/?FS˶T '6M$״/[mT_D#(cAaCZe [ ' h$LoD^"`' v&"MX>[aie./2ІL"mⱰ+7Ԇ)xI |lsCm\Wu%t!,pBmep椳Q-N" =#@S694;>oI}#Z= bY/ CLwO@d,VadPekcXtl ՟~ & ܤ>wIm*0ۖHW9Ⓝt#,]o!˲P>ƀ]*Uݧ&}A%y1yJ2+]f@kM!=#ۣ>񧶊ѝZ*n2v7!DY⭥>KҧmHr{A0v~8J}+Jd_gnᔒYiƃ`j0"M$PYimƙ4#*0+`9MT!#T]eg*:!;?mG,$ǵ.'c cZPQ~I߂u%n1{7gqTلո7.'HgD&b qT|CDs+KXlkM7yBy$R:CkH_D pċOz3;`hjJ?#c闤c{i\.3G.e_I[|MnB_%cB[nu#A͙{ Ӝj0'k83( NH׻t88ND"֊)/,/"Nβ;Wk!HtLca9$&" у0ChpiY& `q'0 %žeD髏RmN+T% [^ohP`' ot! WsaZ5_3@%L쒃2X7/5]ԖHYZ#glYUXa:q`86, '2o._$l MF'/ wY/)Ap7r.=v&45 Vl-+kD N]3PASByODl_\ !'L%\> 2siAL킺O)"y*YdZ2DV!O= vI#n7POZ &/1b(eNz:71#&vf= r H΄ “AHs5φ=HYFFgI ae3#1BSdC< ^OA6v't6jB)w :=x%F1?--q \?@h!@ӆ8o 0ؒ U >amqu*d(lq5O<{*蹔-=X`*k'eE,dge?nƈuadwaumC^oa%A豆 kWxJ #\>M!y+aX #k/6A%hqI /6pSi)A!eBp.Tlͣ Jx n|@u'޳fHӌ()kfhv^(OvXUPmz'F2cw~Z78iTa< MT;J!շ]j]$-!Ti`k =dvzseɔ `O⯌X[*#T@; J̻s8J6t߁y<v [vKV vm1 Ȯ'3M9D|䗫4PI=K \TD~ǩe?V3/ T%,8^=  ) f^9VĹ(#}{hL+_zP@%glld d;䨺ƨꝁ8-nK:{3';|^y\MբK&|tu~(qP1\.cnk?_ٵN'Iz0ƒn6(Sߕn^5 #?&@j!d>TdCI*8G+U/DU u2bqwMҠ[I_N)ŏ:(,(?_ؒUg53ͻÐq«ĆQCd'3n|hv̨Nծ6wAf&{,RʤO-gu6]`aK/ h!8ۨ6*ѱ pKwSZV_u^h;3fC}П>A DTiH !zsM̬ۊɒ/9{ly%g 57WQy(PH5Ü%, r$~ Gf.vb}wp _˻}E3v*13_i& %a0h $ 瘰֩ Pb]L!f۩] /wCa'&ܦvNVbv421~-Cڀ %{|g]M-Nl)A{5ۘaPjR0Ǒ!.1vMCbZ.ϯxE 2<(D`n{56X)ҡr[ @habvH9FQShag&dN$>@F{-wRM*<:.{gːBSAfk]oM :_ XLYO Es;*x)`_DGJN+j.DEnCì7t\ŢQh ޻jN"!#0np@bLޥ%<<J\jPV1jآjŋmW=׺^..*9F<z^Pƾ3hRj&Htd쿸R5tI/mun$8;P%R,Eܸ/nXJk6'{j/}DS߁= R~f>˴s!T@] K3X։t[@c7Ny"D1z7(?q&1l3p. Ym>}ٱC2|խ*G2fh)/z; k\]?mik{eߪI6rPUiwM]]ߢ휐)0;^*n^؃WibF$[:_ilOX7xz}:n. xc@e;erS>]؈ӰB$v9WU)X\w9>5zcY8"„"㼟"9WlnX ˱ ȯ}}нՑ&8zɖF#bmj ӥH&52"% ea6 Cֶl줲ѯu"4c]{ 9a|j&h00=Ʌ9# Tö\Le6s4>9u1y !{#ɢԎU8J!MC(JQ큱YѭdhGX%EvZvf<'7n J q38&z1n]!uƒ:d;bZubB6Kg=5_Ac5$}7 TP3&S稗VB6r]=itaM  'A̍A`uE|y/kIYGӖ/yz\J 7IO&+#^ X/G"F&l1 #BW_z'ע >,'V&{[ǏDz^ z3c~ޒ#x_4{v̞54},#+T[6‹8f^ |N// i|۶PGj̻݀9-޼Pك({1 Sq[`YJeݎʆ[UljU>`\8>G98#AA*aǭ+ r<74-sl'~7CL˃\$ďoЙ$/+{L\h0{ĐĚ-XJ5$,:R,gEt3*?ĞCD vECXyV19>ײڥ1ENqw߱8)Q̝-Z*3hDQ3DмU0gN{)v .PB>ح$K6 iF[dD4{/' *=;>r ,S*L?hGϋH4QI\wW hՐ0&]cG1AB(9F> - ;}p:,JKB7ص%Rxo⍰jEbQ axeAV&=j} < 3ӕ";bk5. sVyLp@;( \_37b"%w ;4#1][A"٬I|YTwۏ l.k(>T߰y)?6p;!G?E'D`,p諒b}ِ@v( يsTepf*DJBv⹌h`IEz 1֘5a_KXX'S\jb=J[uՈmz륊[e :;3}VPaXKZkK" eC-Q`t''I+nk/oQ9,F+wlĴ vw:k:3<`\rp-g1[&RCe"IOR>+O>k* MxvRDIblgBMdoKn @ RB+ A&qdOC-h _-vv2i&YSzf r*> D͐6V`JքWlB_oo_YOcw}E5 {*^{ϝաG72 FIc?'zb7|dy2,W^f)>e\N(1&{j7MmfLzx~9f1 Jq$@EgSu>~gf Zr7';)ىq,lqT!$K[4QBdNKe Fr5&dyrn7H"@PXEbXA^:rT avTDJ7o~ EᴃBœ 3[c-К UR ywԬ3 >gw]b;wN$I)+ܟco(kVt#j.C }Am po#lq{jRC*c?21QyvPQ~X6*n^wPQu,%?y݉H%E떑I.۲KS1eWx}.As M3uXYN2b|~4-Jb*^L{jYlO>1q=i6Cd*>2JkXfa'˓M`[ !>h1qnHA63[J%mDpSi3 ,e!bs 7z [6l lX<$|dYO@޵+͙ޔpq$9_ Hnkj7#FQ<1 RS:[70ߙOX`'ptp;eHP X(Q]G*Ξs6 'aɟ$Πo佖Wr;Y7*Vq~u=v%fTL3 ^ucUŷb^=PPCq a^E2=y-+ז5\5\_ϹQƹ+jP[xW| 'zu8RMoyRet*(1 wQi#PjBw}}VTL MA^X(,?2~lC#F6a%ՖK@9Vz&QYKQC1&M>}+.`<.X0d));]N#W!PQ2gYZ