From 171b75c65cb1184df7f03519b77050ddf09a8064 Mon Sep 17 00:00:00 2001 From: Martin Ger Date: Wed, 16 Aug 2017 11:04:31 +0200 Subject: [PATCH] user/password auth added --- README.md | 20 ++++++-- firmware/0x00000.bin | Bin 37120 -> 38208 bytes firmware/0x10000.bin | Bin 225956 -> 226148 bytes mqtt/include/mqtt_server.h | 3 ++ mqtt/mqtt_server.c | 94 ++++++++++++++++++++++++++++++++----- user/config_flash.c | 3 ++ user/config_flash.h | 5 +- user/script.sonoff | 4 +- user/user_main.c | 48 +++++++++++++++++-- 9 files changed, 154 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index d309bb4..6c3ed82 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,8 @@ Basic commands (enough to get it working in nearly all environments): - set [ap_ssid|ap_password] _value_: changes the settings for the soft-AP of the ESP (for your stations) - show [config|stats|script|mqtt]: prints the current config or some status information and statistics - save: saves the current config parameters to flash +- set broker_user _unsername_: sets the username for authentication of MQTT clients ("none" if no auth, default) +- set broker_password _password_: sets the password for authentication of MQTT clients ("none" if empty, default) - lock [_password_]: saves and locks the current config, changes are not allowed. Password can be left open if already set before - unlock _password_: unlocks the config, requires password from the lock command - reset [factory]: resets the esp, 'factory' optionally resets WiFi params to default values (works on a locked device only from serial console) @@ -70,7 +72,7 @@ By default the "remote" MQTT client is disabled. It can be enabled by setting th # Scripting The esp_uMQTT_broker comes with a build-in scripting engine. A script enables the ESP not just to act as a passive broker but to react on events (publications and timing events) and to send out its own items. -Here is a demo of a script to give you an idea of the power of the scripting feature. This script controls a Sonoff switch module. It connects to a remote MQTT broker and in parallel offers locally its own. On both brokers it subscribes to a topic named '/martinshome/switch/1/command', where it receives commands, and it publishes the topic '/martinshome/switch/1/status' with the current state of the switch relay. It understands the commands 'on','off', 'toggle', and 'blink'. Blinking is realized via a timer event. Local status is stored in the two variables $1 (switch state) and $2 (blinking on/off). The 'on gpio_interrupt' clause reacts on pressing the pushbutton of the Sonnoff and simply toggle the switch (and stops blinking). The last two 'on clock' clauses implement a daily on and off period: +Here is a demo of a script to give you an idea of the power of the scripting feature. This script controls a Sonoff switch module. It connects to a remote MQTT broker and in parallel offers locally its own. On both brokers it subscribes to a topic named '/martinshome/switch/1/command', where it receives commands, and it publishes the topic '/martinshome/switch/1/status' with the current state of the switch relay. It understands the commands 'on','off', 'toggle', and 'blink'. Blinking is realized via a timer event. Local status is stored in the two variables $1 (switch state) and $2 (blinking on/off). The 'on gpio_interrupt' clause reacts on pressing the pushbutton of the Sonnoff and simply toggles the switch (and stops blinking). The last two 'on clock' clauses implement a daily on and off period: ``` % Config params, overwrite any previous settings from the commandline @@ -78,6 +80,8 @@ config ap_ssid MyAP config ap_password stupidPassword config ntp_server 1.pool.ntp.org config mqtt_host 192.168.1.20 +config broker_user Martin +config broker_password secret % Now the initialization, this is done once after booting on init @@ -143,7 +147,7 @@ do publish local /martinshome/switch/1/status $1 retained publish remote /martinshome/switch/1/status $1 retained -% The local pushbotton +% The local pushbutton on gpio_interrupt 0 pullup do println "New state GPIO 0: " | $this_gpio @@ -263,10 +267,9 @@ The broker does support: - retained messages - LWT - QoS level 0 -- a subset of MQTT (CONNECT, DISCONNECT, SUBSCRIBE, UNSUBSCRIBE, PUBLISH, PING) +- username/password authentication The broker does not yet support: -- username, password authentication - QoS levels other than 0 - many TCP(=MQTT) clients - non-clear sessions @@ -294,3 +297,12 @@ void MQTT_local_onData(MqttDataCallback dataCb); With these functions you can publish and subscribe topics as a local client like you would with a remote MQTT broker. +Username/password authentication is provided with the following interface: + +```c +typedef bool (*MqttAuthCallback)(const char* username, const char *password); + +void MQTT_server_onAuth(MqttAuthCallback authCb); +``` + +If an *MqttAuthCallback* function is provided, it is called on each connect request. Based on username and password the function has to return *true* for authenticated or *false* for rejected. No provided username/password are empty strings. If no *MqttAuthCallback* function is set, each request will be admitted. diff --git a/firmware/0x00000.bin b/firmware/0x00000.bin index c72a42e3999286d881a50b7aafe6fcbf989cf6c6..9d99408e49b41a1c63b278f564e565acbfe8e4ec 100644 GIT binary patch delta 5555 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 U=CxY6q7diTAQR1xCvxC_0Ho?o`~Uy| diff --git a/firmware/0x10000.bin b/firmware/0x10000.bin index 508a3bbc23a7140a741bdf2771bae8dc302eb4e0..1c0cbabecb6483cbd7e3e8b42a2d8ce04b71d6ae 100644 GIT binary patch delta 52489 zcmagG3s_Xe`#65)?4A|yEU*hK2n*~vAS{;!&f*0OVs~W`6B5V>OB2vY%PU!FX^WR7 zGb&}QtfU1=1&QZ>ws(X(J6RKJU!-x)^-X8FKP9Fzn5BiY601aiN%a)PYSEwM zX;1OCf8yP6QgWHKCe~HVH*1_OjR(>;_^P|9`YU3FrCZEshUfB2o4?sI(astQ`GIU? zX4jfCS2z7BQ9+l)3~h~=5&w^vQGAi2s7;941aZy4`&9t{!&1fp{2WRi<+Liei;@c; zM3ZT|5qr@4kQ0AJze~IHc&=iRqj+kh?|SO6;E-4~wS(;_Wx0DAy70W1Z` z14sh!1?avD(gF4WYywyckOzF1H=OQe62vgov@uuuZ%ja)GRiRln0dv056lH{J z?tyR{z-huT0F?`A0MrH$A$dv^RnQ}5e2nd*;^?Gsym(ZwUrF6E1bNxc2SEVzX zC9YnI35&VYGr?Ix+24s_%8cAMk{+|lS>^`=gfAuZ11aTtRm$Hj)*GmTu^UG{#4vX% zvk>L0F*qkHQJZKzN|H(=pM99}fIxZVv!kB9-o9Ic@LJQ9XXVIh)09!qU8g^kgq>2u zRy@}uZtfm}S$`-7^}Hdmbh;0M5){>0g?5qWXmer2IFk>n&>uobgosK7_35h7BQZm6 zh#`d_^*BjIwWN>`Egqp$6#QaeqhCrgio!h}ev2HEtu7mFCh7Tlv0yA^Xf*I+QOfvK z4GJb@&5c7wjjgsKiC+uid!A&pZC_rH;LG`n=1yd!%?B%t=G4u3{93f0q#8F{7fO(l zs&pQeI(c*LYHq&7`WtEH3SQ>vpE^(Hv2DH&m9#u{O;n+(HQBh?`LK><3UY3`nk6$! zl^z__sW`4kLfZ&^?mh`UO7ObyH=eY?3*_7j2LcT7b$@`3BDQ$6Vif}QK5F?=lG6^GTcC+d2{3!gkSFm;tiL?etHszzE=1nN_L3;eX*BHl( zS`|YT)KUd`6lAxV-m+NwNMO-h?UcmVQjHvF1~kSrQaoL4Vr@I3kUt^DYF$rBNK1kZ zSBYBtlAwug|HI9Oo5KQFe>MQIB(9+LF+kbSBNi-jb+9$PcW0W^OwX98P`b>LPTN;= zQ6{D=J*3Q}Ejcfisvaqe@&x41hcqDyYFgo1vrD9h#tUCvXRLJ5<64XCB5L))C-}? zQ&KTl3r>>2zI!6{JHdR*90SivDZ}_WKFUtu8;2l8B}uFTZ2F6Y=6_}L>dmm!;3%~T zh|Ey$D!8QPEO}tT+SHVV-43XQ0ST}lgz;diFIr7dv6+I=4Z`Fj)>wE03Cvx?*HP$6 zlE`&S`m5F}5^G0Sh}=u`xWId(b}66)R*h?6tbl)D5C7v`j&|V^pXezcL*hJN&Qg&V zX_*BUQy#GB804w3?@_mEoxN&jxq4T5!*!{#b%7(E2p^@sSm zIWZ_50hYO>Nlb{j2{u(YBe_OPtX4QB*+=7VwIz;}Yhp&8mLn4cPh{_*)O3s{%B+mh zlxatinyNStO;i$HW?+E0D=LKRlaPv#=XxZeSF+Vos9$dLe?ZRj;1vWdk%$rfvOs$t zW1)_9TLiac+ja;DwP-+_21(_P;J5uoJ0=s>!Gb(C$gW3wiE;`{2U8TX#a=?v(pg*G z7QWGKF!b5Oh^@H*n0`Q~37zI!^ADD0*8}o&>l8Gr@@#B zy0-_ol56Y~rB88;zrV>Xi;u1xkSIBUaZA?A1GY%#s%}fJ(xAkqTQ#CAf8$5|ztpq= z4&Qv3JOCsCz$_qOyqEG8<4U|dfY&}o7-{-P8u|yuCIr=6gm(t;vtApi@uQM$`^@1M z%KBX@3k$RVB@OXhn}jxx z?hv$)A==*&LFLm$*LIQhU@O~aW?jG99@I+KDgj#)R#b@ynP0MEe7gX57u-WD90 zY=6<6Y=na3H?;_AFZcW~d^1>>@A^wabD%;nAqG7n z2H;J|%fBWw^WuiQfpT$7$If^%j{5bK|eyDBCJF+nq;^nGG zR2U-aNkkG@wpwVhHh@TP3Z|Q+bX&`|hF|d;dI8nqBYG2h9S`a!>A&rViZ$%J$#qER z0112Ku=j7bbbOw}EyekvIaj(b6l`v>}$RFXQB|F@K`D!#WKJ&XOrxK!l; z7fEVm=C@dqeXSA+^Zd)c*%k}$o5ZhystwD~>kf zep$mF(5GaFAeM5CQ}nL$T8=iuiIiRcylg<%5i z{0H|K!chg*a5~z)9LI1%B(p367CmSA_(tK`A={4eXa%Xr5qj5J*2W%;VW-6-1%8GL zL670r;WrJ{H}L6Zi+FGReVF@pNH4<6!8Yi zSz~0iBUTtzQYe{-gC!Quep!m*8P_GL%={1HZ+PVCibW&ke9fr3Dp5*6ISxigkaCOQ z$sM7u+svpFZ;zO0Sa7Qr^KTGTifm26ZL=IpAsY8baHt=LMC!BiZ!~6ljMO=gaXn&7G0&YhIdM_f@W%%u}=E%RVdr%%pQ})m*9!A+XK3*BK#$Z^BW)q|Zh+_SP zE_`il9`wDesJMWG*Fi!l3Qr^tQw`T4lkhFBjEY73@!qJAs7O*QWepp^y?5P)C?jpL zW1E$_E7@qyRm%&D*aQ@Ud!rJ$t=F4IQ!qf<-gO}zu_{Ms-C9p!^Ysw{ZpOCgh|$jx z5=NAxK$UoDbPg!;*U^)`R>0!90$}|=*vmKxmZEl}fd0Tw8XaETt@2!TOqe?GdZQ(6 z1fdSc#e_hIn-X&sCE`0`i@d(PHj?xuels=#w6-BO-0MHLBL9Og#)c;?yao)IYhlc< zHH;cwK$Pe!kjC~osL;BpI2jnhZHKqC0oi4d`o1X*P{``)L~ zv@Pd7VcjkKYw^=@AwE}01)Bwr;kj1#{vC1Qh`#q4Zi-*v<##KqA5Jxm^;|=;f~!J> zA2!XTS6#x5rn`b`K}F_Y6f;_3fo&i@2zZVI(Ue`nQ3)I}NQ|1&7q2w`s4^eCIVlNs5nbuH`x)zNV!n6{Y!TNi*&cEW zcVad%DWVXT=(06Z@Ff&V=rflf4~r+qBtrj+-eog#=n|fjs0&~=hC^2rtj- zrsEm2;*r9GN|ty2=#HZE(fq4M3#+u*+KMc+VS~-y9z~@c*pz=+66S=H7P3XSVHIq# zkgz$z&3$z>DQS6`zlQyJ;-{gk!Z|fur2spaMT1np&^oh8+YHZ0TvNhT&^Q(_fyDf2 z8gj3CqUIdeby2rah19sy97^U(=5YH>vN$cD@3v=$qLiy1mTH5hW&t<;Dp_CIJ;GET z6i>ZexP1WZt(uxymQ{7$PTK1u`2V`P%TRgD^d*@vPvH!6;;1mnyGG`rfQQ(6GL@ z!0+TqQS$(bVXpcD4a2|ZW^O=2Ki)9X&#kF3TW?C~6l%e?afi{X*lYZ!VMgdL3jvk_ z?1a9=YQf_LQ|bmL9HEW)_wiBa3}z-wkNCbfi>1<4V708UBFH9cbP}wVw{WO;L?sU5 zCnr>+t=MbgIOK^lCXPkV;fLVYfuEn4>tzH-VJmdfyl&hzaUS{tPf1zpZ{MOX+~)^V zK%Rbv&;6Qa=L-?|WJ;P}NG}nXUoR{Gz;u#U`vk|QPV!=I5o7Su)G>i?_hiqg`8dD$ zY60^|>nAMDGzNim-ov%2N0AXPnUv+VuV;k2z4+TnV?7N-Pr;7tz?UcGkV)_zg{BlR z8^NPVL!55WoZ$Mc7lboGJ)Y?NgU$t_?n4h)@vAsWr}bcc1TFshj`*MxggZBVfS<;j zO;PMTR7?8YGK5iD6uNlQ!y4%0I#>daADfOV~h4Wf{yB0o_uC`v2&^LH-njZa* zpHG{qZSKBIH_vk3D@JL-eC&#Ee->X)n@Tg+ur)m~*mW_S^AmZxHRNQRxvg#aMAMN< zaH&$(QoJ!e0Ttpe(s>8-Oc1NJKLkIp1l27C*9j`GrOGoOv9AJIxaI~m-IS{vTF)3kIC9LXZX?P)X$5T-K(*QvriZ*y21Na$0Pb@1yB*2^C3q5_p>dCbT z7xIrNFROByD!K;Wf2Ywmg~-E0o$hV@OEOVtJg&Yo6=`tmop&KW9GGz@ipPZ+3Fszv zW~6#8fkAY5rH7j{!XEvu$Exav9&d~MxzKO);VrZ(l5$3hF-V}gxd*!&=l*P@8yB^w zn2lOAtDCf*`nHvE&J=}TZ<-ZUncpba#4u?3qM-VCgY#HONzWCQvHdI-lywv=I#QOV zG%20SaK6QV8eLq!qHHxLl#49bROz(}lu8>}qN5MqO-Vy~i_duVuK|&w*07$2q{(3@X9T+oxtQ;ow5Kh4mp{ zSekSbXOGk6M)PmbFpE1~re*W(-JhdU<`LGvY(g=ia66?t23kFE#k* zte=q$@1AlGECo=u9%k!d*;Zu1#o5tdvo>VMC)qy=Wp;)-Ulmn)irMOhZVyZJ`ZNRg z>=j$B3Iym$jGoTSq-dbAxNv+nJKj)n1$4J8f@QVLcY&A%mA{woVJRWp_I6r2@qnBQ9Niki=~1+VH( zr&&75fd3tShg;40Y{>0)l#4?PyPo@h#J%wU7nl7vK6+O!ETZ+(>_O-XNa)|Otp`S= zO)$1*$mc3m$2@Q2cERQ^uP=iKFEUrLge^|+P{uG-IG{B%w*dKbR}9xwsd=Nv-RerIkD z57w0joxhKM8xF^z5v^Bz#bBecQbDZT;0cWXyBf=7S4`=bJ z5Hpe>JrAG);A32J&pxyY`_HfhEE~J*8>xI0r3++C-u4iVJ0PK6ykN#8uRs2V8W3O0 z8N7SO67&!by*I?Ma4h%P4Wm|9pcGcYH2QD!>?O!$-FJgkr24}e09?lf3{_)aveP-7ui9IL>k$uF5wY~9zx4WG|S9n{}nf2e)VE&sWG$D z43?q0Op8CecZ^pMk}?K-$VvkLdas%J5?+U}rqDli9pU(2#aItjg?*?DPLxOs3Fv9L zMuU=v0Hk3q0Ui$h+hWG~IQ(GY>aa=$_}`LqX>^Ko&=EA}v6yjbCTBT|`wQb7_7Gm^ zlT0i#hBvY1ZSkzXJ)ZXvnuq866m=FT0x50}>~pbxW*g;tT)_=WX#9UM_A%r+KZ~K0c8%y{jG8Vcc^vBc_~ZYgQ#m-+>_Lg<$+ zSTEC{J{=_t_-uzAwQT4C8vMXuAy6NYL5&&w;OXAEKIqy-cxBaDN(%mjzoqU(!|>i+ z;Xb#=GLyQwrGf6z~maVhVIbtLEb@oX@8u)^< z73|#Mtsa_-tFGPC$i;SWF|TXX-JMYPvjD)xBHBo|fEhWWh@w4gyfzDwI#_Q=1yKlS zm#RESCxSgN=vP;WYS5%P6`&h9X=Z4Ga}8OmKgm#jV0QS5>3NR zv3)?qPtS}>pCB34;MC72&6dpymn2`#z&tIPkn>Lo{Jt{ZlaU9hFU|Qia@r0KChvJf za5G}@?=!;~3UuN$M)!}+_LpG6?^B;+Kof~UInyJh(=pzMtJTmlXf|mTl@~=(zuV8XdqdI5J!>;q+OF=s$STtPsar;;<6XB?|Na>E$C@kS{yRvqV`U_n^DwO&#b> z$A{N4RL#p`Mg(Z@WPk%8aBV{ch>|V|Z!8IO?r^h;c%=!UpU(rvhHDZ`MM1X^GX<=P z#av5)qM#p0nwPbkXiYlnv}4Wev4PA_Zkh|PuB~X~!iciKIuBa33+K)b_qHjdjMFc| zoDpK!7x7cGgB>0(h#5fu27na+2LKKMv;s5&S7+hr3q|4~oB~e@P~^aqhi56kT7VjO zx7d8BW_WgzJn(lGp1$6&hxC$|kp^aphw||d_J_vLgXesJ4KIm~jI9vZ1#kf15Wo;1 zJPyy(0L#HP4Z-tcc#eaDzMDWd0U`m$0i=;9nEy<8&H!jD;w-b^xd}v@2@EWR@N$6G zdm}BY;8_J=1ZK9t(;v$1+~k10et0nKj#7Z0F)p$UjPF@5)mOl4!|scr2wk{d=q>vzCTiy^CsvgF}{{;qpxK- zn2N1ngR8gIgK_UFS$O6dcVo%oBec<*E?Lr1vZ%M@QRF82@1{XjJ35d#fy(u1GZ~QM zCW*E+7|h#du*`sa(m0daR;w(SP8C=U%zKiX?rh}ty9-E$c}9BDc-Sr8QIInPTw`B50zY_CM*vkmhWLxS>e(g_5!c_UyM}A!?30d;1H~Dq0kQ~Bf`CTo) zKPd?o60o!K>k|_9vRg0{3m%E4$pniOFhZmda^J}0w7F5?x~N22b(ZQd>4ao3Xy|h} zr98O(rg$b$Dp0p@I;p4FotJ=T)1~S%&R-H@C2OoyoQN0Y5P{ekLe8~B;?30Znngi9)xSXIlsH%yl`nSUPiA zO!om1&2>8f(XLYAlDJ*nvbkMc)+`o;?khPbrXt}_k~!DAcI7%}ugt(K>C7L)78nK?Bfmogh%h2d@VK>Q;t6o}& z?Wg5(@5@9^kzdzT$$pBd>a{mB!VYnmhu_7fcW7a|jP|71jr%BvuF@K6!N>f(5C_GIfi|y;2Z6v_lAyqD>slO8GtQ?Am-nLvs9mIST@>({m zEW?*K1;XJbh`3AxZxkD5bI5jM(l}VBu$ky?qE{VUNo#1<1GG>+WFixpm&sg#FL|hS zyHFxi`A%%Qhc?XoxCQxbs&GL3Gm;q8dWB2v`~nr6py|K|9$$#f~&54(AFOVxHbX$5qgUy3Rn9To0dmKe!%4+_`aXcfuW zSpeEDhlDU$3ZIKAR_;k5qJy9-9~Lwcf<$}O5c~o%*C(P%0lFL@6MRI@u@-S3xcTbq zt~VLMcUURy`^Bt&n3oD_IbX4y&&ITGBaDGc7N%VWs&uEEiT36k?hd-8@bcxT#L>bfg3Z2DR2@NGz|jT3=0M{}PB(q2n)#gK zz8w;Na2x5~$yAlrHBk~$|As>xNiv70NMUE4sQLzxBPYm6VhvpeaElf;Qo?aLdApeP zDWdHAVf8sA8~{umlPQn_lPu-08xjr=+F){5t8aXWLcftJwtw$%yJ>daw;;G}+=Ea# z`zyq*z&bFu1zjP1M0k%BIDNOlxkb!+1_|%VLjIE^6?Q2ALDNo2c*_m#j82eEH1MDl zRwJvyZBm*uTZYd@39ri>Z4yk;wBU_6E_Ylb! z=4PG~g$kL04WjC9$hVqc`@|vVt44f6Ao`eug_UkTw~XMc6tgmkcpsM$esBxn1sUP_ zA!fZOER_+i6IGJ{;Ua=?8_C9(%o{2t7!!!N|5`g*cv$9ejo6fkgyS-T6GKdeSim{v z38f^hAonoi5VMSg;DZE_e6$H_luXKmj$ zC}fiOuH0tV<6@QqGFs&dJT9szc)3$1EYH#k*V2S=*$82SVYyvBXzduPvRT`Px@K1h z<75KM#HJofFw5m;%6ZETm#U$pqr9Zd^-M%LSGI`e7u_Mmxr;5!i;I?*=UxE@ii;n2 zEfTZ-0M>-Da^bs%Ys(PsI*4!tgB#r`tDMbH*h>j;KoBaqD9!$enDrAhMM5C6GQv=8 z5Q0d;Cd=|oMawr8KfYC?x%7X_WH1kis;yAwuOZMO`7GF_4j_ZzYz_sBS1?xm z>@_ePo+4%KMWUmr3Z`G=1{w4J|(4c zeV81v=>baEFH7kl$y5lFF>Vg5E4qF{sGh_KnL|nDwV({CPsL3$oA%S!fvLRbtfbXugT?h$mMJ> zxtPO64B2W8=v|o%Cei{=F(_sBT)S1w5=faBNhP;J1_w-G5ux>}oO|OCKYJhKb=@gu zMU#w`B;$)D?RHam4}thzlCxLbZVIRC4zVd1Hj+sGwZr*4dkHfaVbC$4b#neEZs*_O zN)em9DPbDSlzh+=|AWAdK_DO>CKVRmF5q&F7r~t_%qK!8KGJdWRN`%sotw*&xzv?@ zyn0c%$r55b z>Fy1`Nx5`ex&a(j$V?)*U%*>~xIZE2vA22K@y+Mg++3z@NCJ0E{01c~t<@Mzt`15T=Q1M_!uyVGisdFU@*5O;;~E+Uo|ZYIrqO zWh4H<8Ut)l!D>i zXjubAp^6@p=<}g ztD0(E3*vxjJ8=sVLF_@??~?hQ^C0Bs$#CHfqInEBhlca=+7I5dbSE?+a2Yyi|k zb?N|C0PFAPUDly15xAtYs)``<39a(#}nab^M2P8cOZJwSxm23%pHJS zZ2)qg%vBtrg+YmX)C?!>>X;2g&Q_a5NB6Q0elf{zixMc}?W5AVbm-VM*= z5a;^}^eljS2q(dF7d$QSoB^;LU=_dyfYY3>@0f1(BZ-Xb);li3Tzlkl| zPHgtvds5NAECoNk@+6AJGoQ*shw=MQJ%--LVNdS}`cP@~S%KCBiH3r1>m126D&4!{ z-dblp{_W`!IOmnVY8Gv~f!|nVvKoNrNB|?iIDq+}<=OCD4zK}W3qUK-KL)T1!k+`Q z0d$fu#Pwm%)dh5LKc2nX2IoL(S3A%SYn#4o!NpQr!KVk{4-g3u50D0s1dsw?0U)l{x=74dyh=~LiNC5?PLI90Us!Vk(QjSD zvFil?*U2vGW!jjCwvtfn-3?iTc*(jj?Tfb)o+qJ(NrU+9by1NOIb>p6)QI^5UsxBHuux8hiD)8?7Laf{4OZ;KKM1aXL7^WOkFW*QJ6z@p zwylq4&vrrLWtx;YgIBB%qg|Kq*7afDR|gh2P&-MS?-1aq)B3UO#M^9)yMeE*H>zWY zBS_ik8#vZEf%d(IOP%9s`Wk-Cd50qtgpmWlg5P)sJZAxT6h>My!CyQd!pi|F0M-L+ z0jL28g6_291`{qi$!4>naIqjz*7UAYDcCnS@Pt3y0VS5!rB&r6WG5<`gu6suaP5h@xwlT+$vKsEXqnJ2;_2E(NAftE4Dc~b(B1~t%?_>W; zj9Igb)*VoDe_bVPc<^fB+yM8KRJ|eCaVMeZ`b^Yq_tfQhah(HZ&cjF>5^IgTJzkL& zc}wlu>Jrpq-v5E1w;%{_apgFW3Des5`1Tz6@|fD3e$ z6awGaMd}t~XDM)V!z#l0fv7W&TE^gu8$!&^WztD{MSB!&H;(Gu2buu)G{BRswqGL{ zE>gmHcwzn{>dM8cDmWS$aUD;5&g@{`f!cX;e+&|Vrg+CCPULCTn-o_$5HcOuiG)GO zR>C6oIyC+0j_ig{bJarEAXNS`K?{qexWwm$Y1Y}uK7K@<4pF++I3OU&r|f*Bm^E#t z+N6S76Ekx!auF3Wt|{89TN@*IO1TcTi9w%{$fCU|YfOxMl>cj4&)ynQ=dF}Lk(S>o z>I%G#B2@}tosK8`s{bWpju7A zY;`rX{GOzaJ)=@Mm14pgS&xGLltkgMbkKn3mphK1#Mx1wgA@ahFQ;E zqlf06vX2#3!%Q0N2h_G0L>33SI7`?M4)T@l;GkI1uIo@5z3-S4y(3syK1dp2WxI2& zShROVdsX=~xWL6GXZcduqb~J@5~WdtuNm~@D5+g8F!~O>O>LOD*N)$PKHA~jt;mYK zrG}A|utkK1d0N!1_2BHFL7nul26+kgLFZvW(UeSafA!ziB#@$f0Qe-Wr?VS=0p9II zm0XZBE9SN)En=N_j@Y>f>cB2gr8%U^;Li1)%=$ZbD0Y>DnLzhn!}nK($nG@|78v6Ho_PA*@coGlSFL3uUC1O?S9kAOD zU7ZqshIspKQRNRuuht3?q!v42-@?d7e?+T}!#zbp*r+b!{n7U%m~9oF>$C9nF$$AU zlZtAn>@%{4j&5`acfAlhePbWYu4$^J#LDmLvQ`hUPb^Rh&-7b24zhHr()#j1kvdf=Y#5ADuzq>wbvBkV z=L88g`1cn%$HoCq!90&bD@ljo?jks9x~%j2^Op~@im6P#W55It>#{+>uzY}>H&wxO z!Xbv?$?pni7eSJ^={MzrF)bWp9m;=nfMr`4>wW$Ca|gNLe!#JKAdTQC9&7|ce{}*O z!LJ`CC<-CgufIjX`~nDXpB|t#;mt4UQtln-8N8|Tgn5Q{>$?--aLl~};9P`53g$!# z?mH%B)|w+JTO@Lh7Vn5pS38}cdLcIMPJHU6;3%Iy;0J2rDeThbrw_1E3m9u`fBuBw zDp`lCl#IhS>E=`aoi$;Aod8)w`tzfQvzmvqMndiFEfQ=ztm?g0cZw?Mxe8=TRX}Dn zotL+KR~B2qX62Qx%h$tc=LJlD#K1}>-+$2j5GDBIH#Y?`WD#%xf3Ydr;dut6;HGsQ z9;`AX0amaKiHHH0b0-bGgB+c?Nt8K)wX>p={xOSoUI9bO!HiolGAm2#B z1PPG&7GKyL?pqHtu4VwJA~|pIDGsV$MBmqgpRG=#r}SV~bu^vcga4_XO^@xtx!6F5 z_TVLW8tr=uAHc=5Yvum1EgA%OT9aN561HyUEXr!m(z!{#U)jPnm%_@$2*-I&XzbI& z;24pS?PyJ5a>K|m9@ah;uY5UO>kJHoQ{-LzLQ`sIF3a+8-J|*CiJ=ansywS~H5*x{ z6v}Rg3@pzo$my14SpQ0af?>n(vR8D0h2&T)^ht^>hdk+O8A*OOe(RNBD`^X;TVn}r zXfzmU!pQ+Gb59uHTnRtzH>DK5Cc*@#*x@Q+1yNdXYA8~9Bb!b(v!3q6o4@r#$Fcg= z2)N29yy_P-pJamd^TKh)DmaaH0?v<6Xzp-iOqH>wszW$NZs|UV7rh!p7j@!iUyaJV z`&J|_$l*HZk#AU=K!kl0VqrFY_F~ipq!bH7LzRelE8FtSm1GQ1Oz9M43|eTpwi*wARzh` z&U?cUa36{2sH0+DA}CILMEq30VdopB(PIWlljr&%&nx)rHzwpFnfpEBYMJ|$2$@My z*i~IP20i~51VLge5bN_)dG8cb+iOHzLfyalqh#6(gMqdKTWXBnofwYmf!^u?inrh= zYQ{QPk_Y6Yj$!q5E*z+e@jej-J47lHACq8Y&-3>1uxvIatSHSG3Crr4bjv)L$@~;5 z{0VB^RlCLYbLhoO9SdVS7RJF6j3VWP(^4)AFMXsP;1u3F=S|+Tm1uyxrm)8Nl!)(> znQL*sXw@O0^uJX58(HSXP#CI=Y)X87hh%H@b%uoD@ozpvGhMjm&Be668nbUDY8H@_ zUVQBqLwp5#k6^=wcLPFd_UTJWhf%OR=`gcKGR4ND8ocVQ6wglR^Q3Q_#$Ue`1}f6| zRuSzyv46tbaAEu+o>BV-U2uGVPi-7cuYV1Py^}#3f5UU$vC{#+;dkE&AEPE!B91s;2eVc;{iMwU=-YyEy0+p0{g)AJeO625t|Z zmt;}z-o?@P|AgCijq&d%1c=Z#4<^~LTkr7r05ozpXDRxKvuv6P zi{JM+3z$(L?J2ZyCp1Us3&{DM9!w}4HT*#@T!*KtRj>bp^@oVldZ87L5$^%3&_U?L zEIdiK?&JQE&?xds##*LF>N>JixG3eSTZp6cuv}q(lQ$^kY-I*ILf*+(eOz-MjrhMZ z-{&l=_>m)g#EQa|z3l;f<5E;la>LPG*mAXx3bj6m2X+hTAIg!nV8ddKIaQ6aEqzZW zL&xM8XN|<{7>Su>tf>L_RaKXq?`=H)!^o^xZe!5$@qVx(26r&jY142KexV;9?_bp+ z7kK_woIf8QaG)C2;Pj7vRiQxtODFC zO1OD16L=J-e00y~fQzJ}txHki&-j&(#?#EV_{c~3G_wpF_Cz|CLrcv7NCIF1*2AQ! z3gA)^TuBDl1yBL75FiI29zY4ueIKL)8~~^Vr~;S|FazK$XwEoz>H$0ew!mHFv*1EG z1W*UC3E(_v$Na*`(Uxp@83$k}#9!_Scl<1&q@RG{rc{~_hr6g$Y}&*~Uvq7htu8WY zPDOBL!941EyoTIKk0SYCM4O|jOrWWv>A6tr*s*B;FA!}G*BGZyYOPP|Gtbf3heShC zAD}bO@twGDH21B90%aNox@dZ7ouP}Ng3C^4S{oC2$5d6+E-$_Rlp4CS5UIRqNDeNW zuZq&ql{Pdn&6nFNArDd*76m7zO1Q(o&^)84$kfDUUS`TNr*ttMQFqgo5maeilJKq+ zTsCd&Oclx^6DV_CQgCvSqN?lsbelKLdk>d_oi1CQv1@uA`)+WigJ(QnU>7JWgQ&83 zIgQ?4WocOi(aV5nrfOOO8uwp_E^Tj|UdMZTL2=&h!F!Kpn|QmY*_#c{G~2z*-fH&z z0;SnLI*Xy;k8?`s*JHp2Tfi^jSwEE@GH^4#WSNTp47xXS?Z`uDqjNEn2kO& zRi$8~I6sZI-9= zA`DtQRFp5Gs~)!LJ!jEV_G#fOJLs!_X-8!BQA2gSPhFYWpMx*se0)2}!A4YG24?xh zkWMW(OF|#sPGTce=O}Kz$S=`m1rg~IiO4((bH$Lzl`1l!SwNb`28?GywiU`<1;9c2 zD3mDcM5310d&WX1fivqei;!4EtB7>C$r8dq$}u9HHKMqmC(##K3#jI zrV_+?O6cC(LUuI8QD(gdAMP8MJn0#zV0oi>`pJ6I=F@}A%4bniLF6F$xP;hph!)p~=wCL+r)73T+1W%jMgP;zB_%PNE$?v*Mek}NhoG$v>o z%*Xhq;TdIhTd-ADghGh=w%>6DR<87wdV>0Ghr>^s{dE&oiukuM7m)b@oRA7yTb zb<1yqa#t5{UXfxzuMNxH4+@RQ-TW`tAjM&>LCv`RA{zV=YBk&gle5MF(+_viDgy=g zLSNzG$dp4wS4j?7WieYN)gXxHmL5SBPA{(q4N7OB9h@JFm+4j;pXgtyq=2$e=Oz;{ z^gdydU*ca=4cx&*wtSd5|9_bSd&6N7o%nA?w9o@y60_-Dj&b?bZa&e^oak>DyDn+` zx_TuA%K4m#j>!4%F)!g&qbR+Wm=Fb!hJx!v)I<`&Vex`gd6eRRFgkx13+f_+?@gg? zS~})!BV!MfqQD(pM{z4e^d-q{4)<*g*HnHC0+%f;`q^dYruiMTYg zHd|S%q^_^iaEnB=dzgl+Qfm5y6lYBg+%BE*NkmK%=~KG<`I*Y#Wc#+^_AQ7ae9sio z*5P7s!=bVk*M1TZkuRc`hU4rGsq$5D%-strotM`~>L?y#iT#rd`R)H`Kd(h79*!gMr zJ@y;_8!au%X9ATK086>)rzh86N(9TsN)I$v?R!4YVBsEPZeTG~-J472EtT3Ux z(|xD|-}sa(g7a__NWNiavXX!qTcQet0|wf}5Cc7$*&y2Vqvd*jLyRS_AI&OaIWURY zON`Uab^aum7o3oSPPv*c(0f52h`~!g3v&3_^j;>EJ}NKYA8~Fd3hf7kRG>W2FIic^rw-Sh0|YAABcPZlsk+Ycy5@gv zPalUFY5a$rr4LX2T<>sYQLP0mn-vNLV0LYvD#FrQ*C>LctK_K*a8^U#nCsK8Lhlg1 zF4H%(9eNsEy)oYXu!w@C+?ymmCSf*xqgp3y9?FHAWHZrlY!N!bkUJ#8?@~u8GI=`( zLQLK+FFotW{VG|1m1ZkkvH0xg(Z)kV{mW*e;_l_S>e=jtHJ*Df)Akuu)el8bh&TYy z*F!+W8Gw_&h)A^GaqE5-%%RiiRlS~q-F_>I5+a6T6fnaV?sv=2^LX_aacDk%?~BAS zFT(`x^Oa=QEAP(_Z@^xr;Z|?Y7w@7AcaFu0(O?@c6Hi!lTGZHCC@{^n+V4-iRl!x?U}~EMdC@h2iyIJrCQ; zz6U0FUnWOU)783a_-Yhco*kHy@J zBda`mV+TI@Rs?3h&WTJV)(w0YvZ-51)Hj9QpczPx2{QWW)(*g28#UlnUvGw$q4zhz z$g)4?n?RJ8vK^}U08BICNfwWAgHc|UfOqAD2KBWA8t$fqB1oWtczAZ1T|b6^m*tvd z%(<46b0ube-EYZz6sT>gJ#Hl3g1~DVtV{seWS(@Ur&Bp z>+4%JceR2$5+M_*ynY?(k>DvGOlRS?d}Vz!ZTG<+)d#^BSDNdy!))jBGtVtx&A|0k zGVSpYQuVj|mmfcX6B@#G@3%p`d{fJHWhjQ_R!XUQ_!`dKhDi1N|ElOicuRv(odcY1 z`IfV6@S~{ZxTPUJXbQ>WriB?2bPRQj&xvq7-OnN`RyT5YC`mU-1Gf|y(oH`=_>4u; z?}tU2l|recpwKC0v*c8)Nq##4%Q-fHyeH!YjftutAQyiSzttEr+O;xF>q@yvnj%J)=|i#r{Ob0 zOPflVg8@fxDZ6%x8zW^AzAfeS>Ob-c z3)Df@VYfdoLQy-%;z@^RBVWArurRuqkOQL(2QBfj!`o0Cexf;!)pKfFaoM-MEK*AC%?UND6}S1&+bjI+bt&A3+0;mh+erWdD!UtZ6Mr z9}&MMQ;$aOIUAsC62LqlzOaS(O;39YGr1P)0$5_3lw}b*?gl|O9&_J^!Zr1b?*&~q zL5+SnN>h(q+623fXNV853s-)hs6IuKm_t-kzhrq3H+~u4*XWqr> zt&xtJqw>DteiC)uTBZ+1;RMHgM0;=A^;ZbBtgV%v;*0bovROEv?*W%2;iL~6s`^vn zwo0gu6tsUrsk*^+L+LE;(Nq?Aaq>VAMF80V&=PbBDvQ*>0W{sqid+SpHR4?#D^)C2 zhEKO@$JQSK9B@3&eq7?NNa$LQ-sW_}HQ2Q0(qN<#Hf9i581WRi1l(tlD2@wQe z>j7Ht9H)l!?Xz)p8xP*mPulJbLBraOY$Ow7r_F3jnO_xLekg9mn#+EE8;N;W{YE5J zGEd@F=KM=|TzkA%J+LbENYa6&_>uM~^b_9P9)MEuf7)Z&2T2iTJPo6}7e3jZmc01C zI6eG5w^+)CFM4K=Gasz5@N3~)uPAkd@xu~YNEk=&;hc_fUNc6@f!lCnhd}p!kH7Ai zrVA!tlO%!y;dH~3nggE(oP)!D40N185BJH(M=Ky$Ftx| zu({tA!=5F)fiuq zX82{#lOW-Ra{H}y{mw$eE+8+EE`%R7M^x}fj@BQnr#pk_`eV_1rf`2tF$jG?$bzq} z-c-*w9z_X6#IXNBvjIkgc92B4Y=ZxDEC9ZE^!2f1+As(A9!mgsCHGU{Jr0r%UOfIt zUW^7kMc#OmA7Df7@BYQ3L64IZk0VrSWK?n_N1V^7mJoud=OUw0G~6qq@QP^L{wmsx zpZ_VJHvW!(|H&LP18TiyiIfHDWBwOVu%H)B@jFb!$Dmg9m<&3m7N!eajOGvZAQsIe5}9ad4fd?3dWU>^6^9zBMliKAzZ$ z{`~*A`Vz1xtMC8!To~2?hiy;KNQE3GzD22JSX{oui;I6nUF#pdT%zod$&-2QhyRYY-d$ubQL-Pgr@cm!S zJ@c?Kb;0nu^oPw>f|c5~l|OEA#j21z9M#9&k&_PFGr^B-ttIf34pIs8DJ`6eO+EF} z%r``o(yd}kf*HD3tLKT+Tr)BSHA`A|>hc+0L z-x-I6;GnHI-Aff9_Uz&YW&6BEnk5bCRhGX`cURA;M<8(0aTIApGySkf)!Qvye=`8- zO!zIj!&osJNA#!S8j~NUKSj*KgPhj#@o%SSs%6#h|G+cYoHNtmC-C%{mlAVDdL0RW zui2BD^RKi_JFN7}%hF6gOiM%*oOL?6OOY@m7b|j}2-1#j#yXH?AG&`8;M2wJ1qoW- z+0G!ZtY@Rc;{^^u8*kbDG@b`%TMyxRva1(Wi{75lH{ZT*b2(bAwa~dhA2yhR>gekqwLB$%)2{^sX4#gw*!(sO{V?6Ezv^D*b7m(8WvyJ z34wpi#R~t}r**+CZjwgw!{rh%^Y*1ALwABvzwdjuv$ZCf`R1J#z!KUm@iI%tjENz!3LUrj++wq!Z;9s$R zo9YmT@sedSSljEo!;|S|ou%ZjMeXL+EpySCR#U;}?Z)P7_gU0`Z*G4Ja|Lh4_G4M1 z5u*QEc!vnJ9Qs@5`S4k!E75b7$A2eKux0Q+y~)qA^q*`j*Bk$6L5ryx+vlnQK$#KuHiG z#p1W{X&I3L-wg(b?tKH3vI0Z2eGk(pd%oU>^&=kJ%SjfnS)1@!aYBO94E|}mAEpF* zs))ll+i)rgZRw#RM7CxY{2;~s3`(#jzPlF8{hT@k+s`8Rz`tC8V%K`zMWJlo(qt~GDTRNNTeu`49dth zQfQJzb=?;Z)k3ci?KHSHwU;8Px5gAqRT@cas+Hv-(GECh%)h&B{Kc~NdN1Jy=Xww= zvz)sgE6;k`oPt|6ZAcx()uCvuT&M5<=;;U#w8Y+sfjhB9H%3thOT&!`)Ya1UW{}6R zLnwZE*pTHjDLd0L>gG!{+_L+oA1)1bH@hl-5r|GP5;qZAZfU;R5!bHvw*o!>If&q= zoi|$IZuvTYT8j`0wT!Bj&~*N84XS)oRhkZAAs@>;bRkYV;6d`q~& zj%%&6+_k?nz4uX94_uFIKKB+@-&=?|b%Yde?Q~x@o{q{ljL0igu zl5^#j^oxg_`;=zC^k{6NE6p9P8kab=#5sTZk-P%U>cmoIcWQ3Q>M*RHQztcR+yUXj8iXMYt;xd9>#b=^s6K zIwj4AEap2YIEc6035rnJ`|4MCz$P8KZPzTpL5p*@;8K(MQd1ezy0z-v(WU#;Tw}R# z$B*5wu{^xf4c_TP?)GYbUhIi<(5LvYVujN!;biB6W$sAY9VrR}v&$iUum7UHERvCYqV7YR)d%#NvF=g`P zT5+=H1x3KgInbQJIxlXt#c*$k*B}vX$gKVMxcJzz=3c)(nJBgmuL32G6Y4;6aU0Ci%(i@iQ`vE?KMf1=1od0<+EBwWV zhb-Xp>&E?v5QQjL`++Sk1GgeUk3)Zg$X=OOn}m1ecFVvA9oYSYmT?b4=!WIB2fcmH z+Xv$*;dKg*tTgGCx(De|AZeeqQhBiMuC3?$tS$)ix( zXVE@ZgF=da{6U8W|0E@inmb=(UF0=)v}T-B-2e-g(p6Ilz*8RhZ#8{=b(@l6pt`ttY8mbY|hE!0?8hbNcEWb9dW<`@N87&z;)}HoR6;}dr zG8UVFuzzjYK-(-+Tf2I_DHa6yGjPM1w*z>w#eE^UiKSuGw(nYK}mctQ5^lqi-^KI9ux@m+H!EXbb9$D z=$+^xr5$zDZ2%qM4d4gT9{w283cr$DxXun^QW~aZF1~Hpnu$D|(P(;u=Q8r6oqQ9c z6z5mPO+C($-(VE{{F5rfL7f!k)w8GGkP5zMm1)SSqHZD_mxD413gETOA^jA8$$>)qTod8qk(l>E&S5tG5HK8wZEdvEkbenK zxSjeJOYHyxx|YH}cc7v48MismDEfkra-@fp!G|j-+4mf^0NvGrf)bokw1OTJ2+8r=qDn1q|$|sw4ny(29Ac<+*sH}l58CCKx_Pyr#sO* z?B=(eoXKzKE_)3w&EVw$uRQ)%)c4*KD55AG_e^|}{Jo9-{uVAu%j<2D;zW|w@`LOoK6j|KLomd;BFY>d?t55-L5M9)cO8 z-3GU<@FcqV12i3F?oQ{WUKH!GTBLDelF+#+Bxgm z4n#w=yc$rb|946k9LD-)Tek9Gd9+RG7k9D+9e_C=rNk@t9Bxg%zn^;sQE9s$_fy(e z7@(#9ppEHA`6oftna=WKK{VBQe@*gzTmFYUwi6A*Os(ofW$Ag3*mH5gPusa2$p{ zWp<{J+*@L9i-N+3hqoUbEoF_2-4dc6=3D)fjYf*uQ@WjsI34%Jx-TO>Sa&3jl0=xU zt$^-d;P=onU7$;%t9LXWarwF~R?3<@H)6SH!qVwPr$yPKSuSnO%B7z~h^c(}vu1hQ z+jUF?KW$eB-a&)?agYy$iMv;rsPNPPr5l5ftIVdIFx^M^A zb=3a9rkzfvdzJhH4NcBnC3>tYgQ%wbOIm3M5(V%T zKU5-wE{h3Do@SdCI=#3)l>QMQY=yEW_t6E4Vj5`9e-->dGybdK7)=9^`?QARG(|)e zdP`aJ{;lCNQNxL38yy#=E{ zS^@qakK#`oU2ac%Ktz`Jw|(LEWyj)rH~LDzPQsyd+F!6j!?KYsfm6XlWje@uHCA4c z={F)5UK@gO-%xoagi44$J0#=5TtCB{fzK>`G1!n&ZGAg7;6SwU_nvUXSA7<=i^?qBZlx>_$B9F_&jX zl7`B7K_m@w8oNkkJg}Jm5J|szWcQGb`@l&!hQAvtKkH7ujILLH*OT0c_VSYPY zkfAo4?L7Vl;_os1Rp!Thn?3PUJEjpXqc7`EjOD?-X%79wExmF6yucfK(_}Owu@B8B z7Tw5e`jUxqxdIyNw2zOBCNs(WjcD4>QX4B%ar=SOl>B zU4J_0Y0bcijIRWrF{5(g0P-O!=Q*)7+A;HUTEoAOr7X(khJkd6qB$OTd6P+#`QGPn zXy|#G5v@2<`LmI3GaADW52AbQr&stl@igCO(C1ayOvy2EW3@x|v5H7XdXAgT)YB)* z9Oyhb8-;4~cX@dfi|;&*nB(x(z`+WZ=1Y0g!_D z-k~^Rz4_Up^s3YE80F=Sl@o{2o8&YPfahi2`aHcv^Z1Ji)RVIK+5}{Jk$;mwdnuA< zC*nZv!dEBKL~6$y6RBsA!ydG>YdhtoJPpD3c~w-^ak)x7tl&w_yLs>7)P>%xoG_fc z8I7u(`vPT>TM6cH8!B7bSa~i9W6X*!^FAqbh+g4OQh=K?`1p}@isdx&KBFk5d(X)s z#${lTosWTD0ytlSPj*ys)^SN3{qzwkcZoyKbsmRHA4E!6il2|7?X2lzK4CP4QX^k6 z8VBl+{PbwhUq`r8DlG{3@MGjEykL_XS~bDTl_Tjrd%yu3=bKWoeb(}?QZdQx_?1*L zu*FMwr!ka-g*j&o);bQWF*FWq>B<;dLlJxdv;)|~T|9mq&hm?uW#d44_*i$L1`np( z8mY{yqN*c$Dy#hbMLIx!5&y-wSLHR>nUCU&e()^_1dQ!vMCd1V&$0*!Yq zi^kIyK5QxtqAI>_Dh2ucvr`oBO=sR0e~XsJWN+kOPo<9Se-r^AUchjoQa`MYdY$dr_L;B*We5A3S^-z2w@6MqR;ot#aKo+RCuG z^)o;}ALB!2VBHPoJ7&-?^a0PEN!931+$^jDGtZudZTsPO++#KkaXXIOHrw20X$GG- zo7CjU7tE%2=^Xc)1Dtw>kC;Op=x07{4%QK{#2l=cL;T}8Sc+fqpXN|s(CT;rFk;G5 zlvCABHlErn8jYa)sV=4AcG5+pC-mUl~ zsk5Wa_KD49hGabdvbYI7eH9Z{YS~J)ejI;$F4fR5o|cV{B=C}KTF||9Tefx^1}mk@ zru61*d7}k!W$LmyEnX$XdnLtdhIy4g5b?{q@QwGk@u(bnl}_+aa)30{{I?vc05(`Q z534M>(mIcpFdXs$3juz`V;5qt@2;G(klac8D%vM7u@)Z6V@WnXk-<3Y+wyceB&nHi zTm)SF8^5=RR?0E3KMLK|G15>aZ&WPT%` zDnU2Dw;Y$L4ZLwVX3K|vxPnrdb#f(J31mi_E8i}lTSR~J^{Z%9`=ko2h2yceG{@(k z91(Fo*h{0itF&PMJYGd`Z7E`L?UbZ#MY8d=%aw*AoKKOjW4xB zdpD)~vUFAWiE+0x($zKTUKi7St~*xyR_<9%O0YmGzga_j2wQS)F@<5Qcri_JU51jD z;AG=tr>a>IIDd3y2G^=SPeetSKQVh`W09I^rZcRG*C zr766w1Xqt@Ub_)PmCGM(qzz0ng|8{4Z`gw}{=9`2kjMK~79y55h1a}JMLw~jV-uix z6r&H16Lb>A@Cln}aK|np;-c2CN$Z=U^)hL_W3t2Z?FqE}n@u!K?I{wpMV*DKhv?g~ zR)uR%&}K@f36;5<$>P{~-5W?#2tQCQH@fV0r!@jJ%3j!~_#c-H{afVYWJR}=kMZZ< z!uF`*E8e2ajxTK0_q-^kIJhYZ%KNg$KHW{&`1PEXQ5|TK`Z5~eyy=~|W}7yRE8nKm zq~m|TP2Gb!y@A9Txl|jBwyLgTjl)`-enU##aPQ4?t{fl0I5)fS6=Q#BFyvvqn81@HyqJJ^$_dL8D z_&SlNmecIqZU0k%RX}yW+fu9UKg<2r|K#2xpus=dm_wf|Ri|f(O8+O(1_3#JXG=|L zdWNsp*i-!5(n0|hR@)q;m_|Oh0u)gxf2)GZK_A6#Me8Qh{@M;oXjiq#{E4$dxHUI_ zsHi@`Pwk+%Ar5bf5pj~7y}NgTTH#3fkv!1$s}z?#1pv? zj%Y3perRiug?UZ#EuQuP?Tp_s1#}+1FYs02+l^0^1xp9~y@l^QJ}Bg!PQRS}D8D}0 zHO{W3Lo-F0YNhM#+qM%EdD4gE>zpZq^4<8152=HCya2WgS9VJ6;3ZdBW80Z3x>G0q z=7-cNRm~CCI9#3`s)Leus5;GCKX02d6I9OcTM(n{1P@Z;kwUX5L)i&#e2yfaN`IJ7 zaUvkn(bMHvzo4r?uj`C4#~y?7RpEH5FqF83wsr z1vjy`MDWlFa%Pxr0+YkkCC>WcZLRo>&-{pjavMd0SXg@MhMOv;)1LyYAMSL*mKBIB z>Y6*U947h|PiNaw>L!>f%=DW8;3|JYVVzz1##O+D-`SL&PH+&8^q_+5NjxDHnoxJ% z9@dW#$zFJ%LZ!MWG&2#YNBhi$B=TpPvsBf8#C+a(Y;Pc`pvWeY+^l zx#TT0E&pZS@nhf)2j2T*5UtmF@y8VDc4M17Y*_YcuJz;xKL+)t;e$RQt#hTAI&C(e z@d@6|E(qnjKOuws<0b@}+PxeW;;tBWUugKwbS;!5LxgK2tU4jYYv7K%saN~g!D%vC zTeYq~;RFSHouy0Fzm(%*k+hpM`rV=wt=@)gCac|Z(N250N{-85N+p6ES z#CjeXPjf|?^2{i8hPP~OfP1R)X*5HGv52T}Rl`LQG6O4drU)BsloD%1$Q;TL@L6`v z6zeHRM48HS@IcID5%v_GN0R`#!_|mkW>ld;y1ko!wTF7g|6`SFR5-+)CMIexb<@_~^HF-o zQbEdPXftD6&2xMWq9t#HPmUE9?_GKBUNC8%=kM;t4M)w7?nlD+X^X$#h9u5AUzbY(&OaJ zsQ+`zhYV)7Y+T8wd`h9rY~;nCf??*!zxtGddi^3Y!1aP%bM89<XokGlKSmf=Nim%!o7Mdj)puB8RlI&5b#ZHk$e?IFu-Gg7@jhJWKjVi!L!Ux< z(`WG0wN31u;wF#}`Yq++Q6@g%b4m(XQI6MJXpM+e8wjxmt+O)Ia4?DrL|AIgHSH^W z_viEq)mC<^Bp1TPyw?}>CFt=RUjY4^dC-^SFJBZWUR~oLTOAD0bazxFwhNEjS)=og z4ul$fv=8;?sb7+&oB8E-)6!ur@BFuyEQ%IW^~-SXjW;!eV*3)1y{t2M3d> z69~7eFUi!eotS1_oYFyti^-ZQbDX0t&i)e;JBk+rhUd}F*@nhJ!eIvt?;p2I5eM=C zU(x)4oe)pm0vqH3zAf0+R($6zj?x}u<#%6Edt#4D_@DbJoZT$p?GDgD3gjaW&{Q?E zH;pwjt$&qN^qbF*R+y7dYe~#O()qM3t#vR_?t2O(l?+jzvJz{ zr2!u6-==ZmoXgO*-xI*ozr_)Hk+1%iItITl8XB0QoHrbT2eF5WYoM$-p*il`R{Cut zV3PRZZ)rDh>EbHt;j9qFRD1G|t3Yj!;RY%p?55-cogvANUH|8VYnCXs>)5 zkFTKw>c~rKC@;2<@X@cRhuq!205=;~wG0gp=Tz`ueBTM3Uo2tLjY z{@Ov1Y>ZbQB>zFbibQpHY-)#F+CuyD+c3TW3m&0^_u~|auaR+jpO0nQ+w1F-kEFQ9 zH4MN@N4+4@>7`Vyy6YErk#{^qoz*F2%U$Z-i}Ld3uO{kRiu^lh<2jymh}0R!%9I`V z8YTVEGFeOVWOvetc>FH#b24ciQdc@8TS`(CGn}XNfRej*q}{H*Otc}px=g9g7!ocY zj-YZ8piK~->FkHXI|9ZVM*Z($!yP$9-7{vD4Aa)8-Ez^N*{xGHRKRtNGA_efaG^0= zS+LAgr>tG-33XIVq}D2mYT8J-q72g~t@`U5fehr}?Rdpi{FuDGHo2+6yLLiTt@E9N z@Bd1vX-WP0IyezyYq69z@O8Dol%MilwUiV*Z~aLtp59R8c*3yvdSfBP@_)T6%KvO5 z4YId+57*RDgj@Uy< zYU^7mNF<#3Al>>d+LjXb7KHlZN7h@l`&)5m`n`^ZIUP7A8;!?#*TeJ|MD4{*h%e{Y>pQn8u7V=_Eb zf={Lw@qYER(f>;ei}1xm$Ah7vENP&$=XBgADX;R2_1JNxl~Lc(EQY-WW^ow#^CJzk zn!e{LN5M7tz4Fte#K<$JSadtGcfkiObbB*D_ye7zFL}i=+)C$W@yEw#85Z^8can|I?EeQlGZzO zEfRMdC^rl?d6Fs74AG74Bn9_7ED{@(<||Q#L^I@icAeE{LZA}tYS1Qlyg>GM^*STV z);!pPo629HCmZ} zqukJ58A4q|>OwrT4A>WNupPen4DQSio~2m#+2`!_pq4q@{T!vUdu#dZbEMYZ6vOZI z$Oh-wbt3;&JACgM{14xLj{2(l7ctGavb=6RO)6;^fxmR^994mbw(Ae-#U8KXm;RtU zPI*m^%enai1v?KZ!WN3#%;#L7kpZ1W=^sTXGo!01Q2dT2xj`(A4*bjo z3JCCS3lk}*o%n5!MPemaUBq>99G`NLf&*@dk&GsLva8}ZlEG(bCQhb`i*%g)_`FM$ z#hMHG@0Y+XxWr@s#Fei-U->7kqr^(@zaVz#+#+UdhF*uW_#>Gf2`H8XB;Rg`b`#Vx=pA#mCKhwu`J|Cm#L?lW@?D>CtQ3tj^t}DQy>-b z_b+2yr&f-;0;EW(eEn6L!|tr)wyQMEZ7!}Fsyx`ljrF z*Q-#Wj%LW=H1xLqT|WLM*tc6NKfei*oW}A$Zc#Dy<}+_oN!a)tm9e~cfzlc8F+Hk& z+u1e$ba_m6{l?3Cj102V|?9R zI!u4^(f8b@gC(($b0Q3raG&wD*0*|$C)$s^&kM!Aye#Bc4beE#wy8tr^%y(z?xI`g_ml-;q* ziuwsT(#9-*&*f5SaS<3)*M;ffQHH@!d5qx>;;SBm?l{NmAA@jtpHJws4pNCSbG2(uWLVCu5XxGK#7b`i{Il-jdz)z}d%S`- zH$&L<79Zb2+Luc6Wce4RkGrf1wt(em#PlcO3z-&T)VBbs#Rv?c6&hNy^(Pv)9L2eS z=bxn-11A?I1ZnIw^rqZA*gG0s@GgCd(G@?mOZll5>J~W6o~2D~0kply;%3kC8BOP% zTgkuu#yrtRt83shFjL=1<22H(_Y04rP9%Kcn z;N+r~V=DbUC$E6!O-WJJuhG5X#)wa`fpvR|!!T+PlcsM9V*|T5b_+J*-iZ$3PI)oi zK`73gRaF0&d)@I!BDUVl5V>I}&DykJ4=Z9O& z-6#Q8YsA}T8Mc8S#MW-Qz@U zN`Hf2V5}oJVJ(dLhZhURpDFY$u*1cVDR1d@xtP?+x#$OKhN%s6bWU@jU>@th{Ix;3 z;^oKOwwE6Ro~4vr+=Gn=Kovja3mjOtcE5}1h2AROzr#5F%0F>nv7N@=2I6oGHWqaa zHqJ!{i|{o%2OIP7w`4kZb7Y;uYedG#c5rHqe4h)THuOfd^sPF_p*Hx&wTpP)a^MZz zg}>m*jw}cWaE>EWKY!viSo*T#N>!GRi%B`yIg_!(oe45+7X`o#lJEa)cb zi}DN(GnA6^$cjbcT_(qqVWY<226@bpg?U%yA|V{}x#y)8xe4vP{oGl>x{!kR zP_Q}eHi>8qQsOS?I_cy2E(P=NS}X$Vj)U;O1&zp)uJZSsSd@@KII&Ivy%HzILj)aRhmYP9Q0cO|Ij6f<))=q2+snAZg_-FOp5VfQ z;`fT^X(Jjw$DQQ7c$sdy2!Iu`!J3H;lVXJ^UWAzWg)D=b+HJt^0{6$+F>7<2>lb;0 zQKNW{?{s19y`!-xl$o)RcHR=QPNJ9iFD`7Hhx2R50)N-qpjlaX#A>JLPM> z)s;*98s(Q$ZMyK+(w{nvk8x4l@7B@B&C-Mb1=0hre&y9sV7qKjQzBY3O zRNXYes_^+@Ja%I|P$$$^nJj2`S1QomjMFYletECU{4*!@<5ob~vu96L%zO~;W8In2 zrwTbn<2BnPd(QK&=|I9CxwByK%8$8YL-pcU-C2Ogk|KlF5m$Y~K^1l5F#nE&ddw)e z2E>`OUdePi?J|rLrHPrWNp}c`{tiJr585XY9cdsE_G3|Ss4wgrdgA9&BdkQQEmN@ zUKUA(<*sS#M>LhM^I)BQRxPdfIvJS(v=S5xk53?GzUAL~ut6^j5{aSzlB2=}VP{p~ zUj1a$_XEX>@bH#~Ch%(}BIGzdCqnA_f}iIbxQ|G*4txf!m#iEm4>x`kl@LkIxjfmE zh0rv<(3AD(q?qm9NG|%pBr&UW(Fz8XXBjgvGF5B3MVa|QPu9J2o>(~b9@!}e@}rh! z_>U{qP41X=+V$kL$r)qDL1M0I$9h8M8rP1!K=d1hlQzq zMV&6`O*6e*q~zN+ra9@FEckLhY$Q|6=Iwmh7}vcb4Q$1B^Etk3BvtW)@VL_3B0>|+ zfVEg6ekrb8$np-}v-g#~-7cQ_2&?136JUgVdsdHsFZHW<2S3&^X^{vO%2hWE4MUZg z=Uuc)?{E(`yqkP9lm>|Pq}LQCL`Fb?Rsex1`Yo>v_b>z(8HR@_eW+5Lwd$HHc-a69 z$81m&EB#oE+XPW6?k8Yk9rk10h7S?&b*A2X@uaDnsHlT7^9?4~gp!B7irWPV-BE>G zTNO&5^69S(_pInzR52oiitJT*{~;bvFqMacB7aWJ`ndJ@w~7d!t7Ze;f&?s#7X$cV zHH&i+Ji(sVxu-wt3OQViKYIxb*G>LxEzpOyJ-g+e{c0?Ovo6y$kf4Db*nB7;18A4benw0DJ7IlKJJEEPt&0$^Ep-BWQYMGJydugoO$PW;x7fTjtYh3 zU9RS@2CxnZIuJO(V{J@xCVOdWG+CNx?T{s5Vg1E{Q&4QHU5EJzwUaL$Uq!3+36DXi zI#N3U{HM_B$Nvamea6+ULh8fz)Qw|!cU*W@pSRA{# zn3n`Ge_UvG1hEh4O+K;{EA1Dv*bo`A<9X)e+4Q{8`Afx~b&H+%D{8EnH6uN1j5O}@r zAu3th2K>8kHuBpVR*LPsQp?J*-os?}CcC|e*T~H1tzQH$ct#~_2rOj4rMr=Y?W$XxHAK7ANIze5+(ITXGKPqR<7Z2%&RS2NrISZj{_5kby}VL9e=ePz znLz#9=EDsBZKF-!h*=T$PN++Sgs?*Y!wZKQi(JMf6}e3B=|Am{0x$y}*rYOE9m3Si zwu+w)VPQc&i%^Rby!-Bie3Mo$1{A4`jDkXMDWF0O?OU8yD_ zfe!P^P!<&KG6TlPK1yNu(WWOaLmBId4aHEE7+#udt3Q6k3nyMnDC?D&wXls6kmZB| z{X-enquazKwzlU(rNdBi@zTUsfr?Uk;{gjnI-J6wmEDDm4RowwYZ~$*3kV5VUg2WC zER6LU>be-At|TkoO;Nm~Npno=wLSl5%%kmA?UVDXX zVzjhZUeVtWJD|x9{qxFzU^`p>p#TG2vR~mZb-{UXlb3a2>#YBLGj(i$M*})j z3_OzDYKyDopXu0Su%SDIvq2rVg^RUuo~0{j%YvG8C#G>c%3LJZIMDQq!dVy3;ftc< za-6LYV@#)XcfKm<(UsufM^St}%bV50T9uv>y^=PjElryVP;F6b?P`$*Pf`Du2HE497NS|Q z^pkpJzz3|<)J>dIVG9tK5TSoHFT#;t7aJfj#bB-9b7%f=<=$>ZdlN&*N1Q-*QN~Xw z?l-Cx#nILIF2)*(Ya>|iwAy)Ssk^qurk|Kce~J>*d*o)nz7WHhF}0;O8?hhPXanrH z`y-JXIOw-~SVQl&0srEl?E)-3Z!=Gq=rGEcrIT3(Pkk-_Jc5Pg&PC7l%fuFH+iL~~ zi!kh}67{LaJAt@$k(_)mQMeXJ85mlnMgQ@9ja&j-9Jyw((xG6X?OF}pv9H@5^O@3O zkP~1DsgbO#YO%AAv;K|cc*16o6z9F%bst?7>5|``kNcO|3*3XGw#lv@zfg$8#Db6% zGi|UiQhLJ*s2S5U_8#6B?(r1K0S(l9xs)7bJFU*8IyxpOHbX?GE|$QYa%0?GTko1NJWcZlj@M0JW!W`j4IrS5kjF^ovd3Z6Qp+9N^f@vtyJoYB>ge zponrhXH$;ye#RJ~4@EKJ@nDSLcn?!zBW)8Q>0{@k5gB0#`NNkxt6g%e1ZypXY&?|j z`X#+Bl9b!vU`^Wdm2JnHAMA&8gLh}K{yXh^@;FO(soxlr4TQf!u2w-W@oIObjc!_? z4}Ks^wM?oD^Pa2iHs8EgrR_RDR;l<*we*f5@v97O7!WE4A$ODHv;`dfN zjgrVm$FP2r{(5z}i&IIFX5+AVSkB9*x3p1d8KMMCN~I`0RRDHsYQodtKSgko0O*AW zCzfTGYI64;Z`~PQp~=e%2tvLyNB|ua@MB__KGG~w7CMLm!{^x};zWp0FnT(qh^cGK z(vK(hV_~X8uhnar)Nna&a~^fmprGabn8D~Tvf(kGSz%!DdBQ4F7&5(z6TDH545Q!0 z;wcoGml)sES};6zye7==8;-KgCDbhqyz#sJSY&@itGj7?eXf?g^BG1Ia^Q39k>nFos$?08F!5{^MM^$qJoRI!84@PaHr&5 z{7@{*2ZwaJ$a^WnNNdeknS1i{}qy0ba92FLvgD2iXI?fCQZHL@K>Ki5u(d99Sv1X_h_g= z0$qk7GRDlOJ;xS9;BetN_9;->CL_ytSF}5qVkJ$628JuzIMxFqoa8vBZU6clrFy7B z$||3m)f0@_VZv|<*P(lSO&ohZR$Mjb;!M-G+LXPpid+c`$eMeUfdGdqc^|R^HFwB z{7u4_cMs+ntPgJf_r#yQJi^S{4>%{r$VCg8euH7AJlI>pl*K3Xq!=--%u^9&ObAOF zB<%Id=OAS1$wF75w`cHFpoe*8W`yXj+RR2eIhw%=p2-6Sv(Bz_L{b+oeR`#7FjBC4 z^Z3dkY!o%~(?ft2H}WS#fV}g0>`=B$NVkTvRB-#ehq1ZTgRdBd%K&7L!`J{Xl~@VI z4aFbFdVUm%^A@ta=UMx1Rdd^z@>*B0z-#F)g>4XjB+Ll+pG827O)v3CI|Hg_0~aoWk_hqGo7-Ekv8 zd;9ZuMz8}uLuZPyr24#P=BdZ|tQVNS-{o0|fQ@qTGx7qgQ2xdXEGGHvTttC2V^V|{ zWB1FE1Xtp=hRLPiu&chHRTq@l ztKbJ$T@VodaL8kVli1)s3Xu&|@CtLT^JT>>rS5igTwHN$V(;4Rpr#c+3;hz|kGAGc|v1B=hx}H%EQI-Q`S})M>y$xvCQm=**Ge`_AP>BiWSBwS@}!jilOj_>-V7 zD8`?H^@_FH@Aal?RqaZy90k&20q-#i47AyN#VGLVHt=sou}HRJCeKg6vT;F8s)B7# zTL)oRVsAw{?>?IKU`@06q|wMI^G`=3;~;)xG&1&mnlU<6WZd{~w<24RaRi^3$~t-b z&HVp5^d4WI%Ep1g*O-cds$KbSrpL{Rz0Ev)4D0ND(LM*cSKc)6g2FH%5Lo-#3X}m^Nbu0=|#HohqIlOchOqqJjYKv;pny zz^yg_$r2sudK)lP>0q+v(PaVQXL)qZ8LDZx1{TC$A_$r%@%a6B>k&O9JjuKzjrC&Y zqr7hh>+3V!mT1<6d>^ma;*t{NT-+NkQ}Jc#tT!{)wj~($Z-SEl611kXzD)78NbsC{ z?W%tx3V417rfM<&J%df}b_=^-886OjeSKUEI5a?7c8$DiG)8RM)V+?8^!)&I5Ly9~ zS#pFl%Z@JKqoT&HN_*5%9q%Srgb24V6_cq!3>Y3G$iOQF2l=(hY?)56ACDhEPG+ju zM!Q7x|54wJ^e~^Y71}vQXZXfU2vs)m?V0QZyO+fmPhsPuRH)7+(|)~zleT(0dWD$o z;kj_ql@@y|mberwbva>f4Ua5l4P|iJN3U|{EY>Mdk>#Sl27*c#DSQu@=ezuCNe^8I z9)|}dg3Y(jo#>9IhIEmNxh}94ZC7ll&31WIrqV*tB(6j_4i;sxppItqSvWI=cmq5a z(f&x~BRl90&GJvOSZHs>r@x1JlaRR<>LvA3TP+8CTRi9F(yDH9vlpnO*Rzn5?s`ywjRQ~y08--0mP6LxIxPQ(4AU@<>~zix^RD78abhIu~MPG?$o zbFqNc5P@g&;nU%!_lVeR4KUw);(gBD3+GA7Jq}g%hpFwE=v+2{|!s| z6j3j*Qh_ITc$wwKtQW*nuAlG~GjOrn&Oe^P0{fg0F>sa>*?Q|2}<xlz?;&2?lz0@E(Jw+2udUA^GvDY&hZaLUWGHVhfTt9Q`pD zWLW}NXS3Z{>xZ*hOuKesEo4|*yM*nA=*FG5%V9m;ZCMEXyGf`r^5=8dNUzHxKpC%# zjE-0mF0k zhg{O_eUq)Kf(JG^-BA%Pjg9N_ncDpGZ&}_I@V-j5L1(8?>U)ou*1)EFsdrtIt>8y~ zd_D`)ngh;$K|Az$`@O!T-5*w|U%s#S^LLFjKP$;oWHh(u{tK9?L%~VPe@OmO{Wv-;XHMt6`#_juLxf!f?=S8ejhrcIlLQWu5p4=>~WaRDp z>_oZtJRi7-wU0h6a>$dho3NkCpuVB6d75@3EcYbk)}DV?e8_mpj3a1hfsU`{){PSPati1wLsB^WzpaKtc$)wTg3kf`2^BCxu z{D-)KabC9Jc~nf$V`P`+qB%(ipOz!F9Z4s*+NvMh6s691h>U&`w-v5l#-8_F*#cWf zd`s~q&Em6{;l5SN-^U-1+B^k>MNlOgzY=}Fwv6?UF)szh0atq_>vW3EKq3E!qLq@e zab`L{695R)cx9yW9fG-sKTms&?eeId1v*W?8QDJqO%#yJzGD&H_}{rK)aS71y?B1i zWW5<9!z(l_K0D>%+P9w%%wy9!Sw(#6fY#~-t$~9;5QL@yh8*o^FO29UekhM|w0nF$ z3zBDwq;(KyXCE1$bW!@JE`2iCLBiQp8>_%R2k(==l@A8mOZFm_t<^o-iiBwCzal&E z-}Bi|zO^$I9<0tmJf(njjMt=;iUNLcIqRvd{ZwI!^zmR_GCPi4mg46ao_@w}xJO`x zau9T^hY!Vw`L19Q-ijBcLU3Tj#lX%Vk0{{hidbNZM$s?}v_PTbV1*FLDIID%V`!iL zDd14nuydJj+G>LoxX9sO>h-pSiXeMJbC6=Vr_NKErkv;M9asT(7gZ~mZ|Af&I^@~< zDQ=1-#pBj6Z@Yv^;&)cCP*yUF2drcoXs`EQ$vQE`HvZB|)?EnAbInc5Ry2YuK9iZG6j0*11FNZ5vPl8fM?UWhr<{*xSWWY%Ji%SF#yS z?ya~Mg8^5-Oo5MDOch6Is+ck-XG#4w;iWP|cQSQS;QIJ(0SHVp-(P_Jq~K14Y($5G znYQ*CnBk8X}&rtRI~I;vAKi}qV0W;9lbRT%R{L`9I- z2kvhKD)@|I)(ykUi&;$W88k^BiW;YZmac&p;dF{rD^+G$`!!>H!-H}OdoU8|Kw{GcE8&T|4402)|+B^&r%ktdHx|5qB|xV zq?M^Wow|$0KVw3`)@WHNdfbthm$E<)!^2vK)}gpB4h_-&%D*dRsZOe9IOor)470FT z$YZMLT(s8=p`D${cfHQKFx71S%j;}7Om;&y;aa_@a>yo}UjxtB$0#mgAgI^V;8&9zYZMow|STMK-zim@$WHBzy#3>t-~Z8dwPyVN_EXZ{+brP`8~FXng3r? z*8&$+vHy2wmgTj}OIbt&_pE@6F3948<*^8hAQp6k)V%p9$Ok5(JjBPnrI?s0X_Phg zGT_!j4ocZ7Mdkm}F4qD;;>og!q$(*>)t#(4K!C%de>){1{cn8g< zvAsO(Gq8|P@S@M?LM-%`Kcg|&9CTH5%+OMNQA{h5{ISnnqLpdSC=FgtY`Dj0DV7&h z(OekW+p6g6Af23@*hp@0c_*Dj2jy|PizXvY&7@s)GJ-O;bZ>uDJ9dJJ2Q{82qcCXL;)`7m9o!h2UAM?m7TUcT!)s;Bq! z`RVWI>JjnaEfMz~CACz1TjpF0U9z?Lp>6J)K2l6OUYqwP&zb|B{wt06reSrX4n9i<-l0AW334 ze?CEr5VbP(B$T{_e|{21gtL6!DO#p_0sUE=#~+`fp2^N7iJpP??xz!ZV`PDS1V_?JR~PM-KR&eng0yyzd<3V!A4i z|M&x@NHa%jBrTEULFcKJAii;W3*AI(7V-8LdI zfi^=aytS2Puq2f;|D%_*@C!^#=KSOrKl}3l%NJha43b&8}cHaI?JCPzA z%_L6qc6bjO^F6EPYHgScyy-HtAK-f6;qL%jI(MHF|;2lJWBM*D;I^NqVRB zXg;kusK%E3D$M7rq?}$kp(BclqCVFMcqoR znrDEardESl8lY+_C{m>0;P`x@nNd5>fG|{U63qzPy|2{If-^wZ2FD2@D=&wkT!P zcWN6jD`7_avKzLw5BT|Rkaa1)(+#!NI?)x2`X)`$z~C_I4jruj_IqvR1L#-F|52;2 zbzS|shO7`k&`m`2m7j6&D(=?M5K;=GFZ}*Jc<&wRPaFLBkh^r5%P&ANrU1vb7Vxci z=?I^aN!=ZaLRST~{to^;c%WDCWcN^qB>wYV>c6sNUaKk;rlNuR%mH(aqu}CVt{bw3 z92ehRU#BzIsn>Y(z1thLY`b@_E3lSoQ) z!}QklLDr{lmFvUiG#|IY*Ir{Sf0wk2fw%Z-kdVt-zJ+uoqu5IIxpS(rkYNB!#^!ri z?0R_9JvxM%@AF&tXfE~0=d|MwDwS=HlYulSoDu5fn|d@Z^@AleE>t-YkbxNx>Pq%far~xrklw0 z{SNUEMbmXK{MO2Mq4!qvI}fl!J;yU1f@Ph=-+c(R)?|L-Azc9VWYi-l1047Vi1Mel zN&LVg;JwXzAJH;!Gn;zpercQ)_+U}5vwm`%#EAZ%uhZvD*IF-H+|qD9b0S~(m`1|S z_S467qgTCnI!5a}G}Ez4B&0~=Nj946UMcD$B(1(qYlJr&ueZ_Tr2L&XSQ!Gz(bt?NqVgOIm*U>_uE97xBjYlE0EL>Wkf59IJA$n z*@ppB3QSr6w~pK&OWZ}wq%A7QDSv0%LP0mhznKO7G% z@N(D+p>`SU`+-Wf)J+mE-b$ecM2yvC{%<8q1#R3_vLH>0KrS}&Avo%g8yr|b=mjxf zr=IRnYt~-1Dc0Q|7H=(&hjOb=-Vh0aBC=xarm8A@u0c zhdHtzX_tlD9GL_flbqO5s>|osomd!{A75uyhE4r5XO^vX5g*4wQkD7(MD2e%2LxXQ zVhV9#n_;6l;KHgs@AQp}*2@u5C?J>Je5EU!iwN(lu51T_;z1_E!4iJ0W|zo%`2!7u z%h~h%p&N@sE|q9^wwPYDa8GwSa9gcABje)p1Mx;WWSOIxuHV*$6!&||Y!4}mI20IF zL7p9tE*UC}EJ^3=YSiW#D3kN^C zbui2G{7yVxy~bQ@NS{7>I*!xgIzQ$YTq~;0WrlR4@+UpnFG^`pnoO%$mWkonlJFi` zm!5fzXZo?}ba6gE;Kz)RUvKy^WXy!SKidR9n_q@t7NyAE{w$FM^uz##zD^ebF?$WU z(^oP?G#XIqis3~8tQ5-|8_GF{clW zAlW^OHp>O|vW$O5?`B%mO|(h)p5i z$Qy!~4+*;}Mo4cQQPmczvCp==ai}ntrBqC-S*X!B&JIaPs)0v^MT42Rf;R=Tq2OLS zf|)Pen_Px7e{F+(j5T7O47BFN>FXci1J!cNa25m!^Tpv9(2w}h;Vi`cZ2<|zwS8>@ zgJc`dB!_A+wdFj>z>d*B;`nU?tD)JCd1VNDCcsO;ORw9E3g^}R(s#$>$K&tfhqImd zfDvqTNaXI0H4-<$nA4Z=!I^xR_+ikz%^so5;(#deum~2n@@+B2y6Uv&_7IC3h7@1< zws;g=GTd?9F0NH76#Lq)+1uRgZCAu~sJczk;VZe3RRYuLy4YT-uN!i16WC$wqZj(& zHMnjO*RU5@+)y}YZ&0g3Mavo98Nnh|Z({8%&*x#IL34F{@@OpQyX03#v%eG7Af&$V zc%Qe8VMyaE8^*F6LYB+#jAK5OR_F6wX6yv}d6Su0B1-}|9!|h&??OE_Q0=qRMkgOIxfe-M6C>B00DY`{^+oZEIXvm3i+%}_| z%o_~=(@_C#Ezcqg1biQNmJzBE{Mj|WBZ~R?1_&ZPR(8JPTFw1BVSkO+bj*!)z~*r= zifI!H;i1)`*DE3P!P@)u^*=3>NEd~MdRWZt2T;CbN>dwfF3t@p+oT@0D%CTiy!M#L zIhw@BMzh6(Q%rNQRn47Z6{n^~%$=(0wIw8)QYM&`{9rWmU0I8dsE7%ScU^@fO5z&a zFE-b2^XkT!j-@(hQe&V&r_(8?MtI@m6ss=4v?n$y!Kze|$O!bGj4);BE@kQ3O1*=% z27RMak2ns6_yT&#!E{~F>mLHnkZzhk#!jyfM6uZ4ByEUWm!dW(Xi9TFwFLWk>FeVn zjDaAcy<-58H0zXFQ86Jlq8#Rvz_Rc7$`}@~@`AWI#H6JT5W|#F)SLjX%1Qwbe@<#L zm_!(#H4xzq2+1QKiiRN>8NkXif&x-Z84jw92_wm1F%?Ve4JK1K_Qj!)B~Z>*=Y4I< zQbpxEDk87ys^%5n3NO1EzS?luNLOsJR*qm* z&tbniL=r{2X|vU!ell^xGY#E$ku<>hUMP9ev>~CycH&5;^LA zFA1`+kG*z=qZXn~-G;D`ilzyk2p&9VVdKp%0y@+kXOylXj^f&I30prYNrmqSB*-;{ z*a6fQ_dRZo>NVB-!}mPpNFI%r)8becRhdlZDc1g^1niXy%h!XA?+xdsL^chq^ZG=l zSDp^f`&q6|#2!pG%H0#dMniJ6CbNyMI)zQ>LzfN6jOITjv-jxz(Y$CPJMN_D|C8fW z*aY>kge8U9b8-vkznED#e^IV(>HNZMT~NWOpaR|8%=tNUW@}s&@~e|sBJ~xJi}L5M z=mY$#6-MHNQ<t1SiE_n?2?0X-`#{_cO8Dh_`If9-ny7wCAxLVSn($Y T#uFe=_W#6td87o!XXE!@$>VRA delta 52673 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 ze8cN+flags); clientcon->connect_info.clean_session = (variable_header->flags & MQTT_CONNECT_FLAG_CLEAN_SESSION) != 0; - if ((variable_header->flags & MQTT_CONNECT_FLAG_USERNAME) != 0 || - (variable_header->flags & MQTT_CONNECT_FLAG_PASSWORD) != 0) { - MQTT_WARNING("MQTT: Connect option currently not supported\r\n"); - msg_conn_ret = CONNECTION_REFUSE_NOT_AUTHORIZED; - clientcon->connState = TCP_DISCONNECTING; - break; - } + clientcon->connect_info.keepalive = (variable_header->keepaliveMsb << 8) + variable_header->keepaliveLsb; espconn_regist_time(clientcon->pCon, 2 * clientcon->connect_info.keepalive, 1); MQTT_INFO("MQTT: Keepalive %d\r\n", clientcon->connect_info.keepalive); // Get the client id - uint16_t id_len = clientcon->mqtt_state.message_length - (2 + var_header_len); - const char *client_id = mqtt_get_str(&clientcon->mqtt_state.in_buffer[2 + var_header_len], &id_len); + uint16_t id_len = clientcon->mqtt_state.message_length - (2 + msg_used_len); + const char *client_id = mqtt_get_str(&clientcon->mqtt_state.in_buffer[2 + msg_used_len], &id_len); if (client_id == NULL || id_len > 80) { MQTT_WARNING("MQTT: Client Id invalid\r\n"); msg_conn_ret = CONNECTION_REFUSE_ID_REJECTED; @@ -384,6 +381,7 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_recv_cb(void *arg, char *pdata, uns break; } } + msg_used_len += 2 + id_len; // Get the LWT clientcon->connect_info.will_retain = (variable_header->flags & MQTT_CONNECT_FLAG_WILL_RETAIN) != 0; @@ -396,9 +394,9 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_recv_cb(void *arg, char *pdata, uns return; } } else { - uint16_t lw_topic_len = clientcon->mqtt_state.message_length - (4 + var_header_len + id_len); + uint16_t lw_topic_len = clientcon->mqtt_state.message_length - (2 + msg_used_len); const char *lw_topic = - mqtt_get_str(&clientcon->mqtt_state.in_buffer[4 + var_header_len + id_len], &lw_topic_len); + mqtt_get_str(&clientcon->mqtt_state.in_buffer[2 + msg_used_len], &lw_topic_len); if (lw_topic == NULL) { MQTT_WARNING("MQTT: Last Will topic invalid\r\n"); @@ -422,11 +420,12 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_recv_cb(void *arg, char *pdata, uns clientcon->connState = TCP_DISCONNECTING; break; } + msg_used_len += 2 + lw_topic_len; uint16_t lw_data_len = - clientcon->mqtt_state.message_length - (6 + var_header_len + id_len + lw_topic_len); + clientcon->mqtt_state.message_length - (2 + msg_used_len); const char *lw_data = - mqtt_get_str(&clientcon->mqtt_state.in_buffer[6 + var_header_len + id_len + lw_topic_len], + mqtt_get_str(&clientcon->mqtt_state.in_buffer[2 + msg_used_len], &lw_data_len); if (lw_data == NULL) { @@ -446,6 +445,71 @@ static void ICACHE_FLASH_ATTR MQTT_ClientCon_recv_cb(void *arg, char *pdata, uns clientcon->connState = TCP_DISCONNECTING; break; } + msg_used_len += 2 + lw_data_len; + } + + // Get the username + if ((variable_header->flags & MQTT_CONNECT_FLAG_USERNAME) != 0) { + uint16_t username_len = clientcon->mqtt_state.message_length - (2 + msg_used_len); + const char *username = + mqtt_get_str(&clientcon->mqtt_state.in_buffer[2 + msg_used_len], &username_len); + + if (username == NULL) { + MQTT_WARNING("MQTT: Username invalid\r\n"); + MQTT_ServerDisconnect(clientcon); + return; + } + + clientcon->connect_info.username = (char *)os_zalloc(username_len+1); + if (clientcon->connect_info.username != NULL) { + os_memcpy(clientcon->connect_info.username, username, username_len); + clientcon->connect_info.username[username_len] = '\0'; + MQTT_INFO("MQTT: Username %s\r\n", clientcon->connect_info.username); + } else { + MQTT_ERROR("MQTT: Out of mem\r\n"); + msg_conn_ret = CONNECTION_REFUSE_SERVER_UNAVAILABLE; + clientcon->connState = TCP_DISCONNECTING; + break; + } + msg_used_len += 2 + username_len; + } + + // Get the password + if ((variable_header->flags & MQTT_CONNECT_FLAG_PASSWORD) != 0) { + + if ((variable_header->flags & MQTT_CONNECT_FLAG_USERNAME) == 0) { + MQTT_WARNING("MQTT: Password without username\r\n"); + MQTT_ServerDisconnect(clientcon); + return; + } + + uint16_t password_len = clientcon->mqtt_state.message_length - (2 + msg_used_len); + const char *password = + mqtt_get_str(&clientcon->mqtt_state.in_buffer[2 + msg_used_len], &password_len); + + if (password != NULL) + clientcon->connect_info.password = (char *)os_zalloc(password_len+1); + if (clientcon->connect_info.password != NULL) { + os_memcpy(clientcon->connect_info.password, password, password_len); + clientcon->connect_info.password[password_len] = '\0'; + MQTT_INFO("MQTT: Password %s\r\n", clientcon->connect_info.password); + } else { + MQTT_ERROR("MQTT: Out of mem\r\n"); + msg_conn_ret = CONNECTION_REFUSE_SERVER_UNAVAILABLE; + clientcon->connState = TCP_DISCONNECTING; + break; + } + msg_used_len += 2 + password_len; + } + + // Check Auth + if ((local_auth_cb != NULL) && + local_auth_cb(clientcon->connect_info.username==NULL?"":clientcon->connect_info.username, + clientcon->connect_info.password==NULL?"":clientcon->connect_info.password) == false) { + MQTT_WARNING("MQTT: Authorization failed\r\n"); + msg_conn_ret = CONNECTION_REFUSE_NOT_AUTHORIZED; + clientcon->connState = TCP_DISCONNECTING; + break; } msg_conn_ret = CONNECTION_ACCEPTED; @@ -812,3 +876,7 @@ bool ICACHE_FLASH_ATTR MQTT_local_unsubscribe(uint8_t * topic) { void ICACHE_FLASH_ATTR MQTT_local_onData(MqttDataCallback dataCb) { local_data_cb = dataCb; } + +void ICACHE_FLASH_ATTR MQTT_server_onAuth(MqttAuthCallback authCb) { + local_auth_cb = authCb; +} diff --git a/user/config_flash.c b/user/config_flash.c index 4179d15..cebdecf 100644 --- a/user/config_flash.c +++ b/user/config_flash.c @@ -34,6 +34,9 @@ void config_load_default(sysconfig_p config) { config->clock_speed = 80; config->config_port = CONSOLE_SERVER_PORT; + os_sprintf(config->mqtt_broker_user, "%s", "none"); + config->mqtt_broker_password[0] = 0; + #ifdef MQTT_CLIENT os_sprintf(config->mqtt_host, "%s", "none"); config->mqtt_port = 1883; diff --git a/user/config_flash.h b/user/config_flash.h index 6e405ec..30a2dc0 100644 --- a/user/config_flash.h +++ b/user/config_flash.h @@ -13,7 +13,7 @@ #define FLASH_BLOCK_NO 0xc -#define MAGIC_NUMBER 0x015005fc +#define MAGIC_NUMBER 0x015005fd typedef struct { @@ -46,6 +46,9 @@ typedef struct uint16_t clock_speed; // Freq of the CPU uint16_t config_port; // Port on which the concole listenes (0 if no access) + uint8_t mqtt_broker_user[32]; // Username for client login, "none" if empty + uint8_t mqtt_broker_password[32]; // Password for client login + #ifdef MQTT_CLIENT uint8_t mqtt_host[32]; // IP or hostname of the MQTT broker, "none" if empty uint16_t mqtt_port; // Port of the MQTT broker diff --git a/user/script.sonoff b/user/script.sonoff index 37bedfe..456094b 100644 --- a/user/script.sonoff +++ b/user/script.sonoff @@ -2,6 +2,8 @@ config ap_ssid DerKluge config ap_password Bonn2016 config ntp_server 1.de.pool.ntp.org +config broker_user Martin +config broker_password secret config mqtt_host martinshome.fritz.box config speed 160 @@ -70,7 +72,7 @@ do publish remote /martinshome/switch/1/status $1 retained -% The local pushbotton +% The local pushbutton on gpio_interrupt 0 pullup do println "New state GPIO 0: " | $this_gpio diff --git a/user/user_main.c b/user/user_main.c index 44f1ad2..58931c7 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -348,7 +348,7 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { if (strcmp(tokens[0], "help") == 0) { os_sprintf(response, - "show [config|stats|mqtt|script]\r\n|set [ssid|password|auto_connect|ap_ssid|ap_password|network|dns|ip|netmask|gw|ap_on|ap_open|speed|config_port] \r\n|quit|save [config]|reset [factory]|lock []|unlock "); + "show [config|stats|mqtt|script]\r\n|set [ssid|password|auto_connect|ap_ssid|ap_password|network|dns|ip|netmask|gw|ap_on|ap_open|speed|config_port|broker_user|broker_password] \r\n|quit|save [config]|reset [factory]|lock []|unlock "); to_console(response); #ifdef SCRIPTED os_sprintf(response, "|script "); @@ -396,6 +396,14 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { // if static DNS, add it os_sprintf(response, config.dns_addr.addr ? "DNS: %d.%d.%d.%d\r\n" : "", IP2STR(&config.dns_addr)); to_console(response); + + if (os_strcmp(config.mqtt_broker_user, "none") != 0) { + os_sprintf(response, + "MQTT broker username: %s password: %s\r\n", + config.mqtt_broker_user, + config.locked ? "***" : (char *)config.mqtt_broker_password); + to_console(response); + } #ifdef MQTT_CLIENT os_sprintf(response, "MQTT client %s\r\n", mqtt_enabled ? "enabled" : "disabled"); to_console(response); @@ -819,6 +827,23 @@ void ICACHE_FLASH_ATTR console_handle_command(struct espconn *pespconn) { goto command_handled; } #endif + if (strcmp(tokens[1], "broker_user") == 0) { + os_strncpy(config.mqtt_broker_user, tokens[2], 32); + config.mqtt_broker_user[31] = '\0'; + os_sprintf(response, "Broker username set\r\n"); + goto command_handled; + } + + if (strcmp(tokens[1], "broker_password") == 0) { + if (os_strcmp(tokens[2], "none") == 0) { + config.mqtt_broker_password[0] = '\0'; + } else { + os_strncpy(config.mqtt_broker_password, tokens[2], 32); + config.mqtt_broker_password[31] = '\0'; + } + os_sprintf(response, "Broker password set\r\n"); + goto command_handled; + } #ifdef NTP if (strcmp(tokens[1], "ntp_server") == 0) { os_strncpy(config.ntp_server, tokens[2], 32); @@ -1188,7 +1213,21 @@ void ICACHE_FLASH_ATTR user_set_station_config(void) { wifi_station_set_auto_connect(config.auto_connect != 0); } -void ICACHE_FLASH_ATTR user_init() { + +bool ICACHE_FLASH_ATTR mqtt_broker_auth(const char* username, const char *password) { + if (os_strcmp(config.mqtt_broker_user, "none") == 0) + return true; + + if (os_strcmp(username, config.mqtt_broker_user) != 0 || + os_strcmp(password, config.mqtt_broker_password) != 0) { + os_printf("Authentication with %s/%s failed\r\n", username, password); + return false; + } + return true; +} + + +void user_init() { struct ip_info info; connected = false; @@ -1297,11 +1336,12 @@ void ICACHE_FLASH_ATTR user_init() { espconn_tcp_set_max_con(10); os_printf("Max number of TCP clients: %d\r\n", espconn_tcp_get_max_con()); + MQTT_local_onData(MQTT_local_DataCallback); + MQTT_server_onAuth(mqtt_broker_auth); + MQTT_server_start(1883 /*port */ , 30 /*max_subscriptions */ , 30 /*max_retained_items */ ); - MQTT_local_onData(MQTT_local_DataCallback); - //Start task system_os_task(user_procTask, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen);