From 6b384c7ecf684f8058536d49f0a2b37f2a981e3d Mon Sep 17 00:00:00 2001 From: dacb Date: Tue, 16 Dec 2014 00:35:29 -0800 Subject: [PATCH] working remote over-the-wire config commands --- bin/eagle.app.v6.flash.bin | Bin 29968 -> 32432 bytes bin/eagle.app.v6.irom0text.bin | Bin 141596 -> 141660 bytes user/config.c | 149 ++++++++++++++++++++++++++++++--- user/config_test.cmd | 9 ++ 4 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 user/config_test.cmd diff --git a/bin/eagle.app.v6.flash.bin b/bin/eagle.app.v6.flash.bin index d8824e55adde1c3b8e14848a57cb77bcaec3ea06..fecf2bc2c59c9c6a0eca0aa9e323af7bef34af58 100644 GIT binary patch delta 6103 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 Bs)GOk diff --git a/bin/eagle.app.v6.irom0text.bin b/bin/eagle.app.v6.irom0text.bin index 1a38dc5d878ed7a402d7acb09f44d17c1643d217..ff27211443f9a35156e0f955b550f45c31a8cfdb 100755 GIT binary patch delta 16420 zcmZ|02~<%>w*>- z?YLmYrLAqPqO``X6;KouH)<8FT9?+n6;Z1w@_u)s?dRM7Ie*R>-Yj=!?%cU^x0w{x zx?HMtaTA&!M4MJLN2jbPaLd#U!(0|7p$XIT=I8^_1#??NXu+Be0VTw6PnM)3%Kchp zuA5nmPf*7%5u-%IEm?WJ;9ASD11-vblXJf%W-<3u&-kV4Dy<9X$~EeGK@f($XpUZj zV{XNC74t2cN`oN`$ksJ<2-%)}a!qq|6{fPS3Xo-4@H#3-3-g2;WkFMSZK?>R^A89jVl4^|>LQ!KT-F` zEl%)@8@=+WV@;7bu|bw~<@K(Rs}fX*x8v_V_Q85%EJE2@($ADD0=y8X`>H@&5_Xx5 zdF)e>L8J`9RjXV@V^k6p&@5FDqP0|&=H3P&gmul)6u%wT(z`0jby16&sfcCeC)C@y z0M^j2oI~3k2-esflfz57Oc4Ghwp1)&HOUYv2h&H+Gs&PAbdpP^`!t+;A*QoPqs5=n zD=u%7yiZGexOM~86IZjSY@{E$Eq5zM2$zE9=*iC1y~SE-&{Et4th$dW9rIgoZI3bE zgh?oqqZRq|Sc@;<9Gxus6BjLAA=VPjTAHcu467+qcWzna4NlFXPIR)`$iEnttfAM{ z-Bhc6ji8L9ZQUc`J37ogFs-VOV@1_kS2#gL&EK&g3Q{o8Iq&5Qde)RVWE>qODse^vqP_ z!gCFp)Q=lui-p*CE0A}kUz&3#sWZG^&VWpnaKbs;$1Auc$?m39p4L_}`4wGqQ|P+Z zK_Joc)}Ev)k)CVa75<=VKT7=5=_bES-2vR!GE9dteUE9+8tUV}4Yt!m{>P!1ej3nU z?4XYKSBtuYzvSUB=*@swRU9sCXg&>Vvzv&Sr8nCgQw9yq4YH*uf^1$$%ap)CTMnM# zF$l)FY7Ty9%-I1me_}=DIxiPXmEj+`Gfl0r zE!gHbqZXU(@o<;SVqu1I+29Wgm46R%TjVbIWoHlh^N713ISHm8-YjgN<^&C*NFx6x0q zgW+!(TG1cchmb+*=#}=*N%}f^vBO=MLn}>zU@yIEdK<`=QKboCRRDjMdW4SzSViBn ztWhPd#{;{r)ZJPLfq{5)~(tS|~L}4fo4$KvGz)$Ypv#>i9fd z((}xF&qWEA(Bi0>FrK#V^;q0dKO=SOm^f_9Xir;5$CC7-(hVPU)M0Jey3(`(nc(&SiPZt?rmipjY2YNH+E;|~^>b=XWAJI| zv9zh+b{iqCVvor6r3r(E0I6F~KObBLo^Ub>C~Y+0D`FWc8B;8_i#0@g_a-)cX5*M5vXi97KA|Cnl*iGYuE6Q0?`G8!xrqMsZZLU%liqxHnBn?OA}zOWm%{}O5=(Rv6(n=H=q(ZmxKkzwaIth$ z_6LC4@51Pr9vg0Bl}N;o#f730ifG0dPY>p(%fX(!j?$0Egjp8{MMiu0@z3prW`+G8EORh7q*ixEi=cTaMrB zo`;Rokp8m#K)%1O^vZY<;0JndLV#MQL;L*ka3ywo38wsB*9Vf)i_!i6=O zk~N%V3&)*Cup$nCCCi%MjUbK6b=B(^(UTxFzAF12CnmFTFUi zkibwnadJAi)030uk{8HOQ^tdm?wcZ!<|2A!%1>E65cV!IiXh0kl)^yU{QN*${?b6( zV^g55t|Q9XH}K$M(hLf;-Cq)Do6!l|YzUL7v8}}26a+0`U)g26U`y0$Y#DoQATg?A zTrGDpE~LiXme0JrvFm*cfrX{k4+@=BmysZQ*OwlfK@_S9m=7;3t(~JIB(kvd=3MFo zZ_rse<57m+%(24a(pDcwgZnT%XpfM$>XG^86qaT$-0noK7MA)fJ_<04URlxzJxlAB z&Ii>q1oWb%Bl0SMm}sfA!iT7)p|mI&N_*um^t^rr=`~!PEOxhq#zd*jB3z-r8gSU3b)nRw;tD+l1o>7)&@xFcb{!=QfP7k08jtmeOnha)zQ=IjM^Q1 z=3S=w;&tWYXQKMr6zW>^hV}q)(Ui|CQR(|^c*AQ=9b#zB8iPyH>IGqn@1q4;`q75>RA-Uzepyc& zHYB=baTqeL@6K=t8Qm47V}9ymaJOc}Usc|8_q7pU&mH zl<>1moVsRf+WZT&|35%`cu93k9+J|4^2*a8b4nc$|4g)lmll=F)Nf0F6kDUWjD(-) z(Jk#^3T@c(HrcbD4*0?X`E>plE#X(X`U?|8(#kKwU>be=MWkrBP#9X&a%@l3dYLrx z%T6$uPX3ZXN9yubAJ{-sz8V3a&>dg-!2o*vt1gg0Ve3~Ud;|SvtCa{F=#{PCs8Wj2 zvPFaZ>vc-p?4ddu_Rai|xL=U`nIXCJv$>4Q9G%OhQ5~mn!hKoD*da?QYwEM}^p|fs zxMyu_j^^&*Gh|9(C3XL{J0hC+ZCmi6W4>( zd5q+<!gH!-B-O~Y+D6d>mpT!VG< z?J{$jRB;k!@uH}RBBHku;3Jy+T|2jr9Z0?_SLV=J--Qw5O8U)r61+oCeAi~^U=FWx z6{Hg>p;}1cCCTiG<3Zp5Gm;ki^HOfPOw^W&;Q`|iNLyhP=|3m%MRr_=}@%YI(&Z}jYsz%TB}{27^c6pOn(`>d0)IU?ec>K z1>5K!l6q(Sj8jPlNGm=VtG0-nQ{ps9%9J>LY_bI{8U?(=+jHapVUCQz;I8h5J})hO zaHN;-l))RrI^vtq|{{yZ6Bfnq!Yd&3Mr63zun~JziV)*r*jf6ZUf&;Gc074clXZ zvow8=7YScQr|;3XI>U#-Hp3G+{`6zR>L$zTrr0gjxu@ukJwa`%kP+X-)3~FnAS4sM zsfG&{!*khH+ZUjaHtaFN2pN_EDF8 z5wM%a>|@|XFYMcl+U=wLY3S#j-fx6;v~j=War8_XVhNG&iwb1SBeea2;NWfB18s-V z|IqIZwAEwE+aG8%#d=tNV0{Lo_Mn|Oim?9Lhh(Gty7MC zj1d|o{G+sy_;IV~v4egvjNUwGhPS9!S!WnR`<6{Z_xGnV3CVS>tR+d`NS~J-gmk*E zd{)QFNbi4QPtfZ$V*GD#MOcjT9=8fNqWo{!6;K>>p`$8#fst;i=%)4kFL3@wdbc7N zM5;a1&PTKPmB>#)e9wkzZ2m@#?QuBmcW5x^Y4M@0Waui|@9=JLqfptwXBa|l>87zA z=%ld?vS@72tmrgaX>4UQ5Smk227lAuM<)6WmC^I+@H()=rI;&RFMg5$0$AwrBjKQ+ zO-KA8k+wP-;_1baTXan>i`1uKfWxFPbf<3|HK^ues4Ki1optnm___42qwPVRcPP-N zM|3Y8LAIbl)f5>)e%7L!-e-KY9OQsL>S!5wOFTC+z*^7KS)1jG*4h*@y{6xLz9^qgEd z=#h(|%5po^tbUeJ7o#iJtLqJC=e z_;i?C|3^qb!%exeA8k5qB6&k;`!jRlI{o_0XSgt1ZIx8A6{B>BYf2R^r>!7dz118Y zhj|RI{$?8}*!<&Z`=6h}4l14f1eVip&b|#3sPY%ddEyzQSw+WP zYTK%y!7N5-6CwVFyr_kc?P)YT;(QXHPd8n%lDbv&+$AF{rShfWZnv>lJ*KOxX!hlf z(t-xGm2>})4fS&T{Dyy&iXg=QE*t)oBS1N?)PA`KKpJhhl1(00(YJrwZF|Pi`V7O) zm?ANB6^LIWCLSC`rCgDrbd5nN_qSX*q#@YfCD=5U)Vv&0)&jAr9Nb_SL{qM|n)gP7 z<W0xwQrWyam3mh1AE1Tjm>ZVQKwV^y&K z2*VY*a$p1g&mGvXpyzQzojldWKhwo8&82m$ODn63Z;ngA639(%D7biZ^;`EZ@HuYr z;dY)oDz*-NXH%wRb>(M{TB_x$VK~JEJ$%cjFjUEveW}~E5U8NmYs29intv^l zt3;<*GD0FF z1uvUET_MD86r_#mT|O2%ZA5oma}1}838)giGZiC6r}T6MHd*6FzGJprl0`3w=I9VL zsnHO%lVQZs7U9-pB1vylR?9K((397F$m42y^LjgtScQOQ(OR74&=794)s2q2rlWi@ zKgj>oK0iv|zR@+L{ZUt_8U_)3_0oh;skjEZ@O-T)G&CTo0<64%j+gz01gZ4mjgZ)T z98D9Mdh&UWDYUSqFtsHt_7y(V=6|T4Sp_~E9vc?>UNapHeP(tCB}co^6q-y{w~BH% zHli)j`*&NLZ#h0y+B(B+%m0Kjl5WD2YHj&Vy7Bkmd22a{WC~5pbW!A$m<9Ok--^7I z7oz(+?HW9FZ_?NS#-xAZ}xb2q>Kl+Y{o)otGjh$gdmkcZw|Of zAy{|F;o;#uBtHoopck)=sh2~(w_1yf4RfjOrca9*N5nv5TIFhDm`*cp`jM5HbneZC z(2hFYiqL(;Xem|JZ%<9K7lV5<`*b9vnjjv7Cb0@ zcxyk9NDQ&w@q@SNu{%)_W2+I+7-KCi>mi9wxt*PO{(cV$?W_1Bya_B<<-{21{km`k zxeYA~8;!o(g_JF$)9-e|5dJrJm&05dajzo={Knkd*s32Nb;$Jxg$B>lYszkpC5sNo zBtY1xqSE~l7+za&{}|qGB>fo(pVBFRCa5n|!)4BxR)cQidV2WJRWO6T{nvH8YKnSb zMyq1{1M{0Thlh&Y4K;rxJDJ5OMeO0*%7Kp}451=AnBK`wqDu5s9&c9OdKj!z7{%Nb zZjwo;T;Zm?`4Czi&bE43^$MT&RYOZfr`|BzKf zD$h38)Sh>5VVF#3HFPBrO>|d-6;9GW8bY8SRXofplYM8JX~FGT!0-BYVUubexP+tUEwS0@vry{m$@&b2?`X^0ummZ{*40i8JB-DiKcx+hPzEk>}qSRuRs7y-&2z~{}dqF#%cl5vk^vvW8gCLA8 za0Y)r#s2|=*I;}Qcv;T&IK%I7i>-HoP4E-5xk4Nyv0PUe42=ECKO^lHH)s!SyvlL> z@fKr-nDwm$T3(6*UXm&_pk^~$z#P!BzgxgK!_Q^dXgwM78uk<~itexaa_Hl1fe7u$ z;brVg5mvzGtcx1DLOz?I1}l8bHmD)0RT3&j6JDjEc&R?qz2L1WV>4!^x|Tx$d!mLA zuTKt0(%Yg_jgE7!PB7d@f0>25!*jUKI(XnP-Pi~Z=mw$eGY{zJwg{PwU*Apm%zoDc zx&vt{V?kQj0JB)776PFYyQ_sdO^<_!sS(EGX-_lgES*`c4q_pgd3(ZGXu;-rLNa;w z6Fcb%o8c6j>IEG^!!~)re#LM5U^mO~hOeNKx%$9p7|5phK!GNCU#zL*z-ji}7bYw2 z|Ah3J)C!7V8EerR+QCTH5oMc-+YvGEu#>If5&Xz1{NPRXVuu~i9bDn;VixQVX41Ha z4fY4UfBhc3Z5KUTNcwgZ0b>4;Q*X&FGSdgqjJvGBAJVi1dyxWB#HbCIN~8*JSk4~% zBYhUKRsk@cq`Y8@0^lM{XBll^JUnJ6+CXn|dKuHTg|4K28SB>;*76C(Yd;Pdp#=~2vMqE_r=#kh92{hugWq)4MGqZ3?0XQx&>&-g6n&^t_MRT1+-vkf zHeW%GKHM(I=90+v>7ni0YdE0tR-=zqq5Pw<3GYzj;W^r1P~aHhFIn6ib6g%8Q;`)~ z8@DwrtHbpylf#i-#@pvKEb!PJm#f;Y|O2AE|L;8HbXPoPFJlN0>O~5;IbY$Z&#f zZ3p4nI^JD$nQ@noMj^dVIY*T?Rb{p9J?L}g|L%- z5CltM#b?2gIFJE9O0y;)X^h)Tx{5iBDZ0y|IK9Wl+YVb85m3Vl0G=rqo`-{UGd z^|dZU)ZzGdZ(#43%-yNyFS<;-RBKtu_68&4>_M=Js56ifuBnj99$}?bzYiAfL-4#p zkyK^4q&iTBfPEyxi3szvH7$Konhn1DtOiAFvC4W#12b4k2$-NF`zQo_gF<%`y<(T% z-Jj_9>&@cctCd?`9yu?E2P%9DpOh!<<`J)UY+nepR$Trw#+RX=($+6>H%@5OMu~}t zD?dU=&T3va#f|BV5a=W9KJ&wF$&_BCb0K6xdX1)bLI&(*Nk;JZeEdVTw$_|}f)q`R z68oFE$Y-;S@Rr9NesaF;C1(9ekWqHA8%CIoVrFD0+}5n+OKhq&%xjJ)#~!=co9&^S zqU~-N#|qm+yY?AB#0pRtI-}1TwIO0}hj3WS(ejz9+SqmPCb#){cMYBPMx4Q(E7@=D z@q{m9iVmouMzEqu@Ka}Qug-0RKEL7TM^FNQL$6hy~ihRCdz>S=#R3jG0g(>7fCOc`xt)0zYSmB!Q`BILZ7;A3heV6DcV`HOqb#5c#KUbistZylhnc#=egjp>G3_sn0RqQSJQa*(?VI70eLQI#wxlb~EeTUf z_aK|)B_3xCusD$nqOZ_bI~k6%-?||JM_6D4SX({Y`Butem+tz-E@Q)6j`=MYErO@A z5H85TT(zKI3ivSZDqh-O} z;hm)IJ8@o=A?O?B4u39T2-(KPR^_ngqEjNcX!UVrc&RArYz~bfj6r<&BK{jC_s%V@+z;+zu-`F3t-*tjW!tl#Z*}6EZFwF2+&i3pnN%Lwd z@bQ6>uM^*HNTcQbeK5uh^h<>2d5( z4_E>{S#nRXq0O|SC(Lqf!UZAC_Y z6U0SujX}M*KN3Pwjr8d0vj;ixPgt ztbE*T*w3~{fi$lU;ZGxtt;HI{6MWjh>A*wZbYF& z$?IBKzI=fN?9u(dJ-V_ny&&B6Frrq2sfcat1ue2PXk*F~qB%oZ3XTg1N*ITlb zKCmUM33u;*(b|jm4C?LHVnOt(Ol~$vxYf!)`ClJCB9TdnV41gfJI-QE#T#Lyx}6ss z3b~Z$(3>9kN+Iv!#i}VT89Ij&=6W(iDn4vlblePoy085t?TeDpW@QgDADZh@0B~a z39ky2JMSUmyDJ~cssy1hKrL#9v~sSF$v7ydu3@|SL4J!b?@3{89Da~5OYRR_TrnzH zhw17P_Pjq>i7APNCBb{V`ZlKfj%qzSk_0+Z=V7HLhxq?vmjG{j?*9tIb&;^6Xa`d+I-IYi8;Hz zDBc?hCt1w9(3V_sW|{B8K_#Mi)|mxoLlWxz_p@QFat!jr7IrNgI(po>6U84eig9!5 zT_e#KYdadU#J9f0(WGLCg7_%*>1fD9_s)L|q^fuF2D7`Ue9IlSvsq)HwX5JJN9Q}n zTR#TgXr~vsOhN7Sx6~SL$}XBBeUVe5Q{Lg!Mp=wY!9l6rb1ZlRWU$b2Fpz|c_F3cL zGQclv=mdBR4zgVnkOPuDSeuD30m-~K@o zJvQ#GK@p?6XC*izh^uNw%b7lq@c-!$%QjDfu_Rx^+~0%cJ@4Gf)@kv|M`O`f?!TJ| z_s`C$SoBn`ymcpA@<1f9K7QZbF>q;!s!@)=c_-VdepOq!hn;&5e)gnWP&!MJtk*lt z?Yv!<73{!dlx*|Zv&k@n6l>VjDexY=&#q5FV`~KKJQX^lfjxFAj3UL1otz40XwRCa z!a4o<&3rMaVfwbiCu?VU2`MZl2*PEIOrZtU@IEAX{PZ8FeXP$k;3n<3X>bibVo4u> zvHye*f^5d=uXU?%!BDNeV>yAxytYD*?;gkU0g%g_DtqAj&iL<~lHEgN&|}1=EJu^t zTKt?_I=5pWogMrDhGPUHU^+VcUD=z{AsLOgFQ&sl{nhs!GhEM5phB+AaH=+3b~-_P z3YAiY9$hb2=Jg@iG|xBj+0^1@hwb!q6U+J#BHZ>Mc6*RpiaupuehA5yUvIlWoxv>L zwp5{K^y*!@5b9MX2Eh)MVDqltcUY| z7NKP3+0e~Zm>pyrHY>=M&nC_WKZs;YW^($O&sOXcU@~=R>c3?J&qz9~iHcU{i z)X32#EMpG%v=ulM9_^gUV@{XJeSDV>UvI>!BY-;tU$M{T;GtX0&dve7>MYXfK4Z`4 zKnJV}{s`Ksb8j29xmKsp7zF;14fzQ5`5t@0M-YJOm+hDfA%0!9;Ao50i;dMT)#k>4 z+{d?rbs?e-Px4Xra4xiJTY0BSU1dse!t>3!KlkvR3bRmUGJ9}&2ktC%9xCJnmOc*^ z@?Exc9>nM_6yumxhJPGrR7LFaJn+XD+4Fg@R3&KT=!m{{d^0u))Ds= zBsYn@cdt6w8cD@kF<^4_OLV2$`SEx-N&Ms>a(KB@R;MGuo_kV298WcZ$nA=)x>&47#AqCpo z=dML}&2()I&aP4j!J3xAdaq!c7P;yYuRG!Hclq?`Y4~>Dm=u5DCRU%fpIZlLB$l$P zMY!lijIM_TkZt$=96kZJaGcT$(`23f%MGy3i8L|Rdowzq*X>_z1~+_5%64smb7YQ= zE&T#=$ON6;{Y!{-BUw6@Rss^q@5`o_U@-9$=Cc#BU?Q8n6M|IvxS#d?*q6L&Fl(_3 zLjAAydvz&kz`#cA335pvtcf%H^;pso=)zKVfdRtpQ+Gi);Mv<;3Y987j!}|lpY%O4 zC%nNf|A1CSU#8d%eV{u_+6^!{t@Jg*(dzl#CeS~h94q#g$ zrwX}0weq=aNPonuw!W&m6l+#1pU8%H9F?2w>-L~rf~BnWK1d*CdG^eGFcYBGerZ2c z5#*9DeuDWR*@F)PzF)m!?^Fh7K$VWPv-P*TRlqj@YwbTAf@q~`K2}Cnv*%T4{%mFM zR-><8#d7iEUX-M<)nIyz$v2tps>Yz|qvZ^aq1j_&LC0Vtv}Q+-VTZl!)-ee5c3$B? zKfzUS?xo?EMqy<@nEp6;>0d5)G#SkVKC&xDLCi9IS+^Z$4WO0`V&dY z9WY5Jz#4Y&G$g?LcGVeZ0Q5&1YvF)sDZmbw3BM5xW92`CZC=eXtU=a0#=oLE0ljrG z%VAnT{HOmLy&gB%BFm1ZP=l)lZ!D_$SVjX1v@Gc10JXf*Ew8aSK_UsLI8f-e8ta?} z^!JSi;0Y&^Wn8{-n@O=u0v=;Oi}4%{dvF#_#TP4BpI>k*FWJj~!FvG=Y5SbV^WK`p zorm`RU3gz>MWYXOL5!`uBtGt=n}dapZ0ULM_x)`t*8NF}ba>U|o(Prq`El+)!|Xze)tilO^N_SUbU$7Rm?75WV{^ZmhP<|rbx zQpHf*u_v5$BA~x1=`b|#JpQs|ALJDxEl)4OB3gOeh!GX>kL6JDl1?&tK{ancfTPUw z5=cJUSA*7AMe&FN$66-gxOJ@mB`DJ^;h>T!13r1(Czl0WMne;I-DT(v7udo3?giDWF~d=v0kwnykoJZjD2?%dZAHq z|0;^#JT@0?Gmiu`+i%gW>i#*Sc5N|=MBW*OOi4Lml%?iv8W>= z=IxWy!sm?^5^f{#eRxS~IQ6!Dg83u;gop*aYZY7mJ9O=~kB?vsFgZyTft6Z0qQDIP z3iyH7A~X0ati=arX_ZsbMk;e}KE(bRZ2KSZp=)nG ztl0x%SlCUJ%pDlH1wmk7##_+d<3rwgNNuC2UWCu_erFlC;3@GMWq=!ZWSv(J5u1_)l~jeQCe#Pc~gljd?6YWXwl+Ec{gFZSdq4EH?8QMg+(z9#Qf zl!sYFBx>#NJ_8q!rtmJtjWB_Kr3o1|Ibx>jguFWH$bA_F!bbSS{%Irl6A;+87tlfb zWFf+hHz1uiru2w}hYQ*57Z9Sp#jBIu@0lZF;CJTVgj6`ra+)v-zKu0E!A9-J96($c zvA~%6PN#Pyv}#ITf}h6>UL8?jOf@NfmGHLp;!Bvy$vL1InlZYZETeV1&5kckqak4b z#|VqU#fpa2La@Io8Lc%&EPcP~GAZXbl0a6%L3?LHbYO19LEh9#X|fr0n}n#L`-`{M8*rOkYEHOLeNHNyZ-|E<{;>hyCP4 z0!c#-``w8wMeYBdf{fw!!*xn>MBCdzy>d;&0_5aFHi%|BRHP+t@lh37yz>_zthf*(L87O1LQH$SL&k{zJXaEg!R#+w z$!HkE)NUlyV>k!2p0GJi54_Fd-AFrCKI-y3Pd3So97PIuZ9zUKLp|BK7Nmc`jrj;~ z$d^rmYtCzhdDT;nzKN;ci}eyol6w^giO^y|2gO(=TP+e}SQ3VFBJh`CsM63!LPyN! zx+`4bfROhQ5tf!elYR1?rJ930AbpPgB@&;}JNVmgsa>w^)epEvIbNDONQ7@Pisz^H z%9$v}9G+uxjzuS{7bnh~Ti7FGFjDY*Ncpsr<;dEG?e?C+lAMwxWTv`+xVy$CgWkcuX!Ggi754}wl5rQ?vA!i zJZ~1S8}udx(n03M+VaSkL@M_`_bEh)s2SG0hF4?$GoDXS3Q_J@ppFJnW#%pDc6yU; zDi_34znp#JO~T*<`vq_Eg<{^MnKzR=n1#gH*uXX|qO5UuBq<9*X5mPNF*7CUT?piP zcy}iL^f&!oYkHPoE)LC*B(B~AcoSFezC06=feL<(HN`j_rTDT4e%p$p3lr|owGH2 zcSLiJMi!ZoBI6R++e2%RziikZt>%&bas)e=)1qh7C93@LQM7k#n%HkRM! z#41#k>`H$Vh8Ze2TFAHcoKMPL7x4a?-}nB=i(<Y^!HV(1(tD_1uubnDY+Kzr*ftIG^_U;Ve(@(u zfU=PRWFNfCTDKw5-3HIWInZksQOc$9yzyET#z^A(VSEfN&xMfW01%@*cDXx?3rl_s z-!;G)1CaS`$YTNv7$r(~WaZVI>rGnkcP_amXMRr%V&*cBxJBx6HwSPp(Wq+$LCC6aj6Q&UUc{oo z(xss&7+M3l$ml?_JH3%LM!&*RyiEbJEDN5;Swkb^| zx>Ui@O_@VuR61Br(^Nq?t);4Dm)=Mbj;lC|zr$A3dn%n{hI8dqoMqVp>Sdn;-_Y;v zLtBJ5*O+aC!yCC+5dLMhE>A!-NfpYH=u`VyWMMs>@6kqCocdT0yTm3?+S6 z6m@p&2&yNJ22uH(&Tv}pl!g?2ziy1qQ&Jb_wYuR;aT5?#fF%X%=a3)!v0jWtD3+tk zSI`sA-$50fEc%m~j&y}sMa-+|NOe0{NtwD`lhs~e*C@J+b|y3VcZSuB-cWZ`t@P1@ z(oCDXM8bAD+$AvCY__ea!p#v*5mEEP0-~VHBSI-n_a|k(F6m)Pc*)mV9HuR6@}JF% zTjFlpJfd`RDV2ao$N|z@m=>m_|UNhW9cL$?QmPK;xHQ(o7U(;hAiy(z2 zdiD`B-4-bYk*JhHTn*jkxzoJ>yZ#Z&ek>1=RpIqC-D@B@*gy|^Z6Zzop(DMwDpsm9 zGmFF~{s1>=sLwL8zn<>%*++!0>7=GfFp?HGHIUct^l{TrlF~qZedD`)sK$k7256EN z)LZfd%ji;+UETS{%yH^euQxMcq)IqtpYH7$+=QfeR4Oao%9#9?FPXjQI^Q5@MoWA> zh&hH{@a+KCsoIZ{+QD>_-$?fdxUaQXo?*F(rG`;&|DCXd9`!#7>*?14J;e}poR3;` zkAEaDucx;IEGh>S6aTMi>t_3id1%q?W+#+EKAAygjUvb#i@fX`7--JGGaQCwT&m3Y zI}LGqdOq;9tACUHWAY{^!F#C!WzT~a1$_=`+B&!^N${eRg8RZ6dL(!`?5Bw##^eK@ zDknimi7hZbkt-BKJh8<(Pvc`5l@R_ulDRlw8+uoMt@72GR=|Lh19CA!Oki+N@Or$zDT! z!|p*ART=`}cu`BkP}FzBiWapl2Y6G|C;TIT@8}-m8r95oc;40&^)}@~V1MLNC2B7B zl4?h|B;7SuxYfsqVqM;-8+mDGRgL}@&`?FY!MdBnHRk?(H0I*I8nb_Qjd@-VtjBB2 zvwLdH+wj}A59pWePPlAuA87v3Q4s7q1e%LG6b)=|vV%o*NyKB-G#p7>N5AZpuF`(n z7=3#kz1L|v`DG0q*?A?Lr!PBqCh&~5?J^MB6fNy?7_{ed8lz=-Zlili@ui%*`HoZS z_g2h*a{Zr@{k8ByzTSzBi5lUTSBI=HUX_crg04+NxK7I}pEQU%+|cT%S?~oN+Vz=u zq;_V~)G@L6EwwWp8f_ujYl}8Sj{{go9b?+S*R)g2QTLTN!3S7`d8pj7(L!Yxxmc3z zoFcHEje-?9yl7lpm4YlDPP_J)=CP<2M-ENu6f;;#Fh(g23do>kJ;FVv+weJ^<_}Iy zm}0|Ep$BqJAx1(dz=_6pc=70Zt~|9f!4e zJk}KD_8tjN&5>Ed5VvVvQDdJ;M0F3p`F~5NCNtPriyQ}q0O|WRH4SbB4fMmoy;ajtwYsb;Djd8ApgkQqv{l@s`?#8S zI!6!$UmS2I5*3d?KnOIiS<~ITb`Ae`*DTAf99f))yB>+V{{VjrdTGov`xaFVU7_;S ztjBi9uP?BV)W77t!(Jp!rqfc7zz0R`M(zb@QgnM%H-O``<>)HXW*u!D9Za0=(BSmp zQr&H$TW;DdhYK2HmS`s`$jIfQmq@^Hw^$J1UeV_C&j9ji(=oGL_tYRtB;o>bp{RtN zG=GeT>-RQX2Daq5&GhJ)*2dNUgImcVRk1wq_s85!h@MFI_5bvgMRj9MWc)fhaO`d} zc^y@ao9do|YY}D&sOPIms-hxEnnah5tAv+y(D(x`hw$ST+(%h{Ec>r5YBoUxD5I?= z1~?A7$EWBHztE(KQo@h7In)zZmY-jn+w#opaAA$6U=0`9+;L}+Y$qo`$hiHc9(1EJ z?MFK3^75c7@5RCGosOBZjvkyi&}lXf`X!cm>xz6Q|7FP zj%bVD%z@@#hic3#aW@6Q4X~~3FkUe4chs0u%l}4ZRKz$M@1|Z#im8#$s&5vVKQ$7V zS2XprTsxH-CGzgNBBxnIp<0jJNy#p9pW{x*gzTc=xzr9u(SsS|L88G6Ops7CWI;5z zWZ_ABio&JEx$ev^+PZMJ9ns_z4P1O2U@2|3v>tjE`7E0UDm|)(*qovbS*1XR=M;@x z;Z0Oq5VtUiewn?{qwXp)Y=k;d>|_j$iBcOxctpK&;^8tKp3@XA(CInd;V3Q6@r1)g z=W`w_oXW9nEiSU}eEQp}X5e1*aMeaT)n&vwtfRSWH-Z~AtuuG6{flqTE7`K8N~fEb z^jz*?=^Gnv)@6k2GK^1UQ2vSI8tY^ZK9PZNP!y{+*O)fnfks-e&JQJ~a-C1u+Dq7x zZd4if>#A`Sn_E|1nrhR)^)ZeBFK_X-zB%G0s#&jhJHkgU44Wt3P(FJls;|$d-PiYX zdw@;fdSt&`LUJgiyViG)+{x>UR02$T98%y6+c{{~xv2>MAHL(@JI@H`sSS%!*9M|o zEcOtDqz|a++jh{2e*Ep1u$tcfHk}BUXzvZJn#|_{Ah@Dys#m3xprmUxF|TE50?pn~ z28Zdujr}~gU&I-j(#GJD+_Zu)#pmgKiT<+j6O{thfpR@Hx<1}Pk_q}GiFs}>F+gwnnR23$W!e)>mXF{!YX4nJm`_dL4J9>rqQ5gj z9xeW^3EZa_zYBw2RJpY^ETrwWMvBHuxuNTujO~JEZz`R=wJnUM1zQ-4VNjv6+ z^goa69~qK4FP$r?ksoJrbyUNd7ym#OQuoL@l_|;LBK7*AmCMSFjnTGnE*JgJT-y7G zPB_uUKQxD6y6uOS@FV^Ghafmj>wk!K+VC8M7pYWMZlE9R?BV(eA0;FBgC(=^cglA( zZ>KrNjJ;U$z?4UlOW%e((myh^ll!(?U^1V`%zge&gwHh*gmySG9)n9pN4K+Ka)nf7 za4*TE(ysO$XZ(TZ6z= zzj|_mVI0aVk%`(^n%Gt_1_rm45=9Ba)-RqTPKXH%Zl{sj%Eq>`CI3a-=XAmD?tWTa z&P-f>|9$8}sRgt2nlk|7D`-dW>}~;5sPmqf;G4K#3z1652H_0WS7SZrAEd12`lG^) z`*PQx(5ZWdpfFVK32}UK4(EcZ@G*V8$EV9J4!vD5;_h$=eO{?j&iv@PbX;edpa=cB(7#C>Z}{Fua!m&&qK-U&ca?(9ly^^J>Mz}}a ze;f>cbo`Gu(0lCtldoEQE=_-9oc_kL`Cyzg{p=?rDz@)`>eX$^?>LlBg5=DD`oH3u%puinSqQ`F3V+JcvG^N-C965j-PaC-jN|*7+dt#|m0Y9`_cg_N+glI9 z6%5@-w}g=n?-j=K=m3OzEWkMz~1x_Ir{PO84#8Ha*X~!Ee%Y zIquvuY4vO4>erSn6`8-&$NPhty+T3!2E}(z2SG?Ad{d=MMyWw|bn6bViJA`RVG(LP0_G8raPyMrOnnYKFUk5(n&U<4eb^A9ozq)mU`3|r|hKPRK_ zr#YmDjkMDto$DWGi&26g@>5ZPf_Z_CI}{u|VK@3L7=Tpo4>T7X2sHQlInbPqMRO?7 zJhKqtl0ft1jdb6k1XPUjp+Q~N@J^)JuZ?GA+>})|=w74oG>39+(16#*N)CN(gHFi) z-C|D2VteRDbAFlOI)P*LN$(~xjy5?Q={ARRNvA{g<)e2GO@$Jgb~r~f<;)xhy=4i+ z%~1@VpDO-Nl}9$Zj=_z3o7F)!#C=SQj0vsHBa>I%Jnr(u8Dhq@7ESz+~D`@_Cy)=g&No4)F=uNv z<}smk>Cpi=hw7u-$YM&D{<;rbXiQlv?<}P93D=mz!!+jdP>p#)D~&m!70oD%1{EzW zE5_Jl!Lf;ci{CUx4-R~nnBiK?5pLu?j|Tx_sPpk~@T8H){b4X2ay-N%kWX&Wb-6fF zn~VvHFoo2e(&LiqSu>4!OB;Id_^0r9QS0)Spzd`P-CdmS`eP^-bachWpy9vSOj={v zYeA}#!|YGf@M&RN}Y>*V4r432qT!8KDu=;Ld5pVZ!r*TsHWrgH&#;NiwKkrCyA2FVU)N zrL%I}pr@kx*sFKPRoX1;h(cX^8%N%c{r^g7)fpqSqKdPvo%%dQ4obJ>vfecEY#2#N zqT|kf33c@D*;Tl*c~#}Q>aC5@uW_>Tj^TQm3xei0=1;JW`O$0UK7u(rijMpJB^;q6 z&wT~xI-DB{vuWIUo&B7%$jJPubkg}*(2v%f|I9V>om+Z21JFw}(Fqs&LjWzga2oE? zoIhT|-J&HILjY~*-b)_d=I7{le~07VLq^phTV6Is2SykDd8rwY+LyH9&t|0hCH4Kw z7rGX;|Emr7+{Cp_i~6t39eM^)V%b_c`?6kDiyvQ8y5n;5rr*>V#0a+pi2GY!7g6}$^}I)uXF~?nVGJo6Ga7Gdu^XtkL|;;w8J7`8lgY_4#vW>n`o6wQ~_hRb4-d|Xt7 z##u({yBF&69l)6*QyY#OZ^&cf#WY=dbNKxvqJsTDl&;EU{p#@l%zkzAd!Cdo%2OTu zM>_Z=JNQ~0nwlJZG8_VyKxR^1&b{NShdj8%$9Q=P+wQ%6T=WecwrQkJ&xd%*aV6J} z8!P1U;W)$uE&R-fkjmwULS$V`ONi5B6OuLH+qCl#$ziqAPfG%-NCx( zmCC)5+P5dT!VTiePmvnS*%fsD4dd_*<)WR1e5fNI37%$cib9CX7j*e4?H34b^D!XT zp1|Q^4CSKNNX18@T}p}qKbc}b8fGwFmPJqK!>2>kq*6oFcG9Hd&f%s+qSN&&tB_;H zQjULDbq1 zYyU-LWn=qQ@4&2Fpu8$#lok44Hz;9$V@lvgAm#;&FI}&oi*EG_n8oQ5<`_g{jSMq5 z@E^ubqmOS5>I}z=d5X)d&$TzXnDQe8T`~0Igo_k{X^$Kp9^P5!r^64>n`2{Y<&Ymu zro2391)X=>+j;RZF;Jgewwg$bX#Q z%TaO6yx#^>e%tQnHyz4*9eCq$uHz_cTHZ6*0o}O0*MIqKEQiqw@ZfV0VRH%v|B53lqv#I4SQvfzV&mO|B-b!uwOz z;3Cm(Ur@>-94ZgeJvyfjp>1lLqV?`x8-RxN`^aj@jM@<@1cCN9q>JJxZX&yaT*MW>_pmlX7 zxJrYbhM+H!_;ej6r0za#u9{tssfA%hF3+k+zywqeZ_rp>!*T?Rd&wEcn7dOdk}jo| zd{Xr0g*_pC8;Vr*J%FUFq{$5j&_am+bb!~i+dnhW{X6u}cuhkopOvUG3W-Vs=Cx_Z z*DLz{$){>6(dg%kY2$TpfrIfXK|jBz5v8GugFhJGeLT$}gXoY`p6^}~uCCS3$A(B% z@jp~$)aOkHu+lznTEK4l=^F#a;rVX{V(|0ojRmYlT^gU;kss@=CIXEFZZM+~CcIkTgjg8P${b+;e9!!x@aGfj6enm2%>qlX|M5nBs+jhJ4kQjm0f%&@8VFzq zoMARdtb+*Sq`!;tqv^MhceK|yD7w6D%c=ijB_gySSxeb%5mvx%_L&+wKpxwv1`|+r zO$|{^XQN>pj(1_GUMkLZ${8|cZ0f8e#}deA?Oh%xtm? zG(a62?~2`gz&5x-N9e>ZxIz!7eJEu7{%!qAYfBAu0wR{M(QdF2mNKO~1VT5~(j6{p zdK|%->R~*d_GHQ37|Yx}zyclE01p@oe(Z<`Boc=s%*7Kn!!?E>V;k^fH$35I#p8o; zjOBa5_i&zd_lA$*BevHYax^0jRvCt^HyFfLQI-G!I&kvREPBADRDxUbTS3VE})vR+R;m}XdE=44+i2>`3?7Bt%LgvkS z%oV^lww|=Y8G|+>Pc!9n_NfFt;0QY`L04~47i8{_1ud*20Fx&Yy(Vb~bJxLir`0&^ zT9hWw7?!I;0gGfOba<4fS-(p85KOFA2PhRx*#des_2px%7FRpkkNpiQ`7QCWr>N8} zo7uP);6JjLRd4C3183XRJIdf-tNhH9Pbyy31Haxt+oIsmdmr;6o{L}cR$6LA->KS^ zDiF*G8}G(cNY?}9l8)A@)^6p!;sPH{cq(0CH7y|At;UMYMTeP(GA6mD5Auu&WTAl& z(%aXX86yl%Ojd47_wwmki9y|YPKXwJbB%4-a~#avTc72wwAPnP7mYPBd=eN~2w}J{ zVp{n&M1Ypg(h?w7u}nhQv1X`KG55mfWNS>7|lJZoCB-@<9aFC?h5n*1sripjo zMoE9rBq=O;D$`L7EN0mu5C+lgmk{s?>a>q&6@^+Cf1>?aYY-1qmu-1-><>9SP~n~X zykz)3p7UzU8bZKVas6S8p5dE;=6=2Q;edL#C@}$`fuAAd=OvDt;>(it5a_MhceZSw zE-Yoey93^Eq*Q9ECZs|I%hH3thhkraTa_W@6j?tpO6+OiI-mWlhas-@{OJ79RZM$G zP*O@+i%|Fi^~}alsL|};OMG1=&25Y*!4}6DYY80{ZT7+Etg0onXgTF4ivYQyGe20P zmJ$xM3WpthTHaGt`SAxfInB$uCv`gzaTZ%{Va;3N5nsn*TcL@X#0pzMIV7?#!cgnC zU|YkWC+gI?Fx1eCS*QWlInDVAJJMD9z!&T{0}Kou&EXrBit5%{7|H7f7vmv*l2hIS z?*(cEOKc6@u@}}Ff}Nt@_Y%pDw}wPj7~TM-1~6aD_k*5IZ3ClVhV?=lI1R34MOokD zSqL-;WmXx*>PI6a!7ipUL37Ap!6ry^>;5B-J2M8&;sm#W$Lpo9*g6wTA+O;if8`53=J7rtAfkEoiGz$SGD@3~v-|Zq!^P_(iO<4BFOF%)G5)Hgru)(TvIMP5iDhstWbRDdHeF#-L&RClW%@js!))$7Gs< zt%!mSEnmM?X2>NtSb)iTq<4g}g%9+gFU-o2ek$O%%*tnt(nWVm^S^|D)fNIf$=^Tm+>`&{k==UhBzmO^sXsK>%BH|KAqzY+F|d zcYKE1{~F71cD*Y!A@)|*&=pz+$|SfCR!jlb6iyQfO+3zUb{ zQag4p8akt93^Ic?>=+TpY4l>E@;#0;vo_(Mw<^%FAiYoAKU^OOzPj$GOok-CZ6 zQ^aJc!SKSMg>t^b@yxwD__g)5btUn;p=4#&Dbi}d)}RpS$}WAfsL`IuGa0m`7$0Rc z*M)Ub#yE0uS;rrg%A>p} z@xWc0a(Dg}yNBeI!eA$+8SmVHpZPj2PmK}{F8-dG17720f%2#ODEKbQC$cJD$PG}7 znt@I2D`HZQ$VuB-T@T21-f>^ox|uBy(zE3~VT&WCB`;#B&Saf?fr&im$tLxJPdK^; z%L5x)%T$Tr4y)P3Uf|E#C&Dn|zl`N3!k45#$=rLxIHFx<{jxV24bop@-P#An0V!5m z-IE{!JcjJVd5VH#*1wsQFg79?eWo~TPBM7g!92EY0J`@xSmgj14av+j5MQN6vebc) z0fVeJ2f}t0WLj5@fPsY6DB10g;7^qU9xHJfJC*{ioBs9#4uD}`6o|38dGkc4O~Vzr z!nDgzK-Dza&)n+zbj*)UyHs@T&1A#dZF`$+p>dZ zy>`7_f?d|HN%gWA+ZQ|CZ0$D|ya1-KvE!f*NpZ3s90ykbZn4!9UUUy2Nq-XhKR6bx@B$QBMwJ|B^URjC$VKF;DDpp@B_b;bvpal7miT|#3pV#H6=Y@gJoyaw**)WpDKCVvJaFoQ8- zItKgkj7^6`*v4*6hd$c8Pi-UINL8Rcu1dA5kgnLBBHp=5U8xpBucoa33@~e)-gYT& zwz*FBo7t8b5aBd)I?fQKC1nM>Jp&Sr*J>Q#qGS+jjO7>^y?t0Nyh5UFGi-yDrV<YGRvP0-pw_f3XgV1*$KNV zuFyd9ozF8!J1cS{XId6>bK>pN)1#?D21JdowhMSI-9PRxZE_q%!6XSwt~fX29x z1$*y9L=uuewlQ0@)gRc1k|HoW26uUVe3-3%n|-qodT4&X;6!AZ^XB4u54f?+#})3m}LBz#H+LpcXrAY6DR6ug0`Jmp!8oq+tM5|#p7DF~3^iP*SA*8V2rI=+(W@DD( ziEd+EwG^%r@+yu^Uk*!2poWnZa0!B~msh|xfFhQejrJ}a`^biF>Uo@74~e)L&)^1T z%E1q?2~5Sa2?U=-c^@bPDgeg@0eb8-#fNT-~g(Zpa0l0*0}YRqzEFuCaDy zs1a1FHFESejWvBWbAfIvQxuOd^}Gay0ff( zFcVrar4@dM7wnQ1jz$+)xgNnQwFm1RqcC@XL%EzQvGn)0^Of6?7IpK)fcle{BiM&)0ktiOu&*I z$LcCDscN@^#hgI5r!O0Q0`j3HvpQ!Z!VQN5Q_UhF==BE(Uj&auPhX z>bIZt1_yWhNbTK#S304xIKq@bx*IwH*sowKPeN<|`sKC`7TuSPLuF~>aMcgZ%4poy-$l8QCGdJ`Sc3#A@UCG{Dgby6UQ0zUi z#InRoFsJQmzJIzBZNznPq3Ng(tb7aW-@+Qm=I|o42_+hnDr9SvcM=lA^te=LteqH`eYQ|E5b<@`6n`@Kg;)IaIvtt_$;oOZ)>8{K5KN2A#L`w$n8eTcvLNORdsq!!(WwZ#j_P+kJA57HxX$JhY?8cnCEj5Q zn8kYBfM3x#y8ey(b(*F84ZDf`GN!qSYU>{sa})GwPdJOSjzqcYDr3Zj@Q{Q1=SR%n z>0BpyJ!r1092Mnkk$m6||3D-k(rcvP5JP&UE^31l^YYGc_U`Ab!)Irk2I zh4o`SgoydP=|y(xCUod{g7=^g2(#0b29~+W5jh6%S3nuZqA>U?OnHYoM?ndPqg+ui zaOlu{_=R=81wn2rd5>RBl9CNwD!;)Ivf1QYXz5R~<+s4kBcC_Aczt|pT>9JlZ)!W{Zu{X&(xok@EN6O6GPq6(I_UIPOaO}ssHMl|&n{*pBa~Ed013_S9W9~pp z*ROcvfmQXQdJ(?I+rskiz)O-a%(}J)Gz8u4AMT;v8_Z7LgR|t!Dz@Q1?8J+wo)0h< zyvFuE01x=nTJ`_~4Y$-x?CA|Ut}47FPE=#wqRk`t5Y57hM^FqyS)a$~SAEAOK8D-S z)Y`w6E9bFHeu6hy$=0!T=#`P0RczH$9IqMM_Y@A22T$45XV3%x-phLU89E?%owxlZ zOc3v6;7FP)#c1WPGwBu1p^>$J1tUCe^C{e`9ABArI?B}`;v{ZZzk3A^pqtN|=<{JV z|J6-Mt;`Tds!qwPqmDh0Q6c05v!1R8e*zlz;2&t^rsO@1mypl-eLF|;3sU`S2vNUW zi0DL@`-X@Zc*cgmMlSrtN?&6V{1EH<2J+n~ClD7#%-1IkYdcJbUQO*A@N-?v(GfZN zq%g%_I_%815vFo>u4sftOfD~%(Yu{sEs-G_0!}VKT2wA3bgUM_@wbrPRH;YkR~7)I zgkMPlSqZ1D(+F_~Lnx;i)>WS*F2o^&IW#7zc5qB`{D_34i0gH+A7&NllM-EZr5_<{ zi|mNe_YA6een%10UFu}4NHV^b@y`htqOz}NjdmoEkOeGIL6)NV-=iR7`1*ZRYy!qrI_cJ=m8b>E&{f zlSH^-LI?HOd3I4G`qr~Col}4g0NOMRk}wkUzTpTDI3cW`LxiOzuVn9RdtK!bo{+xH zTC0io$4B_Ne_>-HWD6u3)4#U6_uUUUklbKC2_+0dR>nDYN zsQWGWhUAv0j&ecQuCognr=E?gd*CKVn_Ys<;cTx9u>|%166vvdn>n^$Or2mR&+rbo zeA*U9wq!o8Bv7w?hduok8^FPT(?NnQ@l9~m16Z0X84ius5?4~72zbl~5Xqt!vS4!~ z)^}SU^zllK!7fV454|Vx_7(B(B*U@1#?Z?XfBmrpVo@-5*prN#tDB2m)RlN&D8&0! z++f^}L%df^lkqg&0bWOMB1--C+fTM{F1BxlylxP0NZK$3^1+q&R80vtKlEq zIqnXt#tTa?AHQI8HI~7?!RB`OTi_pT_GexJWC?6$8w1Ee_>2v0Mxr~8o{eK**es%& z8_DbX>rt2_iR*z0GITu`!f+db80A{%VlOT%_$9osw>@Sc&om>?2<%~H66pljtg=Kp t0$Qk!El2_pXIkgCAhG!9h8+teD_qSUwrtvB4-9vFQqNmQ1(ABY{{yInVI2Sf diff --git a/user/config.c b/user/config.c index 8b3ca54..7e8c6fc 100644 --- a/user/config.c +++ b/user/config.c @@ -1,3 +1,6 @@ +#ifndef CONFIG_PARSE_TEST_UNIT + +// this is the normal build target ESP include set #include "espmissingincludes.h" #include "c_types.h" #include "user_interface.h" @@ -5,6 +8,67 @@ #include "mem.h" #include "osapi.h" +#else + +// test unit target for config_parse +// gcc -g -o config_test config.c -D CONFIG_PARSE_TEST_UNIT +// ./config_test < config_test.cmd +#include +#include +#include +#include + +struct espconn { + int dummy; +}; + +struct station_config { + uint8_t ssid[32]; + uint8_t password[64]; + uint8_t bssid_set; + uint8_t bssid[6]; +}; + +struct softap_config { + uint8_t ssid[32]; + uint8_t password[64]; + uint8_t ssid_len; + uint8_t channel; + uint8_t authmode; + uint8_t ssid_hidden; + uint8_t max_connection; +}; + +#define os_sprintf sprintf +#define os_malloc malloc +#define os_strncpy strncpy +#define os_strncmp strncmp +#define os_free free +#define os_bzero bzero +#define os_memcpy memcpy +#define os_memset memset + +#define espconn_sent(conn, buf, len) printf(buf) + +#define AUTH_OPEN 0 +#define AUTH_WPA_PSK 2 +#define AUTH_WPA2_PSK 3 + +#define wifi_get_opmode() (printf("wifi_get_opmode()\n") ? 2 : 2) +#define wifi_set_opmode(mode) printf("wifi_set_opmode(%d)\n", mode) +#define wifi_station_disconnect() printf("wifi_station_disconnect()\n") +#define wifi_station_get_config(conf) { strncpy((conf)->ssid, "dummystassid", 32); strncpy((conf)->password, "dummystapassword", 64); } +#define wifi_station_set_config(conf) printf("wifi_station_set_config(%s, %s)\n", (conf)->ssid, (conf)->password) +#define wifi_station_connect() printf("wifi_station_connect()\n"); +#define wifi_get_macaddr(if, result) printf("wifi_get_mac_addr(SOFTAP_IF, macaddr)\n") +#define wifi_softap_get_config(conf) { strncpy((conf)->ssid, "dummyapssid", 32); strncpy((conf)->password, "dummyappassword", 64); (conf)->authmode=AUTH_WPA_PSK; (conf)->channel=3; } +#define wifi_softap_set_config(conf) printf("wifi_softap_set_config(%s, %s, %d, %d)\n", (conf)->ssid, (conf)->password, (conf)->authmode, (conf)->channel) +#define system_restart() printf("system_restart()\n"); +#define ETS_UART_INTR_DISABLE() printf("ETS_UART_INTR_DISABLE()\n"); +#define ETS_UART_INTR_ENABLE() printf("ETS_UART_INTR_ENABLE()\n"); + +#endif + #include "config.h" #ifdef CONFIG_STATIC @@ -13,16 +77,18 @@ void config_execute(void) { uint8_t mode; struct station_config sta_conf; struct softap_config ap_conf; - uint8_t macaddr[6]; + uint8_t macaddr[6] = { 0, 0, 0, 0, 0, 0 }; // make sure the device is in AP and STA combined mode - mode = wifi_get_mode(); + mode = wifi_get_opmode(); if (mode != STATIONAP_MODE) { wifi_set_opmode(STATIONAP_MODE); system_restart(); } // connect to our station + os_bzero(&sta_conf, sizeof(struct station_config)); + wifi_station_get_config(&sta_conf); os_strncpy(sta_conf.ssid, STA_SSID, sizeof(sta_conf.ssid)); os_strncpy(sta_conf.password, STA_PASSWORD, sizeof(sta_conf.password)); wifi_station_disconnect(); @@ -32,11 +98,14 @@ void config_execute(void) { wifi_station_connect(); // setup the soft AP + os_bzero(&ap_conf, sizeof(struct softap_config)); + wifi_softap_get_config(&ap_conf); wifi_get_macaddr(SOFTAP_IF, macaddr); os_strncpy(ap_conf.ssid, AP_SSID, sizeof(ap_conf.ssid)); + ap_conf.ssid_len = strlen(AP_SSID); os_strncpy(ap_conf.password, AP_PASSWORD, sizeof(ap_conf.password)); //os_snprintf(&ap_conf.password[strlen(AP_PASSWORD)], sizeof(ap_conf.password) - strlen(AP_PASSWORD), "_%02X%02X%02X", macaddr[3], macaddr[4], macaddr[5]); - os_sprintf(&ap_conf.password[strlen(AP_PASSWORD)], "_%02X%02X%02X", macaddr[3], macaddr[4], macaddr[5]); + os_sprintf(ap_conf.password[strlen(AP_PASSWORD)], "_%02X%02X%02X", macaddr[3], macaddr[4], macaddr[5]); ap_conf.authmode = AUTH_WPA_PSK; ap_conf.channel = 6; ETS_UART_INTR_DISABLE(); @@ -55,6 +124,9 @@ void config_execute(void) { #define MAX_ARGS 12 #define MSG_BUF_LEN 128 +#ifdef CONFIG_PARSE_TEST_UNIT +#endif + char *my_strdup(char *str) { size_t len; char *copy; @@ -76,11 +148,12 @@ char **config_parse_args(char *buf, uint8_t *argc) { for (; *buf == ' ' || *buf == '\t'; ++buf); // absorb leading spaces for (tok = strtok_r(buf, delim, &save); tok; tok = strtok_r(NULL, delim, &save)) { argv[*argc] = my_strdup(tok); - *argc++; + (*argc)++; if (*argc == MAX_ARGS) { break; } } + return argv; } void config_parse_args_free(uint8_t argc, char *argv[]) { @@ -100,9 +173,15 @@ void config_cmd_reset(struct espconn *conn, uint8_t argc, char *argv[]) { void config_cmd_mode(struct espconn *conn, uint8_t argc, char *argv[]) { uint8_t mode; - if (argc < 1) + if (argc == 0) { + char buf[MSG_BUF_LEN]; + uint8_t len; + len = os_sprintf(buf, "MODE=%d\n", wifi_get_opmode()); + espconn_sent(conn, buf, len); + espconn_sent(conn, MSG_OK, strlen(MSG_OK)); + } else if (argc != 1) { espconn_sent(conn, MSG_ERROR, strlen(MSG_ERROR)); - else { + } else { mode = atoi(argv[1]); if (mode >= 0 && mode <= 3) { if (wifi_get_opmode() != mode) { @@ -120,11 +199,21 @@ void config_cmd_mode(struct espconn *conn, uint8_t argc, char *argv[]) { } } +// spaces are not supported in the ssid or password void config_cmd_sta(struct espconn *conn, uint8_t argc, char *argv[]) { char *ssid = argv[1], *password = argv[2]; struct station_config sta_conf; - if (argc != 2) { + os_bzero(&sta_conf, sizeof(struct station_config)); + wifi_station_get_config(&sta_conf); + + if (argc == 0) { + char buf[MSG_BUF_LEN]; + uint8_t len; + len = os_sprintf(buf, "SSID=%s PASSWORD=%s\n", sta_conf.ssid, sta_conf.password); + espconn_sent(conn, buf, len); + espconn_sent(conn, MSG_OK, strlen(MSG_OK)); + } else if (argc != 2) { espconn_sent(conn, MSG_ERROR, strlen(MSG_ERROR)); } else { os_strncpy(sta_conf.ssid, ssid, sizeof(sta_conf.ssid)); @@ -138,14 +227,30 @@ void config_cmd_sta(struct espconn *conn, uint8_t argc, char *argv[]) { } } +// spaces are not supported in the ssid or password void config_cmd_ap(struct espconn *conn, uint8_t argc, char *argv[]) { char *ssid = argv[1], *password = argv[2]; struct softap_config ap_conf; - if (argc != 2) { + os_bzero(&ap_conf, sizeof(struct softap_config)); + wifi_softap_get_config(&ap_conf); + + if (argc == 0) { char buf[MSG_BUF_LEN]; - espconn_sent(conn, MSG_ERROR, strlen(MSG_ERROR)); - } else { + uint8_t len; + len = os_sprintf(buf, "SSID=%s PASSWORD=%s AUTHMODE=%d CHANNEL=%d\n", ap_conf.ssid, ap_conf.password, ap_conf.authmode, ap_conf.channel); + espconn_sent(conn, buf, len); + espconn_sent(conn, MSG_OK, strlen(MSG_OK)); + } else if (argc == 1) { + os_strncpy(ap_conf.ssid, ssid, sizeof(ap_conf.ssid)); + os_bzero(ap_conf.password, sizeof(ap_conf.password)); + espconn_sent(conn, MSG_OK, strlen(MSG_OK)); + ap_conf.authmode = AUTH_OPEN; + ap_conf.channel = 6; + ETS_UART_INTR_DISABLE(); + wifi_softap_set_config(&ap_conf); + ETS_UART_INTR_ENABLE(); + } else if (argc == 2) { os_strncpy(ap_conf.ssid, ssid, sizeof(ap_conf.ssid)); os_strncpy(ap_conf.password, password, sizeof(ap_conf.password)); espconn_sent(conn, MSG_OK, strlen(MSG_OK)); @@ -154,6 +259,8 @@ void config_cmd_ap(struct espconn *conn, uint8_t argc, char *argv[]) { ETS_UART_INTR_DISABLE(); wifi_softap_set_config(&ap_conf); ETS_UART_INTR_ENABLE(); + } else { + espconn_sent(conn, MSG_ERROR, strlen(MSG_ERROR)); } } @@ -171,8 +278,9 @@ void config_parse(struct espconn *conn, char *buf, int len) { // we need a '\0' end of the string os_memcpy(lbuf, buf, len); lbuf[len] = '\0'; - - espconn_sent(conn, lbuf, len); + + // command echo + //espconn_sent(conn, lbuf, len); // remove any CR / LF for (i = 0; i < len; ++i) @@ -184,7 +292,8 @@ void config_parse(struct espconn *conn, char *buf, int len) { return; } // parse out buffer into arguments - argv = config_parse_args(lbuf, &argc); + argv = config_parse_args(&lbuf[5], &argc); +#if 0 // debugging { uint8_t i; @@ -197,6 +306,7 @@ void config_parse(struct espconn *conn, char *buf, int len) { } } // end debugging +#endif if (argc == 0) { espconn_sent(conn, MSG_OK, strlen(MSG_OK)); } else { @@ -214,4 +324,17 @@ void config_parse(struct espconn *conn, char *buf, int len) { os_free(lbuf); } +#ifdef CONFIG_PARSE_TEST_UNIT +const int max_line = 255; +int main(int argc, char *argv[]) { + char line[max_line]; + + // read lines and feed them to config_parse + while (fgets(line, max_line, stdin) != NULL) { + uint8_t len = strlen(line); + config_parse(NULL, line, len); + } +} +#endif + #endif diff --git a/user/config_test.cmd b/user/config_test.cmd new file mode 100644 index 0000000..af6bd27 --- /dev/null +++ b/user/config_test.cmd @@ -0,0 +1,9 @@ ++++AT ++++AT MODE ++++AT MODE 1 ++++AT STA ++++AT STA stassid stapassword ++++AT AP ++++AT AP apopenssid ++++AT AP apssid appassword ++++AT RESET