From a98160ab971b88500954931332a8a20d09655af2 Mon Sep 17 00:00:00 2001
From: Guillaume <sagitta1618@gmail.com>
Date: Sun, 6 Nov 2022 21:46:55 +0000
Subject: [PATCH] mqtt parsing getData

---
 architecture.pdf                              | Bin 45702 -> 47120 bytes
 config.py                                     |   8 +-
 examples/basic_ohmpi_flows_node-red.json      |   1 +
 .../mqtt_controller.py                        |   6 +-
 index-mqtt.html                               | 186 +++++----
 logging_setup.py                              |  22 +-
 mqtt_interface.py                             |  53 ---
 ohmpi.py                                      | 381 ++++--------------
 8 files changed, 209 insertions(+), 448 deletions(-)
 create mode 100644 examples/basic_ohmpi_flows_node-red.json
 rename mqtt_controller.py => examples/mqtt_controller.py (92%)
 delete mode 100644 mqtt_interface.py

diff --git a/architecture.pdf b/architecture.pdf
index a1025d0dccfa2174568c747a27517452214cd4bf..9c53a687468d97f5f0494d70b9e4fbf0cb3b9887 100644
GIT binary patch
delta 26351
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
KOyaL3aQ+7{6$}Lc

delta 25434
zcmZsiQ;;Swx2~sc+qP}nwr!hV+qP|6)3$B*w5M%%pZRy~efGIHxyhS%C6!9mN+p$g
zl5h(gb_|>#4bYW|KN?N!U8~>U=vRF6{}l{gX5kI{L2mPl0Nn?>&(QT|a5MPl+uz_Q
zSc+ZC)T%K6Rx_w7S_vyLGx092WVxmsu=~waDK#@$LS@bqZb^PRczOHzknaHaoOv|h
z;Je$)|M6BirXVP5-?C;TtjFs?^tm#9tBvpax_VCE1Eg@>F<9~gesAzf*ioQZpxi%R
zDJ&rvFcoH}HZ8UH`KrF3Z|ylS?AZ(S4m~taY1}Sf>Z;<yK#zLUGg;w*oPV0U9~`#}
zyq(wouzcNKS#bEh-9#S7Hf0{#!c!y9Y0=&x^re!0qWpZ})4uVfA)Xvj)CwxC7rlGf
zZ&}vN1F|M_DjwlW;`fk!a=+a_q|hBipmk+g@juj9)~?e=#=2f_r_dd0^W^k=KlEp5
zgXEkv|N2N0^pUmE@*COH6HgU6A#)?d%(-2ir`PVBF;;gyKj+$<GAnP=x`Le*x0j@)
z`ZzS9xa%O<oT@NSEw<L#to===`v!Rgp*h&R0BF$raeaFrFA~|khAHd3Ys*y-Xo}%c
zTN{(-77+gk;oT9SrG26DQ<rx`D-isOpr)$E4b<{eo;!Y-Q}}tidhv-`H;*uio3EQe
zH4uC)U0|HNom*p$RaYRmJ!0C4_CD~aW!nE{B}dh1$|SFt+l18G8+ULYV0aGccy?E}
z2mFSxoBAs-@wYWu?KfNxkN9X9rw@k}4ES*jO1rt2ckU5YzatnwSFJ^=`!BoCG~D>F
z9;H^%sD^O+)fwK+gY9ERT7+C;#aX>JR0Yi=WJr4~Qc->=AiN_&6F=SNGewb_kvw8|
ztA2?J9M6(V+n7vb+NdFN0JkVbcy2yO0^k967*|t9KrkY3S%-OJ;W+@L>lH>=Jm+r~
zY)({WQKk6^_5HdWQ(z3C5Ek8Q7H(X&s|Mr~<@Hsvb%Y+>$1p?l=xqHJixJTwzY!91
zeCN%iQ=sNu!vmW9PI>Se-t+l5gX}{4vEwEX>?Mu?QO=DE2{)%+xS2PL4MF>020#`4
z4hhRwJ%0sbat3CZGa@nI?;i|0=4vo)Ry`FeBayhHR{2SR*%zs&oMw9E3&M7S7Rj1#
z%00C=kx<5jgL2C^FXq6)vfb>03XC!?qLKsGoGl{Nr{rkma8<$`&UnXR(_GipeD?0;
zlaR>RGc1&q@sapyyRq_;8^^{ON5H6<8p5&b&#5kLK7=VRESQ>qdhENF)mP@?I~ew7
zP3pID4X)qz0Xoja4~LX33hw=F(k~%QbC-?>j4w42h03DaMLC40LJ7NN{EbI-$7}m8
zIY)=3lgAE_)iG9Z`5FE4gPL%FP=h@ZfjI)q-%Kw}g<vc)@m`xTJaj!>Z$Q=anlX?o
zj8R+Lx(@hO#P@CVgS_m0gvwP1#Qd*99p`vh5;0Cn5P-DIbtBHu<19-MnPIFl)XsyJ
zG>H||koiHng+}*K=!|v^At#^h+7WB;&eZPk#u)D<AbR<;nLWeuR(I4BO6L6;mbY4>
zY5}W3==_6kQnmpmhg2m57QlqaaM6$kG`L<UtQ<X)3nC*vUMqrL19vR3Qz3Q<MllDu
z-lb<HCm#8?d*1SP$Wo~SBa8OUItCNt4TOeV+9K`>kd4evbVCgZ`wPmCPL;0p_yUV5
z1bO$yx~67~^9{!NI|g}J46M1GRutvDxbQh^AZQ(uPeio@<Z12B7C<7ePgJXza9p8a
z#zh#@BvnGI6RF~aEeIaSX(0m4-o;fSyqH?y6zoPF94JJ@Zf=+nH7S@zv<d_2y-hfQ
zOpp*D$q<*I6Yg3=cPwExFVf2gPQ00;Hy;m4WXsb_!DUQ?-Ws)sB2NvoU;TM@H<Vaz
zv*c5D;R6g+_=Xrw3K$gY!yVOybW@W?iOsgxs`kkzgsZ$u7{krYmhwMgC^{fo;1^o2
zH6W~437=P%44l?3Y!S4_YcjN>6u=GoO&B?acUTC4N3U+oTX27|niLZznwscAeBT!K
zu`0^O)u2W`J04g#d!-d<E}_dt8~$99?7dvDjRb~gj-Wvf0Wi;e8iJb9AAuhzWS3NC
zOXcA76!>Ki*RXGU#!m|gy_#;cbU=g)8a-WE{M^HQM=l1APArTXSa#kb$<mCu&P$_W
zjYkV3hkd>Fmwi0l5(1qTf~hFtm^3~%V$>H8R3A9OP|XZdSvQvnG;Rl##}4TNG_(Tf
zncl1MB#R%T89)XbXNL+ufrQjq^PIFIL8WH%YEo;9Rcfio7{$gOb3$o4A6ZQNeDSve
z*~J=^QK=Mr(sG@ov|8o|iZBn+2tAz8<PvuD7h->oCWO_r$*>eC6-ZVHEDtf#pwgM^
zNyM;v%wXyuE+WGs92r_Evr&WiqREOPaUt4lYCl7>FyN00-Mh~50f|=!;!6gNM88kC
z6403OBqbY7u9$q$lw12CS=SD-a$saL6lxi(&knedC}`S2iz#YcOq2Wpkk4dAmlEBz
zLXncBsB8)vz7fs{V+~|VD>L+7KNud1KjkG`B0E|MGH2Z+A)SR_By?HapmR<CK2veb
zAiFOTGa!45kQfuGY2P$qj2@AW<RYwLO$k3d_y(1?e2S71Wk~myWQ!fz_?*&HNLVLE
zxWlB<TkX<Rl}(HLkTW>~3s|1OwUt^8JrN7sMhv~UBEm>et}%eoxtbZeD%UEUkXI7H
zGzFZ2C{GdpxN2Ou9g9~<uo4uucc{h$sj;f<1t6*(u4I@P)?XsqBEjwxxm|b>lWlmQ
zyEwA?Wz2JWaK<alYi(kGe)(tLq|%on^<XRZy#<x=j#dnr%!?ml{tI9v1l@;_CZPQ}
z#O+YlK|`)4j%}9L+BB{E3!5<eX&R$4m($ZXzx&9iGX<rVSKM}zx+*fim!v+pMYy&?
zAAkkY52_Y~_8h=#gIgxxpU*oJKZo~66T|dgZyt{{)uLzKW0|;b+VlC-uYgF#Ju;UT
z7kxN;?65)vHLlA-7AVvO(VZGUb)9H2>>cy0X<CqD&@=+QV7eiYF!XN%<yOZBB=Eex
z=<6>|En}Tuu$p0{Ph{R*#B{n9*^Z2$0e}`hWr-rJJfb)JxjhKT9H{Pv4VF_)5&e$?
zOlY8rwjmZo<Z)x3oo7fR%JMxxebd5S_2VPgo{+wS-2Uclmmo3R?Y<nw#%T5g&-&W9
zB#sZnu#coC`mQ-{TsT#5>~*=v)-Qb?VZIyr`lumwsouWe9G(g{gDV5YD}4Z*HQ?#J
z;g2i=&1@d_rw$W6^{Bp1It5`driRZ$-FAFHi>oREiy@bYC?B$Yw++%C)mYPk6BL^r
zk@M!%R$mAFMiLsaB0``=tt%8FKca+-5s)!!*tkTaQc%4T%<6uxNVqo1)3!ieeT74!
z>o|!EnY&ZdT>Qi$ExQy@<+e~$VgL|m!T5TnERk+gDRuK`m-%p*3KK0pQ4I*omtrUZ
zvr=WXub5*|e!7X#SLRl0O=XxS%_8uCL0E~!mfg?>dTpuci0H63X_T_0yz;7c-Wp^r
z@lJn)uwJPO5}Qn`xFXCkP=okiU7qfbKb7_J<S&Wm$s$={wzWW(a?rop1OU;nULhZf
z!|)w!f)X2uew;_DWHD`s>LK|)Bb64b{nB40>hdyXf0|R|t$U6e$`>gL1~1vw2qQwn
zs#cPfy_*+LI1JuFLHYCLK`P-t_&Q7fPI=FTYf_8b(jwP|8)(oGOTa0Qgc9GLHWI->
zp;BWOFO{_G0I}~>p9?-GoB;xRSbr>ey0>u{Iln2T{-ReyV^qlC?MY!_q#@F_I;)J6
zIYmjzc8J@YgO&RB5xOpLqAIS2qAetrXDU-g+!hrA>6e2$j(54*y%Uara&RB565?5j
zJRhI~$E{jYNF#pgr=zBU5x+;E8U@_pWb#*SwVzv&?c}+!FsRv&_5y(K>l*Pjd$YBb
zR$IF?n%lI6*+VDOOYdR1<Z2;%4A->FR7<a%a7t>kpZPCqeQNC6(Ha|-uh*6rt+PjJ
z&~>b<M8H~YQBOTQF{<jrl_IyASyS^=@2uy_RUapZ)0SY>R^KaazWfZO-%2ye8^J$`
zw{5_T^V4KRx0Sn7C;<|ur5qFQVTsm8<0D9{;}^?B$}cqS2!+6qIseu|gl8l3ro<O{
z>17_7a9BqaPpsTCQkbt3sH=MPvwCEi?9&c?B~BxdH;H)AV__L=2^B6)uraAu2<E(Z
zvU*|R#!5?ei?TJ)Ajq95twfmDD1&)j(@G^DT<`){5B{b`3($oxhlJweA=h1$ALHq{
zT)}+K#PZ_0I+C^mbIcXMFCdmQjkOURS$MddbJF4rgTizKGOE3XwztZP?|?-fBGaYA
zKoQr~*K@&ev<st9_v&wjUCikTnX2Hcb@bAaGZ<WP&bAvi>-P_xJATI<V{-Jmm_x4<
zFz7e&Scmg01hi+~9GYo4jUDbpTh84fepfdQeP0&;4!}4v-3>d{tsZ*0V=gfga#0-i
z49p$(!g}k2n`6>9EH}B^gZFHFlD;nTY9sv&3bSB9--n%xvi=w5(%UCzG0Fw+j-Xu0
zKO_QS2hq62T=KJTni;LDOC^5K7A)z}AbLp|9QVNofY{H()a?_)H_<EyINTvy%OybQ
zx=SyD>4rZlc46VI-Tj#-n<iXq7MG1k>I%y~{$2{0s*7mSa5OqdmZQ<tnWV>X4Ax!7
zcCxuS0k%)OPywk^I?kKqs%uPwj_pv#uKm|jB1h+7R9W$NKz3;==l-U%)dw*BB`!)7
z5=JjT&p-(@ht9M04+{g>Um4%90Tr4?;~}|!F8X4WBymIZA4!Oa-=`$+g87C!LlMxB
zOG7jr`1m8Wjz}QeFJFEoY2vqA(8kMrfCY)BbS-LjyuqS=zUr<RSC_PE2og~B1LV3<
z2dmKP3m=y9jx+|on%C(Uw0koChfUF28eIU#h3}jV9SK`e3|c-NLzwO#md85XI!q!A
zvBi#!`ZgQQ%svc%#cLPs(5Cy*ky6F9Y1wMU)kRBPXtRmw7HG4=S0RJ{mOxDJ(v&jI
z=3|yAX$<EyiL|v=aW=X-)JqtSsg|D+)uM;>ra0ZGhZ4GS1R3ldYtd4U?*LR&sB&$l
z3AsPGB9+3vW_t7fs*$lzio4(M!^|N(wlec3RonFwJrq@HUU+ip*&CT^V<N_q#8_}x
zM?<xSUF7C@wqD7i$K~Vkg^o^|+lQs_`uvT?!sF6%&Fq5u<?v9Ay(k;9LgCxorURRb
z{w<D$d_G26)FMtVdHMe8jes=rY2{ivGMHYna{j;5zwO^Q;8VAH>D^~ZTkI0Z@J@5>
zI-C9Jg!YVx9hPs^gz?kY2H_cQa^e!;g00!o85W*Y^J$EvyGWn$7L$LF4!d)3&b{~V
zX|p}zKH_a{8c21C{#_hJ1uQyEP`&cU83J@bXgP7Z5HPA@F!FRpVF4d>K>BWp#HrG&
zwKigt(q7r^Wzv<B%}5j7UGMiiW9>soy<x~3OvXR!6W8lhEWmfpHa9!|Q+H2;YPIKy
zm__z&tE4v!6_*H;_f0M)iS-!31V?zQi2K7{D~vafHl8FAv|E6mZj<U_4qfb18JyLc
zcejt0j`ra80@*9nSb*DAsbt@om5)weZ>jB;&g98JdrIudPT&49{<e-6?yd@cFFk|b
zRKaoSEn4JPdotR|d%+##UJ0UM%NlB5&yF`s){DCn=uMcmek;pG;c@MchX@{yv%3h}
z6}*|`jQy*%<t|<n;+{zL8qB%@jlsq-4FXM-xd$bKK?mJR1Ar&xro%RZx}7Jfvv-S8
za73sH#Fc-1po0=D1hO>1EN1ci8@_w5=luOgVtrE6lKF(d4~0KX<~6g>`uC(&LW*kt
z#quxgw;Bw{4<9TfK=?Lx35ne}em4e!noKuh6}3&=ZbBMOptud$O=+7ulwgb%tPbyh
zx3BfDF6?j4FA@g1`OY$EGka4PS7$RLyZ<N$V{2$=7D7hC{|HuAwq!D_6ksNf=HFO-
z@X1j~bjjtEl)y}!$qSSL|EW}{%z>G>lKJU)lND&GlZmK@{-;SybMrq^f%fX3Z04t<
z1o~f#BzcT};eVQ|3`M9+|2-)$FN3U^y@jhKAv1F_z>YAv0zktS2)zi|f*y@b844c4
z{#ZLdN*)j)?Ny;DIxmEaT3Y=23kg^i2&odjSLnhA_gYddhv(2_KN&Ir7f{>ty!la*
zcp}CoDx(c4<EsV}T<C)nyaYuw1_h+D@+V?E%{L|Rm|i%8t+lW#6alZ}0GCLYk7)9_
z3rxmlEnl-E3DJ(4NW*ny4YYdd1a^+pbQ$c3sR|#+V^p0Q3X2c<!s-czq+N8TT430l
zYxSq4ppv@7?C6YEc=X7yht0|8Hcb)FhcEbvy(T(#Ae7B5%M8871F<L*#Tr_IJvk0v
zn7mZ_RnbN6EN|ii!PpO%=u$L!JwOm}8lSxNhBhpmw&>G`;6cWeOcwI!OS3}1YtsC^
zCta9CaCHQ^A+q^ixSGIo+gnX=N%=<N6_$oie!(#GjJSctU`MPozSAe=L82Av+h+2E
zA&?5GC+#24M?k7jSPTo!@a(OE>yy;|c2TqM;+edykS9L*F#*&q5W`}E^}q+{%+Hj^
z&Qw@OGbPiCHrWP;GX+`HNV;MSpBAb3%#^T}Tq2XznGnAR?L@OMx(PQ}cu*kLU5`(y
z7vs;C0_nt}tL$T}IQ3yp`k+BFCP*r-K{4Bt%PW>sC*7ou-oVK`#VY&o(Cmy~K0pgm
zP?~+ZTuEOz`FWCP1U?MP^w9y_7v>=tPboboTNYv{;@rH~WwP)n>a!QSzO();U({zS
zJ6|3Bv5A7FkjrswtvCEsI~>)|6fl3R=tkn&&>CV1ho6vCa6xeAx-u^osz+g!vQAYV
zaG?buRf!QcGfI)eh!qp^DCE)P<yE0=SyRBy(>kNCiir|pib9|t($fXV3SAqj)}R(+
zy+S?%X^8ttYWYBwDwI7wDF+GRN{mYBb&Q-vO4;8LPUoq|9X};+|2qTl=nN#Lbir#O
zHJv&ez*41?)M;bT>FONlYDBS&>dCE&e2nFg!zOy9uxYIuQ1Sl4UxgMP2BK#ahH6}!
zMMx)fjU=LjR~LU<9ftyvap^S-Jx`7*X89tE#ziNYt1>Xvl+%oZNx8Ksu4gVSdrk`i
zr|Tart9Moga3+gw5x3f!LThV1Bx3W<7+*@x8gvx4oQ~KQWM4`KD<uACGxxOTCq?TC
zrzmiAjI0ts!jFCJw0{u|aEd0{zXnQ<P_i&VFHPw!jwyw7+1ml=oTJ5RQ)>r;`RE>Y
ziUxMNG^*|3(2BYu`*5{zFTIR%Nwi%R2(2q>!f8P63NhpuBFPo9Rq)Lgqle!Kg>UQo
zudojtv3#sP`$EYp&{g5B*N>By8?FoDr^lpQ%(OdoF(!P+`2S2jgBHn_hMY?p(wZTc
zkp-UH>7R>lrKJGU+QmB`CswY7mtVUKTg>>q*J6{5w!<o}CBmn6teK<UHh`pQid2)U
zafT`L1EmMm{csBQB;~Z>T8ciD{C!XR;hAH|nf79BN%=#s2Pa?m{&@2+BPuP7;BO$A
zr%3oEH|)cV(y4cFP~hl*(kvLlC08&NZ(J)bU*^r*=t%);2E!JeH%WJCt@AL+Qq}I%
z7cPal>xTzdC#9Mokr`fE?nQ>TmRdbZ&em_pNTdvtL~U~;^wX5qwe|II+|;?NoOV~D
zj^Q<yF$7^CwvX9>Cax4khPrT<xqz27%u~`+x@5{`=m}6TM8zd9J01sR);p%~m~mYD
zE2#Cz(pUiS>;WO*pb=u4jtZFJFBQysq3J+q@`Xu<@|YB9!NH^zN-<}QjSc3?Ir3F6
zCX+JPtc{!laztv0bHm2rH2X;cLo8UL(RXo;q0-9MPQal?&`8vebCDycr00wDTs@lC
zbxsi5PsYoq4C$lfmEqQ0b+A<r9ku3<)lW+3Rgr)W#M}zW$ryAmT)$MDp0HJ)>XGyU
z3W|B->PbE2O=>2OF)ZX1U*{A_`b!)W*Lh7sIZKXF{e=LPEcvt59{zmR%!~Szj1CHo
z_AZ&JF(vC5igq6R)OY4YWXen?BTw?MHYlH+2J=mQf*Pt^J^%55&h0F$;}1+ja&>vg
zOF4ju?i*1eB0(rKvMR7Nno^ZyPML|A*g0OfZ%B(Gtpreuz8fNBXeBZup&A4hmU#lt
zWC7kAWH6@u=qvIv?w~4jP3Yj61w*3hiOe5A>io@eGtkjS4AOc2knVuaa_n(`I>`O?
z=-M)sTOrGh>Sr#~DD;xs3FJDe-|KE0m-m1#?Vy=6Jf18<zj?jOCrevhb?6c62_<`&
z<#u)Ok_qt|OYF~J%8s$(%<V%Z#8CFEqq<DQl@1EYTVN=C!XY$d-AH<9_5Kq&OCJC#
zDME(I^&k~hS@*dmn=geHb%0Rm%I%6H>NTi2ac2fclc-b<f1uKBO^{l(XPSuOKqTN2
zMI7bm6sJf0CL+f)eIeD>6-&X9?UW#IFmGSuvpZ*w$Kmjso(uvubK`-IBjI-*DH09U
zvl%uTb`c@_Z|PHn3fP(r0>fH6_jSu~be@n)MJtFtJm*WtNq85BG=Y+SkxQ^V{@kEI
zCj|2taE-c1yvzgqnud(p-EF1q{(QjC-OkJHih=<_=R=~zTD{MHquX@B`uY0WJ}^l#
z3J=Oh_r;aR&*7m0H`zwOcJxO$z|h}}BDJ>>y?CKSIV%N3ISI*DSz8k*l*P47Py$+1
zWuLa^r9@Bz`Vn|bnJ@*|<#=v}<6oH?^p<-A>$z8s91G@Hvu5gwC21B!24KqQ7i$%U
zRM+`_KA)+~=_zTo`O5hGMqWqbP`~mj=gHpK*=A*a7krWa_PmU%Rwpm)wqe|IE~XD3
z!0W~TU=-H1PPbI96l*<=T6P5xt{8G4M~6N@(1O?QmXfDgBcym1^n>6daPk$r^mE{I
z9tRHLdyax!@HR|?$l+tk02;9owj<8ksk{-y7+(5u5oDhNhCojF9K+bJ$<~j6IzbS~
z_IVv=K`2ma8n6D1kWyNA`u2(%O0#P*3u&U4iYP0@8{cs#cb?FMFxxx_DhqDgJ`0qV
zBF+bQ=1sT)`UAAm-2rx@J}t)?YZ^UVj<FMcDdC93$8q4;*$I{e7)t#7jE<wwS|sI@
zIO>RLT9Z1#{ew5W-o4y?2LU$anKlg@db3%-9;u@o*5mvTWQL=>!L((+``zE0SvXRi
zu@k?IY<HnQmxkXNG&h}(oyYf67Ml98n^yBPPUrJI-;+06xYDS_8D2-io+N(qF1{7H
zRH0lM$xX5|u7w#55NT_l9Dsd>z_einfo3)|0S{sB&jjMbnokA7!y-grI4F#~d-AsO
zHSPpQaMJOCFfSxYqR50tZl+!Re2~qv(YOSUJ9Wm_yBoEUu<v;&D+RM@+is1)+WuON
zt{O82(!X1#v=_B=e%fB|TsP?TG<#m4Bj|ae#+%d5@zpp0bSM9jDXz~@qlOx*T<*?m
z{zV1%>s(1B9b3M#Py|ki%~nMu8e7=f(YQcuXoJ6koy}HtNHr?!17>P0oH~|?zyFB0
zK6K=u&d$N%bVTpB|Mj0b-XHAQ+9Ap%ybc$m$eHxvKjfJdx3{>$O?=K5NL>21-mmc#
z3X_e&@iWE@fPMK*=yE^43F@AOloIu3ZxoC6%A}_W_F`=XPe1_Yb^DMskLabMUHG|s
zhGBT3yJU0l1bhtM?8ZS0-fsI4jk{(0kUP&~Y5qp|uJrlE5jeq%Rl{2o-20-)GCZa&
z$A*y`@%n7T5Gl5U7*EDk|HeTLUf1PqAzs|ZkHlj!;P++khSR(LAN@)FCjC4=D@;HT
zMx%&?F_xfV8y+lbMb4Uqx%#KG^-FGdU(O%2bmboox<3Ov{A&Z~2zyC;u=q*gvj)HR
z<woE5xi?_APtIC9v9uKCI7X#;<R7}IY!^HjMyM&oSI5k)uGK%MhK}8Cmf_xHJySP)
zzFRFk04d6SUf3p_!8SI~vM;%f$*92vG7F{L>!dzO_@}{{E1B$NgMU>aONHI2Wu-$C
zD+$YjxX@-xg)OLYWkRn~2$P^wD;a~4F_i;lLc5kwck-aKDK{0i%9U{0zY~hoUk+$k
zQn~7i<xJfr1+cw(cEZ!AC6f(ZIR`382hMz{0Xg!w)>2^Pq8~4%!a%9{CC{5pMfs}$
zqqM1!(@qRJvj_Cy8B~N>XI=bQnJS#70jNc2nBabPeDUD5@j2CaOyn(B4cj41jHxSL
z1exh`=v0iMNrcO~TAY_P-P=Yy9-Qnr-Hd_yjs(8vYatPW_J*6UZd|)(%enSX#uhDR
zK<4EXDy;Nuzt%K&9+?yxP!g?n!4R+#Op8{*2rv<hs&>BvP{@mPu47F!6|4X!9f^W8
zP)UL`40IgVn=P&T&4Nj|{`-FEhw%^dp3}3G`$#ApL*L!?h3!-5N8X!NDy~lxqrgJ}
zFSg>FzFH+3?+`NFl#7&gtnfT{2y&nnfC3l27fDl|5r!mG3fSWiwoqG>&K7wy)MU`=
zAg2JEMlkCaHqb1TqjG==FfU0zIZzsuBAp=o2y)a_$vS%!oKlTKKq4?E=sxK94f4JS
zP!X^#MuFHb7IzG!byg$r=e0P$JLR?P1{wHlCed-E3^M5suwNadWZ_z5GO`_i0O+1}
zZ!V|6dV_$i>n0t-6Z2v!CO$H^uH}98;Ph{&<3_>hA0U%>EP((v#}9}`p_s7Bn{U1c
zf@zeUe8!=!QxAlcRid0|U%tOe{oAf-3^*;Drf$qr&fIKBploBCm)hi+m5`(qD0v)e
zpe3N|q^FgbO^Vb~wp}rsPML&$01<Is4Z(r_(73Znv3Q}m6m(_T3@4->3U`3*z0%15
z;Fr%nLc?8oIeuhpC<+4qfb2DYfBoxOsRY0L)i=n;RTJ8dKyA8dZm3rao{InqmSEaz
zR8lPT@h{;P?b1ZI5=zt%Ji$*OqhA@FKp@NBJu3wBILkEx1#Rx!1w%k~0QmK@0Cb2D
zT*dQWeIU-bj#B&42&Klm+n$ws0gOBav)r4b9VJIwM`*EWM6B6rL2rd}(W?late8IU
zmv0Y%@V@SXJ<pdaI_TFm7>5}e{9O@8;<5mAaJN2N2fvd<KAj4J_CI#KGa%?6Wd~VP
zE*<GjImd<3;VQhYw}{6^02~B5-Vjg6`-0O0TLM)a1RSr7Nf89QMX7_H;V-^&2W7?i
z-zA3~+FNgj0`a6!c;QN8_DLewPcx|Da4OVv+<xd&f9a@nuOkAVtpWqp6ERbV%D_^j
zNvP%n_18*FSZm}hSgk*SiUUgyiX5)SL)&!MGhpaC5hp_@b#G6F0q|h6J*ua}GHP+~
zx%qS#xn((iypdtiG2My9(1h{iX_G|c=_wY{&zN>f9S|0<P8Wuf*Pb2FDcs->te%f|
zSAe&>{6d{Hc5D6Vpp~(`PGj3Bn?<%27u2XhkmhQ9=<Y6GHKkCmwUhEKwC(kknI#Jx
zqO03o%``w3v#BK{U`O5K<x)Z#1UFfQueMt`j^~YUuW8PO><C)<3a4BZwylI4R2UZ>
z>~sPZyxILX$_t@8NcIr|rB*c&iX?f?Oh}#V*?7pLtmQ;VkgTBRHf<7JH!I`wNzvC%
zY@F>QVS@0{c#Q41u_BamQEdu`k~!>6u;%mI&!z80iA}a0z+`Ik`1nDCxBKrV!tUme
z&|i~xwb*uX=M%n;gSZKif#%~0o;4l|xooDPQw1#E$1d@ovhW*C3;N#c&7>M9jgoRb
zH@k$B%|(ASzr`^9fX-(^{c@B`Orpg_FA|eP7rQ`GEliA=)}=y1JoYjXO1zx&`DA##
z^ZCT@z2i++Kx2}#T?<YaSbO&`$`8`5sOZk;rm>!wsEu07(~fNld%nB-M4jvJuP!#7
zRoYbLE5TG3uf+<yZI8zOmE)&olfBX2*L%%V41%7ovTg&@)dB$ul=iuTeoFBc^Jx7<
z)BVTcpd~?VL54a>eX8U3NvysZ;v0i&wM$i}JViTgfcIv{ys^8l%f-N>TdR};Y0vhq
zA8%uy#auyejVWX1ISy08nX7lUaJ{5UHZ6D1RFX8=Vy%Bv%gSB`cp<A}nUDguYpIZg
zwyuib9|eD2qrQp?SG-}5kB%X1VynrM*&tpn><N^hnc}KIpLDx9vkdnUdi9O3Q=RMG
z#m)D9KvwDR3yWZ^%jt@ZhxEaz(`1hrX3@HU`SdY<-lqwiq`Z`lgCCBQdnw1@8wx^b
zH{>bCC{p!eH5P9$P5jkCYdTeHqcC)GE1~5eEtnkiu9n+E^f;?RIhgGCrEyR<X6?}@
zv78de%o|*2kH_%(;#*|sHA^E_;@#_b%GZ1-z@p594De`us4X34i(t#$QOzIbt)so!
zd4E2k2Xx&ek>A@HygGJZ372Np{84o0ui=cNd`Dx&+o?Ofh4u8>)7?RB6+^Y@X?wEZ
ziFf==sb`PWQ-aZXj`B*WRV<mT2LV!%6QokHpb@#KkKnR@*q&ku7TxW5^CQyk+qP?l
z0Q->A>7}zDzsK5IW%Zg_KLZ@+KkGI4->XcQd=A)xGgPK9uKI4;wpOQOTDJY0oyKq+
z@Uy<xO?XcEG+RR7y9i8zam<zsT`~W%WTR>q5xVQz4*|6%wT6InK>nO)rAl$vNT)bu
zxm*K&9`a9nLGEvE;A;Sv6CeI-ZFVRR0B2jBOMJ^P>JBLTVOS%Wm|rTFAM0C<2qp$1
z)PF5#{z}Ai$spgoPUl1!v1;cXYK97ffg*Dckb#}Lw{i5|rKTJ(-+P_w7f&^z{WY%d
zcT*Uwq1*0Y@bGur?Ir7FI51Y0mok5K_G--{ZS0^~gYK>(ZU_v=@YI~FKgQAx1gO!*
z`<U!g1NS4dnfH?`1$3sHBc4HFXfRQAbkNqlKCyCq4u08QhkC3-yrJos9O6f5wJCo&
zX8_AeV5JNTp1g`1eOH=kg4Gk#j#Z}AOjL}R%2t;`B$ib`eUfw91i_=&vI><#Im;&4
z1%==&rX<x>s7B~62U7_U{LCY10WdDon8iwkBS&J0w!;Km_wLqhWCzNpE3Ucz0+DQD
zeYsRtHn6GF<ytuZq-u9Dvjgwa<cO^ebe=&76cWIW(GFCSfvD`LgU#uvK&9uFvXSaU
zQ`mrPg40#61$`LKX&LYbMQyX}wA!mX2B$4`Z2*A`M+q(oLc)e51y+m&0t!wb;P*9`
zElPpQXbh8pQEi!LiE&}|h?UA0FH=lPN(>Qdb(@Tx=@aE>Gqk1?XxSZ1vo4arl284k
zdT>6<e*3%=HM;y1a=>H})cXG2_{-by%Z2^KZ=v&}5bpz8qu2Q<YQ#;2*YT7<AZ+vT
zSSF2uCWniBD9isUN2i?M190i#qgR-vxU^zs!slInI*B#o%s=BN=eHy|`X<UZx3r|M
z(uAKYR)3l*tp{cf-Yq2y{+Zk+hOu<&UtVfHi>HvC8fIkZ8o9mJ_@LMLCXs2i2egL7
zgZUdpJuv?3G1lR?!aWT?5B%sg0@>E1t4yDNg8#v<-+p`nm07~oYk<ZHYdRa#8R}9j
z4Y*WjR%)1P8FMx7d2Fpxvqm)QTE-!0F?CF{P*xhv+J3Er9JFuiP!siai_k0eb=%P2
z$SKK`WaQe=G_0SNp$s**g=qTCgAXb8t!Tt4EesN3L5B}1JLHpf1JEoemkIkVX#8b*
z#52k2nl_>4G=gMTEPz;OwiDc|znI4h!XH$P!ti3nyr)!Ea>h4PfoAFzW!n<k14g0E
zEy3-z^YXt9<Ql=$4Pn&@)x8t6@1p6}$Y=ydN?&E-HQxyu9=95|y2Wp2vuz${Q`;O|
zm7lM7b}kX|8t$=~xHqzCcRFTn@T62MaR0{iwBH0U&%BOINl-TBP!!3&#2xT-xi}s;
zZg?0>&7R}mE^@Pn&d%^K5xjw4<qK2$n#d)irIP_-^Lieo6+B=cIWs&zcq$iY6<R#S
z2PL^U$!omCJMN=!fN40|$Kw6Q1bSWfP$(}Rv(e+XUno&}Z)<!vak75Da6aU9=bvtt
zc0h3TDg+*2l2xlC#hsSWQDmf57K*}|tR$3$Jy?6{z=f~eHejz-8g*i4Kzn~@7K8U-
z|CI++9_V>9b_u~T3+Hn(ioN1{r(qXS67aF`i6}wZ7WD@WV_jH^x-K@aphrDa6J--~
zQ>DkY*kHxQh_YcW6XtK?%i&I{E2{#H6d_I;;5Hjv-=3Zr+;MJ1L%(0PkdYXsjJs%M
z%%&SxZtHDpoZ@Y3=(JCMq`v1lyp>{>LnHvadVN<7o2!<sY0Qh@d*DD<&4*$zIbLv;
zuvGa|4O*2}%KoalRjO*sYPV{G)v-+!1=HI_%59D)_vwOwqinx<jhJQ!xgf}!+{1#3
zq@%iOeXKRY6#OV)zW1+cHEQq(MD@IJ(gr}~i>$KE#lEI|a6JoMo@#nrs!8^Jzoi47
z2ao2Au(y%?+_#%j??0LiFWtXUaD#J85`hh}mO_5}qgAuqonxgfM+Jl~!PP+;(k>Nr
zWTn9(mInJL(cM%@?$ws0L?P-sZ@i{4kq}i#SrOWML3W1xfV#vIgzaeYcyDhvLHuxj
zx2~Te7>he!Q7~Rt3XFdHJ%6k#6ubehac`$D8skmqu6cw9^;Ru*CB5Ov{Xv%wo-K?S
ze8Hv1W4@@KMJ^2*IgB`Cr}D?JJ66{@I@a1>mthqgtAB)ll^nViG&Nd^QnZt-HaM4d
z*GJ44&+Y503~w~fXk0Z_uE@vXS+h3Dvs3V>Imj?yOrL)TY!p1af^gF){h0;CfPg_@
z$8j>=M{?cT!;88YlF%jN-sVpR#^GjUf!J})CxL8m70d-TbInV^Jklv|Kb`2w5}!<5
zIP85%^{J(28SIuujq-Z<)*Bbq2aCsHUybOc1jhC~CcD!f21;#xd>5R`PE`pRc7LRG
z`@hbh9N=liMEQs}_IavVUEl$tIZ|rr<7Twil9ZX@Mz8A}exY%epv;8r7syR2@i25_
z;|%q-y<5)U=;ik)`(?a$HJ{Q3D}`oA6*9;%X0v(sWF6L^<JAxLmk&Tyn62=q<}pcq
zsOz%-!P1$8ay54#?pQF)q1hn8(<7Zbn|+9T*6v1c_g(JSMauXn-_ih_?%a>!>;|<+
zQGXyze^mGW_^WwrJb`h0&2Bg{Jh6=$z)jz_BE?GQ4jW~Su+UD?tYGWU*P$CW{z?Wt
zS53eZi^r;cB)pRVl83ov;<NS5%Oj^pzeZ+<v2FbYJwR;=DK;n@Sg$f)9^xhUs`*-7
zuu1Go%_zyLVhrP_C4B}U0DI0DCKSO8h3i~s9ZVj4K%Iqw@Zt6?uFF!)Vdysm3V;L;
z<f0G^pQmz#vi<Fv*QsQQvL5j(6?j?_*VnjLCL5l8BYNvBvrOm~hDfMLozkg4C&^3|
zn$L*V6-QKoT4-{Q*Kc(?>cm{(p_`xSCjEwrA<xMhaGaCuHu4QX=6QpziP(AJJ`?;f
zzvS<L(T|ZcX2#O9h38%HtNZYqAa8b*^Ns$Ee`r`+p8$Dc8mgR0YlzFb{s~m>)#(-d
zmXgVm4F|4-q})Qujiv{kM+qAxt$igJpd70cQ$o5*AlbzIF*ckH)4lP<ybui$>PHcr
z6DWM2)tXB4IHv>Xa`*E(v0Y21P(e7)!eMV=4E|Zx>J$9^1m^l+${6Ib7TmSL(Tf@%
zh&fh@Suv!>H<oU!bRHSSsmw+W>xFAk59v5T_eeIh-Pzal!_4Amd{0(rFLAj}kw2>M
zch3R5ZD4%$QRKK|(TBHohSenbA~(aIon*#^MuaV2jFtlE(72;1l!2NI=F9(RN}^y;
zt5ak4CaXx1X4@HzNUD~iIJJ8`;uY<gR`{x(%LeI+Eqwc)@oP5y3nz~8g%=3JK)+tg
z>7DZSM%moUGhKhSJ2L(1)yYe-CfVmA_)(rv;E*F#D^E-%MHQ!-oH}1JPI#6aaSX^r
zH4?o{N9zQ<fA$yN{C0{?ocS?RAHFQ(S{UKjSC(JSjb)aBcszV<j|jEBU4fY>_!ZXZ
zh(2pBw^)qwCj#{>W&)Z|GpEgVOI0V-uG22qE?cg$9nH`w{;J|C<tj#ws|{EtCdTAR
zvMYShE8D@`t#O8fv{|#|c%9m=W-g2e8NnLsv@iu=;d$)Gy5d#$c|u@Poa1b$TSAd|
z&$S_Vt6fm|_0nhHr7<yna6NcO&;UU%YmQLU<+db!rLDFAH=q{zU>|oJUtC}FvQoL6
z5HgTx$tu0Q3$0zQNXWQYD}08;*+Ynt4&&RqPm`;q8@W&_mq3gHkoIOGS>vL5Jc8`y
zY?1+R(p03v8p0}{JH@t+kNJYN`Nr^DvLWnd9~T-XaFCTnz@#k4S}ION?(}u_;K}<V
zX2ag}3!smtJ&ZAcViBe7d>Ik|Fe3KS<&u&>$;R%0>({It`>KdL+LuJa@r%4ImqeoR
zg}p15gAEWMZw{CB9rlLCLNM>r-5*CV$)^F_d3$eI56$iv7;yY<g*gUJy|0>Fzf*gY
zvq5sFRmnr%LY6E@X~#ggaM!_afRo`cCz?@`#k`Minx+F?<~LTuuA~=S@CToy;2!)i
zFhh|8)G9dTl7f!s^Evq_OJ##J`Iq~d;96`9e}l7I8McBGV^@r-$${|0#ViL@05t=^
z9dmig1L@%i{l*;T6^b6Mu=iOVxd+-}lUhHqGc%Rr_$4aMxY|_WR#GC0^`48~-KkK<
z`3hxaDbT2;eYPqB6Tm-J9aFj#xb^S$zG+VuSq2Pj-;l%QzjlM9#^edfPWPKqm|cDw
zn8EGDGaa<rj&`+Te0R&o$xWFYPZt9?DO^n(<_bu&NYjR-2L8fH!KaPaThrIkOn{@1
zt1d<vyI3%e9?$i3eB9<)#9#6+&SngNjqP2>n2q+v`Jqg`?{nt-vfz#9jc!!n&hMS#
z7%F4Nh6B+8$v$D{YynqeR(M4P1aKfKc{?1+fH1-B$^~0u+m@Img?W+iRptS*!0oK&
zlfXBu3KW8yt^S=ceR&-EC%oA=eA98K;r54?(>Tc=IUhsk9^Cu8W_HDlG`{K^vrNVK
zetk~^t?jfuHZs*%HHK#5GgVlRJpPyMrxF8!R~$1&qX5Ux*Gh)?FRjJ%f%UnDpd3=`
z<;ujv$S4gmE6ATmTr@AtdRu_P-V@UfabKY0=|EIW;nYcLzVG{}Prbei#8)m1jJhzY
z!P4GHfs<s~T$K_P*ZB(*wK~mhfqErDUN8@3(pBl*;?|sg9dA9E6IEER^MT-4=;^m-
zl0PX|tEJDJ*j6(q98@~#MqWdlj2!|v_y{W&+%#hSim55D<tK*64HtkGYY&kJ4d?Co
z;}(DY_T$@U%w%`{v<ZMWux0ny9`o`V^ytCYkDMGIj*Bmf4~xm+IWCaxnUDFWFbP5c
zfj^3K>r|~6mX&nh=WJ@M_mLPOT|VvG<vfWaULsC9Jo>JA%{C=*OtUQ6G-VeRMV(ta
z6_3iEzB6;`{!!@!4i*p=R~vHfMZr$<twRm+mhONdPY`$JDxR!gzx)a!9sU_y<ss*|
z42mNwC_C>u3Yy!ZY#4-(a>+Enu5DLDQN{0_K%KRp0#!tASzKPNLgmD62S97%5?Q!W
zh8AtlAT$Lohk8sYj^UQpnu<kQ7xTF~6WKP<NcWm^bYWoSuLu00mZ}+FjPHtBoEjwZ
zV)w>xZu?5pshh$x;1vIkUAv^K{p%L>$NL&;gMzUYv*B3L`um3F@z9@8{_Q7a_x9_f
zaQLT1Qd`Y;M#iB-6;tF0;on|~*Ha*W{=R_Gy{~61Mh(f?A2cP`f1!3yVtdtvt50r~
z<>#WsvnRQ<`Ube&Qwk)T62%z4S(Rjlvequ5SlySh$85Wkucp4%3{AzasoTD=>f`FW
zSiL>v*@x^+_(?S-X!H>0gLXR3ohs`b-3&jocbiMydK%au@*^76D&u_&Ovp&zb@J|>
z6hs-iZb-Fg@&`4PA3WuGIND;73darM$ilnOxCs2t)&UH;-6MVWmSR?R$W^NC7V_3M
zRoN@WYwQ*KOMJO3c9g_ssm}0T@m>jSpY@de7UmFovG^kV+JhYln+fZ~qQLaXbS*nC
z8$D8*Xr0hA5A`bPT=kv*Y$QWnyQE|W?$O=_!jxq11cKSZigQHefyDNC5~yB77ktzV
z_M{=Jj0L1?P5WVtPT?+Y<1svBjM>JeqhW^Q$ET+rsW)-xt0S>^{xM@)5EAOn0flqa
z>#iZHoPOx}3C$SkCSZUejh7n_`;EblKn5fq+q!eP?1?o_*v6x89uem<JVlE&0T-Rl
z#T=21!|*^Fs)NozBT4-t*j+<<+R<~@6a{;n9|1^TAx#xPVxVBUc>u(xvzf;Hb?mMo
z<EZ$?Vt_dkcN1pE!>Z(Gtt_k~T6DCLYt_Vy0UfC-n_oN$>w1siY_ZPB$Yvpy=q{_Q
zv=@ryY^>y3UdE02$3K}zN}({6PN9{P#Q!lQRms`bOl2!I@{g6JO#{anTC(|zP6x?u
zfCs3nvZ|@GLJyBlN7Pl$)mp+$o9xsgX>z9jLtkhM87;)Lh+9*qg=yO>Wm|Q{5WKFd
zvW6J9%u3Qws6;zOJ%ju;ASq`e3d^n@&EkzCUt4QeQB~Mqm31PC7@1A{M0pY$orN>F
z0;i_za8RRv{!vlHs@&Wm-c64gxg3&>O#uKMTE~!fcXJsUER%JT@)J?(=^({KueKS4
zbBm40=~KPj6Bo5b99vvpZ^6`}ubU9<w8^#^e1eO0Gscvl4YSF@u|A|7mh@vJj`cN?
zE9oqx?l2rsX5Ab_WY3LP*Iq=dO!r2hU(Y0y3AC;hvx|a*5t)&TuJjxlQk!98iv_GJ
zG;nkF83~DidM!g_2dh=kE^CUYWl)2-5rzfD4#8lsafDhcj%%&Sc1lJVPej3T&}r(T
zlr6`yv8@<QAg*u@gRMjI=+7^^CbOn&mYJj0b1MsU$9K2N#Uj~ml7d%PJ55(qlvRnr
zkf9WYkw6^;sm;hmz|cX8Crk}GsssE;k-M0Ad?u2}v<5oVs^%%R#<@P6JH{6k<+f30
zkkdn9$_kEg$g1gz%2L6VxV@q{*+Sl_gb#)}g~~E+Cy=yA{^%88;|M1@s&^O(sjIl?
zJueqgnIc;ex_OG-cBL*SSQGz28}>$&Q7efI8CPDEt^A8bom2>k7dEGx6bukzf{<Aw
zR73fLVd#UDUP4}iu;7z$Z$}(U3d1CY>fz<zshNeJUYyZ3H@s+iq!`LuX88Lp;%Z83
z*iIEO-)OTgj#ii}NYaT-xC(JGqPqm07%Oh=m`fL*C)s$g=T<kx5>%h7Z}a+|7YC6<
z8Bc;zJjsbD^@BWw?ZDWHiw_VXsUdQOE-njKtEN(ie8XHqS*q&4sk|r@^1LcpY5pl4
zuhKZCZEGNAmr+nt)J<lPz{O$I$zL~vqqH=m8f3jm&(y~F{3)~Z)1{H3e2%`vUtjE4
ziC@+MrHL>$Ms{&&y}2h`Bh{rDlqC7Jy5yYjw>hgV&9|Cq*O}it+Y_+iKkT_>xJ@7X
zYA39%C0!|JuDjRzh+p=_ZcIR&W`+~3sw~yDDN}-2IU1z;(=>xY%r0zIjoACEPv(%t
zj_9w%wVS^$JzXJ7bFasx<PEkgosSYmQ~UC$pGwI*Vp?{^CDavMIeOwzeW9{cDPivU
zL*oeWW<0F~-%})Et0h2gdk~4*PFQB;PDu(mjM9{os$`dN<~pl`+`>pV<Gvc#%<kz)
zasnBqqWgfq8>g~m1$A|~S}W38sGGuT7{>CmvvQ5Pb$QD4N=?On2q4nes>+e*Sudwr
zWc@kmp2k-NwMAc~o@|kLIh1H%NiX@dh3bG&q(q6FZbp=g_5@hI5k8WZC2UsWKF=2G
zslU;!jG9ZS>6qU5xo}U?C8`?eZ7%B6NDHMrOnJ?5xXiVQexKe9A(Ljhmn~ExMt#XI
z>Npve;gobaUgYEo8lCtqPUvX_x<H~<$oR_~9aji{r_vZsMVjZ5oJW#@^)q>DjiDsN
z#dws=j7b2H{{<jmLZQ%&RiNM>LuSy8yk&Y7<-H43_LdO4*$Q~L3W>8{UxF*aNh-^O
zxa0lYC;0o>YgzHo7ggt&M|aOjGfOKlbT%i;r{ZKjl*wn|Iipby!PWO!G+y}w>}!Ck
zm7DK@#<h3Fz2a6D{p98)f#!y`k^A#nH};12S$nzl#{n?eJ4<E;_}SW<{BF)j`AU7{
z{Bd5XY*Oh@^K(bjc_y%pSNTbNAPL*`b=bfYyXgg%;2z~Nc(&j)@U^OFK1F;*2!n6K
zH7&*9<Aadv6r26`oKS{u$=&eT-v;6XPkA*bVrj6|d&aNchrrGcv2ZH*gIn?V0rQ-{
zG1n%_Ar8p2Z29*lYu5aNdTF$o7t258%DeSOo7_`vh|zq7b+*3InVi{WG6YZVBe4`$
z%;W9us6!y{@=g#|Hsk2ZVoQ&G=4+TdQ@MAv-Qv3xCdZfkn)BiN!bJBXWGONQZhi=U
zwm#n(nCY!B!YB9A;DPqU*}el+tr6=eJ_t6;2oET!bjoRNq@2qHer^KN_sLwGN~3Z-
zOO2@RzX&Trn&oPa&TYQS%(0<9RN~X6*J%p?qvMIo9i%sOFnMEH^7dU>!rW`=W)kbQ
zIv0uFeHuC<UeJoksUNUWK+2)!RvB(V4P;wWHV5^~B+@V#{k54NuvEz~uW^=s!PUdB
zBLGm_E7>a$D7{&rfkAW^pJPYLkS@t@ymdrmzs^<qdzXT%`Yg*3N&V$g)Igr4Prc)}
zWG;bbQ&eL6oO9pv>jnH;w=Yi?QxkcHjxJsu9yUd^x^X`lnog4ucH4#w1^7UcvuT{f
zPmn$#VhjadhAhDvA4@`JABqHfq5(;rINDTl9VJeXGbWiV=$3JM$Qe@vZg8lBM3k5`
z^5Nz<1aDeI+%tMyFJx$)KE`+O?)vg!{0GRbY!>VPLmx9U|2GND#Kg?W^nambW|m|G
zYl>vtnn-Zw|FFW!$u^7xAgpYx$%WE{faDqbYDPry7v9kHo@i(m_IXK4<t$cZ^e?5Q
zk6)lUx+OTlxJ~0*Yb^O&(t4nH)4oHISf>{|=BMFY02q^Yk7jQ8UW99AeUa1Ufn4x>
zw37G2?4?}Y-!436UenhO=^MEo-<<4nX?<fB>0H~(J5>Y-*9vKUVY{IN`O7<dfG7Ul
zoBE~4z1-aV)Y&wdmER_p58Lt#R~yGkU3*V=cZ_@2CP(G_hwNNp&IW>|I6fYko3o*-
z`MRr?J*qSAzo&C<0DLrX#Nj3{^>B?X5vAH1jU5Z1{)X)PaLs6SY%Y;cU@l~`3e#-X
zre8wq((XjMY11?fkN^JAdDk_{1Ez5v)88p>v%FyFi7~Kmn5QT5o54P94vri$lK~^J
z01~!aj!VV<J;|S=Ie4(o+8PRg7sIE_#9&`t=7E6>`gbX3|DJQ&zJaqs5Mbg%!Rn_I
zVW97XmJG1VA^pMNx9>m(^N+*6t$+QE_(}791N!qf5$jvsdSBtQhw`mnC*we25#^hW
z2j>+9fHCx468Z5@%>@MZp@sFOz901^9muMTn@pab*?g*bz!Amu;<9IY<vkDlzIot`
zMJYdefdc+IRr&vA16%T(KYj9D-3ARCJ0UX%2O%3HBO%AXBw=A;`7ixnH5)the_~9G
z|APOF<fnQ9F6RGm?8?v#st#)QRwfRnW`xYF|K;%W|8G{Y|8xGsy8l1eImdsna{v<~
zCo|{2p8w6pd*&Q_`}m@&rQLR_t<<}g|DQU(G9aq1Yg-!W5J5z`L6~6%W`>eRK)Smd
z>8=q_X#|D_DW$uWmPWd}l`e?^q&~dg`}yAc*5^Hc&Ym^bUVE*z*E&DWwa;o8^U6cG
zGRb>>SEhS%UzAavTHb_YR0i8MC>p#)U@bE$Uys&?jZS7B^vX)Ya%3f|3g@d5v0k<S
zdsP)^n;<Ic-NmFAHfRUh&#8cP>2#BpLC(*`6H#<sUpFtEEos2>3I~PG8izh_EGm%f
z(O|zq!3@B%v@GM^O{>a8zc+|RB)5^953M^sF?r36>e$fGw&Qb)+<lUPhP`kv1+?Q+
z>x$v=avI&J2R%e_o8bH^YpGEmJK7+EXWfHgwR`QIwPVBy;6nq%d#Wm>PtNIzHfljA
zOJS)mxtquFih~M1w0F8drm)K5`3mo8RHv|^18q6q4oQ?H+NQ^A@t94~qgANLVwJ1#
zJPo$T%{CT0RZ9ThLO3*##`_VG+8D4Km%T=+D17YkY9zBuAQSP8rhegZ;X9*L8y3d)
zhsef#l80g>c9=<@UPw=+uW{Vo>SRSW4YqPP;zYF$8KbAeUt6xw3f^ll7BER~vEU|N
z;XS7ly!$q_oo*VJ#eREA!6YD2N#|MPy>4TQ=1AVFsm=Y@Xoo`M&6Je1IQ~a;Gohc9
z$A7Zo#oY51t!7MwE~}oS+1zl=p2&GVUX=Jmbu?0MO@4vzMM^C-2U$Mm6ed*WJbQ%a
zL?}*k=Hkz?4L^VUO*?$^wp}ZoxyZ?t&?a|E2U}zllfmOd;?kRvDM5<c_cj|HaFMI2
zycGjJAELl=WjE><hL(!Hm^p1MM9*%78@uL)JzkMN8XJ_cmwyUpIXk2BI3=c{dUfh~
z*%NH_-N668_pq!@kLh7qx#anyThKu951`gtevLpH1rxac;GxGW;(f8F@5C=}qbDD8
zoht0&%Csq3;mbEdn$cd~@>(32M|8~%<`ijq3BByo)lFHD@1uOY?NC;vzg<{RTBx^L
ztmQkGtxKN3&6*1DYcwgyFE>IKCwqZ*Kf`LPKcZLlQk1<Lv*xvlZ*@V(kw|tO@9|Af
zT0WYw-ED@?wxL!qmo(IuXLjvxM@wd~uE`}?mz9{aHYh$6knmz|_8l93Qc23zV4vyQ
z#rj?~u7i^+P*UxUe%w-FZTJT>^(w5DrU~~lR`}OtDNJ0@3@tSl4A%3dID0aTx6)Si
zOi3PV_PNxFlRC0cM9&x{qGOAAoPlwuHdwl6xAQd|Wqvp14Fi?cT7k|<b=OAX!a#b8
zjjcjdU3sPg-)zy$12tewWxebqAjTv*g}|pHCeTHkFe=4ZU%L5=!`bEjVNWBWSMYgC
zRu<N`*S=m+O*-jSr)%I7L0a<ZBHM4i>^05ivWnNd@e&%}llNAK$wWMMGYp!k*Hi)9
zg2!a=%*=lE-jAIKaqc2qQz7uT%J9;xD7vN1j%EG^t6IWH3Ow-@N<7FXAyyOD)$c+Y
zGpCuFd>*cdHwK+<nsQBP(~YwXE?!&}bHNl>1?3x@<?D<uMn2unf{nBQP>Pi_D$2J)
z9~88L(Y(rMNFRrn5B@}j=J=NNyA3D1AV9tFm#!9$&K6-!?NOgg98U3i#SGpr83Yk8
zts$_cjNKMwNKGMqUEIYmB%NHK7MItfk`RrFi=gb{lu%Kz(k(nKNSt|3KV}!VNtt3v
zzL7<sBxl_R3iiA%gR!hDyKMz=6ne~hzGoWPeL|I0lqh+My;=j$D_&DI6THwWPhnDp
zC+r%-dJSOl`ZgN!<rD2%5BOjOvTvgl-pD1`OxKgxzU418WmeKgS`5i8Cw+pdu<Ixa
zWIkw|h=b<f6xmq}M0YPS&G8re>v`yBcc(B2G$k3AEs!3LR<>gge6}+0TrsbyoL614
zDRVIRuANCilA5{tx-sQ($F$I75(TFSTst+7Oeih>j6UlTaW*cB&v$y?uPK607cKCh
z?W1iadW_y7WXuI4cwSLjr1=_~o9Fyl>^chSHHgu1*AVAIn-bV!+O)b>>q>P#s}#Xg
ze4D**4{F)chE4o5CU_o1no~aY9x)}HZbI5CyVnbiLnx^qnln*wuFIAt7(!AW!a4Cs
zzb&79dxfd${#`c@OVi+Mmuma$<J=wQyiU53re?PgoH`Cvl&58gfP``v(ZKjq)cVZ5
zX&*@tmvwDsuvD5teNqFt3LTRFHo9q|Dn!}z*^I@4tebXb`Z#wPCui%V2F!$|Ayqof
z%wvarNX|mAZ_i-gD}X^yT{_3Z430VIWk7<GhS#UeDLESO97|0Fm!LXg@n<ZlQS<-~
z-j}ZTAJ8cj1VR~xVP88P*ORi7U&N3?(}+z#gEBTKPO}vD(JRxus9>`}XuRsqI1FD;
z(DDi0gHu!!gRZK)s8(yVP?kyJZ#Kr8$~@3)7ah|FLC;qrv_CcMrEJ%#r^ClEMfi{s
zlJO^P&N4e)W^1)73_q>2=J)ofw+}}<G1-zRujqIxxVykJ<R9p4f~YJB)xLWBFm-Aw
z`AXuI<$B^Lu*%T&2#0+3=zFcvYNJTNB?DZO--*6ZO=08ai>Et2zyX?&-Mi}cv{w_2
z8hef9A}Htb8moB$_hEida5Wr9I`B<gA`5h#Odup^Xhbdg_0&y}4})&aF~<(+i50p!
zY2q7_EMi5nWTn;W6k2WE*<H>aK1&zA#pq=uWq%>KPBWeak)${~RVq`il%>Wgvl`Kn
zE^wT1k#G?e`yg^Ay=Xlap+dzJ4$JDe-fY3U9_wxkGEDb7`;ge;y9_T-57M1-(DmUs
zn-^MZxy?E_QXE7`cKcuO_b!5Ndi~miZKyAjo=k~Q7_yxYGYiDEVs4ZOLKx^c1OyCI
z5s20wQ7WwQa-Y!+`bUnU-<ywq&pT%8ileWCboL)h0S29YB6~BPeZCY<rx^ttfkT^A
z`+)2T<3~x43pU@j$H14B(ughNv%Vj5ge>$Z=gB?|zwaHtt@Yw76?5C;`&p#}b@M9x
zW9hbxR5Jqp&Nr&asWTzEb?5Lo2*m%AX8XX)t2@DR6gq%6;SxF{9o|9(r=Ol+xWsHP
z+PBdLG#~AJRun$kJ!|Y+Z@%zoc)sOjcw5*gRG;8yc)MAZaSWf)br+Q3Y@b8U-@N~E
z8`hbPc?^=%!nCFhoYH2@MN1l0t>)JcV`E~`EW(J#ws&YuVse%VWThk_t(sqys6ttQ
zeAL?z<}VhJRc57;gL#)u0=mDdn9gw4^oz705a6n>`FS?@D7-B@{!1P>Z@2wjz761B
zVtbsFyc;9H6@b^x!};D_<@wE&`aLNjJ6m*H$yj0}V|aG$Km1J1=ge<NNQUrxba+%m
z7U9EB1J<DY6G}h5G@TC>j5@JuI%p0Wsj#{!yC{(Lc(2k*z7k2iNWRnksHB*2SqmHo
z#bR25$e>*2_)BY1<wH;RrDW5s1XA}bXGgCQ!5fLIvUK=o?{q`K@!K7JAt_|%JvGwA
ziwxXT0B!<o!)Dw>MbPYHo_MTIk`Rl*H&xZDl%{Cn!Q~TQDXGHbceY3yu%Og1UBw$P
zS+jG5!M57TCXSM6hef>k2iS21mj#(qUEH8YNI?ocUJgHuE%l>?%T+q}?Rit(x?pUT
zrO~b9lm{FOtBAWvdXh{qzS8Y_p<$hGZ>gdxVcvarycLN-UFR^cs?n`?_BIDAJ?*)J
zGw;NpzLplWfvNv$8tSBdTDnbJI;mqB0F*>a+2w4?S+E7kFb|rI;znB!J^(Ew6Pi=^
zsy#mMf03@}aCQ``g?oS5$o$o!lA#uH-0(MC<UIV59_N-=zdc=Th-F+s!b_TGXE)(%
zn#e{uOyP^@Z{!)tKai#$))EPBR<YXACu7zRXr77S9g&+Y1#=7QKWug|yQ=Y6I=^Nh
z>^$Q7xXfSMreaB*k&wyT^=NI)&B@wHJ6R_-OHqkQoadoU<qU;GW!KgruA`)k%zcel
zD))eJ()g<}qYXxrka+qe!}aGX-Ctj6un#rWEI4~#!kosETjXQ~V~SUFGeYs6r8EZ3
zeb>I~|D0Dwy{0?ovEwli>PbWG{Ig8T#I3?&l?Rf~-g>IO(huBpeTb)tX_f@~#JKoz
zvLLkyQ(rG_5M5?kF%IK<Gzk?rNtVOx;UI?we8f#P!HU}@&e+XnS8#n%StVB)(ZQEt
zeOVjv<V(Xx2+!iQg%+=ev5BS1)KR6k{cTf*pZmdt!_!Kih=$R8A=vq+z$GRxR=0H%
zMRK(#>^%A2(w)2oA@WQG1Vsu32CDM;<LK5_t?WH1k&iEvpA-)usOZxlwPf<&Zm8_i
zz^A@hFT3Yaql*^d?hI~07dAU!mQmH2wPMmQ_*3m$_RII<>|f+Xtxd2aq@FVmZ+8lT
z)}1h1+)Zz!Bngq?_%g1C9SJ_n9=<aTmW!&PL(gtE!rR)){QFmRf^2Wz<wG#i6o4|3
z4OHYAlo`1)<3*<yb(-&V6H^?J%mwmPaO3cFNi}PYucI0Brhpl6VK_|hkTUdJq5P+t
zUR>_?URysRx>Z$o4v-55vC3L%%JFgM2AFW<4*$(=lWu#KbNf>MXQubfKGrl(+k|yO
zgsceSM1!lUwK7uprWix2I>1fkne$0YyJXc;AJlggm~z#!yWbksn0zf+*Y+YPfup&U
z<utvT?TJv+Adzn|V;j=+4iw+IU;W_gt}Ms<7)`$01TFISyz0e>nlH8yzIF|a=2t7c
zFWKF8aOY?QC0!ZMR94^HLL6$El{{B2hnmto8=7ZQOp67Nf37c_UNlQBk?OC1>cZSW
zwpN`ro)os0_31QKzBHd?XowPA)`Nrm;Xiiy<){0<<M<j}eC<57)je?NNLw}-x((Q4
zsu`Rq(23d@U@l=3YLDJT&h~fM@g<=s8a|<N_y$wRK{cOi(Oyy#9N=J+`|dm)C3*(W
z*>dW&IQpX7mod#F?7g3d)z$2ACGEtpojx&_p;d8;@LDUoT9tMn8d7C>I|ldrg4G4D
zfM4OvZQRI1qfTRSKo#Oc$zNE^JAX*wBE!*f9g=zHVx#RMu);bLSn8W7K_B&XV^jq$
z$3ug8Bgc;l-aG;gDZk|{nw*xicDGo0#FRiWyW11MqUg8N*6Z+uL_PVbWvSU#x}wI!
zlcL@E2Kz5jk-BFkTB%oGJ>YP$+DP{@A*uAA>`o5hAL{%%)7SG#&ujN!0Dt$5y8ZO|
zo!4ZW!6>!-kI5Zts5GS#V&h*MW|mF(ocO{tyPa@*_sqyvV8v)PvYogRgqT4F%N3BW
zM;sCIUG6XLjcj7*-yLW`H6X&PSY(CehkJT!i?=%@&j;taKi8_Vz}JRXF$Wt3b)XqO
za@xc`tNJmNQ6dy6zjES5a<#dg5t8cbbasAScx>q489yE&r%4k&Q&QS(p#Pjd%~0Dl
z_wECAiahS;8y8|p)>Q%N+_BUN*pK3RoY~l&vL#|omi<P@MjvhYZMn!GxEI)+Xp@=j
zuQy0Ov&Nh;(aU|LEO;9Omj%d4WcCa(?b9%l#P`^QK9DneD<MMP^CL>)MuvW<qJSVY
zPPUIpfjfpL?Prd}Tc%1;dV5*Jfx|v!$ix*8M{Os^H}q1Lo<{Cl^a*KbxD0oEh&Blm
zK}lPZ*`SjTXkhE1K1y<oX}OgOt)%?BNGa9Q1?s#has{bmOmAmWxHD_;B9gZPH}&PN
zPJ;zbd#SY*zui(&CZp9hO9EqU=s;sHR|5Y8_3qU3Pb&>$k2NF|bs+CGkTvzv^|ia8
zTIxOjWs##O^6A~<<kU|kbL$h3>+_z8ym-G-_{4hTnQJGqe)=2XJ3XPVgK?hC1V*J}
zhv4yj@WzkOhv94j@LntMkK7rT_2n+d`e9|cB?Vg>i<jA*Hasb@RWqY~#&X=(xp(~=
zHx%9X3f4wWI;9my`nMeP{JfR@c-;0g2CGBG7Agu;i(4*&ewx$x^Jb*^opV2=y}m?E
zyxGfxAKnbQk7aWhg<soWMw$y4HX>7pf5dNl>t#_{{m}4tg5zas3pV2w=7wBBuK0vQ
zZ@!3yh+r(Ld*XUdIkM1dwjSsgP8l;qxqNoM>zEWw<r{QVD(Xu-s+3OYyHUud_<H}H
z=XWteU#SE{(6^zqRDrJRm~M-1?lnRjYq7+`p~B?t7pF@7!p{RS!kVa(L<0pJaht-Q
z1uVVUvg6xQy@A)GmW!=qDw0NpwB@{gg?b!~^7w&P>x+FABeITmIt&d{^mKJ2e7iTA
z543P)KE4QWGh#f&p^^^lC~EcY`F7*9T_z+sFO5S*Sa*nt!6$~<g8q~)kU)CqxQHxC
zq&8F8hyYJ49d#}Ac~V|0>H};P3=Pq@jv@gQ08LMY0Nz9R=feP0TjSbod5lTX-0fR-
zN2;?@euIG1auFZV0DQ+_F7<%56$O2XfJmjnOE))1KLF)C<zcwL;W&%?+cw>wK|2i}
zR(A(sCNe)7O`NP*tD9M9HQxMe&+<0}Q*3jD71hTSOW27L*ECxNXiZINj}z&Uhm3@k
zG&eujAD<$H@9L3k;hkKdU7KWiwqN0k1EpH%hiS6%W3#;^JExwrN*YI)P#Oa0e|A{4
z4AE?!o;nbT>rXvqL}E>1F^q^jqYv^k(N(sM*+fdB`6-V~ZICA_0{PtBFa*%>W*%+6
z`xy;=uqXB5fNGOa>gtO^;Zqgx_rB`#YALi-RFe<fa7ug$F~9g`>}|2WgcB?uag5dV
zeIv`dPc!7i*8$HR{b&?Q=jaWF7*>l3{kC>+Uy8+~qGDKiXu@enpX};#OIcab2izDX
z(u+m7UuKUVFN#z@o8H>lnhCtWi_fsb-#@)>RGn&bcACZ-rX66s)s`9dWzi9CMG7hd
zjLy(t!%woPGnVSOrb#2RBkT=Z%1DFW5aYT_X#oJ3Ceu@zTA*PX9IWA<c)7==#M#;v
zB2r>Psi?$K3*^}63}9k^*9xp;B_~DJ>VW!DvTf<(tC9USYoz;|pV>W>B!2$Sente~
zxDlL;J}`d$0nv5Ae<=<n-~S=0EbH(wUw{&y8y@#@AQeJ>5m)SLq7tT5c_QyJ@^s}@
zY?wcLPF)@fXi2(?uT@3vy;X@VQED3n4LKzXJ37Xyne`w?N?v{|0JDAMxiaIl>Vs`V
zZr;z7nUsO$)Ca7Kx)u5tq8)R=rZi&ji2?z30sc}Gky^wS4DJNYa+wtCD^J^0KH{wS
z62gzdr$@z~(^x3dARY$_vj#%>jt53%iENaM^UdcmuqWu?EV5Q2&2CTu{Zi}_=ynjc
zigKzC(b9c6$NA7WKi1IEaHWtl$T9r5*z^4rSp*l4q<Y}wKzqY^t_rjH0|S<|^`C(+
z$RqvY29z#+ek{D33l0J6FHz7DZ=rH#5W~~%m&att<W$Z@XU8jle#8=~7-zj>s@CU_
zU2&h+9q5BL#ww6(w=MU=8GFT^Y1E_bUY{d68{5)HhfhzJ7`Y*32^tm)%(+!DD_hXE
zb#^Bz<*TqxyZd8P;S7}F16KDZ<_3&t!t*km#tL^-p;N|B!j|%-)ja)V4SpVyip|24
z;^Xo}LOsZRq>>he$LZ(=wRwrxEu+7`tS6%nPkPt+EaBK7Es|$eL4!f4U#uS02Ph0I
z*@@$=O)i<<XIqL9W=S+h>TsG&jOM5n_LLjH7Vk&)Zjx0-C|#oUv*TQ7VQB?Z3EjQX
zkFwXe>*_M{Dt3jn%AH5nzmvnpILR1}^JAK~)%9(%UZF7)GW>0-Y=oq(x8&%H6MzrH
znAsW7_8N~oC5$s?TN&IbxNq!d-L9rluNB{!y<s_ub1UoHpk<dGHc3>~^DaXx-IR<>
zY!M})W|}>0!tsQge#7(!KAW#`T2{SD?MbEj$iOxi9`285wk)?3)s8}kpE_G`H4WJq
zld6;3e(61&Dr^NqvTN1alk7<RuPFzqI<{zI8hd8UIu*y@axP+x?d}{2g+@_SeGZ8G
zfLF1t!GUBkWe_xq$A_LXL9##i6uR`9l5*3Fl3BR>k_>uIe(M=96^oI{Kqm4WRvpv%
zwILSz<Ano*+~Ldivyx?6T;dk^y(K7NP{-X{V7TQFvu}D^Y7mewYCyf5r92N|b!crm
z)Gpyz8||XmTTp~v8v7}?EaaT*^J@Cb%YNQD<Uy&g?&Wk8a1cBRo)oTy?~W(Q-Zs3e
zdU^X(H*w%ZclD}-qZ64L&NXLCzSQiwLVwV>nRHOUDO=Sf%d^5~B1sAd9lqZ`slMJC
zyFZsVpHtgcb32LbCb7C~&yjnXh+Tc%{BTw{;Qm~hL&LCpz~M`pg|52mu#EC#VcJ|m
zX5nRKVcOs&mV>5-9^~w^Sej3kv-}45E&S)~2UL3$`0tKR!t*@FRaSZ4mq7cH6*SYR
z1qOEbzm@k3G1A1CC({VRFNS6Idt@#c>(*e-cP}sl5mCWWF1c&+-GnqPj(Wp1urvo3
z>Pe<g%lQ|qb;DlcesPF*=>k6om6`Pg*#{l{Hiq%$5T4Hh>Mn`AeAP?#DuO_E2ULxo
z(c;-4tTj@-TxF6CJ<%8M_C4clX$bIJgnW&)0QhrnJ@5`_(kV3HLPv-6smCkhoQcQA
z@4uMyi_8*I2|I4L+G2GPyr5DNAT(S59JQNx=CXlosk&YD_g^wdEb%OJ;f8!ld~LvV
zQZy|2GYu+@H`v0<{HY^rmCk<3k85sl@%|j`+ugkYTr^X(tLb~8QtWob5$Y{F59g#B
z->)QNZ~^tG*2SRP@OFWqk2N_0qqAUwX8Fj*p_5ox(?={i!v?b*tFr1EhTB<nrdk2L
zW4oe}CG~R!&Wh>+fQ;DvrH8Abp=Had=R_?*nomwhK7ZHi6L<=?$kWA<(+9f;>j2zM
z2S^9fsxA^RxGY^3?WX4J>A6xFK3DhIedf|P^=8nV+qAw)gm=kB8uArVJ1|<~gK+e%
z@wKyee!R7O{K;E0xnz)O)@Ecg$1}q@2DcPQ4%wt<W9of*zhm5j3s~c%C5s+1U{MID
zNp(*`N67H-CX3}>=i=txN93Y9nKBEbf4tvggrgjzd^Fs1G<kLPQ+Yr_uBq6mETPvP
zRu(V(exS(g6mI`$R-*(NK~y=^V0&PY-(Q$0rz7Mnols|hWLW;#N{hN)9P=RmL@GOG
zQ$)DwIo_+Q=l;TIA1?41r)9R#jS(kd5=W+MR(Qmrqsr(@uZ(tsO&Ey72C$^4A8CcR
z`)WN7jl~X=XtGr%BFj+RG8&C42xsdtd@RZo7n=M~lp0``g?bpKQ2DXs%`K*5>VDII
z<K`fLlV^NTUKnCSjv6s6Q;5Qc=zPJ10==VU>EHwQK>)ma%RcG!-TO+SR=7p4qjhu`
z2`)#bsb4YYhJ(c(jG{TTK==8qv4#^n__}1ak>iwm2u(;Yfgnw_GQs-RI^!X(UX3yR
znyeh$u(OWJr!O{o?rBwU1#i1r0;d<QWt9i6;gfOK0IY;YD275RhoRrNzLp2Xw#5j2
z4es@|FpPsj?0w#%@EHRm&~~BFvG}@@fDMjv5RQ@FS(B;p?W0j`6Z%vtM>&r?hXJ2_
zXKOy((nOIhQPdyF^*W3wC3mhKXE6I1vx$y;^Ql+xq9pkveinyejEPYHkLMt7MWF6U
z0CKG^YD7D%)EfRyIL759nR6Kb(N1_=gfuV4X$H;6*^Q#rb_<ac_E}4()3V=nL~>uM
zi*d&fl{Gu3!r9h?rnz1d4c}%ITi3*%{}N^p;4cc4_608r3_)8)hOm7>1p38*^8U?;
z^4yJov7i6B|B~Oaq&R=yX`#QEQeHj;N;xTv2l@vo3j3WD1^wBJ3-nhnt|}b)eJZ^F
z@beH51c)%O`?c#25PUY#s30Ih=Ots+u8l7WV%QfOG3n2ONVF@5{=vh7{@`IjfAX*(
zNEQ60G9d~CG2%;x_#yY;uXPCg!tXN76wXl9<VS>pm@m42w~ROZ53fLfcm@84S5iP)
zFyNQl+){T$GVlM4K(su6kHEB`zy8Jf2U86ErSNa2SjxfPmG&=vcl5HBqKOS6uABr>
zSuTn=DKENfNb^gvin)t}o3p983+-Klw2BH}gbynbLa37XSI;x0N>SSXMDdPzR`YT+
z=N311HMVoG<W@4ayqm)VKvY!nqJR(^mGMjf9taQuh5`T_03H?qfQ9WJW_dcBTi^g_
z!FR_Xsve_*0Z=fawTcPO3%(2buZz~67U!=4015%#h5a`f4DtsK1_1sk<AMA!7Y6!M
zAB^{Z^uhnRFpTfND7>@gcVl2M;9XGuWgrj$gxrPmUorrgm+yCDfB+ugKlR<M4*&oG
z;9sft@5xXw<ZdH>lkvfRR|p0{f2F{`a9}VG@9#JufcMv-f`8$7fKWK>cTaeLFyLKw
z{Tp~^^gpfs^(PMx->-c9Hx6{?%kMH6?5@gx!@*#XyF$3T;QzbtcXOe?13`d4LkI#u
z0l!BE1m)qod&d8|{(m0b$)JDY!2fpmSNuUxDC~FdKzBj--4ief@CObI0{)RRU=Zk!
zD1bqHfZx{ugCKnH->n9NL4WKW_)ho_Ph6dit?kU6f1LzTwe~i@D=BUj2Zy^l|5d4X
zbuMFX;XwPVtp55TL90tE2oVzpi17iX#Gz8W08xOrI2Zy3i1SJDxI=mFDi+8ijPrkE
z{sW=a$KjT6Fcr5lH??(fdr8YJE-u9bgNg#dl6(-pJJqneqUHetM5Xw|0Af%no?lNT
Y7gu9v*S~5X4CVtuahRAS6{T?gAAWbj0{{R3

diff --git a/config.py b/config.py
index 03ead8f4..8e206ce1 100644
--- a/config.py
+++ b/config.py
@@ -52,8 +52,9 @@ DATA_LOGGING_CONFIG = {
 
 # State of Health logging configuration
 SOH_LOGGING_CONFIG = {
-    'file_name': 'soh.log',
+    'logging_level' : logging.INFO,
     'logging_to_console': True,
+    'file_name': 'soh.log',
     'max_bytes': 16777216,
     'backup_count': 1024,
     'when': 'd',
@@ -74,8 +75,11 @@ MQTT_LOGGING_CONFIG = {
     'transport': 'tcp',
     'client_id': f'{OHMPI_CONFIG["id"]}',
     'exec_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/exec',
+    'exec_logging_level': logging.DEBUG,
     'data_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/data',
-    'soh_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/soh'
+    'data_logging_level': DATA_LOGGING_CONFIG['logging_level'],
+    'soh_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/soh',
+    'soh_logging_level': SOH_LOGGING_CONFIG['logging_level']
 }
 
 # MQTT control configuration parameters
diff --git a/examples/basic_ohmpi_flows_node-red.json b/examples/basic_ohmpi_flows_node-red.json
new file mode 100644
index 00000000..2cdf5c89
--- /dev/null
+++ b/examples/basic_ohmpi_flows_node-red.json
@@ -0,0 +1 @@
+[{"id":"61c1655c50bd371c","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"2d6881abe9336fbf","type":"mqtt in","z":"61c1655c50bd371c","name":"","topic":"ohmpi_0001/exec","qos":"2","datatype":"auto-detect","broker":"6ae7e77e.04c64","nl":false,"rap":false,"inputs":0,"x":390,"y":40,"wires":[["02e94bb48ce2cded"]]},{"id":"e2590e574c551cb9","type":"mqtt in","z":"61c1655c50bd371c","name":"","topic":"ohmpi_0001/data","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","nl":false,"rap":false,"inputs":0,"x":380,"y":140,"wires":[["b9a9d56fd4fb0b8c"]]},{"id":"e2c109f78f9e714c","type":"mqtt out","z":"61c1655c50bd371c","name":"MQTT ctrl","topic":"ohmpi_0001/ctrl","qos":"2","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"6ae7e77e.04c64","x":820,"y":340,"wires":[]},{"id":"e1d067d8532ff36b","type":"mqtt in","z":"61c1655c50bd371c","name":"","topic":"ohmpi_0001/soh","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","nl":false,"rap":false,"inputs":0,"x":380,"y":240,"wires":[["f5c9dacaafac51d0"]]},{"id":"a7a6f6068e01c7eb","type":"ui_button","z":"61c1655c50bd371c","name":"Run sequence","group":"142ad6ae.d55e29","order":1,"width":"1","height":"1","passthru":false,"label":"&#9210;","tooltip":"run sequence","color":"red","bgcolor":"lightgrey","className":"","icon":"","payload":"{\"cmd_id\" :\"0\", \"cmd\":\"run_sequence_async\"}","payloadType":"str","topic":"topic","topicType":"msg","x":380,"y":340,"wires":[["e2c109f78f9e714c"]]},{"id":"d82912d9c5b122fe","type":"ui_button","z":"61c1655c50bd371c","name":"Interrupt","group":"142ad6ae.d55e29","order":2,"width":"1","height":"1","passthru":false,"label":" &#9726;","tooltip":"interrupt sequence","color":"black","bgcolor":"lightgrey","className":"","icon":"","payload":"{\"cmd_id\" :\"0\", \"cmd\":\"interrupt\"}","payloadType":"str","topic":"topic","topicType":"msg","x":360,"y":400,"wires":[["e2c109f78f9e714c"]]},{"id":"02e94bb48ce2cded","type":"ui_text","z":"61c1655c50bd371c","group":"64a75353.37700c","order":2,"width":"16","height":"3","name":"MQTT exec","label":"Execution","format":"{{msg.payload}}","layout":"row-spread","className":"","x":830,"y":40,"wires":[]},{"id":"b9a9d56fd4fb0b8c","type":"ui_text","z":"61c1655c50bd371c","group":"64a75353.37700c","order":3,"width":"16","height":"3","name":"MQTT Data","label":"Data","format":"{{msg.payload}}","layout":"row-spread","className":"","x":830,"y":140,"wires":[]},{"id":"f5c9dacaafac51d0","type":"ui_text","z":"61c1655c50bd371c","group":"64a75353.37700c","order":4,"width":0,"height":0,"name":"MQTT SOH","label":"SOH","format":"{{msg.payload}}","layout":"row-spread","className":"","x":830,"y":240,"wires":[]},{"id":"329591d611aa2704","type":"ui_button","z":"61c1655c50bd371c","name":"","group":"64a75353.37700c","order":1,"width":0,"height":0,"passthru":false,"label":"clear messages","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":" ","payloadType":"str","topic":"topic","topicType":"msg","x":580,"y":160,"wires":[["f5c9dacaafac51d0","b9a9d56fd4fb0b8c","02e94bb48ce2cded"]]},{"id":"25d69085f401beae","type":"ui_dropdown","z":"61c1655c50bd371c","name":"","label":"command","tooltip":"","place":"Select option","group":"142ad6ae.d55e29","order":5,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"","value":"load_sequence","type":"str"},{"label":"","value":"reset_mux","type":"str"},{"label":"","value":"set_sequence","type":"str"},{"label":"","value":"update_settings","type":"str"}],"payload":"","topic":"command","topicType":"str","className":"","x":140,"y":480,"wires":[["182249692ee7502c"]]},{"id":"edbd2d507fbf085a","type":"ui_text_input","z":"61c1655c50bd371c","name":"","label":"kwargs","tooltip":"","group":"142ad6ae.d55e29","order":5,"width":0,"height":0,"passthru":false,"mode":"text","delay":"0","topic":"kwargs","sendOnBlur":true,"className":"","topicType":"str","x":140,"y":600,"wires":[["679471976db01c0e"]]},{"id":"679471976db01c0e","type":"json","z":"61c1655c50bd371c","name":"","property":"payload","action":"","pretty":false,"x":290,"y":600,"wires":[["b11654144c63d1b2"]]},{"id":"435a126aec0c424c","type":"debug","z":"61c1655c50bd371c","name":"debug 5","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":640,"y":480,"wires":[]},{"id":"45c95568bb348470","type":"join","z":"61c1655c50bd371c","name":"","mode":"custom","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"3","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":650,"y":540,"wires":[["41122cfe96dd471a","e2c109f78f9e714c"]]},{"id":"41122cfe96dd471a","type":"ui_text","z":"61c1655c50bd371c","group":"142ad6ae.d55e29","order":6,"width":"2","height":"3","name":"","label":"Command to send","format":"{{msg.payload}}","layout":"row-spread","className":"","x":870,"y":600,"wires":[]},{"id":"182249692ee7502c","type":"function","z":"61c1655c50bd371c","name":"set cmd","func":"var newMsg = { payload: {\"cmd\": msg.payload }};\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":480,"wires":[["435a126aec0c424c","45c95568bb348470"]]},{"id":"1549f01b20537e60","type":"ui_button","z":"61c1655c50bd371c","name":"","group":"142ad6ae.d55e29","order":7,"width":0,"height":0,"passthru":false,"label":"Send command","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":160,"y":700,"wires":[["c81857e22b65ef26","ae78c7b9e5aaeede"]]},{"id":"d4f6486f114c987d","type":"change","z":"61c1655c50bd371c","name":"","rules":[{"t":"set","p":"complete","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":700,"wires":[["45c95568bb348470"]]},{"id":"b11654144c63d1b2","type":"function","z":"61c1655c50bd371c","name":"set kwargs","func":"var newMsg = { payload: {\"kwargs\": msg.payload }};\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":600,"wires":[["45c95568bb348470"]]},{"id":"c81857e22b65ef26","type":"uuid","z":"61c1655c50bd371c","uuidVersion":"v1","namespaceType":"","namespace":"","namespaceCustom":"","name":"","field":"payload","fieldType":"msg","x":310,"y":660,"wires":[["1f97edbce5f88461"]]},{"id":"ae78c7b9e5aaeede","type":"delay","z":"61c1655c50bd371c","name":"","pauseType":"delay","timeout":"250","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":700,"wires":[["d4f6486f114c987d"]]},{"id":"1f97edbce5f88461","type":"function","z":"61c1655c50bd371c","name":"set cmd_id","func":"var newMsg = { payload: {\"cmd_id\": msg.payload }};\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":660,"wires":[["45c95568bb348470"]]},{"id":"6ae7e77e.04c64","type":"mqtt-broker","name":"ohmpi_mqtt_broker","broker":"mg3d-dev.umons.ac.be","port":"1883","clientid":"","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"142ad6ae.d55e29","type":"ui_group","name":"Commands","tab":"5d888f29.07334","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"64a75353.37700c","type":"ui_group","name":"Messages","tab":"5d888f29.07334","order":2,"disp":true,"width":"16","collapse":true},{"id":"5d888f29.07334","type":"ui_tab","name":"Simple OhmPi controller","icon":"dashboard","disabled":false,"hidden":false}]
\ No newline at end of file
diff --git a/mqtt_controller.py b/examples/mqtt_controller.py
similarity index 92%
rename from mqtt_controller.py
rename to examples/mqtt_controller.py
index dd2e6a5c..a9d42e11 100644
--- a/mqtt_controller.py
+++ b/examples/mqtt_controller.py
@@ -22,13 +22,13 @@ settings = {
         }
 
 cmd_id = uuid.uuid4().hex
-payload = json.dumps({'cmd_id': cmd_id, 'cmd': 'update_settings', 'args': settings})
+payload = json.dumps({'cmd_id': cmd_id, 'cmd': 'update_settings', 'kwargs': {'settings' : settings}})
 print(f'Update settings setup message: {payload} to {publisher_config["topic"]} with config {publisher_config}')
 publish.single(payload=payload, **publisher_config)
 
 sequence = [[1, 2, 3, 4]]
 cmd_id = uuid.uuid4().hex
-payload = json.dumps({'cmd_id': cmd_id, 'cmd': 'set_sequence', 'args': sequence})
+payload = json.dumps({'cmd_id': cmd_id, 'cmd': 'set_sequence', 'kwargs': {'sequence': sequence}})
 print(f'Set sequence message: {payload} to {publisher_config["topic"]} with config {publisher_config}')
 publish.single(payload=payload, **publisher_config)
 cmd_id = uuid.uuid4().hex
@@ -38,7 +38,7 @@ publish.single(payload=payload, **publisher_config)
 
 for i in range(4):
     cmd_id = uuid.uuid4().hex
-    payload = json.dumps({'cmd_id': cmd_id, 'cmd': 'start'})
+    payload = json.dumps({'cmd_id': cmd_id, 'cmd': 'run_sequence_async'})
     print(f'Publishing message {i}: {payload} to {publisher_config["topic"]} with config {publisher_config}')
     publish.single(payload=payload, **publisher_config)
     time.sleep(1)
diff --git a/index-mqtt.html b/index-mqtt.html
index 1ee100c3..070d4fe1 100755
--- a/index-mqtt.html
+++ b/index-mqtt.html
@@ -153,6 +153,7 @@
         let port = 9001
         let clientId = 'ohmpi_0001_html'
         let message = null
+        let msg = ''
 
         // create client
         client = new Paho.MQTT.Client(hostname, port, clientId);
@@ -182,7 +183,13 @@
                 let payload = message.payloadString
                 if (message.topic == topic_data) {
                     // process data
+                    msg = payload // for accessing the variable from the console
                     console.log('DATA', payload)
+                    let ddic = JSON.parse(payload.split('INFO:')[1])
+
+                    // check cmd_id is any
+                    processData(ddic)
+
                     // usually these don't have a cmd_id so we are not sure when
 
                 } else if (message.topic == topic_exec) {
@@ -463,105 +470,110 @@
         // getData
         function getData() {
             sendCommand(JSON.stringify({
-                'cmd': 'getData',
-                'surveyNames': Object.keys(data).slice(0, -1)
+                'cmd': 'get_data',
+                'survey_names': Object.keys(data).slice(0, -1)
                 // last survey is often partial so we download it again
-            }), function(ddic) {
-                // update status
-                output.innerHTML = 'Status: ' + ddic['status']
-
-                // update data dic with new data
-                data = { // destructuring assignement (magic! :o)
-                    ...data,
-                    ...ddic['data'] // value from second dic are preferred
-                }
-                
-                // dropdown with number of surveys and +++
-                let surveyNames = Object.keys(data).sort()
+            }), console.log('processData(ddic)')
+            )
+        }
 
-                // remove listener as we will replace the choices
-                surveySelect.removeEventListener('change', surveySelectFunc)
-                surveySelect.innerHTML = ''  // clearing all child nodes
+        // processData
+        function processData(ddic) {
+            // update status
+            output.innerHTML = 'Status: ' + ddic['status']
 
-                // add choices again
-                for (let surveyName of surveyNames) {
+            // update data dic with new data
+            data = { // destructuring assignement (magic! :o)
+                ...data,
+                ...ddic['data'] // value from second dic are preferred
+            }
+            
+            // dropdown with number of surveys and +++
+            let surveyNames = Object.keys(data).sort()
+
+            // remove listener as we will replace the choices
+            surveySelect.removeEventListener('change', surveySelectFunc)
+            surveySelect.innerHTML = ''  // clearing all child nodes
+
+            // add choices again
+            for (let surveyName of surveyNames) {
+                let option = document.createElement('option')
+                option.innerText = surveyName
+                option.value = surveyName
+                surveySelect.appendChild(option)
+            }
+
+            // listener again
+            surveySelect.addEventListener('change', surveySelectFunc)
+            
+            // plot last one by default
+            surveySelect.value = surveyNames[surveyNames.length - 1]
+            
+            // call the function directly
+            // (as progammatically chaging the value does not trigger the event)
+            surveySelectFunc({'target': surveySelect})
+
+            // update list of quadrupoles if any
+            if (quads.length == 0) {
+                console.log('updating list of quadrupoles')
+                let df = data[surveyNames[0]]
+                let quadSelect = document.getElementById('quadSelect')
+                quadSelect.innerHTML = ''
+                for (let i = 0; i < df['a'].length; i++) {
+                    quad = [df['a'][i], df['b'][i], df['m'][i], df['n'][i]]
+                    quads.push(quad)
                     let option = document.createElement('option')
-                    option.innerText = surveyName
-                    option.value = surveyName
-                    surveySelect.appendChild(option)
+                    option.value = quad.join(', ')
+                    option.innerText = quad.join(', ')
+                    quadSelect.appendChild(option)
                 }
+                console.log('quads=', quads)
+            }
 
-                // listener again
-                surveySelect.addEventListener('change', surveySelectFunc)
-                
-                // plot last one by default
-                surveySelect.value = surveyNames[surveyNames.length - 1]
-                
-                // call the function directly
-                // (as progammatically chaging the value does not trigger the event)
-                surveySelectFunc({'target': surveySelect})
-
-                // update list of quadrupoles if any
-                if (quads.length == 0) {
-                    console.log('updating list of quadrupoles')
-                    let df = data[surveyNames[0]]
-                    let quadSelect = document.getElementById('quadSelect')
-                    quadSelect.innerHTML = ''
-                    for (let i = 0; i < df['a'].length; i++) {
-                        quad = [df['a'][i], df['b'][i], df['m'][i], df['n'][i]]
-                        quads.push(quad)
-                        let option = document.createElement('option')
-                        option.value = quad.join(', ')
-                        option.innerText = quad.join(', ')
-                        quadSelect.appendChild(option)
-                    }
-                    console.log('quads=', quads)
+            // update time-serie figure
+            if (squads.length > 0) {
+
+                // transform all surveyNames to datetime
+                let xt = []
+                for (surveyName of surveyNames) {
+                    let a = surveyName.split('_').slice(-1)[0]
+                    xt.push(a.slice(0, 4) + '-' 
+                        + a.slice(4, 6) + '-' 
+                        + a.slice(6, 8) + ' '
+                        + a.slice(9, 11) + ':'
+                        + a.slice(11, 13) + ':'
+                        + a.slice(13, 15))
                 }
-
-                // update time-serie figure
-                if (squads.length > 0) {
-
-                    // transform all surveyNames to datetime
-                    let xt = []
-                    for (surveyName of surveyNames) {
-                        let a = surveyName.split('_').slice(-1)[0]
-                        xt.push(a.slice(0, 4) + '-' 
-                            + a.slice(4, 6) + '-' 
-                            + a.slice(6, 8) + ' '
-                            + a.slice(9, 11) + ':'
-                            + a.slice(11, 13) + ':'
-                            + a.slice(13, 15))
-                    }
-                    //console.log(xt)
-
-                    // create one new trace per selected quadrupole
-                    for (let k = 0; k < squads.length; k++) {
-                        squad = squads[k]
-                        let x = []
-                        let y = []
-                        for (let i = 0; i < surveyNames.length; i++) {
-                            df = data[surveyNames[i]]
-                            for (let j = 0; j < df['a'].length; j++) {
-                                if (df['a'][j] == squad[0]
-                                && df['b'][j] == squad[1]
-                                && df['m'][j] == squad[2]
-                                && df['n'][j] == squad[3]) {
-                                    y.push(df['rho'][j])
-                                    x.push(xt[i])
-                                    break
-                                }
+                //console.log(xt)
+
+                // create one new trace per selected quadrupole
+                for (let k = 0; k < squads.length; k++) {
+                    squad = squads[k]
+                    let x = []
+                    let y = []
+                    for (let i = 0; i < surveyNames.length; i++) {
+                        df = data[surveyNames[i]]
+                        for (let j = 0; j < df['a'].length; j++) {
+                            if (df['a'][j] == squad[0]
+                            && df['b'][j] == squad[1]
+                            && df['m'][j] == squad[2]
+                            && df['n'][j] == squad[3]) {
+                                y.push(df['rho'][j])
+                                x.push(xt[i])
+                                break
                             }
                         }
-
-                        // update trace dictionnary
-                        tdata[k]['x'] = x
-                        tdata[k]['y'] = y
                     }
-                    //console.log(tdata)
-                    Plotly.redraw('ts')
+
+                    // update trace dictionnary
+                    tdata[k]['x'] = x
+                    tdata[k]['y'] = y
                 }
-            })
+                //console.log(tdata)
+                Plotly.redraw('ts')
+            }
         }
+
         let getDataBtn = document.getElementById('getDataBtn')
         getDataBtn.addEventListener('click', getData)
         
diff --git a/logging_setup.py b/logging_setup.py
index e0ced5e8..b80d01fc 100644
--- a/logging_setup.py
+++ b/logging_setup.py
@@ -52,15 +52,18 @@ def setup_loggers(mqtt=True):
 
     if mqtt:
         mqtt_settings = MQTT_LOGGING_CONFIG.copy()
-        [mqtt_settings.pop(i) for i in ['client_id', 'exec_topic', 'data_topic', 'soh_topic']]
+        mqtt_exec_logging_level = mqtt_settings.pop('exec_logging_level', logging.DEBUG)
+        [mqtt_settings.pop(i) for i in ['client_id', 'exec_topic', 'data_topic', 'soh_topic', 'data_logging_level',
+                                        'soh_logging_level']]
         mqtt_settings.update({'topic': MQTT_LOGGING_CONFIG['exec_topic']})
         # TODO: handle the case of MQTT broker down or temporarily unavailable
         try:
             mqtt_exec_handler = MQTTHandler(**mqtt_settings)
-            mqtt_exec_handler.setLevel(EXEC_LOGGING_CONFIG['logging_level'])
+            mqtt_exec_handler.setLevel(mqtt_exec_logging_level)
             mqtt_exec_handler.setFormatter(exec_formatter)
             exec_logger.addHandler(mqtt_exec_handler)
-            msg+=colored(f"\n\u2611 Publishes execution as {MQTT_LOGGING_CONFIG['exec_topic']} topic on the {MQTT_LOGGING_CONFIG['hostname']} broker", 'blue')
+            msg += colored(f"\n\u2611 Publishes execution as {MQTT_LOGGING_CONFIG['exec_topic']} topic on the "
+                           f"{MQTT_LOGGING_CONFIG['hostname']} broker", 'blue')
         except Exception as e:
             msg += colored(f'\nWarning: Unable to connect to exec topic on broker\n{e}', 'yellow')
             mqtt = False
@@ -89,14 +92,17 @@ def setup_loggers(mqtt=True):
 
     if mqtt:
         mqtt_settings = MQTT_LOGGING_CONFIG.copy()
-        [mqtt_settings.pop(i) for i in ['client_id', 'exec_topic', 'data_topic', 'soh_topic']]
+        mqtt_data_logging_level = mqtt_settings.pop('data_logging_level', logging.INFO)
+        [mqtt_settings.pop(i) for i in ['client_id', 'exec_topic', 'data_topic', 'soh_topic', 'exec_logging_level',
+                                        'soh_logging_level']]
         mqtt_settings.update({'topic': MQTT_LOGGING_CONFIG['data_topic']})
         try:
             mqtt_data_handler = MQTTHandler(**mqtt_settings)
-            mqtt_data_handler.setLevel(DATA_LOGGING_CONFIG['logging_level'])
+            mqtt_data_handler.setLevel(MQTT_LOGGING_CONFIG['data_logging_level'])
             mqtt_data_handler.setFormatter(data_formatter)
             data_logger.addHandler(mqtt_data_handler)
-            msg += colored(f"\n\u2611 Publishes data as {MQTT_LOGGING_CONFIG['data_topic']} topic on the {MQTT_LOGGING_CONFIG['hostname']} broker", 'blue')
+            msg += colored(f"\n\u2611 Publishes data as {MQTT_LOGGING_CONFIG['data_topic']} topic on the "
+                           f"{MQTT_LOGGING_CONFIG['hostname']} broker", 'blue')
         except Exception as e:
             msg += colored(f'\nWarning: Unable to connect to data topic on broker\n{e}', 'yellow')
             mqtt = False
@@ -118,12 +124,12 @@ def init_logging(exec_logger, data_logger, exec_logging_level, log_path, data_lo
     exec_logger.info('*** NEW SESSION STARTING ***')
     exec_logger.info('****************************')
     exec_logger.info('')
-    exec_logger.debug('Logging level: %s' % exec_logging_level)
+    exec_logger.debug(f'Logging level: {exec_logging_level}')
     try:
         st = statvfs('.')
         available_space = st.f_bavail * st.f_frsize / 1024 / 1024
         exec_logger.info(f'Remaining disk space : {available_space:.1f} MB')
-    except Exception as e:
+    except Exception as e:  # noqa
         exec_logger.debug('Unable to get remaining disk space: {e}')
     exec_logger.info('Saving data log to ' + data_log_filename)
     config_dict = {'execution logging configuration': json.dumps(EXEC_LOGGING_CONFIG, indent=4),
diff --git a/mqtt_interface.py b/mqtt_interface.py
deleted file mode 100644
index f90a6ae0..00000000
--- a/mqtt_interface.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import paho.mqtt.client as mqtt
-from config import MQTT_CONTROL_CONFIG, CONTROL_CONFIG, OHMPI_CONFIG
-import time
-from queue import Queue
-import zmq
-
-ctrl_queue = Queue()
-
-def on_message(client, userdata, message):
-    global socket
-
-    # Send the command
-    print(f'Sending command {message.payload.decode("utf-8")}')
-    socket.send(message.payload)
-
-    #  Get the reply
-    reply = socket.recv()
-    print(f'Received reply {message.payload.decode("utf-8")}: {reply}')
-
-
-mqtt_client = mqtt.Client(f'ohmpi_{OHMPI_CONFIG["id"]}_listener', clean_session=False)  # create new instance
-print('connecting command listener to broker')
-trials = 0
-trials_max = 10
-broker_connected = False
-while trials < trials_max:
-    try:
-        mqtt_client.username_pw_set(MQTT_CONTROL_CONFIG['auth'].get('username'),
-                                    MQTT_CONTROL_CONFIG['auth']['password'])
-        mqtt_client.connect(MQTT_CONTROL_CONFIG['hostname'])
-        trials = trials_max
-        broker_connected = True
-    except:
-        print('trying again...')
-        time.sleep(2)
-        trials += 1
-if broker_connected:
-    print('Subscribing to topic', MQTT_CONTROL_CONFIG['ctrl_topic'])
-    mqtt_client.subscribe(MQTT_CONTROL_CONFIG['ctrl_topic'], MQTT_CONTROL_CONFIG['qos'])
-    mqtt_client.on_message = on_message
-    mqtt_client.loop_start()
-
-    context = zmq.Context()
-    #  Socket to talk to server
-    print("Connecting to ohmpi control server")
-    socket = context.socket(zmq.REQ)
-    socket.connect(f'tcp://localhost:{CONTROL_CONFIG["tcp_port"]}')
-
-    while True:
-        time.sleep(.1)
-else:
-    print("Unable to connect to control broker")
-    exit(1)
diff --git a/ohmpi.py b/ohmpi.py
index d3cacfcb..505cd0bf 100644
--- a/ohmpi.py
+++ b/ohmpi.py
@@ -15,7 +15,7 @@ from copy import deepcopy
 import numpy as np
 import csv
 import time
-from io import StringIO
+import shutil
 from datetime import datetime
 from termcolor import colored
 import threading
@@ -35,7 +35,8 @@ try:
     import digitalio  # noqa
     from digitalio import Direction  # noqa
     from gpiozero import CPUTemperature  # noqa
-    import minimalmodbus # noqa
+    import minimalmodbus  # noqa
+
     arm64_imports = True
 except ImportError as error:
     if EXEC_LOGGING_CONFIG['logging_level'] == DEBUG:
@@ -130,13 +131,13 @@ class OhmPi(object):
             # current injection module
             if self.idps:
                 self.DPS = minimalmodbus.Instrument(port='/dev/ttyUSB0', slaveaddress=1)  # port name, address (decimal)
-                self.DPS.serial.baudrate = 9600                      # Baud rate 9600 as listed in doc
-                self.DPS.serial.bytesize = 8                         #
-                self.DPS.serial.timeout = 1                         # greater than 0.5 for it to work
-                self.DPS.debug = False                               #
-                self.DPS.serial.parity = 'N'                       # No parity
-                self.DPS.mode = minimalmodbus.MODE_RTU    # RTU mode
-                self.DPS.write_register(0x0001, 40, 0)   # max current allowed (36 mA for relays)
+                self.DPS.serial.baudrate = 9600  # Baud rate 9600 as listed in doc
+                self.DPS.serial.bytesize = 8  #
+                self.DPS.serial.timeout = 1  # greater than 0.5 for it to work
+                self.DPS.debug = False  #
+                self.DPS.serial.parity = 'N'  # No parity
+                self.DPS.mode = minimalmodbus.MODE_RTU  # RTU mode
+                self.DPS.write_register(0x0001, 40, 0)  # max current allowed (36 mA for relays)
                 # (last number) 0 is for mA, 3 is for A
 
             # injection courant and measure (TODO check if it works, otherwise back in run_measurement())
@@ -157,7 +158,7 @@ class OhmPi(object):
                                    f" on {MQTT_CONTROL_CONFIG['hostname']} broker")
 
             def connect_mqtt() -> mqtt_client:
-                def on_connect(client, userdata, flags, rc):
+                def on_connect(mqttclient, userdata, flags, rc):
                     if rc == 0:
                         self.exec_logger.debug(f"Successfully connected to control broker:"
                                                f" {MQTT_CONTROL_CONFIG['hostname']}")
@@ -170,6 +171,7 @@ class OhmPi(object):
                 client.on_connect = on_connect
                 client.connect(MQTT_CONTROL_CONFIG['hostname'], MQTT_CONTROL_CONFIG['port'])
                 return client
+
             try:
                 self.exec_logger.debug(f"Connecting to control broker: {MQTT_CONTROL_CONFIG['hostname']}")
                 self.controller = connect_mqtt()
@@ -209,6 +211,7 @@ class OhmPi(object):
 
         Parameters
         ----------
+        cmd_id
         filename : str
             filename to save the last measurement dataframe
         last_measurement : dict
@@ -305,8 +308,8 @@ class OhmPi(object):
         time.sleep(best_tx_injtime)  # inject for given tx time
 
         # autogain
-        self.ads_current = ads.ADS1115(self.i2c, gain=2/3, data_rate=860, address=self.ads_current_address)
-        self.ads_voltage = ads.ADS1115(self.i2c, gain=2/3, data_rate=860, address=self.ads_voltage_address)
+        self.ads_current = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_current_address)
+        self.ads_voltage = ads.ADS1115(self.i2c, gain=2 / 3, data_rate=860, address=self.ads_voltage_address)
         # print('current P0', AnalogIn(self.ads_current, ads.P0).voltage)
         # print('voltage P0', AnalogIn(self.ads_voltage, ads.P0).voltage)
         # print('voltage P2', AnalogIn(self.ads_voltage, ads.P2).voltage)
@@ -320,8 +323,8 @@ class OhmPi(object):
 
         # we measure the voltage on both A0 and A2 to guess the polarity
         I = AnalogIn(self.ads_current, ads.P0).voltage * 1000. / 50 / self.r_shunt  # noqa measure current
-        U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.  # measure voltage
-        U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.
+        U0 = AnalogIn(self.ads_voltage, ads.P0).voltage * 1000.  # noqa measure voltage
+        U2 = AnalogIn(self.ads_voltage, ads.P2).voltage * 1000.  # noqa
         # print('I (mV)', I*50*self.r_shunt)
         # print('I (mA)', I)
         # print('U0 (mV)', U0)
@@ -337,7 +340,7 @@ class OhmPi(object):
 
         # compute constant
         c = vmn / I
-        Rab = (volt * 1000.) / I
+        Rab = (volt * 1000.) / I  # noqa
 
         self.exec_logger.debug(f'Rab = {Rab:.2f} Ohms')
 
@@ -429,6 +432,42 @@ class OhmPi(object):
         self.exec_logger.debug(f'Setting gain to {gain}')
         return gain
 
+    def get_data(self, survey_names=[], cmd_id=None):
+        """Get available data.
+        
+        Parameters
+        ----------
+        survey_names : list of str, optional
+            List of filenames already available from the html interface. So
+            their content won't be returned again. Only files not in the list
+            will be read.
+        """
+        # get all .csv file in data folder
+        fnames = [fname for fname in os.listdir('data/') if fname[-4:] == '.csv']
+        ddic = {}
+        if cmd_id is None:
+            cmd_id = 'unknown'
+        for fname in fnames:
+            if ((fname != 'readme.txt')
+                and ('_rs' not in fname)
+                and (fname.replace('.csv', '') not in survey_names)):
+                try:
+                    data = np.loadtxt('data/' + fname, delimiter=',',
+                                      skiprows=1, usecols=(1,2,3,4,8))
+                    data = data[None, :] if len(data.shape) == 1 else data
+                    ddic[fname.replace('.csv', '')] = {
+                        'a': data[:, 0].astype(int).tolist(),
+                        'b': data[:, 1].astype(int).tolist(),
+                        'm': data[:, 2].astype(int).tolist(),
+                        'n': data[:, 3].astype(int).tolist(),
+                        'rho': data[:, 4].tolist(),
+                    }
+                except Exception as e:
+                    print(fname, ':', e)
+        rdic = {'cmd_id': cmd_id, 'data': ddic}
+        self.data_logger.info(json.dumps(rdic))
+        return ddic
+
     def interrupt(self, cmd_id=None):
         """Interrupts the acquisition. """
         self.status = 'stopping'
@@ -444,6 +483,7 @@ class OhmPi(object):
 
         Parameters
         ----------
+        cmd_id
         filename : str
             Path of the .csv or .txt file with A, B, M and N electrodes.
             Electrode index start at 1.
@@ -546,8 +586,6 @@ class OhmPi(object):
                 except Exception as e:
                     self.exec_logger.error(
                         f"Unable to execute {cmd}({str(kwargs) if kwargs is not None else ''}): {e}")
-                        # f"Unable to execute {cmd}({str(args) + ', ' if args is not None else ''}"
-                        # f"{str(kwargs) if kwargs is not None else ''}): {e}")
                     status = False
         except Exception as e:
             self.exec_logger.warning(f'Unable to decode command {message}: {e}')
@@ -583,6 +621,12 @@ class OhmPi(object):
         warnings.warn('This function is deprecated. Use load_sequence instead.', DeprecationWarning)
         self.load_sequence(**kwargs)
 
+    def remove_data(self, **kwargs):
+        """Remove all data in the data/ folder.
+        """
+        shutil.rmtree('data')
+        os.mkdir('data')
+
     def restart(self, cmd_id=None):
         self.exec_logger.info('Restarting pi...')
         os.system('reboot')
@@ -699,7 +743,7 @@ class OhmPi(object):
                 self.pin1.value = False
 
                 # one stack = 2 half-cycles (one positive, one negative)
-                pinMN = 0 if polarity > 0 else 2
+                pinMN = 0 if polarity > 0 else 2  # noqa
 
                 # sampling for each stack at the end of the injection
                 sampling_interval = 10  # ms
@@ -752,7 +796,7 @@ class OhmPi(object):
                     end_delay = time.time()
 
                     # truncate the meas array if we didn't fill the last samples
-                    meas = meas[:k+1]
+                    meas = meas[:k + 1]
 
                     # measurement of current i and voltage u during off time
                     measpp = np.zeros((meas.shape[0], 3)) * np.nan
@@ -779,13 +823,13 @@ class OhmPi(object):
                     end_delay = time.time()
 
                     # truncate the meas array if we didn't fill the last samples
-                    measpp = measpp[:k+1]
+                    measpp = measpp[:k + 1]
 
                     # we alternate on which ADS1115 pin we measure because of sign of voltage
                     if pinMN == 0:
-                        pinMN = 2
+                        pinMN = 2  # noqa
                     else:
-                        pinMN = 0
+                        pinMN = 0  # noqa
 
                     # store data for full wave form
                     fulldata.append(meas)
@@ -799,8 +843,8 @@ class OhmPi(object):
                     # take average from the samples per stack, then sum them all
                     # average for the last third of the stacked values
                     #  is done outside the loop
-                    sum_i = sum_i + (np.mean(meas[-int(meas.shape[0]//3):, 0]))
-                    vmn1 = np.mean(meas[-int(meas.shape[0]//3), 1])
+                    sum_i = sum_i + (np.mean(meas[-int(meas.shape[0] // 3):, 0]))
+                    vmn1 = np.mean(meas[-int(meas.shape[0] // 3), 1])
                     if (n % 2) == 0:
                         sum_vmn = sum_vmn - vmn1
                         sum_ps = sum_ps + vmn1
@@ -872,119 +916,6 @@ class OhmPi(object):
 
         return d
 
-    def run_multiple_sequences(self, sequence_delay=None, nb_meas=None, **kwargs):
-        """Runs multiple sequences in a separate thread for monitoring mode.
-           Can be stopped by 'OhmPi.interrupt()'.
-           Additional arguments are passed to run_measurement().
-
-        Parameters
-        ----------
-        sequence_delay : int, optional
-            Number of seconds at which the sequence must be started from each others.
-        nb_meas : int, optional
-            Number of time the sequence must be repeated.
-        kwargs : dict, optional
-            See help(k.run_measurement) for more info.
-        """
-        # self.run = True
-        if sequence_delay is None:
-            sequence_delay = self.settings['sequence_delay']
-        sequence_delay = int(sequence_delay)
-        if nb_meas is None:
-            nb_meas = self.settings['nb_meas']
-        self.status = 'running'
-        self.exec_logger.debug(f'Status: {self.status}')
-        self.exec_logger.debug(f'Measuring sequence: {self.sequence}')
-
-        def func():
-            for g in range(0, nb_meas):  # for time-lapse monitoring
-                if self.status == 'stopping':
-                    self.exec_logger.warning('Data acquisition interrupted')
-                    break
-                t0 = time.time()
-                self.run_sequence(**kwargs)
-
-                # sleeping time between sequence
-                dt = sequence_delay - (time.time() - t0)
-                if dt < 0:
-                    dt = 0
-                if nb_meas > 1:
-                    time.sleep(dt)  # waiting for next measurement (time-lapse)
-            self.status = 'idle'
-        self.thread = threading.Thread(target=func)
-        self.thread.start()
-
-    def run_sequence(self, **kwargs):
-        """Runs sequence synchronously (=blocking on main thread).
-           Additional arguments are passed to run_measurement().
-        """
-        self.status = 'running'
-        self.exec_logger.debug(f'Status: {self.status}')
-        self.exec_logger.debug(f'Measuring sequence: {self.sequence}')
-        t0 = time.time()
-
-        # create filename with timestamp
-        filename = self.settings["export_path"].replace('.csv',
-                                                        f'_{datetime.now().strftime("%Y%m%dT%H%M%S")}.csv')
-        self.exec_logger.debug(f'Saving to {filename}')
-
-        # make sure all multiplexer are off
-        self.reset_mux()
-
-        # measure all quadrupole of the sequence
-        if self.sequence is None:
-            n = 1
-        else:
-            n = self.sequence.shape[0]
-        for i in range(0, n):
-            if self.sequence is None:
-                quad = np.array([0, 0, 0, 0])
-            else:
-                quad = self.sequence[i, :]  # quadrupole
-            if self.status == 'stopping':
-                break
-
-            # call the switch_mux function to switch to the right electrodes
-            self.switch_mux_on(quad)
-
-            # run a measurement
-            if self.on_pi:
-                acquired_data = self.run_measurement(quad, **kwargs)
-            else:  # for testing, generate random data
-                acquired_data = {
-                    'A': [quad[0]], 'B': [quad[1]], 'M': [quad[2]], 'N': [quad[3]],
-                    'R [ohm]': np.abs(np.random.randn(1))
-                }
-
-            # switch mux off
-            self.switch_mux_off(quad)
-
-            # add command_id in dataset
-            # acquired_data.update({'cmd_id': cmd_id}) // in run_measurement()
-            # log data to the data logger
-            # self.data_logger.info(f'{acquired_data}') // in run_measurement()
-            # save data and print in a text file
-            self.append_and_save(filename, acquired_data)
-            self.exec_logger.debug(f'quadrupole {i + 1:d}/{n:d}')
-
-        self.status = 'idle'
-
-    def run_sequence_async(self, cmd_id=None, **kwargs):
-        """Runs the sequence in a separate thread. Can be stopped by 'OhmPi.interrupt()'.
-            Additional arguments are passed to run_measurement().
-
-            Parameters
-            ----------
-            cmd_id:
-        """
-
-        def func():
-            self.run_sequence(**kwargs)
-
-        self.thread = threading.Thread(target=func)
-        self.thread.start()
-        self.status = 'idle'
-
     def run_multiple_sequences(self, cmd_id=None, sequence_delay=None, nb_meas=None, **kwargs):
         """Runs multiple sequences in a separate thread for monitoring mode.
            Can be stopped by 'OhmPi.interrupt()'.
@@ -1026,6 +957,7 @@ class OhmPi(object):
                 if nb_meas > 1:
                     time.sleep(dt)  # waiting for next measurement (time-lapse)
             self.status = 'idle'
+
         self.thread = threading.Thread(target=func)
         self.thread.start()
 
@@ -1077,7 +1009,7 @@ class OhmPi(object):
             # add command_id in dataset
             acquired_data.update({'cmd_id': cmd_id})
             # log data to the data logger
-            # self.data_logger.info(f'{acquired_data}')  # already in run_measurement()
+            # self.data_logger.info(f'{acquired_data}')
             # save data and print in a text file
             self.append_and_save(filename, acquired_data)
             self.exec_logger.debug(f'quadrupole {i + 1:d}/{n:d}')
@@ -1147,8 +1079,8 @@ class OhmPi(object):
                 # print(str(quad) + '> I: {:>10.3f} mA, V: {:>10.3f} mV, R: {:>10.3f} kOhm'.format(
                 #    current, voltage, resist))
                 msg = f'Contact resistance {str(quad):s}: I: {current * 1000.:>10.3f} mA, ' \
-                          f'V: {voltage :>10.3f} mV, ' \
-                          f'R: {resist :>10.3f} kOhm'
+                      f'V: {voltage :>10.3f} mV, ' \
+                      f'R: {resist :>10.3f} kOhm'
 
                 self.exec_logger.debug(msg)
 
@@ -1169,96 +1101,11 @@ class OhmPi(object):
         else:
             pass
         self.status = 'idle'
+
     #
     #         # TODO if interrupted, we would need to restore the values
     #         # TODO or we offer the possibility in 'run_measurement' to have rs_check each time?
 
-    def set_sequence(self, sequence=None):
-        try:
-            self.sequence = np.array(sequence)
-            #self.sequence = np.loadtxt(StringIO(sequence)).astype('uint32')
-            status = True
-        except Exception as e:
-            self.exec_logger.warning(f'Unable to set sequence: {e}')
-            status = False
-
-    def stop(self):
-        warnings.warn('This function is deprecated. Use interrupt instead.', DeprecationWarning)
-        self.interrupt()
-
-    def _switch_mux(self, electrode_nr, state, role):
-        """Selects the right channel for the multiplexer cascade for a given electrode.
-
-        Parameters
-        ----------
-        electrode_nr : int
-            Electrode index to be switched on or off.
-        state : str
-            Either 'on' or 'off'.
-        role : str
-            Either 'A', 'B', 'M' or 'N', so we can assign it to a MUX board.
-        """
-        if not self.use_mux or not self.on_pi:
-            if not self.on_pi:
-                self.exec_logger.warning('Cannot reset mux while in simulation mode...')
-            else:
-                self.exec_logger.warning('You cannot use the multiplexer because use_mux is set to False.'
-                                         ' Set use_mux to True to use the multiplexer...')
-        elif self.sequence is None:
-            self.exec_logger.warning('Unable to switch MUX without a sequence')
-        else:
-            # choose with MUX board
-            tca = adafruit_tca9548a.TCA9548A(self.i2c, self.board_addresses[role])
-
-            # find I2C address of the electrode and corresponding relay
-            # considering that one MCP23017 can cover 16 electrodes
-            i2c_address = 7 - (electrode_nr - 1) // 16  # quotient without rest of the division
-            relay_nr = electrode_nr - (electrode_nr // 16) * 16 + 1
-
-            if i2c_address is not None:
-                # select the MCP23017 of the selected MUX board
-                mcp2 = MCP23017(tca[i2c_address])
-                mcp2.get_pin(relay_nr - 1).direction = digitalio.Direction.OUTPUT
-
-                if state == 'on':
-                    mcp2.get_pin(relay_nr - 1).value = True
-                else:
-                    mcp2.get_pin(relay_nr - 1).value = False
-
-                self.exec_logger.debug(f'Switching relay {relay_nr} '
-                                       f'({str(hex(self.board_addresses[role]))}) {state} for electrode {electrode_nr}')
-            else:
-                self.exec_logger.warning(f'Unable to address electrode nr {electrode_nr}')
-
-    def switch_mux_on(self, quadrupole):
-        """Switches on multiplexer relays for given quadrupole.
-
-        Parameters
-        ----------
-        quadrupole : list of 4 int
-            List of 4 integers representing the electrode numbers.
-        """
-        roles = ['A', 'B', 'M', 'N']
-        # another check to be sure A != B
-        if quadrupole[0] != quadrupole[1]:
-            for i in range(0, 4):
-                if quadrupole[i] > 0:
-                    self._switch_mux(quadrupole[i], 'on', roles[i])
-        else:
-            self.exec_logger.error('Not switching MUX : A == B -> short circuit risk detected!')
-
-    def switch_mux_off(self, quadrupole):
-        """Switches off multiplexer relays for given quadrupole.
-
-        Parameters
-        ----------
-        quadrupole : list of 4 int
-            List of 4 integers representing the electrode numbers.
-        """
-        roles = ['A', 'B', 'M', 'N']
-        for i in range(0, 4):
-            if quadrupole[i] > 0:
-                self._switch_mux(quadrupole[i], 'off', roles[i])
     def set_sequence(self, sequence=None, cmd_id=None):
         try:
             self.sequence = np.array(sequence).astype(int)
@@ -1268,9 +1115,9 @@ class OhmPi(object):
             self.exec_logger.warning(f'Unable to set sequence: {e}')
             status = False
 
-    def stop(self, cmd_id=None):
+    def stop(self, **kwargs):
         warnings.warn('This function is deprecated. Use interrupt instead.', DeprecationWarning)
-        self.interrupt()
+        self.interrupt(**kwargs)
 
     def _switch_mux(self, electrode_nr, state, role):
         """Selects the right channel for the multiplexer cascade for a given electrode.
@@ -1321,6 +1168,7 @@ class OhmPi(object):
 
         Parameters
         ----------
+        cmd_id
         quadrupole : list of 4 int
             List of 4 integers representing the electrode numbers.
         """
@@ -1338,6 +1186,7 @@ class OhmPi(object):
 
         Parameters
         ----------
+        cmd_id
         quadrupole : list of 4 int
             List of 4 integers representing the electrode numbers.
         """
@@ -1346,65 +1195,6 @@ class OhmPi(object):
             if quadrupole[i] > 0:
                 self._switch_mux(quadrupole[i], 'off', roles[i])
 
-    def reset_mux(self):
-        """Switches off all multiplexer relays."""
-        if self.on_pi and self.use_mux:
-            roles = ['A', 'B', 'M', 'N']
-            for i in range(0, 4):
-                for j in range(1, self.max_elec + 1):
-                    self._switch_mux(j, 'off', roles[i])
-            self.exec_logger.debug('All MUX switched off.')
-        elif not self.on_pi:
-            self.exec_logger.warning('Cannot reset mux while in simulation mode...')
-        else:
-            self.exec_logger.warning('You cannot use the multiplexer because use_mux is set to False.'
-                                     ' Set use_mux to True to use the multiplexer...')
-
-    def _update_acquisition_settings(self, config):
-        warnings.warn('This function is deprecated, use update_settings() instead.', DeprecationWarning)
-        self.update_settings(config)
-
-    def update_settings(self, config):
-        """Updates acquisition settings from a json file or dictionary.
-        Parameters can be:
-            - nb_electrodes (number of electrode used, if 4, no MUX needed)
-            - injection_duration (in seconds)
-            - nb_meas (total number of times the sequence will be run)
-            - sequence_delay (delay in second between each sequence run)
-            - nb_stack (number of stack for each quadrupole measurement)
-            - export_path (path where to export the data, timestamp will be added to filename)
-
-        Parameters
-        ----------
-        config : str, dict
-            Path to the .json settings file or dictionary of settings.
-        """
-        status = False
-        if config is not None:
-            try:
-                if isinstance(config, dict):
-                    self.settings.update(config)
-                else:
-                    with open(config) as json_file:
-                        dic = json.load(json_file)
-                    self.settings.update(dic)
-                self.exec_logger.info('Acquisition parameters updated: ' + str(self.settings))
-                status = True
-            except Exception as e:
-                self.exec_logger.warning('Unable to update settings.')
-                status = False
-        else:
-            self.exec_logger.warning('Settings are missing...')
-        return status
-
-    # Properties
-    @property
-    def sequence(self):
-        """Gets sequence"""
-        if self._sequence is not None:
-            assert isinstance(self._sequence, np.ndarray)
-        return self._sequence
-
     def reset_mux(self, cmd_id=None):
         """Switches off all multiplexer relays."""
         if self.on_pi and self.use_mux:
@@ -1421,9 +1211,9 @@ class OhmPi(object):
 
     def _update_acquisition_settings(self, config):
         warnings.warn('This function is deprecated, use update_settings() instead.', DeprecationWarning)
-        self.update_settings(config)
+        self.update_settings(settings=config)
 
-    def update_settings(self, config:str, cmd_id=None):
+    def update_settings(self, settings: str, cmd_id=None):
         """Updates acquisition settings from a json file or dictionary.
         Parameters can be:
             - nb_electrodes (number of electrode used, if 4, no MUX needed)
@@ -1435,21 +1225,22 @@ class OhmPi(object):
 
         Parameters
         ----------
-        config : str, dict
+        cmd_id
+        settings : str, dict
             Path to the .json settings file or dictionary of settings.
         """
         status = False
-        if config is not None:
+        if settings is not None:
             try:
-                if isinstance(config, dict):
-                    self.settings.update(config)
+                if isinstance(settings, dict):
+                    self.settings.update(settings)
                 else:
-                    with open(config) as json_file:
+                    with open(settings) as json_file:
                         dic = json.load(json_file)
                     self.settings.update(dic)
                 self.exec_logger.debug('Acquisition parameters updated: ' + str(self.settings))
                 status = True
-            except Exception as e:
+            except Exception as e: # noqa
                 self.exec_logger.warning('Unable to update settings.')
                 status = False
         else:
-- 
GitLab