From 9026d522a167a77feec1f20e015506f175474f77 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Thu, 29 Jul 2021 21:40:09 +0200 Subject: [PATCH] update project --- CHANGELOG | 1 + agent_based/cisco_wlc.py | 62 +++++++++++++++++++++------------------ cisco_wlc.mkp | Bin 8069 -> 8126 bytes 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ae57d41..8c0802f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,3 +12,4 @@ 2021-07-17: added basic support for IOS-XE based WLAN controllers (C9800 family), without most of perfdata fixed _render_mac_address/_render_ip_address, code cleanup, removed WIPS check added lwap_uptime/time taken to join. changed perfdata to 1/s +2021-07-29: fix missing data from discovery (inv_ap_info) diff --git a/agent_based/cisco_wlc.py b/agent_based/cisco_wlc.py index 7640fe6..b59170c 100644 --- a/agent_based/cisco_wlc.py +++ b/agent_based/cisco_wlc.py @@ -21,6 +21,7 @@ # 2021-07-17: added basic support for IOS-XE based WLAN controllers (C9800 family), without most of perfdata # fixed _render_mac_address/_render_ip_address, code cleanup, removed WIPS check # added lwap_uptime/time taken to join. changed perfdata to 1/s +# 2021-07-29: fix missing data from discovery (inv_ap_info) # from time import time from dataclasses import dataclass @@ -165,11 +166,10 @@ _interface_displayhints = { def _get_short_if_name(ifname: str) -> str: """ - returns short interface name from long interface name + Return short interface name from long interface name. ifname: is the long interface name :type ifname: str """ - for ifname_prefix in _interface_displayhints.keys(): if ifname.lower().startswith(ifname_prefix.lower()): ifname_short = _interface_displayhints[ifname_prefix] @@ -329,17 +329,20 @@ def discovery_cisco_wlc(section: Dict[str, Ap]) -> DiscoveryResult: def check_cisco_wlc(item, params, section: Dict[str, Ap]) -> CheckResult: ap_missing_state = params.get('state_ap_missing', 1) - inv_ap_info = InvApInfo( - ap_location=params.get('inv_ap_info').get('ap_location'), - ap_model=params.get('inv_ap_info').get('ap_model'), - ap_serialnumber=params.get('inv_ap_info').get('ap_serialnumber'), - ap_ipaddress=params.get('inv_ap_info').get('ap_ipaddress'), - ap_ethernetmacaddress=params.get('inv_ap_info').get('ap_ethernetmacaddress'), - cdp_neigh_name=params.get('inv_ap_info').get('cdp_neigh_name', None), - cdp_neigh_address=params.get('inv_ap_info').get('cdp_neigh_address', None), - cdp_neigh_interface=params.get('inv_ap_info').get('cdp_neigh_interface', None), - cdp_neigh_platform=params.get('inv_ap_info').get('cdp_neigh_platform', None), - ) + if params.get('inv_ap_info'): + inv_ap_info = InvApInfo( + ap_location=params.get('inv_ap_info').get('ap_location'), + ap_model=params.get('inv_ap_info').get('ap_model'), + ap_serialnumber=params.get('inv_ap_info').get('ap_serialnumber'), + ap_ipaddress=params.get('inv_ap_info').get('ap_ipaddress'), + ap_ethernetmacaddress=params.get('inv_ap_info').get('ap_ethernetmacaddress'), + cdp_neigh_name=params.get('inv_ap_info').get('cdp_neigh_name', None), + cdp_neigh_address=params.get('inv_ap_info').get('cdp_neigh_address', None), + cdp_neigh_interface=params.get('inv_ap_info').get('cdp_neigh_interface', None), + cdp_neigh_platform=params.get('inv_ap_info').get('cdp_neigh_platform', None), + ) + else: + inv_ap_info = None for ap_name, ap_alias in params.get('ap_list', []): if item == ap_name: @@ -541,21 +544,24 @@ def check_cisco_wlc(item, params, section: Dict[str, Ap]) -> CheckResult: yield Result(state=State(params.get('state_cdp_change', 1)), notice=' - CDP info missing', ) # ap has wrong serial number --> AP H/W changed. - if ap_info.ap_serialnumber != inv_ap_info.ap_serialnumber or \ - ap_info.ap_model != inv_ap_info.ap_model or \ - ap_info.ap_ethernetmacaddress != inv_ap_info.ap_ethernetmacaddress or \ - ap_info.ap_ipaddress != inv_ap_info.ap_ipaddress or \ - ap_info.ap_location != inv_ap_info.ap_location: - yield Result( - state=State(params.get('state_ap_change', 1)), - notice='Hardware changed', - details=f'\nAP hardware changed. Run inventory again. ' - f'\n - Serial number (found/expected): {ap_info.ap_serialnumber} / {inv_ap_info.ap_serialnumber} ' - f'\n - Model (found/expected): {ap_info.ap_model} / {inv_ap_info.ap_model} ' - f'\n - MAC address (found/expected): {ap_info.ap_ethernetmacaddress} / {inv_ap_info.ap_ethernetmacaddress} ' - f'\n - IP address (found/expected): {ap_info.ap_ipaddress} / {inv_ap_info.ap_ipaddress} ' - f'\n - Location (found/expected): {ap_info.ap_location} / {inv_ap_info.ap_location}', - ) + if inv_ap_info: + if ap_info.ap_serialnumber != inv_ap_info.ap_serialnumber or \ + ap_info.ap_model != inv_ap_info.ap_model or \ + ap_info.ap_ethernetmacaddress != inv_ap_info.ap_ethernetmacaddress or \ + ap_info.ap_ipaddress != inv_ap_info.ap_ipaddress or \ + ap_info.ap_location != inv_ap_info.ap_location: + yield Result( + state=State(params.get('state_ap_change', 1)), + notice='Hardware changed', + details=f'\nAP hardware changed. Run inventory again. ' + f'\n - Serial number (found/expected): {ap_info.ap_serialnumber} / {inv_ap_info.ap_serialnumber} ' + f'\n - Model (found/expected): {ap_info.ap_model} / {inv_ap_info.ap_model} ' + f'\n - MAC address (found/expected): {ap_info.ap_ethernetmacaddress} / {inv_ap_info.ap_ethernetmacaddress} ' + f'\n - IP address (found/expected): {ap_info.ap_ipaddress} / {inv_ap_info.ap_ipaddress} ' + f'\n - Location (found/expected): {ap_info.ap_location} / {inv_ap_info.ap_location}', + ) + else: + yield Result(state=State.WARN, summary='AP data from discovery missing.') register.snmp_section( diff --git a/cisco_wlc.mkp b/cisco_wlc.mkp index 28b28305d4210bd68bcd0b0c0a5b8399ffd1f500..0976ce4c1266461f7ab3771e6ba8c0b79f74b2e7 100644 GIT binary patch delta 7678 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 delta 7553 zcmV-{9e(1zKZQRCABzYGOxyZkkq9*bZIM1E0gI7kC4UYN_968FuHWnL9{falKYfR^ zOj0KXQZ~^^wR3-v^wn~f>0KCGLt<Ut*{3#Xr+5DLbn*GhNw33Y>WAUyt67*{Ps2sW z>b8hAbCYT8MX47CSnGWlcxf0X<j6~=A^CKAM8@ZdO@0ro7Re<mapQY$>XPZ5JN=xH zc^D6kaDQZ*EW9M~f?GsZ29hLqJE`jjZc5z1x$)gu8KfIb<3~y|nR!ViXb`3Zz~)Qe zC+FdD8JII$c)?B>xv_(29iM<ArLGbD+>PfmCv}G8$oJeJorcRG?UE_|F?T$_OO`;~ z!tD~<wgClYbNCSWp);E-V;}i^m!{EhXNOD2zJCj&G_=F`mIBW`-%S7t#CZ!iCpS*w z&fxczHASgR9{i~tJzCdYl{o9cy`eCXzr6K=Waq(2!yT<cx6m1^C*T)u8hg`3uX6o_ z1O?8*MXF^HB{NtqCW6#m%t*b|r*I3VMY<BvI`?jza8(=h2L0Y)|Iohg+53)KYJ)H) zu|NCIr5DqFTLZgi_cVyenSKW5%mgC4cWC$bG>|3Lj0p(GLzbU~f&28+zjyM${@edZ z!r%wm|Ng;V&i+H{HIqjIi+^`Fseh=XsI85L@cY~U!#(_4xBr8|V85~d-y^98=9|v{ z2b4Aa!@WcH@BTh#)xqGPe@NxOzq{W*1i^#+_xiivQ~refbhGsQSq0px@;_*L^{1U> z67Sr=^yvooBzgpAAlPlaBHRD5O{U=tCh8$srt|IBnA3U%C8sc{!++#HBtM`1Mt*h! zm~>$#Uf%fLRFskX0R<gX-(pD0T?zpD?c*sdDux8-*~B!_0?b>O%@JnM>mO|Q_O^Sw z6o2+}NMiRP_5doJLv!#??7>V5lmRNzx4$qqgxow5>gLGG``d%PAvh2-cUI;`bjjTN zg8qwiU7Tow^Dv2=7=Qjr-B_YK-0t-SIzI$Z=x?-4)$)TO;&W$11syAY4V8hSAuv7x zw7}2lofF);Nta_ZxdpN+^aR+zYRpJ7b<jx)rr49N%#Pi383*Lv@t1Bw(vUoQu0I1D zY67`~+vdAYu#CD;Wf9&()n%}RS%QS#%t~aVhueb#(O+5(*?;5(Alb+V#z5By`d_3i z`szP8fD`jN63J^SKtbYk77<*Q3`qjYlfvJ?;JE{yB=Q{U#$glzT;O`QcQ?@7EL=EV zz)Kk^7dvOf31;LykmO@GQ5LEwpvgDe{XH%U0>mv{^5CU+ihJ5E7G7NZ!W4;O8T63> z{ew*Tu=hvre}5(5DX9>Lf<-XVf>e`b6k*R0`sBmK_Wv9cIs=1)Ha-J325B7nK6p^1 zee~vauSe$2!t)<HT}lLWgDk=%MNN;mf148^qZ@p;VCKe?g)^N%^Rb&GJ0j1EL{_&% z+@DU)FJxcU#FZQ5IAOl?4*rLv&Sy73R{taP0$WN`P=AOe{T)!8);taugjVqulnwYd z%SFJc?<5K6CNGp(yxwDk!r_G<A~sIDV0aSn>)(3Ql)<3^L7v*&qqbE?NBMi=M4o-$ zw*jv^nYnY>Zkt9v-r_(5U-t2%n=Jj5g+q>zDQd<AjLP8l5<T5+tJ7MG0=?bXy@d|B zF~`qVQh)r%+57X$*yX=aSwQ)dF0Y2d<t0ev#CPvqpO=0(d3zkp*xx$&XyoXh@2P=d ze>=hBB%HIqZ{2hfOQ@gS^dtN@j^i-S%BfA6B(U7zU?;Z${LNZQI52Rh^<SAx>3_-5 zEIPpf&*+|kamArcO)MCJG|uI7#WfX4TVX1Ue19i}A-6D<&6Z%VzOWJlg{PqH8HrN! zhf)Ktpyg{aqA?=@gF_^$4T!^rj-l1?+0vLTn5&_q@BvH-$atAl1F}VU9h9(SuLG9R z$t@mEdQ}yW?MkH@G}9@&5>P@WNjRnJ{}mV!&I9$HO|y_eb(Mwlg~9sX!b@Q>e&fbz z?0-bnwPKexl`N-q$l}l#v#8SvnD+18+8xkQ!x)KS4)nu^nzc}4SIEho!d&kD6P%7Z z^f2fo0v&MuFiBQbF^t%;K3@HBN`1O)?4#V!JJ50xH})K#Nl+{BqJq^yI>FP7Va&h` zYbutWWVM2th?j&jPl)wK+ANkSv2pvUv44cl&p9|@#j2V<3GRP5>+(~8>;M30oixk| zHDHxVq6Ty}YZ!rBtxU{L;!o&`0SdoTG_V%1GK0dmQwETUAx)kSt^+UF9cJ4;EcXe} zQ~Nz(DkKs20Q78U%qwCuFkBV<{e64ylY+K?V80f>!Rxg!e9C{qdc$(R085~2Jb&u| zcVy6qL@{$RkRxoCltfrPOC!VT<L_ngIe<=xyn)4=BdoT_-=&*cjz7=xMKej{g6CM> zN&w8)n&|i5-$aRqz2DRF_IRF_xsRF7G7VY#txP*6AR`d|;~nH=jJJg1Vm<g<;F&w% zuPH_E98q%X-8wg(R`|0g3Sqi6lz(5!u7T#Ij|PZ$p@6ts2B7*g1I#Z=0fTezHhScN zOZO7bW$kn+@-8Jbtk0txXZjg)PbK8k_5G#q(4FEVS7?fL?>lsF?r-=n&s#VFIJgU# zd*}wS!&wXNHJPBNNY`}}Z%&7I+nY;AuS2%~g8wqxv$eIwy;@weCdTC;p?|(MU1{qD zw5CAqB{U{b1~x?RpD1+5=II}FNlObSQS4$Y09KnNdSZWeACq=xDECdhIj?K`IF8#L z8v{;hf-AYUhE)J4m9suDo`DvYw0otYy4Eo8HGhtb*oDed*GxlKYqm@JomK&pkZ5t0 z*}i#9VWP)H5${Z9<)I5%DSs`?erjcsK<i(7|FXKoB34JuvkQ4!m}4P>V=rpcGXAG+ zb$*vD$tn=6FjP_4Jg3Fghxl%w_J)i`1XlB{9BXquf)$rrfC02N`uOcD>(9MGVv#?S zJNHXFjA!jdr*kzJUb7GrDp$s?>rRf`9*_&pGzuvvfNV)$<iEKmdw)eD?TkoDA|o%O zEW>c!G4wSnp3s0oiA05@@**yXB9kHf8~I*J#VVUi<Hw;%)eGH#A<|xe8Xp+D!f3tD z@VZ~7Zj_S0;fj_nT#c<LQdf){Okn6!wRw!NOLzvgZ3UNYC@l<tfx(O)ku+W<YZYfj z6`|rDb&Fom1nrq2zkh3Tg1Y2)tr^|x=@!<=AW}i9YUC6OQMLG=c~eFOVWyXjtzqH7 zNdX#-U{U1@U>%dlINRG5tsvPW{ijepFe6vJ>+Wh2M@80GRFa|?8D>WVSf>h^5ZuTh z%Zh4DwxfK8UWJ=Q&P(q8O2x+&2VZlvLvIGF|5=x?OkMZoGJhmfeg-D>pZ&~qfi7kw zP8ojb=AtZJb1<cAikWnCp%HZ$<YFORE#%QHiEMPs0vO#~oT95oBXSKJ!w=o6C_~p2 zOz4_o2KlD)L4s~oETCIl@^?)u`&=W&r92E_MdB^hj;NwWi@^Uh8epMF#o;VfWP}Ds z{_0>0@|W!;Gk@<E26l(eVpO5KCRB=w34BVHK&oUt53{DMS_4{%){a(EySe-z5RK*Y zMN|3w+6^fKOSGY63G_-<ZOrPx6sXlafm_Y1ja&|Lfmvn<v@&B2o=a0vWV<XXa$XkI zZqa0fM3bg6(Wa@acB6`c6KyG3q6sC-jM<1<+DeI8=6^`UGN(SpCQGZekT294%NN#e zx6F=<rpwAj>t*G&3CPbCqTzhLXfU7u+=k?2l50rj=Ngjv^+lPV$)p(b1yY3hg6FA? zVSdy!$55^*kD>he1kgFS&@9a@G)8ml+pOH2E)7;LUs|hN{xciOc?WuHxkA0kT;b|= zO)l)K&3`3&Dur&*lDFf_F*$eQ#Es=S3@qMYW6b%Eu#Jg464K^t+LZ0j;l}utvO#^V z`{KA`j`8d+8AsRLA=g&bH%WjlCUe*1Vip`YwV9T(Xg-0J*_Yg+nX#L(o{~$WyH8no z&57uW9NQYI-lO#SX%S!VDti)L!!}D-?oV{{`+pKS-&F2Qbj>>w1lO@z1#mVYb8PTB z6{1Eefq9@Du|n5#*+R>6*+Rd|v|Dt1Bsq{TR=F|Cb0-fh`7_d(l?N*_Ze$7y8X=Xn zY$u!inU2^?)HS#LRckQQ1l$%gy8bAp5&ze`=%o-^xJFel5wR)OmAh)A!jf0jR=(=Z zn@k?@*OP9ASZ`b3z!06B{q6Yd^25i!e_IPQ6Q^WUE96eurlDqGsPV}isu?O)fW?o% z6!7YWa5@-@kt_reh%lR?JYH}=$;PU#JeHH34KWKF%zErD<EnXFvQ3lN4Jr;~DUNZq zz0_Tdq_L4_NRto_7=MPA*#+!8?=(!i6;?tyWhaj!@Uxk6lbxZVcEF-}lMKj`yH>hE zkOv&vEz{hsqEw~PVOgsEQ0%*$cvn|vwnVS1&C07$Xck7tlug;I(PY*}$6=VyS0gi6 zAq8tLyuJcm&Wd!Yr(?uclfI&1slb_q<7;EhOicw|8JVw*R)1O^4Qr>BpD<Zy*7uwQ zr%n|;sw*r20KwIDZc`e@Vd+K<vsY~Jwdueb(L<v4hhJgLE*A?YejLrMF*Z3QUq$Or zV&jy~(&MPOnoy_jD<t7sT{`^gKIRq<ugFE@PC?lLjq9X%qyULe@4SS}Tzb6_{u-Yr zTGuk3KBHSfn12E~=+*DR_?*1wMx?U_0<sMhu_Nr3>Hc(O!uC()iL0;bw5!;jr|x=~ z-?L*|d9>6ft&8)5TB9OT)k>|4`{aCEp6trwm*#72W{i)@u@~*xQ$;JC;y!1FEq9!) zfTgxp9lbp#C+n$|=<^x7G_j0xJ=SSlhoe$t+3C8H7JsC*d`UCs@>pI;E5dlbs4r#e zSC~+qRy5LS8KtdNQbga*J3G0xq+)~5fif_pPxNB+JX{7doCIhH3Ky|9d4~rc!q}x2 zDPB<f0XCRl%my=>I-Z}9wsKvmV-=R=nFEzAEwuBftVI0M&!Dn0`7=9R^H8wUYOb9f zv^SVxc7Mx4x#dud1<)%ABSg>!pAx!Q#7uTbzt=M@^_?5==d9l%0#cZ|hNm!ij04^0 z5&PT5brIciE&#J}JP8B;ada6k-B!8zcxLxXJ5|vq1gh5~8aR%epa{$^qcMjrd*_2w z0M>sR2D8L6hF?vBE*@E5$0cFc{1fuE8n^UROn;Q9_ck^r7zODH=^V-XU-T-KJ409R z8wpFf#Z@A)8oFD}Nc~>RX8Eb%UcuJO!X-83rrk@~TZcn+z0bcoiAzoQkb9rC{ezQp zl1*1ePwBZB!9_BoG`UC5#m#-uf*<-^L>D_}L!#l)T+ipC%e-$5r*yrQ)1k#sSzRHc zD}TpU2%Xlm{Xo@;D~YZ>t%Fx}-KxT6Yav%0wu%_qTByfTL(4;jd5dp=6z3a9WVhbj z(=NuJvRe`~{?w6#S}1WAw}KU`dhg+x=HWaJZ+v%=sHc<_HO=i9VPohRV*G&Kh;CQF z{%HgxXI;+~gCiQ_*-Q043hlaPm$f5xbANFegtWhwxBJwwp6ebP1AjTRTmY@2od!PA zSA?>Q{-8RB-ah4~1@0=3#0sCWRzXvAo9j8b%CQ(!zd?oi6{en*Y*CP#Sfa6o^@`Sz zuPzzpM!|@A#tFR+X|q#O^ujv6XAsOieCL3_@Whua9lO4JsGjFSMcpiqRP4Z{L4O64 ztV`F&Fcg2QY87`bwU@0(n{%kZ82$p5D3%PW%O80#ZS%~Ls8^_ug|8#jWQzh?&J$=j z&yd>uFdU$x2h6DvEP>1z*xwif4GpYfqw?|@+LxLfWyA38<>`g`blTL3XrFGDDJx?a zzEluy#)LG=0~vFxY*hPR@OfK7nGql5FBaPG#clqTVys)ybnJ1HxDp^SQ@uAtPitg_ zFZ2=0pfnF*1Hw>Hudw!W>s)<4;cKq1Pc=rR`d}fgZbDNgh*#MIDw7ElFdeO@9EaM< zt!9ohDWEgoWH6z;F5DBMeJTr;vsX%!RueE79zKD>+*2qD96q2jVf$`$`z?2~Z=&9Q zlb#b9f7aHcj_U-E_ToJ(qgoWNmXvFSh8549E`i!AtjgV#)w+gA&6=y+rm2Sp+hw>W zz_$sW!JW_>^ajMn%P`MqhK7wwG4q==<@oTV>x7@KHFv*w1!pBTc5rrrCugg0=FZnX zYxJs1&*DffT;0@06CX!7V%qAvLPQ<zHXZNwe^)uKaO{g=Du)3ZIC$P{j;FNgpy?P} z-kfpCW9IwY>bpti&KpKK4JWD-a~>vlH3~}&PcOBtlfX+o$M^mhZ(4IpmsAF`p0SVl zif&HQGtWo-<*)7Szu@%8UK2}0@Z{%nH^!wCUVfk6?Z|jiUVTbpTIiIO(?h`g{cdDx ze^n@}9A^gd9K<4yRgPCeJO`~fkX(vY1ZmgWTvp<d;@vizock^YqS+=P`1r6oeF)>v zWWC)~3ntTmo%_I!$IAda0?H7^kHonJ$HulgFWVWX<kJn%Az63Jw@zfWyEgXP@zwR4 zs2OElzk#~3)|ZRY{Stw~xEqpY)nSK?DhPDtS%*!?bk$LZ4TyEcF^Bq+Es2gZ17nJg ztM&)VP47!=q%Bp+vcsa2UKJaEh7i2E`;@oX`QpMPklzh6AYl1bH4Rr;if9Z#RXF7) zq5)M_R)s<ApcxRzH^w%x51>ii6#ln<apKv76T6wVwahDcdKU052W^v&hUu$h=phb_ zcWQdnrqk4puyCDW`R*mzsXka&-7I_mwz@gC>1t?)7gRTpZ4j?$#;{|5Y-rO2RY^d$ z=e?r+Y!lqjtWsFnn%Em&(U#mRHZ+y(BWs&QE%D^5odgS%G4++0=I2gr@QUo-pE$ff z%3T9wFmo3i?NPS&7mvs4BMRT49a(nY-n9?lzkBfi{$Bs^jXi+>!QU{Hz%GtYJ|173 zkB^SGKfzz8#}^md?@#`JIvn04Fi4KI_h9Jmp*KrLR|RIWM`+uIh?}*`+UXOD@l3qV zrNQhmm;r+k;wZu$Ft}X?_d#sYUC@wQ5xmdg_ZU1KHU_9e2DQ(i*qA<}<In*7h5;W? z;OHdcQ>>xiyyJ%q?J*w$@13csO7^yw!o%8feFOj7@9&~iGszx*om?D!*gpL<K0n_c zpEIdWPsh<FgvuF<=zfdv3{DZ`P=Mfj9;HyPHK_j%z2FiL^O%AAud`;eDEM(8FRN<M zgI)$r!@Xr{GU#W3Y-6t!<sgH+NbbtOgy?lTFU01Dp@PECw@&IPl}c#dRah~`O<E3E zgxptpH^%VP5e5l=3~+lnI2z<-C+|wC94PE~?|fmfr}%yW8$Oq@a?v)cb(q!q$l`?; z%V`-|2d@jz?_e4)fj(3y8q>gcWd{y-bA6Vm--Yo<@F7pb2ScrWLoL);gPaakm7U&& zA6Y=JjGi}nXcnqF4U?o;<>fZxV6aQ`j5Y(jX>K(9>Cr5I8b?RY^v<nqJuEJY9?|NL zBl8q+Af^cony&TC6%NImQLMlX?B!!rZgF<Y>lN#~5%Wl~&WSPH#mv<}Oe|V8vG6lg z*cX$FR^cr@QB*B@{(c$wxZq-p*dy<m3W)dQ+nEXs_+)`b(qbQy%8sa79ZE;?n7qaB zg5kxzu@`@TxTueie&FCDoTunw8_=;2B(R%L9mP#zCq~)h`c-Zc{|p&F`U>v+pT!Z^ z?Ao$)q6{~g)z|bTT<%t*3Nv%(4y;)w>b=e<6(C;vZsMksBDtMb^FgX6HK|EWYEqM$ z)TAagsYy+0Qj?mr@$}%{e6#O9i&Xvn=lx#s`_H|9{k>lE{patIO20<GY5A9a|G7Un zJlM^B|9QW+*L?r^yQDwX_n(zdtKKd>+v~p$#CKCCdJ+4;apX?(-*ct$TPJ>G5!p)& znDeid2B~{19%a0Azog@2>Ur$vJNy<J{TdAWjgRVn;Gaf)9|m3;;#;`NcT}<dZ-Iwj z*44j%2#d6d55nS@)5)W6-kpoU@kb04Ll-`I>D>uFo5vmv<+&3U2^T#Pz(2>~GScxR zXYA-EkjOs3N<Y~l<I@w#E9IF!ehrwvP@1tV+bM8;`h~CjhK}hWK7Icp$FSn{9g=#f z?~W#I>w?{vp7YCX0-<4_ncTU4M60+d{npoiLbf7qU9<0kJM^XliSXqJaYEe-Xp!<} z&RZ75M}SY`k7u^ANfGI1C&K$Vh~m+E^Nrk%Fo)f~6*mRH0e`mC7Ph`Mg9<mfH^QX+ zW$kalCI$Z%tMRRQrC(isIivIo%bQ~oo~h)QoOwQPLSxX;$CJxC3>wsDkaB(b<=jz! zuQ+d%HHf%^FB?`I<E`YEbEo9y@=F+XdOSYgIU1jTf&pB-yBvh^_h47~1>TMGj9<)s z5z9VRvCMoE*seG^Zhc$EYL{_0XXw=%x0@TP1=Qcvda19;yqq)GnJwkznXMPG1^<u7 z=mT-dLR`R!$ri_tEYTYLQCg<n1$a4sAM<w=b~fRcW;d8{sbHKUcyoBhK68dES$cU# z-x`V{Sd@u|V0=6PGI=e}skoSDlS`Gf2M@IV#wE+7@|_3^uwu6fJL(KQbp*9qr+%Q# z*_<-qT@Xb$FVX?LXh7&qgK%D{0w@<R(H``yV5KHDO*U?cWWKv#<U7?mAX{gD8{|OO z?QJuWB@0u%ezrbuSKpYD632N3Un4hl*CcElIqZd$Wej|0*P0j0BqboR=^bz$7q$2r z0LV3V`D-UPkE(`L4l_+E>@jTi*sJ@+Sw#5lpRMtE-`?9=NwVYn;lspTMCl{DA6)@o zg=;;o(pSW5v-R)cl1!Z-V=Zxi@Gj2GyZ2^G$0zI=^gFO;bSf&0BFcQ!_nM5QQyuh6 zl_ifCYzYCPUTl#$-dJK5lMzA3UCm}-cqVuF2nxr|uHCX{;lG3Qu3NQ0Rk1mxVsmD* z343%CA!jo_ZgMvV)dvLV{g-@P%N9pH>%_*C6Rh-*<t>K6Cgu~Nm}vQbsBX|qzM_iC zL%&u$vS!{?wO594+Ne6lmepl!^_|7d%o!438arkC>GTMnwpV$K>NcUc1+<J*wxw{? z+QMcDc6V}TOhx>ky$_pwlP!Q1@&DfL{$4)*zrWjW;{Q$jKOg@mgI@pjcCWwPJ7}>_ z*hudM{H8~AZoFXXFK6I?ONB{FpM}8pzW5n%a7&VD>_z-zH&vSn=7>EXC3?`FKdqd7 zZ0t66qC4d`zAqFqGr(Ry?`-r_KF|E<54dJt;1baloFv5qNSplt&~rW&r10>n{4Mco z`8_X-8as;`OE7W_P8doHeFat~vzFjbL6#*#4AwOCL;O6KH8|LRaUk=llnB!s*=9;G z@bV&B_WCPmF}>nd!W9Zh#M@jo$l=cb<w)wUB&qliSP4ZE@a0quc2`hU@w}Cpx{pc) z!YkCFufJnZss3}Q)1S$zK^?EKE_J)>Q#ZMJq;E1kgG&19*}9~z91n)KvCO359XY}Q z*QKUEs7FolZLLawnix1i@U<0gP;-!0J$+U^YK2G%!V`pFSN)z%D|<h!CV32aU445F zZI#wHgIk-JzO-?#ew?=eYf|*8s7r%>!jE(lz)#3rD@7{VcTY+^gdI9H|E5pP+yw%d zEK<~7^>GYhZ98Bf)kRsm;_D~GQla_XODp7`U!Eu=tnxU2s3w&3U-b%}=MSvnf%(}` ztBM82mq9HboKA%erG1eP)0w+*B;T#8*@4P;E;XtuYv$jwtgKo30_5{*8K0-DjlxK2 z8RuO-dsWO-^;vFwu(DERDjucOhuig!wugN6ge#`)aGNgbexNzbtt@T2(=%(+jgIMO z`id44QTC}`UJIjFIKBActrL6c-NIAjVqCb?^IrW)Ckr?CSZoVw4EEm)dcB^le1pew zzeISz04F)V>B;Xxn<xU#I_jr*ti-*gq5PbEG_Hb_YH64{__^kR_#Dtv>$=liu5Ocl XA2XAX9~}+!|2zF3V<6BJ0Pp|+<__@_ -- GitLab