From ccdfaa56d3db9a2c5c0e83748fd85e100451dc39 Mon Sep 17 00:00:00 2001 From: jnoack Date: Fri, 6 Jul 2018 23:56:33 +0200 Subject: [PATCH] Initial commit --- SpeedclockNano.fzz | Bin 0 -> 49327 bytes fonts.h | 19477 +++++++++++++++++++++++++++++++++++++++++++ speedclock.h | 71 + speedclock.ino | 346 + 4 files changed, 19894 insertions(+) create mode 100644 SpeedclockNano.fzz create mode 100644 fonts.h create mode 100644 speedclock.h create mode 100644 speedclock.ino diff --git a/SpeedclockNano.fzz b/SpeedclockNano.fzz new file mode 100644 index 0000000000000000000000000000000000000000..99a1a3da713e53d1a938db43d0a51b234a7520c8 GIT binary patch literal 49327 zcmc$_RZyf&&^3s=yF0_+?(Xgk&fxCu?(XgkI=D9O&fpC0?(U5&^Tzl8yAgY_v3s*O zrz=ioR8>Eb_4LWCY$aK62n-Mq5EzgImlRn612_9`;2?jiU#x?nlM92LiUbRr z91}BxnU_OX#)Qfm6Gqq*U#Nt)PY?624DkStd93e+=cYQacs47>yiF(b8r^8YCM=n& z*)c9PpNZWThAuBuk$tpd@L3Iz3z&#t{rzl3HXQ*yMD|ns9w+&Q6tQm1pxHTT{%vO! zvNITx_2A-rkzqz1?eN0r?NL}WB$tpak$V#DwxNUF%bJ%^*)`^dOD=TiujU{HEp7Is z%{uC4owWJ$>z}^^faZ9?m3noOR@PN-s0@+z7VX|OD@R#@3#&?=GTOs~=E$634|?;7 ztLL6Xc0tlPiol zJO=?FUNEG*3JLwgO5P8F!{H2otoqG39R4j z^i>2S^%4bEaU1u>+p*6iC_`l@4iStkC*HBHR#13~;Kqg5Os&$QGEwYE492N}#=Rne z$;8Reg%@oGR}yuzS?OEkK#C6b&pT0@1@e9~=*x(O6rBoUMus1zrh`c;HR!{ruj|D6 zRo9sp0O8DmCdUnX$VZV;mOvtv6$BwG)&Hs<)c@)RhE=tqS+`H8c~@tU+aE+?35R8a z3V(LM$qc{F3=02fL$~aNb?&KIr)Vggzy=8)7ZFPAewK<8HqHu)IAz1e<%E~xY2lzy z_|J-1lMwdzRY3&&Nlqx37ay@E2g;oYZ(Y>_g+g99n5xL|;aU{|++D6Wh!Y<^F9*_| z2&?l|JHGfvQ@!(ZY`m}KMF{mAPUYH4%2r_G#rzXQ>3<(8DAyF(S;c@pOb8GVBV-T| zh5vP^6y?OlNSIl;JUG}$q*+8sBOnxl;KJ z5%u&oOoiEioG|A}Px-uX+KMB;ie{g8t&xgJ@f||mkSr>s$iUh-3of{=`8nJe^sYQFo?@imChW1ui=*0o0@r`HYIYaoq+ zYHavl_=cA2heC?0P&#;wbi5G454^KR{b6DWz~{PdfuMbD?aXAEU=4#L3;_0JjR=*c zn=n1D#t_ZvhKQWNk{&vQ4h!Dc5MN|+>_YPP#%LkV1vzf}xahDw@MhEno{Sa9-t|`Mmr1~A_4+XCL!pRXs%y=WtCe2ea_QUzh z1@@Y83#q1k&wO*iHI_9bo=w6uY9f1$zm2qxq{_4InyNzyGH!2dTpvRh$yQi~Y)SzL zzopbPSM^=i;>EAqCg)MK*#h=G1y9KX99Ed6=P$q}&;kTM0$s&Sk4U6exU>XrTYlvJ zX%0D9!y(J4fS$rSFmph;K~i`j)wj%eM7Rl=3RJu#4{wFOup}BEB|2;!RizXeviDm# zw3CxTDyC4bBhS9))9=%K4*Gq~J#0M~=ur#a-Rp;FRkh>2`V&ixt}qLF8dC)vNllXQ zDwM@a&KPq``O#!sP?A^|nhYuNX8{2WEN6)ps^9R2=Tz>^Giw#3@nj>QW}3V*^u~Zl z70W_7@YL9qS7Ervcrbb)^;dKy5TyoRJ+0ogqzufKU^eMw!&V$0xY`NXh6B^?(w3@u zi;+IW5o58Z%b{@ivE30o&qmLC*C2Qt=O!4T9}l*Ir`XVaBlYgv81$>h4a4Pw5i-}9 z=9oZK_$U>QW842{U&oDyWZxzcES1}7Wl^zrT3GcM#Bfu*rCjN z*-oI^8L?{f2eaB)k4iJtoAr-1uD~Vo1O0=YG5`Pb1#}j;Cx>?De2ixd0+Q$q``@p+ zs)MPiiLs5nv9*Gso&DEKR|*91w#{RddzS5DajZV0W1w{>_ZjRNJdGG=iN75rPzbyzWsh* z+>MQHPa}U{gHK;S0m4a!tAWY`UU2{YTE-ra+t>H|wb_xI^S{qV0`0!e{2x0n>HZJ- z-5x9%iib;kjCmo*TYB+k;J_CHE)VwZ{5KAs9-_5@&CNAr#&aehswazwU|UYl`);I! zu1p1kT^_<_9F_g%RF4N)!v15v?^#vO_R2VdU{ALE)*lJZr{IprTzpP!4c#+YUq|t_ zhNG%w&DaQ@5wEHYHpSmmSlv9WZs>$v_4A$_9X_0GxdJcqcV*`O9e`ne;HO>LuW0|A zu8g0Z9k^RlSJV9ojT(E|Cq8^lP&w13O9yL@NwL$1jk6c;Lmo!8<`4EJf}d}61TKyo z2X7OcAMCh2`piAv#tyvg_4B;>v6AUSC!b}$cVpY@3Kx?$ua}RvFZW(Nz}>OWcA5`< z+|EpS2LGHl4ma9hIlFv>%PobiPtQX+lMDX#yv{aXe!Wh&@MkNIt`{dCeqZ~Z2BybX zh)c%JID3h^G4Z0kExjCjUKZL9Lf`$qXpL$A_xPJ&5;qF<=h}Ohwk8mcZW2e={oUY$&e8e!siD)YO7J$c_eH z|9!UFsQ`s_ z=l0}(cwP7biS*vxG`j4^y^rkpvi%XThvSd^p>48x(855r5QqB}sr) z-K0KX#SS&E-ao!Hy1A@#BDW>_<^}&k`CK9%ezV_RO4;V~R1hr^?b;U|-5)9vg{={0 zAQqai=GQ;H$-i7v+L+ykNIFE>MS34iCA#}z@PQ};m(W$n)`@h*3j9d0HesIWt|LYh z>4!h;M%BUo&`wXTJ%Vb_*wm8hgU*z}I9u{iUEx%+uiZMZVk4yu*zEB%@T8&fWDHz)th_aTF|u&<5%^$YB=%{2ell?| zbtn69q;UJ$Ix+U1%m4X_<4^ErY=hi6uu9vw#W4=nTkY#4XI^jG&TUoqJaIvZ&Dh%Y z8m^Z*S=k7!Y;@PU#eRL)IMmdVWp<<`NFaf2FRk=m zNT~dSM5|Ivg8&^79iMg8DX?Z|a7Kh4j*R9HymUBZ*HH2Uq% zxC6A?+IUVIxX_9DeH2)pN6`IOVhhQVC`}yO<#yUQ2_Q>TlhkTbiV2kT!kjKF# zG{e6ejXJUD_2!Q%qrXhXZW-L}SbwSaP4Qvt)4FQ2EPuA|)T=6q^O4mQT(tJL=Scyh z#^#30tkfrdy~gJISNim>5_f)0RZVViD!j$<4nyk3cp-IN^l?;k8NQFPaqi}jE#8`l zTfsvl&F4k}{-1n0xU*8(-7j@f%C3T$Pe0d&><``2f8pHr!8_C=y8YMNd>o~rS zdJJAv)_(uQN+u)?U6Q5N7%vans+XcF`Obk;JX@YmLuMyV5~!jkxm}x=8+aaQE}OBC zSAAOSO&FQLbLcrWwcr~e27}wd*~rR%^7RB?=N0NlvR(szC63l8?kWgjU2G4QH%OSspu~~ zua(^R5tK|xSDNPx5^Sp1Ur=mQy-lo5=h$hliU^S#Zb3&@C3zaUem7ZbxDs!T zF3#m5cWQ8ctY~}sM&&j-xla2x+=eAkn7lnOO`5?(vgA%TB@z$vzc4kC)s&awVB`na z7$IAp*r+wh=&-~IJ_+@ylrZ4xv_r$C(fE!n&lP_?R&hfjixcp;miR#vA6v_(nhOE4 z`KbrWjn;1d8POjns>5k#ykr%sEHmo>a??3jKrhTQ^TsQwUT!5?pGb^0M+1E!ldmZs-E&6oXxm|;Cd92 zuPTRPceME?pP^mqhjdWz?Qsr_2DiUNAMC83@y3D*n%wGSzZau^ZVa@4_Y&4YT}rBj zrK|=%TH{%=Mg20T&I9{lba6Zv9qY=75b=xVl5EjvIxE`6Y@fZytWJuxskK-dnxN$) z*P(US>+BR^R#5N!<4yas6i!;$N8W=Tg|fhCll?b<<`6S3r9Q0!_%+B&sW0IzH`*LZ zWodDN{_&^dS!IuA33E8*#`U5*$TO6k-CwV=lX~xL)%V~Q&V77&ZbO5i_PQ)tmEqHa zwY}TV(>9(z`=@`Cq=!H|zMkB<+-{d4rfbTc1?8Q%XNvwvs`01Sm6@{?^2)WZyFheH z4MD}{i@(0DZeu}?cb*EPdC*TJc(D|uEN)=g?&RqqjJS5%WEYNGY*QSD7$bc134|;2XVhClu;{oi{DcswO%)85L%y%PKJ%Qus&#a%*lJ+hB6+aq$ znrI@K21R)#>^@D*IR3f$GX5@J3x=;GTJ@(E_Qm5 z5v(K;jztc!b1Ne2T@pVESpRC;mJmL zZdSK)@y>g_Mi)$e#i_zWw<;Z7^C7tVn#MBo#+jdLR(e|5*`E`a`K;`@o8j?_;8 zdF8SR@vW|b_@PTVI#tDnCSLyXmBSiuxxniuaC;Cn!UB4gIClb${C7ER)2_lz<=Jeu zw}zHEZ)=+&qu_G*<@>goldrx@O5x)cdIuE$hrTY#rJtYn_Sr~3yqiEnY4>{b8~%O5 zIm=!tH*4Du;{4s@RoEFwXZsL5ho%ZohVo~rApFPSaFPf|n0^!LMYy=1;Uq)(bYbKn zu>0X{*jR4GYVjkeA}IBrXcQd<&9W#D z&4i&CapuHSYjFVqrl07d5)mEmwnMK!DT^_!V%*V*bFxCUB!e&4fKMcv+;wBek{qC z8wfdK@Eu3d;){N#0}Q<#H;DE2#`VP}BZk&5Dua7y4%C5y*8N>!Lm)%}(W&V*_ROI8 z#*Cb7I-n7P$PpM0nTB~IoBAuqIf}->IQahQ)T|C~SHFIROjwAzmp5&Z)whOXk`$d{Ik zDq_v(drzVgmZ?a27}FZVd{tgVfQtx;|9SPk8cZ3IyAl)jl^P-95$h; zMQC44)QqduZB7U#p&5$_0!AmB3+$$mQs4RSkN6{Nxv~Rmz8QALV>1>88X-7%4x*$2 z+V4I;d*_^n#SJX!Gk8twSn$(I`>~?65@2-b#xM98idIO|)NjCCzc>Q}OKt{R150aX zOHeU|w33?;6finOO>M@iT&9T3gc4uQ+$#f1jE*TDUai&Y_dr6r$#;Pj_0ZYW^7nbF zrMu~m_o1h0{m-|7i9Y?GpATz&$o|0Fwc31SftRC>lefm5l@-PFmz9<1CC0Zhf}O_3 z^sN`gfdatY%f@_TAX7I>F^{PO48xA~8L9nKvG1Mi{3y*1D0lo0pn@!G9v!JqNa zck%8APa7K343}3L-yEJs`W{TK^@E@6sqSvBH$@JgPqytih`RG*F9q=5+%xvHZmbU! z^M90i3Us}3eHTC)p|*NMs+GXX6%=@Xk6v+c;(m5?@%{u}kG<~$Zd9E$kbDI5Iz4&) zt%zX`jxGUtn+oQfzs{yPs$2nHRoS!WllyL5`J4Ph?!;KN(`9!r_htvxXE%R+4q~+& z*LQPw1dj&p&Q68|!_YhK?Jhd?ZMWFkiYeV8ch=+=yp{esna^ zc=BQCB3#GTb2`su!%2JUA!N!&`gq%j7F_*AvKw9`2xiQGf4*HJ))(}Ce|Xw@cXZwM z?=DAryLosLOaY%QXa#Zi)Y`B86@RqX2fW#Kvr*h0-b}?BJKS5@o+&L0 zFks5le*>jgEP9@(Eyi?SY&i!E68k=)k$7jd*q7qFZ)th&@{+1*wEg{P7)5WH{9wktsDC zYMwPq?3<3=@4E4I|BH(ssUj_{iVc_=BGn0V;S%N&b3K;`9)a|*i!^44HG%hR5Yyh? zOnEsiEpym{6ExiMT^-6z1=Ll3RQgup7w@315%j#wRdDJXUWq3ZvYdB86nR9mNy;pRqxB*9}l7l z_vI@>!FFEe8;Q;4IU8puw=2h*O&v5E$KC*A7x*EG!si6iahD8OS4gxF(?rJ4W7n8&sHSz_KwI7cg+w;!6 z*T}_or5+x%UzOI6ViKva%{~?Ku+-I+o28($i}$}SZmg}OM0NHs^bYr7OrKe3;oFzU zc$+Z9OhC{dqZpKgb~vuSY9WrfWp+5uJ@uFY)8i-h_;t0?4GU<7s6ir+q!evrif{9< z#tn0gxsHP=DXAP|c+!yvo0}KkCe+8S%o=Yl-U9V$((WHC6N{y9Kg7GAXKB39?P`f& zwXofG&OB!94}eR1oZ$w~8!k?~{-fwc&xFLLO>j53u z5@YG*TnB4D3sN|WP%}dPh$-Q6cEn~6F5yS81`cc!o?2LeoC_vKStC3{vXGwrkLl`+ z_A5|{5N)j2?X<;KJCPplr5f*mA4K|77qs#RC+zFMZL|lzRy2O>N8Q}X$`s`2-y-@w z>)_#6q61wl`%s28uA18jj-B3GL|v#Q5vZzmVvt3HOn>_oT#jiT=@e43cExhpQ@RrC zXH#`n4s_M*O*B@kQhB*~@LCFh=})_ytkC$^q&7FC*91N={&}$@fMCVY!Hygl#{8~l z&+8L>PL2xVKAUG$7(jq6uv=mE%qD*SI zVK4ag%lUE0SzMAe+bG+ z2;1q$4Yml+4c12@c^pYxSi1s;yc~8LK@d1f1VsJq1R*CJhw`Zsr!x}=L?tOPtR)sc z+?M>R1QPhr;I8e6J)f>DZ6OKd#xf>*p^TQo3y*!Yqh!z;V^67Sx0cFc_tQA&L@b$6 z{^}$79qre-Epn{^t_w57kVcd? z!4NdTyx)>qT$4U$n@W{vTA@;0)FKBuH7}59YJw1p+{r{;N%{ukBsB zkd)&Qz%)7(i1I<-ojiCP9=2Z-y-j~&etOT_);+TON2FdUx3_gJ_PBAj5w?nKy7fn2 zImYPSq*q&_H)9`pUpotrHXsE$V`+x?-6P3pt}==+Tqb-;64wr(6!EGJ5!qyd+8lV#-&CyWz(2#tGsBME>AA;FN>|K&O&l&R@@d#E8lJ?IO{=@t4LS5iv!b$Ou_>Iz+Y{rwPOO#zFjEItGly%H{YVnJbi z45TJy%P3wBq}UZd+L<^`$4O%O`XJR=;`I~LtXG>p2ArkoQ-r)XMV*e*1uzqE#Q zQuwb9wS#|;Uj?Ml>(=PPy2wa}J-J(2DKp&2wJ`mupDAbt`lxoo0~N_)!14z_!0(5s zP_4I}Llk!d$cLX;E8tzswjp5~9LP{qNyCl4d!Iom%W_75a7rDmlK>s|gzXZ*;{eF) z3V$zlg@dJH*b3om;jyEh7S8(V?Hs!JR4>Iyw_V4)mbQdzCj@-F3ziN7$S*~?uI~ol z_@LhS4%~zD!?#1?h?-B2NfA0sQdbH1MKA=Rolw?#y&Fb5spaf%7B<|#kzi%gS==4o+Z1_op z=Cn5$8DSlz`weA@z^T{g@vY18j&JqEsTcK0n4s0uNLmwT{c9t#oQmTt-@PU$$xTUn zD<&q5VU9iB2$_gSp*fLTJ$ok`oi&l{@+5inkhqL|MA3Cr%MK3<1Dj@te#zf2Oo~RH zSrD!BE#y*oc(z|2cou(s(Y*`NnB<3BkKXNdx=y~wZn6b7IuN;oeN>xF;U9V5pFM6j zub+lT?kwUbKqc3q9jK1>9C>^6J_y~}JN=I;oag1XCK-mG%rUnny@BA$J@Us)#)4+L z743RtLvar%Z)Qk6rWJn5ak3ElP|Xlap0olU79Yo-SHUAY@kkEza9FOF8{B@b{9ewV zL+EXyEPG*HZwA7jn=j#)@NcD$TgiRmLZWdS{&@(cQzdMlntX6ml8c+^9haR@{9qk_ zS}mty=IC5g@Bl77>QwI}mz!G7yzKfc&YVLy0|JjI7>@N$RTe_1dv0Rg7Tt+bW8WhX za3#drc_tv!P{`mK^sSCu0&Gwp#-bN0TTye+AJ4h(putXYxxX|p%-gFq|X+oGOK2_N3}10unapk*xtqUp4Xuj=j|xRDjj{?CP$^5OWJ7GC2bAQ-$f=q8pf%ZcRSv+;apaUoYf2LN~NJrN~@$pMS9{ z9e!eJ)&YX^W@G_<`&+Kr%CbKG-{%Br2D!OiZ&UtwP+hsxS9y84UH+d$UFH@%-p-G& ze^)Bgr^D@!IF|_WH>S;#qq*C2^j~lCJ2U+sJGS00x7O=7P@dYK*DjyOdoJJzUs5zb zbNyHIJm;2kjf@dy*3Z*>cucV;h|0yXL zXJ!y|?|Ha)-ZbI5o2cm4KVO>e@Wd9tn=^{$ek|Zq_x+JuRWx-{}Tm{ zeTDGJO`NB%$oRpWvwYxgz4cy&@|W@Fs_;aGkFC65c2`IC7IG87`^vLo{)R{D@$)B!sj`~-s^VCw8v zxs~^{pexW?IWBYypDD0hU7#bd;~t87o&0ldV>t+QP_JcR&4_fFktPH(&K~S>rbuE# zA}fn$U84OlD+JjYe`h8j$nXl<$(tfJ(cj;>Ck(Yvaz}~!k$a66qm_a8;@KK0wCBE{v}47In*Hi6bmKvyU9rr2$jl| zM-mx)GtY&eM-opQrR_^{kSq^uMgVUGB%5^dtyZpwzK;x{WQqwKNY{C!2SjQk1v_&p zIy_C;kMBv_i5zRR6`&!kYZ;=nG>;2Yf6mAPP`MF1S1G$Z zjxNInfAX6LAN8&Icx}!BWZK-mmO=gVByh9Z{XVy=>kq=djduGcy)lo zdWiev>fKRk$#ocMF!J6t?Os$Rg_@~SNILE|gY4EeYHe6w;O!6+993~eA!0TE@b%=g z8(+3A!i6L9iGe%4F6oo-P6YTB%>}bpXX=CE3R=*p^hX-H(gH*3k z^AzAAI*`jtk3qhKK;76ueU{duKJd`3zP753$c{G5uE4metsIK5(-~T$E-Hh_LW7}) z9l=cppKJ3az`NB&`&)^%x{aSo`ZvM}ZOpuH>^ShZrih&I^r@X zz!&vwf=`iqnN;BHd!&gRGt$-yBsef-D9kthMshC2YLHN~oxO^PX~IazkA^ldHZS`V zA#<(YbfvOdFw4qs^TW_eh_Zx;5eRl-19x8z(Dou9ry0p8<`jORpB>7;ve-#3+_}}9 z5yhUbwOtN;m4o4k>QEmzClZ{2#g7x&7K6{fS_+X*Yh)0R*OUUkGs`vCBQ|eaKIIiI zLy}8bHy_uuw9mErk{)}* zW%m@L5mbSdMBZo-8-A$zB2jR*@w6@NXytMJ`!cr~p}Ek%5(v4k1cFqt z%_5rG;TuAOZp0VCw;jeB$i6LG*J->XyN%%k+jUK8b3e$#uMY-a1JQvyDC{6a(abq< z`C~=P9Bjm_u!=+%n+k3!MB!Yh<3cXtVG7K=|97Mm(o_iJ#pl=7Jkl9=!ZjHE-)240 zrY^Qq;vg^`DKxv+btHp)%}8uQ1eL843Ut_EhnEw5h7t=Bil**BzH$Zb|1(!``nr~- zuzB(GgGVKR&4ylgp-6b;hs`1@Dsc}*|J|271Ft9o2~=22780qF91W!nH2SNr0cPrT zBEy8B3wy(O@YR^oLR$#NL3Jeazr^`H`3&CMf8v|~=6}Sw1KIzGbI<>~I5*S(A8}5z z#Nj_gD>Bbbjf3b>k!TVE1t*q3!n^GW|N1kw<_h~d8sXQ^Pl;5a!fsGjxezdT1 z^sEtG^c=FKGH5<@>z)istz{KTGVI?oVdni?11atDMy=u0ENV%^gy@>|S4O~)gx|4i z8L%4HjO)Y80);SIT;F~Jn4Q_d#E}WmyH-)%*E#E(Q^Xhol9xIAdO4N-0Qd4X);F7B z_CdC<-^!bK1%d8*-LPgTHT%2)_C>T(2;Gr>uisL(8?gdm z>prYp^)?Kq^EwP6*CaZCv-oT?0q$OK6yK@$<`MLB%u9bE(o-Mir-yzR0&_K@hkgC8?(GO52+|vWJ#ByAmg?75o)$KLUx6Z%6Wu(u@+ILlf6oZSGQ9$I z9`w6@a@pKM_m!YtDd?dhg7myc?b~7n@t+=!F!>B0%k5lV{?akF zs+nsUzDM$oZR+D$I8T8(Df%31!BT6Tip%hH$v;*19&QzEZRBf${}vB^`)i1j|15&K z>of~RgMPL{B7F67mLk@jj4BNM8()@EEROR~YyqQLcLbO(vyOPO-|QIl08zKwDsxKDvy2ZV68bvPBdbp8IXy=tpt=bHr+5sSo(1m3P`#&o@~^jKAs}d zPxSNw!n2NB|+ps3gx zW!KxXCh6jmetekeD?{GX%bIIg2`J}2M=EipB`}+dZUvD=liG=lJrUl=vYOP9Oz>kn z3Q!o>zXZXG?P^0NrHwfWoYSj$P_3g;*9*dEFeZR_T7ycHKmmBNv1W>0yK|U5omU1& zk~x*V>+hhGIO`QQanjN{hjI@l>U3uN5G{13IBCT;w3#>|$HRUcpN}R|6s|4LScpYg z(cqJaL^SPbE?dIJ;y{n5?R?2v(tonHMIx{o5`t8QlwMv+aR7lC-PHQQ2&S%CKqdS% zM=_*)Hkra|Oa7=Ma<%*W+P}iL*jM2jRmUQ0BI5t&!nZZ?%m3HH_sm}nJVCD*g z#@P+?;7=rHK3c!(x0A+Gw&}8TV(6if9WHU1n`F`$6y1-dHx^u8d&s*7-?C(Y~xPd-lN`f3aPMe{s^{(aecANAW6ew*xtP>1h7N z$Lp(q=Hc0@`*ygB%kF0CI{$9x<>7vpcpy^G3-Gux9c6MdB+F~TolLCn|2a@A*zNcD zdUn-A`^OQ$6vH|^C$rPP+I*CzrAGt?C_wh&n2@ncF_8*gB^OO+P_(=m>~eX+bX1%G z44FRf!p5houM9}U1%nJvArj~7=Oy1@5?4mk`jl{EN{mKVMkmI2qQ&;ItMLMNHs06n z+}$eHFF{b;+XQ`C@#F136Kb+>9{&!;RHEys^N_4RT=+UL*US9X>iDh(GlxpL9#1b5 z3HyVZ%0L5o=sxfPLPZ1hOx?1UkMF)o%H*`vfyCWelEXJ8YvEv(_4|8Bmsx;vT!y<5 z{@%x`>rcsa2h!2M`f!lCI98QfN%s!c7LLE8lN5`zJB9>u*%y3PpNIa;Hn5IIoYQw9 ze+QOW`(G0|NYQ&Gs9@~Kj47`&X|4`Th;MoKqq2Ye*z>(&7u9B*Qo}ZHFL$T>jahqc zP6KHnA!**pe<6qX+t*`_{$1*FaWlM)@MP_$fRTOW0l2tw2>WJQ z_hcP~PsQhmTP%u%kZcm6I-G=yMy3z891-}R`>AAIHp&n|3{4o!5ImRiVkT0wu^(@3aC4H|nU|E++t{YiJA#RSJ?@v{x>Kp+5tFI5f-yT~CVC5~@bk#*x;{mxPrb?dwr^mdR*<6nw$u*Lj)N%;fQ$G!yc4A<{Ifu0I{ z*a*Mf4&fPu{UK@o6r7`^&kuYYN&gqTrw`lncW3T4-vk6v6mrJV`hhRSI?-UUK`2kLzxilZd#e z!8TgIsT)~qNH1m61vaasj00>lWD?a`5h-(XLh{V$2FwgR@#IVhDCVf!M$M7ROB^3?MX9L?pq7hUZnN7r%*sl1eZVtgv4)O_ zxaU-MvU!*GW|SG>-fQG=nuvMz#nYy;Kw|Vz&&kTII*YNfAo<2-W|ci;#VBrD&&jiM zlFJ!4E-n13o-u14Yr@;YO-UE%8pRo+`-nSbHi7_9Pr5cQIjSM2Z~w>+-y2-Ef#b2! zju(6h7HNcge$3v8w(x7G?lY6P0RPj+)1RCko0UKDT zMSiUC1GCd^*@6Gu4Zqx{8|v0=Hq4bZ?OHDDDd;#=pR`cYva5j%&=ZrJ{8+(X?nJVE zPOPr+p$7lWUiUS-F{-9r>17)P9j~)HzLXnm@0Wf0K))@sV`R5>U2enuM1%3S8c`Xr zA1Xxuram6S??B_O?rN^~jc(KUM#FFTvh9slF!)IiBrSi)n+|khW|<#5@WA{=V50Z7 z(d}!g7u=33mAZfK%$i^BjRbUp*8g^v-|S5XJ2AcNixqlce$hSAf7|F0A8PpJJ~CJL z7PDdO_|LtKkM3)BO_H?ydT$2QiJ9$T`*X!F2Ni8hDh7 z!FSg1XLd6}uZ1g7W@MM6P4lhH;wj-$ldlvSh3tsu%Kz#SO<&R>t+~E~!Cea+qrzj# z;5O!7;nik`_XzrsapQ5Pssn>*qAmR|CqFuNn|X;zJ!VS$5b&W6LrVvE)#QJcot1;{ z>a*b(ZC`a&MVvPMYI=cGb!GnwAZ3FX(RJX~1Y)l;GE6u6Y5Q$B9=XSyA6N12yXx5y z!E&M$I=KaW&UGw^PIyR7f#&r*$?P+7Pq*2wDQ*lWyP~>mZYJkYKs|hbK3OrN8c!S8`;I55>C7u25N1k z{NQT=A01lNPx8Bf!ku`re5u+a%P&u$x84|Qj5BtBv&>}OdnwuL%e5#MKCrp5e+}IU zd?S^I7$in3e3BZps#p) zatT^L-*__lhkI&4UlDdB_Rspn_8&v>k9oofdOP2!l`I}zUi4KY9-Z9uRUjIj{2CMf z8!HlAKMEMgB(OWkEehF9v|n+9x2<$s;r@p&U|-{r6|k=WA8Gp!GymbV=NI38rS;Ex z#r+@R{=?}P&@X;^;67q+Dc{pF_or9NjTY~SuB?SKS5&92B{$Y;TKR!p|Ka~2XNWQ#05>n4-_zQKe+e2c++L6yUbwmmL(A&$`Z{`eG70=D$Q$o{#=zD)Hc zWnyQ*IQXAlt)q{XJmsCQ8w94WMh|GtWNY3G6|suovgnhC1%*$4JIvmkggr?<1*vRq~DDQ zqLjLV$bux5L%0rtMNxhe#S?^(h~(^Gj|wwV438!5p$ypKF$u1Z(o3=i;pwqFF#I_d z_c~lnyG9vB85$05g2Mf3)aruz*QkZM$24K9%_R6|G(JLH>6gyoW+;AdKaGH1U!1w& zU|kd4pNiJ?6_lu)^gj$7r$v9W1EesVK(ms<40Tzd=W)-A+r{Aq+hNG?*v2r>J4{bq zDO1%dPV5-oCay{#3?sM@;|7pv-nJ6uF#|HKvlyHBicuE?c^AO(ipir5MsHRuBlwKKyq}JJW2<3T=rqY!b%hU{z zxp_kJPY_8G4WPIG4!T0#D`ovQ`8QiJfLv%(8w71eq-N^Sq>mz&V2(M%cm;omr=CE? zi<`nMt?q8XkJ0cg@Hc@JA=`TLZnSq*F2MQa#*G zS$XuJ-!IBKN6ZXt-3Z(ac? z4P+r|4N#=Tayh>we8naycm3{H!I#9?vE-65q`%Sr6**6b+^;Y_0H`e3l<;}(8dLpw zm#;GWVGaRpD^1$v9WFyrqT4S`Di_ro$x%*b=(Le7jFicoAw+=~P|QwBp%_Uaw1O9g z7Ew|?b*Q#O5sNa%9UqS^vOD-0}j!VnzSt;nTBp^9WDN;9aG#QEvILHd~g0zq#Aix6z9FJ993sq3PD89;Z{iuC((wFLQ*XeGHsF0 zEnvGIahc1qp4^&{Eg*|M29Lze2A*5!SW_#I;oa=+Vbqk7N(X=N-F|OF-|d4 zU>X|bSmC4bq5+tZBuLWYU>qA|5{Riaj*QTGD^Ip+XflP7q&2CGCL&@r>@Umc@NK1+ z**UI|iOZxYJ4(l4yM&NmKBf&>EGZd0^M6@{#}$;KY^6@H%1gCDqSsim%~ZTnQR^GW zplH{29G264P2h0Rexp*ya78YHu!5XaA_n5kon!^oMMmoh1z{h9Qoc40AsSdz8xBj$k_JDP zA&!EGEHasa;OgYc543`cj7ABiEGgg2Qq(+;cDhKvA|(%aJosvCqRJ|mD&gU%0>Hlh zf_@+I4SHCiF36m0Z^qqqwX4ifuGp-rZH9>kDIl>>D9XSvP21{MBC`k>6*$g{z(w9& z15HE@8za2dZM88>0vkx;6wVt74rrG8MViFvaoRUDciB5Oc?W2>c9mQ~xTKmX7>?2^ zA`#uWO;iwA#Cg0qOp}?R%CBpq>t=h4&KVWSESZ+SoYi2|{YQOhhJ9hfPkOp)r&jo; zBlYAmBVhK{L`o!iPzG~9S=rN2uz+}*sq>;0!8*(+S(~JP~6}{B}JBF zcZX^wNct<%9J$$r!%j@+CHgTYs%jzzkd2 z?Sm?QJ;N}wInu>JXr$9p6k*rYSmd9Rp_PFJ2H(EFc(y_)=xKEG+-$0H7Gf#^iZ)@6 zki}6i3_}cJnLsB^7L~y20gDFvDbo0dG?-B!`qrQlB!?|L*RPM+l5bg_xwOmimxhO@c0Xm_;M&2Nt-*6R!!@}B@4*ufN|rw(rpKe$yq zsqtU@zRAU2gOE-nt&1tEy%Ex$ggKT_0K_o`(MGlNG{M9W9g3SFI8)K21M1ijD1{c) z&7FTcB$d-=SN!6jP|(F!QCn+3jIIK}FeRZV>r^AdUM#DSk?ZIu%;59#WPhV!8(U!h zqg#%r47~%bqn0e5gJx5}>vl@n1<(KWiQnruZpbF01-AY#9vy^&&s%!I!OUel48r2g zjpPys$t2NVGa!@$-PlQf%{H1A>c+%WG_v@A3s{DAx<2kS(K`lS52QR^S+?~bBA zpaq4XpzftyL>x2dJ`NMZ5XKvS0M9tja1;DW(h7^4-`G--WCMPKX1EOh%Ou#0B(aD2 zwa=x{B&R!-EWc}3n7OC zN(-EkJmt2@lvuPz5WB`c3%Oi*IDuJbLg3Yqq227Ws?kNTu0hWjS#kca+@P3yCYcG~ z523O@I%z=eOFt=@+Nv9X;|`yG_&dui1zK#%0-Xz3J%lWbTSz?gckMe(Ft%!X9B$L! zVH;7hA!NNv+5xEBHnt+L*DaW9QYF@-62`ie3`>jy>e0BxvX-sIFn1Qxx@F?qDQS>t z81>+1Rpdz+RNjM>#Vk70-_m&jlnjOaU>ac5lWG44Yi||Q1{Z~ElMpD{;x56Zc=6&I z+#QO$2bWUZU5gcWDek4XLveR^El%l4zw^%=ng8>AtQW1}4p5{~Yz?@?b0Jz7<14K{SnTzwkub#*pt?saQpu-rI1%ynxTd|3A! z4eUKs{FKZ+BnH-V5S(Ko(oflFt|-Nolt1E)w9p(o!J6JTRkH6GPCb|@MLzr2Y~0>T zBJFoR*mob+h)N7nIpb+C#WOX5aNeVSQ1&JUn-4ZT|6NG40n-w-t!ed{T1!~_40u;I4NJdtKyd5-#&l1vY z<7oK#tgH&q(o?)2;Vqq~+p`#nFh52GqAHw8;aVwI66t-7qB0em2oXmial>NYV#`ey zXOHCsaHMg46H$I!Q}}}efr<1hT!Jk?0n7$N`$>|?I1-9b4RNCh2i|EYFScvS7%Ml{ zFNgkcjTDtG475B(+pM77 z15FtmWy&^2Dg&pR>x{}*A1k=f71Fu)r`e!cb!2s?C`&93a5T0Ayt$nodYgcrLD}z& z3yhoEvIB0q<5b20iO8`veVr+u-M>Jw_>?N)M&0QMgSpJ$wjuipp0x2-xwr9aCa9jD zy|Cg19WoW*>4&Y3war;}qY{N>jhIP0wK zDdiz0xug*}s_6^6-Jvwoqgi2b1>FX*UAI7zWVz#Jd!Lp=m6!^}6)QQo`njOWn zGN{TTPz}O~6{o|DNiJTQ40ir&T)Je?fryp%K2_ut=5&7SHU^6TPpgcn14LGj?G*78 zrrCH@#8EQkSDVHk>i%ZcAh@_ZNz3P($VAsr%gQ#IIY^MtkRuQ|^8_X^x+xtV7e4o_ zzE-!RB`{<1kdo~81cqy(3OIj}a@TKLG_Lih?Je_;#BTqwh zEp}LFfQ)&za5#m3|EUPDe2A-^L}6NDdHD}W%iAWcyD?jEF`P~EK8dndfy!JWyBv~h z+de>s67T&UdjuQ&(fHi4?i@V>*;J4JGcTi!O}pMAUps2nQWtgzHG>diB$07MZv2-4 zZD2I)Kn0fvrUA&4O`!=OtCjx_6ibu7EH9CIN0qKxd0RzQ_i13LP7E1O@Appix1UTd zUzpQp+)$_jI?jlEJcCBiBF)w5*71SOHz**ZtfOAh;Xo<9GeiFIjeD0fqjAM^}Jj)cmC9> z8`&9RAs1+Crhl~@S8e-Fb(#;^luTDU(&h!9E#4}8{3 zwY8R&<7;(-m(123F63RJ;x^W@JeFwIUktvp3p6_aQ_GStLtqB$StV?0hm$45%)`V; z03EGE?!D_r4Rki>evHluHSi@P>TJ&EP2u9*X*B42ub~Q5WIM#&eR}_%f+{J$y(USIiZ`$y=`w>I41P3+z z$A<7!s4mW$U>&Z=C!b}9ry&mj5`CsFe4JYGTl0|R)G4a>J(C&>4=fLG1~bQYM4=d) z7Pwy7YCzKQarx~#SqY~4o9O$}mJvs7iIX>w&~WDnpS){gyy$sGtG2ebX~NU$wtfQc z;G9WZj}tpG$8*bMH$I;4Rm%X1uo&yzc1xezmfR~vxLJn@`uD^DdI{c;X~(5ND?TN=twBL)pE(H|pK#IV1f*Sg|L1I^EJXl38{GfTDy{ zc}E5lM4;P?0Ys*=??wX6&1W)R@n&!*iRKH1()1106PtjTlRKuF%GPe)(+3~L2NSgUp; zUwbJ{8YdDoFfWiL;#s9Z&o@^s%Rv(h=V%LnfZJe!23{8^gAunQmCt#zb~UDixi_Y9 z!`hiSo`T6tg=#D+c?L26aWX%v;gnArqK8Z3UK-xYj3&%r~iES9ye}fx`W^^mtY= zF&^rkj=R=)hNCJm>oBTW(-_1t{ zOaKUMs)@>P3mu6S;1Vq$BR0sB8rFXYz-KJLBE0B}3@5>?hfli|M-!ry!G@tPT&QUjqN(Uq>M98d?^KO0s~xCImc@ zP9iB(u%SH#V*K|=18wwMVNa8E%DnZ)@eXI6FjeGElUDAOqj{vlM# z_IKa5u}JGN+ruwDVgdZ=J@biZs@Bq)VkDF3eyY>T2d(W0u~*znHjyOzne#UkC)}wG zQX{H?$d{ZVNfQJeE1rqfZ>nrfbj05+_nC_(TiQobR!Wp+QnPb#pd_Y ziwZ*NPM!p((bjc=HlhCXDX`2&65 zVibKq6edsugS3#lr}%%zjZwetepEN;@tO>&azTf8B?Zv;Sd zaoyfHHCp@Nuhf?S^(x~Re@4oGI#Jxeu!`n_loX0xRuLX7_A&;>iVSB9ZCFnIIXYCA z2ub)^5j(sQqD!fetiyP`0w)tSQB0_WhdF#=X(2xQV4*{a--GX(2F!E;Da@#{o*M81 zC8{*g`0VRwlm4}GhO&c(mXGaV6_jARxnN-padm~MhTs@4Y2MqGA%vb!pUA8g13@Wr zmYP$BRRpNVL(v$j>}YoOEC1OdOtUem!vs_AQ9nIfpkXlX1`BOmV)`?jeg z!d3z;M|%oX>n4t=yH?y|1Sjih))GPMc-ac@jnJa?HYcd)VCwZ!3j{#fHJ=fJVPsp? zJ;?B8fh~<;5*}uTE&*uvupT#Yq`o=ESfGk@Q-%yvu-Uf^^rC*r5b;L8Zp_s4ep(JJ z#uhO#6dxc ze}aCWc;ef^vD%_@D5j@j(k_dkZJMBqBRbXo>i{P1>en-k>*on&hRQ|lu`+*f-zA6$KjC@U9)h?{3aJcTf4~&#F_#$S#UA%0!Oj^ z@1$^yTx_vccRtKxHJg~u1vgSeY5A*j!WGn^DLHAnTuCbnoD;R1ucKrbmRvjHww8-5 zabFuWcZV@lz$y17PcHYo!NDHJ6Uaq(CvI^bS&dd+6S9M&vL)cjrEu3<1TfiIolC+3Q<{ zNY_{G@}Ht97EKbwx#q1vWC$rhLO1DShB`fvsmhoD@VEohdbqOFT)p!RsTPY72=R<& zh3ruY62Y`KQWPZLgXF^N2+HuEfT7OWPlHjYJ=rd3R(f`)0abD@$MOb4`7r#Z+-(1e z*%3-uF_D9=3=0-Ma#lBTjvUq;5MkM=1W8vkVD?~Q0+i{CA#A1OiCkH50k*iZx^GSQ zd)8{E0gwifO`0Y(&;^BFk&9W7u_-y%5oVj+wK-42gh-?VH;5_%@Btt{_$>5Lh}l*NFdV1W>Smw?@FOL6U<)%pdhvUN^r zre|M!)PuiEOx}9G)PyKA&?wFLOvU~-X1;C!3#lCt+ps{QR|1cfYmZKa9J~gjWp!4G zfz3KurJ_96*2>#twn9@1Sdn5Xv=a%KoVrRpyMM7Hl~tVTxO?2)+=@Odnz#ju+6755 zAYe4v*OwV4fX%NRkXviGPIv4Acd*3ial`xE62;4zJbB${lCPCIi#c#Tg+QvgW zqAsZc6B>wOVq?ObR5SH5vvmYn*CaFqJ-nn5k&sSdVkBGoCLAD9X*}dl05hLNq3A}& zxb5*oBM&YqEz!a^v5eB?Y?{wDk!Vq~oD9Ku=3lsidJp-FV($#0@uzsgi*Pa-ZPG4o z)1UK9e?jli_r-=fK4l=t^b_Q)G(G9G<{#}MX{Pfh`Z!Agt+uCI zMX9AS>-nv)7sA%$sK0WLq&tvrNtkag=LQbB2O@_i%u@QJh@%V&?u5%xjh@RmfJ0TF8KJ?coo$?*uZi%c(00qQeeG?(hg7~ zGEFi?LG~bVWBa78rxDWeEme!t&PGprdXm+e;htZp6-1ZH^+>R-%yccAPt2%R_$}EU z$tl4{Og-D)fuh-LVNrZ199pr!r*yu=>~eG4@sXrrB^8~iNyGSKX&?S{AW#}-S(7L& zxj}v!tnZI*_YDI$aS6MK5?(-KCR|TAEh_@SuE!rRP>l()TB>XRULKIa&W!c(2kFnJ zP3%WPWKfK3U`@Ek^8gXM+LqPwtjwgy&j#C5c-?;Fg#l8Ct}FL=%lFD*Q_Ccn)xj}W z?p~n6#Ak83o5IJXplq9&UZsRA+F?duP9c8PozMo_RcVm$sSJds#GRrUyci_-QxZ9g z<<~yw8iRQCP(;e$DlnS0yGDRlvA&3z?1U ze`+taf7(lOAzBfMwrc_QXiP61c4T^>fbv)__XK=z3BS&TS9>%76WU4)NS?B~+WyLV5L=Sg; zb$F{?iLmm4g@}7*DqMh4eG4P&G&*&^74A$6bre+wh;zLj>yOge-IpWDB-sepj=vcQ z7*)6ol1kz|O!QM!a0p-ZZ=8Vg)vzc*s{VsyLBGX)H-RM(y~ zSC2f*S536D{jS?{t??SRS7SJW}m- zA2dW7O~>Hr!Y!a!B!Qg^g`@di)D>v|GM9h z9F4<>xM3Z#m_W4rlSY;C@Rc5y-}uVl8*>y=EfFo<@cLMOFiCgkD;yOGE+KTvQ>YtZ z<9eGep_Zq5ngN1pmG9J;0nlJOzaM%$#fG)q^B4u`CilV_})u9*+kA z@#^*>0R!rrltG6}x|ADJzvZX;+$6=aA-x8oe?KGt=s0|vn_D-O!Bu~$$2__w0%GRR zw7}V%-xZk^P@(EZo#5ig6KS?R)_(bcOsh!x1F2taBq34xRM=J|z)H8m2)dj#Uf7Fe zWXJ4}ECEX<&H!`aK3BM}R_C!$D~+y?M6Ql$KO}XM%uH_6Xsw_eVlhaT2|Af6DkJ=9 znptlkshd%4ZJKW8{uSJ6yd!RxHRYtS?dL4XM>`rTJ5*}wEd(^T#S;YA%_BNxame-R z(sjZ30y_K~(Cjksosn6BA|jWop`1RCgx5jJd$^wP&8RzD-t!+E1kO~Wfq%l4p%Qx7 zRzK$B??;*ugBSm~AkXi~%C!i|=!#8!6UmmA;*{~pJ;~V%I2?Mev+7h;_@5IARI#3_ z&C%&FbpFX+i-E^U7>m=T+PNd>EG4} zM}^^Li!BSjZaSBUZ8og|He zhsof!#z-nUV%GwS;{kTv*|R|s8KUv&Qd}wj7TCdHxcpQ8+CX+5R+4KNL( z?IML$%-{g}72TYmos-9%J_IUpW`i;1sfgun%mYQZR+@W!Q)@>dEcM+)N@lC(YaiFY<;iG z8O4=Zk0}6ycoSkvLp9Tl#MTt*3=*@0r51FUWQyXFM>dImC*Y+|Bd(Yo7E$AxP|Ryu zp=|?Y@bz}QmlDQH>ioqxsJ{M=QY&FG)Bdl0lPqa)f|fYTj$s`Ssv5jK)EoR`v{3{q z2he3qpf*uKdMg*4=i?r0OKkHxxIYa{&MJp+6b{h>u{IrtcfTH<7jjMwiUyx#BHEr z5gKbUG#b<+H5JgrHr&1mtaRrgz`uzribiBfw>M!1PxiWj7g$+k3xr6HXZ<>f2KvF z%=7ji^)z?xzMTY*5wiLS*igst(ptQORb9~os^^KKv$(b7A}PCOi9#`rZ2ln~S^u)C z5ozS=JkLUetiBWoBt9OWx$ewof)5uUogbfvdIgY@U>H6*EyzX|aE}s|Fxd*FKU{>`D}UNqN=bbS1^q_YfNMT%s-aSWIU9r}*0S{Qn#RwCDQ& zI|L~C!hz$}p1*~BV_nJeW9bG@p~JKXMw@C_bsj}=JZR|##`cRa8cW+xpnAa_KYnIR zI3V)$1zn)$ArP!%>>H|WUoQL+?IqrVw-9Cn)%N(f^peQS6;i+d#C}huXZ*V|>&r9f zQk18o#!T1t!hDtlIm*q)vHss=K!@k{qh0q`3}uE+H=$R1j&G!#u3m6jB?Auv(0Z z({sdW38%k?DexvH9!c?R&4T5#G?yHE(kpOwQLxE=pl-ZL6SufZOtXyqlg{r_3j9!! zJ50aLAo78KS*5-EtUdGQiixLTt^E}5C$eX|&-y!O1aq6yAk6#S{0HIn=<4r=pH@s^ zgQCgLFu%p2NT0hl(KN*wJl##j=0;u9|BQV<_xqf_$TR%mNj$zfn zceYUaCEdo)H26Mo8@;Q;JYYiaGqF z#_Y>jJ{GzX=fAJ+G@_DT-4Y*9CBn z%ZWck&4vHxpL|)?rzavaB^F&Eg?c#^%5!(uZlY0Pgozo`Um>69)8PIuBg@;Z7_D&B z8H+w23-Q6dhpDn^IM(AjrJRz5Y8ZeBc-|$h3%~f5*dQ5OCPms{>|7^*SXALTh)F{l zWLo?dQQ8JSTR6V^F+)wANNyz1NxY!zv`Lj$)VA13+1__yan9?n{LXmGO^YcEbfShl z`^@A03hBYD_s1%O)jvScVw>H&-7_VemT0q(0(s%zzVWOxUH`M`L@J#$&zmKSMAx+i zrv$4OiKUX|e>-?mDpDOTKep9jA<7sVjpXgM@QZI=Nr|%K^inRn2f(ZEU}A-aFw{Iz z3>!~0&mI8bK3v4}LB&N17SRvkR4u}onW}aXmq{=QOs%7fz?>J^s0&S;CtS(96?QmmY^BoNbtz5~t0k49^Jf9eoidF?Xi`0e zFWBbVxMW_*Tc8JQ~g*YOxrxZ2)_waT9;gRVB5LuCbOttPY6n#Sq!2 zjum-Q$%z~cOVhnM#6WQbB2g98^GOMk{eqh)u+wDeh+$z=cq%S>s~btVOYAAeYk1xg zZLUA&<^h~YWliF#JUl zl4vBc-8e%(P&#Xm`_%Flgxv<4_PCMrin+p7o)UPVEF}}W;^BTYzRIa<^5j01N5G*N zLeg}1t|RZmHbCl`ehwnZr>9O2qS&p%p{i6tp}9DD;+Dtga}+nw$m4zUY%d!G=d(|DuW@V(Cx@C z?WZIjf7_%Kd1I+FsLE?f@qlT{2hQL!$E!+Ml)V4@;eNGd5CUx@X%2dHE&V3btOgpS$~F(PU3+UIhc zoA;(5%KJBRq0&q$&ogF80(1gR;+7d|SikN3YfC!8W+L@z&_`fwC%>tUhlAA56 zxmeG3O$yPoL(^k*LP=5egyJW5tJ%m>?ol!lf_i9T_A3@Qo=JbjxK--JO@fI5Mi@PO@3Dn%!%*4?cYWBYtWx+nL($b4t=Ed>LG2FWCbfwu|Z0$iRolS2d zvbS7jp0+Xk5Fyh+!wnrXe>%D64W>}*5t%_ij&|w1@NN3lAHCr)ilFOafJ{U86*Ceu zt!yNCjLy@1e*)uY_NSN%xAmrLHg9>xSILT2?Mq~CF(G4+dR@k5&)2=i6WBaF_G)0}4|7UG!DYI)gD%t^@${wLnN-E!mas~1QNDH^hk+Ez_|&-yw_ zSfCIjK_Jm6EZ05Sd1!utkGhxRAI(L>^SkKCBBk9i)jYW;5{76WRBot!)FUR?0wn{w zHiTzc?P9u4c?JU{OE#cYnjGRTMJi==bAbg!AtWX2vjSW`qVo%)zb1}i1s7hB+nLW{ zu|Z>*SB!4HD}vlO#xH2>EJ@K*8OQMUrg{2TpoUb1V+Vz;A76}ZC?-?IZ)vmLcP|vk zYR7%lt^_281WlpvZ5HBK-8TUFw;99p@qS+@X3Ia8l`ge;eEWQX14<4igAiceeSr)m zOhr^0<;WrleAK57{dpzB86HagP{8+H>U1znuL0*;hep0cti;L24bAvtk{C|^omm5V zI>y3PJR`#vIK={Psj2A}(J;p>XyKs1q+x$ncBihO|pACqE)gyiJK`p+kBHpQ#zasXtO!p9i7g^K8yy0b(yCC>~p)2$2c?Bv+*Km92S$z%&XDHiscq$mKGS!*x)?S3bGPm%+&wG`$R z-g*p9N#?~gHr~>qIZNeh|0!9^wCnKf zhiSSpKv3l<*7>Ey##1?XbphO)69)PS@#PC%9(nWCKf(B&`sy3pryt7rPbS|GW_=v= zLN#RUe|+hLE+4EZ%PsRWvs(E?{|X2d6#2IB2Im&;QIuS%`!)AS>G2w=!dPVzVADLa zqbr%vdz^|RGG|$Jt(8_D_4Hk-r?mZ9k-XFIGEgbGanzuo z@D>gZ{{tKxY=6%G{oemy?C|{Y1%9vW=A^q> zmne`P(>(_*JztW7lOdj?>fxmMSlwkYnL!7Nbt<%oc(^a`u~1Z@sKGTF_oc<}qwRds z-mwY0@Qakkai#?aIqL+={z2GAN4xh2`Hh#$KU#5rZ-1vvIsSdT)v4Fbxmnn%d9>!p zVN&{zH!3}zRNsFhb7R8o)7;imAQh(QR&F1wpu88HpOFU zUPSrh)mr~)rOF1^xD#XrJ0bKT-MS52&y_8pW)b>o+GNK)xoo$U;Mms zT@>Hk%rs-$aa$E9Mco{woEqEj3eMvv-3zmP4Tx*`^I8%5Dj<|uIS>gU+;y z!Z*V)+VT6s(DPd;)celcxlQ22&+GB@=)L{4o6|Vz2k+Y(6CuOslF|N^;ffOciqWN` zobTmF4Nq6y6R{!3fF$Ofn~ayeqqzoaNWXA}X4Q`~)oa@snv;dH8NN#UlI)^dEr)U! z%Y4IkpYg?nu4_LS$2k8*yqOo*;p}@$cMSP#<>ziNU94fCXkFP(Vzs(F@p0yurA2w5 z2~~zXj74gtc;ZPj^~y0nu8n#6C~plofM*caf&DR{91 z)*va=-D0e2YRpIPc+F-6Nuqpd^+g>#m-Q3SVmi)d(fguo@U z5B9LpLfFS9dHA&j_87KvRZgOQn}43q@p1n!lCN!q#K1f@g)4QiQQS*Ur-)f|c*W-@ zyWDG7DNg(9R<4tofWG3zLso_F1a1y-MIMFMBDQZ2)tZCh3GS-P$(AU=v=RLkp9GEF z6uz>Z?KL^#cxDvg*3|<4gNiQ)?*mdRuj?h`BzGn^uch(9l;gBJn~c2)_dB%^4yo2C z(~am;rKD)Dtj-{a%DRA&(3I5myRhbKtsNQkfGWPcyitsmaZ5}obZUS#zb;D`J3deC8(1Fsb?;L5%BG^pH0`&x@t0o>b{ItVe}ztP9Y=A1O0{kB zdAa!^=|grIB;9D}2FVl_PP-ZqAFJZ6g?Vu%ekodDT`X=cwtBw2a85AUjXXM6u=@wY zp!_CG*WT##nZ==~p-@8QWIW?rrvj^GVzoRKdQq>jVe1w?0@B9_Zc*1T89Y5td1wb$ zE!|EnJ(jd7&aRjdH;IF_haGULDk~6Q#WRbdVXjAhz&BnlUOlZhq=Paw37^R1s(K*9 z&knwye-UTaJQC_T2J7|)zSs9sF+IjDRSWHrJoEOU|5S+;E&1B;RmpVB8CsJs^~o*; z;e#D(4PTxu+N{ksGRZEa!X*RV+;2{a(S5z`qN<}`(B1_x++2LCE z15iGU!#Z3ik*w;X3NPBQ48=7xbkpFNgsM;)kyBRw5@ zTgu_eY~)`clkff}26`-I5qf08ubsmqKA5>lZyZ157!#(&&yMnD6riPx&<%eHe*<)+ zg%b@nU>>AlN}VJ7eYtv!&W{^6D#Dz7x!UuaeT6Jyy(NA#$Pz)79pDh+nbiWAkWGm_TFEDzY8`CHM3Bn39Q~tRPW z&i54Nfh`fW9VQDs*G#!qr4djXYj}8OlJAvszi@A!=E)KMi3u^gZ*7%yS9MQsLZF0*Fw68PUIzcuF{{3jdV?}I1ltJQ@k0caG=2b{j zvibf-xbY#owmd^-93Lw6;g6gl&GPcWO*mZaYp}Xs>Ne?~DR{QD>kbKS zZ)_LL>{Ufs6%j3A47Xmt*+$&sViY$wgm&+D=L5g`44kEmIo>_L6dQ$Cu<@RT81W&< zP*Ce}J|U9ebK=E}6rog=P7=uO*al=;Wihh7#U(gFiM|!=T2wc(V`NjrB`6Uz@+HPw zL5VUA>8~9y(KB{_K-Ko0VdL|8Og0_}Gl$=rSrVxoo$KZB*VfCgVww`1#ggN$X>0!T zIT<~Cd-2sb?e=WR|Ig5?CJ(m%irvHuIOARHI+Ean}lUtb%!@1sGF(AQ%Kf-B9X7gcSmtX zPb=-e+4IGo97g4DeN_v>4(VB=R@ajP#)cl_^dJ{SZvS{8`Wnq7X9@Xg3=vOL+b)E~iJqemm` zmmtRp)03!9St3v?n$1hHD$!KelsmF#(?JvS>3~%FJiiWY9<(bb6nSFzYUI2B%82}<}OIo$c zcjKl+0qN_azzR5oS7Oz>`P3BEV!ob!cQrgSaRzmnxd5a-A6CVnC_Z(`!krj;qI(Eb z!D#R6WkvL^6ypft4gtnXb{_$CKFx>vL|G%$H`0Y7pf6!J-FfK1JO$)fD}^JgPzYgfZwv7A5rr3sDFfcL7EOm!)Z6H>e!4JHU{cUz6= z-3t-&@1Azl#BoRfqiRIz)>p-J+*R~q%6?e~A5R>*6j!iTESjNKqIC@qC0fWg;#T#! z_ar)Ux5mivtd{ zXLMH5CZJ5_-$*vz6Mv!JeZ8{l37NoF{X9(jgmf!BMjM<8x(7o8KhDI(I2%q!upagO z)#LA`Py8%HN75E63+t*I74PD9j`*{eap>4i8z|O#0poO?t5~1snG;5Faz~YWhFKAxj2`6L>gUN%{}%`1=s&AM1gSjhb6Y$25qiztExM};GdXLKwsPX{ z?%(3&k?15eylqnfgQE9ZxHrHw?JXzw$`zL&Plh-~ z*>%Pz&tFB+E7K33{hS;5NjmftQU_P}pGIHq=XNdj+uC&XxyQH1Gv{_u&|4}hge|FQ zg~?;_>-(>#77FN`3tyxid`%fFcl|D&4t`1V3H|Bw{*m*${xD_Pt>^VTnj~r z;)<1HCU35YO)eawziZvX{P!+#^sC+2aw8o*idyIMLcogY(MmX%Tp9P-fYa`<5WU*w z4~D=qIY%|>5E zeuZm|WR89nKI4Zf9VdhKa<)PrxTXFUL~szd>*!GJU@Hq@aSNRud9~4^inoZoPvTjf zXg)I^d1<~duM1GSDNo7}_|UI(Ym=_k%pJi)?xCsiHr=toZOuqgcuM83r)?U(Lemey z`yu_jSx@#H?6@fNw%t#cnUK9VnW16So|p+gBxV^_>-BGwM?9Mu?f{>=3#RXFRm5;2 zS64_^B7H+N?@#7d=xjUWH2Dp08Fa*%Pb^)*afQ9w63igU*+_4i<3GSjA(cM{`TQ1O z-+@}8+yyUn?{vv|F%`3_A+5S~R^VCE+#1dM64qxkbn?+QZ!4Z#=Oz8Va(WGuN2SQy z2e`l8dq4kANOrauw)Y5IcTIo?2M1dt|6kB-ZR+Uof8en*Z3D*@Zk*2--!~V-D*YvI zuI0=yO0?Gskx~l{K7dwcHWwqAXA{tLYG+=b3{(@Td>p0*q;5D6*gPMcS$266;EheOS zCpcpH&Xpz-2rnzN(74ml#i)p!PJQI5dRJ@(Y_&BDzDdjOzyiKO+3c&!P4@b<~-dZ+jQX zvT=t681Rq<{X{SMh-hvo%0>YA!}hA1C^RKUoD_p;3CCKPk1wU#%X&+V$=4wlC56d3o!wO=uKeHLcXcFehpg zfr68y>ej_!X&wHp@T)(C^{e|41FI^7uU;sjNf$Zf}3g;ifX$;f==;j^%CB z&!)uTVc2Q#o z)F{XyVKfycHI@>6m4-XX-JdTfEtBG~N~;yFJ?YYfL@*E07bn1f5A8ly7+QF$ro!{t z{EFh&;1A4k^(O6R|$n+dM?6lCM%}tYLq_pY0atNs-w78HcW# zSJH^4j)YjNO_7sQ;ZIgosiJ>|6GGO-Z^fM;?cBSS(9b=VK@GYP`3h(I9==jaQ`xac z7K=u~d%m;x$*!`k4{F#IWG$}nIn<=1?(i-I??U`{rhw-~xhLDxTTZ|4rvXyp;#9MW zbw-lGA6p?NCyyobR z8|vdl&RJVk9oK%{V)4Vn1n}EklBzS!(sm^8Yu$uZngofz#HLGcBV(5mp+js=dZ>SH z#b2~nBNpf^`roZT`2WjRBDy8ZRi)^hTEhS%3Jfr6{qMH&{|#FF&+PsO6?Gh8P|@$# z_pjz;b%4-<&UgQyVi?*Y1dgWXJSlIo0TN7$kXUT~_o?cs+>&?Jm{g_)wbI_-VZzme z)ZkV_qyFV#FzWus=A%xPrzo3ZO;JET@f&m}dFZqUt*KECvN2T7;Ajj>TTAkFD0{brEGs+D=1 z_83;bH7Yr`xfK!bt3D;6@#nWO_ZPjgiwYaw!m|j7q%ZS)SkRG$%j@Ch=FVW;xbzB> zmgO5M1~-uph#FizKD@aJO+syetIto*z8o)qTwey4Y#xn8S@DzNQu2SYbFO>8V4vpl z>s8~0!E+sg$PcC7m7{vQ`>~e_rF@A9kv_SZx!QGd>ddI5t2i@L{+#t=P2MX2h4x^{ z1e_(5|LdgX&%%k;8~y{=8s5*s-4;PM{OSLrwReuLq}%?zW7|o`wr$(CZQFJ_w$-td zj?uAg+eXJXea?B`=ef`C-uu_7J;olj_tHnT)e7ArK)+8mEyU| zBH>|e{usNtd1i8UnTlt?zpTW<(svyAu)J2S&7C(GheeRSBKfre;%B3zid>R`usw6l?RxeT&7 zPQ-To_X@9~5Jao9<8O%@n>m{XQ`&$&lBE{^u<)oxi*2jY<{9EF|jE7S{H+du;E#opCpjL7iaFhalp%l1lj_E=J)u~;RNG?`iANrV6!Xer%Q*)@+C;TD5paLmW}Wq zF(7!rc5zg;hw(X4?09i#@%jX86D(Y&$t19aH-t?d$7ePSW7VqauH-i# zD`(Lv_Aff^CK5ggCp z4JLpMMamUY?nCnd9B7mKxXbfo%R~nAs|dmyAPWkj8XnjQ6w?IH216YvKfp^g06)GD zud8w=xye8NX=$1cpP;RU!hB9~mZneKRGz@FxB&t>RPQky6IXJn^s+8e3|1$eMr4r_ zBg(;J5u!zno=7Kts5s6BwTOG3P3-l3JIosXhj(+)2 zL|_iI3-<&Ji9?W|y@>o&#VwI{@PoEhLYblAKsd}cVN2;z&_7xx^E_H-;imvn6P zvb|Mp7?b-Vh{Fw%yp01#h>z{?KDP#p2R>kd43!}TAm9V! zqggA(lk=?|{5are+CwDgGFYnXAV>r2_KMjBFbHqe_XZGYSINx(_DQ)0Ny_gWWd@KMFa40{7*!9L>Y!z3`N8^sEQX^EDh#M2iuDU34A zcuuH2=jqM1zXX#(6JWn<1L(n&0KRdC4{F6^VZUWfPrTSP1GgXB;+NStdL=A zriI)tp66(5sOu*NnAk}#JIC+CGw2FdTA0EyGIDp7{>9IWHu1dML|f4KHPzkdWzIZI4~o_sJpiKyp2z> z{I2`~U?xrr8ab#mhY^VEMY@`fVe*-@Hc}!|BC&)4#ffD+RkthECC_9vYSe@G!t4sVBtGlrRJm`M|bx^=MIH2fVaWw!)kj?&46=9LY%fyRnwLpB<;WqW#^-7AqUIlM3NwajMX zfY*(98jTyYlkQ#8xP;N=k)?r-lTZ2DE|p$4kU94sCJFjYi|b>567~_yLTQ`l2`^zj z+Bn++u1abnb%M@hhA<>tN1HpAAv9@A!)g)F9}tqkuhkkh8Z|U=AUQH!0xSG1Fq%95 zHO2!}!PE~}Q*XMd8(Nmvo~OL*pMlepJm4V9J%dIZNF_KyPYEt&K<$sO8=OLgmdPLh zAmWNx6c0_~pxT-qRH#8VL$|z`OriN}Q<}|nq*(zNA^b@<3+%~>JYIaLiX3an4$Rf` zi`4B!gHWO#L_5F?Ltz_ssHP=u|6G)u-=)dYzEHn$W5>f@#Yb9A+74HxUxA+d7pXe| z!VFK6=s{qRubw1+-dc%WH(GT(A?X2huX8jDd%zSC?tzrtM!-+4CxjptzaU5f_l*(u z+1UVVeCEI8VD#3JST$H{ADMPAs^V`w(%ZK- z_BsmT(dx_%F*~E(GF%Z>F&11&(%)r1R327OlF3Prah+tLSh7fJl>yzCpWs+@UVKb$ zz?MoU8(JD0#Di?@=E=0rzX?{>Ylxr~d`EA9%qQvP3D4S|bT%?tUvl2H;=Jijk)@9` z)|-V43oT5Ly}vo&)t8dEUtq-Hvtie<$6fW&&!#P1!r3q8^jQ~#Ovi6@)|!a5f7;H_ zN$b#Tl+w_iP0`d*Y8ac?(6MwSPg;{hnlw_Y7cwJ3Z>=*911L651)%GIoaU`G2G>qb z&_QZ^Pw;UU8nAWy*{W72L}W7nCro9T6?K4{Q{npDKg^OYs zG(F(gwJE6Q;=dzkwtDZlDYKQlS z!=t0c0s!cfjs#_dFBCRY=Qng_pRE}o}+E6b#NS5bKZ0+4ua(5C)4Ko7-E3;{@v{hY5argB$0ya7B#WTO3PO-UI zXR^7zjH|12QFF>++%>=M62b8N%yKW{!w-Ec zt{E*dD=1HVp>QSP*)r`^Rdi@7finjW&pz*U&lx94*AT8r9{GdkmPg?V&8r%9VUwD& zlx8Uct2(l+%Z}*}2rN2PIF&fCOFq2;{E!>-1Ndun`$sOPts>u^0SEx#{Y3*&{xiC@ zH!}R+KwxrGuWcbcLg9jV zdr?>#O69ht6W_uRSc_4gC`{oof1ShUO=7)MvaesbdPoi@smBf}j00R4&)LgsM#!_w zCu_ka+iDpcr*()YDy{O+7u1*LV9Lt53ZCa*z85kBbsU&PFZDh^ks)NOlogd>G34YY zRg}TnjM3mL!`6)2L)af2zfop-H#}ESLsyDfxKg$A*4@0QvgSNURo9$Z7IEk!#xS_?QWd_aFoOTqE0yiKkSc$HxMT{+ zFWLB23xrAyXm^O_QvP_0^eAbl1Z=MN2Ob4S%9`{B9%^%AeooxDj`q0zc--!_DyN^R zCdJV?S@xr{{HOEONt2{xnVu)2WLL6V(S8{|86O`v>RR^#Ht}x7*lxI02)j z)R61T&kXlH)-F#|)`&aDBpYU;AZHw*Vf?xPCWnnogOz0U z*$66^5#5iwj*XO2B`C>?$W2Jbyd?B1&>o;*&Gqq$CBBV8Y{?DW4K0Yp4LR(e7}H!> zgQzN+RJ5fBzbc>%Ob|aw+HPf%1`l1!ZUOM_g;Xk z<&y{%eyuWx^Lj5?ZuRQ_g%?BFNVc?pqnv_yCnQ``f@#=fu1?zT?1-CH} z;VC$wrxaWmZ~ATn&XlWWkmjYOI+jlRm~oZkx>LjK572Q2#r5{)Qbj$4)NVP?sf+vF zmX&2IQg$T&)OVp}IT!EJH(iG$LunsBgl@*jr3SocLe+r)zWo}QJ@1#ZxDbWk&KMvy zaC_(HBn-T)U648xaxx0T2|iT63-qp|igYh78dE584i#py^uiu;*dB0Wss%Yw)^99& z3X=?M@I?DenD4>i#5SgFHVvpsZRakyzV6W%D-)}F=Svls`!V#<#a=Z|y7)cE zmC~&`As`A6ME+Lxqfai5ustLAt3{8{6k(L41_-W_7(@feT*Va8-#U}gyj|aPV7{Jl z*&XPEaHn-s7-8DpL z7)8Mx1o}wUeq9lyDAVLuW*Vmqz(-wsPLaekR18$b>+bE(*~MJTo?&t#iH`8v?JMh5 zjE`Rw6@$ra7j~jd5Sb35k7)*aK2{DmQsMC^+rEP$xCTDy0}0wIY(Zx>*2v{W`N$Xbe?FJNKcNDE#gioHu z*psFEvR3B-dO&a6#P~k|zr;7Ich5IZnt*0s#SKBRCj>On6KE?ev2%!(i7^F$bTJE! zbws}>A(v>-CxmC!v#%M%ja(>JkxvAk5UXjJqe+vsjtVsBPbR9>RWO>Xj(d1M=wZk3 z9+&VzbT7&HA^5rfz|%Zw-kV1UvQ`I)8l-cb6jJ@GpobZs1^536RBD6ju*GC1$@b`KHCSpog+2J z5s9!p2krGWz_Og9-Qs42UVfa|fLe5b^mBsA7~^3Mbc&V2%pC9)7E+6jj5+ArGDLoF z3^IOuN15qGsbi-?lvGnWc)Lk+-A@~tIBUtrd8m!=OF7LJ)1~>Vzhh`WfdA?(f3Atf zfXBd<$N&Jh+yDRu|D(73cdm?o^}hdzgSAHLzQn=jzwYSC09qFoo>(g(Ww{g0{V|FC zfr*YR^71Vd$e1a@887zFl&n+|k%kfmQ@KZh?KRgsUlmhTD#|mbKCgE!ESG7jTT(M0 zPS_aR>_P`TyF7eayV&0kHzqPQ-VfooJ}#gAe4bL#{a(Afefg~2(0@Cze*5T9r>mZ_ zV_ljG{q*U4Heq(CN|Q>%*x*w+S!%c}EdL=<+>bFo86TM%FlKx0+Wv)bH{0%y_C< z?dWdcWdGE&PDlF+Epg}l;4JgtggBZa6hHMWqUt2wceACs`}2M;qES_D@yHGx+nSLY zJr#W{b1nkU$hk^CdgEaC9gj`DXQ<-s(Jko1>%+4y8-DR{YblB?%4%VBS1z?;;JWJ4 zXMHj?s^y3+_3nm_&-ZgWY_- z1FL4rBTxeVu6qTJ>^<&m;LQ|+R;AHAB8pZTOy%wnFG?fzJD!ux%f-NfhPlB_v}jER1lK4c_DwCTig5Rp`*`n zOKKwspX$X=y^jGM0bOo$#uq!swfO9sNxPI^c~gF~GI1o0Wj`4uwI_|G7rHG?oXaN6 zY++PNUebe_trkpgM7Rb@YND%cnrKLlpE!(djERb^oGkU+n>wu zg2do&v~chtLPw4faY8A0sa@PZM^heZ-czpD{LSH0oq;XJeZw?NI4U@udtb7D|Dwf4 zQ#70@IWDO6rJk0Wxk6@5b?lc+(04+lqDHFgiMhE0(+zjmxtpUVlO zSIc#k*<3Ni>o}oxuM}gDYTo=~V)YbC^H!sKR_5eVq{vRD1T}I zFXet6`)~t^c)^XAO$E94G|j1-F48&4t%tv8b`7O~8o^vY!}Mb$H>I~UrFQflvYgF~ zs&d@2(C94QG1*HIQgc#S?k@6Jv}F&cOZ9ijDA+z*c_m5uIsRTD#^tu59||@IMoP?> zgcTIIE?S=R>m3&=S=AbDu}{dX`jOEAB_K@$AU^s}X*K-6sv0*JL#ClLd)5h1uy_WF zU*x?;>D!HOLlh{WG_*`;coi1mIH9}D8z87F6=v5jW~_gZiUGt& zyHbF*RVr87TA|H%);G0$Wlq5lkgwZO6Ozw&heDz2aSk9)KE~j#WEn=A1VN^1 z984)F6MIdT1`pT=#>TLLVCxOIZ~yZ6yH&vSB~V1c1E9EN-29h5EaaoMxJ6b3g{1~LVG~)VSti=j$Nn+*poy!HZ zT^ycT#cFJl=5ss`=s<`G<_mQc2;6LhnR95L6 zf)zo2tj$Vaa}=m)W__|H`i!Yy9i=BteOk9HROMjj3VrxukyOOWdCIGmZ5gB5e7hBe z&<3K|2Txi0DF`c_c>uczQ5A0xbc?u#Mr-5qQ>5LazegRF2$_goR>}Vm2?U&k8s6FA zrKK}~47BKs#a6+99Gm%$<01tM*gfE%H;od8+MxCwCZ^=nlE;So2WD_XSDDxo4pUwR z5>oGvGWqhH7kaDl9L)eiY#QvJMJZ`N;6Sr5d7|vi9O^J=>R35RPGQvHSM=3=a(@6X z5qB+VtqLxe&v&3;85o&I1Rw^aVFQYl$8e1F<-pH}CsPn3-%LNoM2E!79SI7A^G^jQ)fY zrXhniEOAr>Nrjc72!Sb*nD+mwI=BR-N)4!M0(TJ60!9RtENof#*l`B{#t1|Spy_cO zy$T5Ag+$^=)3{)uRmVP;#~`OH8`>jCdO)trcYNorZLgB7hoK@!cRb)s2l7 zAje36`!rAjSYHaq(-k6%g+|4q?Bd65@~C!``od01?NRO71d^LOocJ{97S~y!0D73i zLW$1mNw^9RHzl-$QX{<2747Bo$iUJOc~hS*st;<2)uN93@;BAWvs%8%%BjLYhaOL1 zSC;Lp9LA7R=^ZLYP^OY0WTj+;;l#-d#KZ;7fD!?S6XTt7MF2uf>pA@DZOC!?*WqZa z$XY;(x+cg&EM@=kh_?+Zd6*ZRRTf5r8fFDeGs9S%;naBtjPdqnK)qUWD{$dJ4p?F= zEE8D)po%DH^Qn9QLf;A;5(ATkH0VL9$Z5*?@#_%!VHZ@;J$}b2R%!q*e<~Cy{p)oy zxlkCq$fCdqgL<$Mw$>S}^fdC^U!pt`+C+M^>lTk_U<7Dh^uWYtUMi?UQjpdT#)nXFmt=cBX#egpQ z(#MGMQGoOVSX|V(jI*#%%^D>*QJ5&2csP-{g`k}77j-uy;jqO@h6;?!gD*^83Dp_1 z#Ni94>(ehiZJEs$$ABoL_iQQisSGobyfSf7#)Hy`Fhx?=HSSf#d+F`cG`aL0obAzL zEEs!?-9h99mka^~^~fH`E+~2d!mfuw;%~>jNBxmGuz=u*)t&&sn-!$9;)}GuuY5C` zn|}liPKc*~PRmgVsP)CTo~pUZuaV8#BS6_g}9NXxh~-L(Q%A*+$904VYFJu z33fm*z=YfWO>K>ShDW;22>V?xVUs-5J_KrP6aT1NCnG!6Jp+A`e)q6=#tPNCqkd|T zNYtJ*L2@X@?yK;h!Qkz;Lv{@$2OA~S#ozj+N9vsw0adAAAXK$X0(zQE zZSDnpY%Q5#Js{7*P2n(A2Gy%xhOpunoCEH$dJIMfalPrfUWB-!iqUc^#~I*+Q%r(I zLX{=HOFZ>s2cJ`@hayyUFF2=Nb1t?tAl{osI5v)kBo9~Jj$@IkVVWO+A zSUOSH)|#r-dyw1!Kch3H?h^*0sQ3JcSzRQ9Vs6v4CPAW3?63 zad{X@iDTY8*i^IQKyrl;-N{h8zdpx~nv_MWrwjH%m39%z-B3ABYe##M@O$d2Kt>UQ z5yHkytJ%DAFnwYi9i%UEd5kpi`IFEM1z1+V<$jgWE0Z9nbMj=V_XzC-l^2a!5n z?^D{Ck%C>~);F96&v-C6Q@<*ilpObC$lVpjj^u~1r+*bok5@? zkMN3thIBVN*e@r}JpM6WV!7O6k?M+IJinRPba&B{#NQ;8{=FEph;%F@%7BzfTrA!F z*3V2i2VAPpGC={y<}TDfs-}&cca1r!lrPPqnj78b5t8UTs-=L^YhbZbj+nV*ursOJ zH8#l%l_%=lp7zvBn!Hj3aUo!yw*F05ZB4eH#>?(WV0s+^Mg|fmGLdj4h=>@9;K4V# z9<5*o;OcTi8a`aPhfG8E@*v;aUtW0L_XiF!54z1y5{<{?6+js!7L}1*x59oo$5Y7f z9tC`#3NOeA=4;H9?+Ofv_DML$xelJuyh9`B8-;ILvtTuum@u zGLuQTj+@yhPbm;bS7ja%*JB$lD8q2fuBN`@YZ)dQ;8<;i9MK78PC3gFA$NEZsP;fm zZ#pvCOl9k!W;`10=n_@Bnh@3F3s#uOz#^ubF&yRv#M%;5YbEEFo1g}wI}Y;@Uymx~ z3k%j4gs5j4wm8Y*s!8z`q~VUfsJ7nT_l_4E=d>joGS}-7>w83{CP#C!0CB}Zs{E+a zlO!leV?HKJmt8t;bRID;R`*3K@62d`u$p;yL@Um!;<>U7;+P;*A8Ho*Ij<|J99htV z@r~edSrV`L0OU54ztLE3*yIJ!heM=KNt`7W@tXofX zDZj2cyCYBdzA>ppz&W3@gA2xBi~2hsI}ZfY%_keagBWUW5;YOw#P^6N~}O}}uLC3hV@Tdfr+O!7Xb zv`qq=qpbyMdU`|R+dBM>2j*b)$x59#Z(}ACi!qm3=`zrY9*o=Xgq5P~ZF{hiZ>|fH z$eino`4YQ|5bC)s9#i?QpVGt#@fL8MVMJnuvfR>Cu6+`$bK*x)My8{@#7q%nEfBik zuTKGu^5WTn*+**!;*8?$7pt|e@)uCdiTt`jEKda#8V2OAIp>0EELvWhBY1Q_;x{=g z<$vH754oOX0vUr1ppY$3kP(XPO6Z2C6ogyEyf&Pt9qHETebIoJQg!oR^3j1S@kPrY zBYE~_eZ4Xi;qUL}uZ_SQj5ImaU`C7sKQZoI&mc5()1d)@Y29`?;| z)7GuE?9Nx#7tm%=@ROwRKfl&@yR6$Z`CgjzbF0xnKVEvQZ!H>D?2zNaTJ+p@H_dnB z;Jwc1*K>bg{cZ_+#ltM9M;bHewWG5`TdI(H&xJd?d>gE-9p`%fO_p#s;aTNpUA>3u zd*-n$w_QLCuHAlEk90}6-X2-d+qfPKAcGp|>HQX5c55cB5?doT9QH2KU5cBaj<0*Xs9f#0wGEra_a|o$GXB za9D4-E||^}FWkz@Gl8)Bi~~gh)zq@j+-w)_3Z=nrsFCjPEU+ew3r_dglJTMj)(RE4 zQr-^+xYD6?Etn&lIx{n6&rI%Ad^(QkKE1I*emRpi=-#}^n4GN3lcWz)5XSY!h~ue( zw6>no(wyt$w!o*Y8IG9{W*PHV$zlxUe-M)@#fPqpOJ2^5%+k*Q6W|Gt?&D);7ZZ+y z@C28^yw*)8QDE^;Di0KCFmp$m6&Ut6QVm_kMT{zYYBLxcCqytq8b$WYlj1WeQ1{q}c4oHgw)mu6!H;jAnZ{sE zSs+yOzK`62ZDjc{Lo1|(99~V9J#(RI8h6-x-LENJm3#FXZ>hvZKmg?oGIXjKU|D!3 zt*B2hwjBZ&g^Etbnpj|)y5z||9YXb=d~f#V=UlR-OhmhwGx|}spk3^=SR7>ItP0VD zlkZnK&2iyeUH1HZppVXJfYM8jMV!@HR%sVF`Qgy%n}kp>eyaAwRX zweKG=J{cnHz`2^(pZKOsm$(R zlazp0qO1X})2~^eQXXU$EB^2^ki3w1qE@24)LC$1?~0fs`6bF0@!q*4As-tPLED~n z)fSM~l=m8opMa&2tI_vZ2@W#2_yP2XUR)fC};SpXWWK=3e?kbm5(l21b4jR0y*JG9FV-MWv z0)2b8&64tB6i`W>(S_|CNC^Fij9+fs96^Zqux`v%A};x11E`{@K0>L=cL(mSLFk9X zlNqD`qb-srt(YQ{Ih!QnrijH~xuGu7!K;qynIH}00}EU8KoMr0Vzmt!t}VN4-xwC07rHvsc@5XOz#+X+SySj}@y zxx=XB1Cfz)BcrG6b2de#BfucbVSJm;SZK=kx7cK7=i+QQVm;8|zF?oomVzZ{_orC` zQb*u4$65U0qOJpKU04U94L&GcF#aI&NG=?h!?>pidP8QPl(jm(%xf*{JP}9chKAsO zQAae65uVNpq-7x7*RXZ6{Xv;E1m&xZToMjDu5cPZpX31l&Cxe=Rp<|cRajb@d9KvV#>3XfDINt@=~)gpu?jDNCCMT_1JZM^pd=^F?5YG<>+E(%g>Ynf@P zCiXYNMMJjtw1L>!#`DEeP?QGx30^EJ{ZG;@t>1U5W(+Agw>`BCxU)&15}Zz_(8Ym}-$Hl{(um0Oa8S@6X=dq2xfkXqxL>L< z<*4=5TY&1E&`ZapM#DXGS8s$seJQBuyO9~n!2VWC zmR_O2d97aVPW6`Qv$V}tjP50`eI$obe7{xk`bi*=LCtCsid^&>32vNSb^( z(ID!*_>0o|1!4?XOZ?->rG4#I)0RX!g@<52PdS;S$^`bi@tk=XK@+&mEsKwNZ|Tf7 zl5vJGf1BMp4oxGAfP!9Q_2tsdDI6KT9}ZVr#labV;4_F+K|w3-%4H9?pV&kc9hN4J+WADAt? z4s0~*DJ|s<0NXhNVmP=-)8_@sR_f5%AeA+8b^^8g0FTM|KK~(UOggmh4on&gBwnWB z{j!8I@yvt6Pz+qy_n;NVZkejA3K&Tsdhdtf^dLDTprXaLRDXc?FMqCL9WMf#E`%V&n0T1o26DxCBPs2s-IgUG}yf0VZ$ z@83OSlOw7gRwI%g3Rah*n>;k601vtEaKS`lShBBhgMMJ;blGl0{@-k z0ot?jhz$jKHEwZ@)nIfW2y&z$>T0Xb{F@}yPbf_0qmmx@;_|zDu2aVLGk8kBd>@Xf zLCAW&c4EI-I!DOQVRwd~wS0{6?2kG3Gf*2x&~lFzFjEW1u1y3L4)>rJ60CYvf0PQ4GD{-6wJtV|f1V7lP>awZHD)xWUd-}{Fn*S9 zKOuKVHo_~9>-#Ug_9i6fKqVcSA>XW=h}-76JQW-q#Kk~dCIfpOhQLR*%ZzSfAyYnZ zv-J_rApF)z{2Fq$fKEM_;y)xN9z8E)JZ=(eh%wceQJHIS?nzv!R8PP}GuK!^OZYF5 zjlQl>7W22D%y{3v8OT*lZ;E=%G}1DtqrYH9io9aDlwy?Xzf|3V4{pAmaau2?HeJts zAi0<=pwqdYVYiRqv$RYWqjuDrQ~s72$KJ#Lesik-nYUq1=YHBBZaTZLJ6h^r*`iu? z@s6_KXL%!XPKoOcyjE(UXSW(K-gV*q;87t#_d|nkeOE`X+DLP<^KFIXz*?5Q4ojk{ z(bHpk4CxBw+ie4j@w6r0#Sx19vR(bXtmulnM7?E@UQBbwP$uYG=v!-0o=I6eXbl5Q zbI}kIZpA=iUz0cRH6*gm=I}^fh#esCx7dAYh zXZ9!sg9GMB>*QLz=8hRYW9SlGav93e8O=Sa*>)3^eJw!fmP24QL|_bhoHQSwVQ)E0 zU9FCt9RwZo8Xh{?IBsfdZEqj=sGm8I*&cSTY}&yN$#>P{KsqeWi?m{$KT=nvN~m_u zH}tOK8(Qvcks_u9n6|FqlW-@HSH0`!e<1K&^+mPzu~_$NO1+MImTFD}&EQ+Fb+MS1 zWZj*08n*bUnDdSK1Rdpx>}}JaW&d(S&hVp@(%W*T`8?hq~cYcPCD}G-%4rcnc z1G(14GdeDl;9;bX#mFT2%dlsnt>=>0M5a?Qvrit60Qp5oHZ;oDu3=@gn(X!)0iWce z9qx~}Q-iT($GuDMP*d-+n)Tx4bXtYORo>JNRc(|Nq4pS74!FA+un~nw@H%&BEK(;| zRb0j75Vk8EN_&c7G+OA>1MH4u{hPosY~SNSsfujc;^ z?F8dL|NAUpPa5gY=@{!Pm0P?MqWS-(w*K9TKXLq1bNrVRvI+lo;-3oSzgzed#y^#= ze_6mv`pd$9CyM{*UjOdGpCJAz!~4qxfV6+R@Ruy;|8@n6H=1*V%%& +#include +//#include "fonts.h" +#include +#include "RF24.h" +#include "speedclock.h" + +// internal defines for the OLED display ... +U8G2_SSD1306_128X64_NONAME_1_SW_I2C display(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display + + +/****************** User Config for NRF24***************************/ +/*** Set this radio as radio number RADIO0 or RADIO1 ***/ +radio_type_e radioNumber = BASESTATION; //---> TOPSTATION has the button connected + +/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */ +RF24 radio(RF24_CNS,RF24_CE); +/**********************************************************/ +byte addresses[][12] = {"top_station","basestation"}; // Radio pipe addresses for the 2 nodes to communicate. + +unsigned long counter_time_offset = 0; // number of used values for the mean value calculation +unsigned long sum_time_offset = 0; // sum of offset values +unsigned long mean_time_offset = 0; // mean value for the offset +unsigned long current_time_offset = 0; // current offset ... +unsigned long running_time_offset = 0; // offset that will be used for this run ... +unsigned long start_time = 0; // if the timer is running this is that start time ... +unsigned long run_time = 0; // if the timer is running this is that start time ... +boolean warn_during_run = false; // will be set to true if there is a warning during the run - usually an offset sync error + +timer_state_e timer_state = TIMER_INIT; // timer needs to be initialized ... + // timer is ready to be started ... + // will be true if the timer was started + // will be true if the timer is running and the stopbutton was pressed at the TOPSTATION + // will be true if the timeout of the timer is reached + // will be true if the chancel button was pressed - e.g. in case of a early start + + +transcv_s radio_data; + +void setup(){ + + Serial.begin(115200); + + // this is the top button - will be pressed by the speed climber as soon she/he reaches the top ... + pinMode(STOPBUTTON_IN, INPUT); + pinMode(STARTBUTTON_IN, INPUT); + pinMode(CHANCELBUTTON_IN, INPUT); + pinMode(FAILSTARTBUTTON_IN, INPUT); + + pinMode(WARN_LED, OUTPUT); + pinMode(FAIL_LED, OUTPUT); + pinMode(READY_LED, OUTPUT); + + // Get the station type (base or top) as set by the station select pin - BASESTATION is default + + pinMode(STATION_SEL, INPUT); + Serial.print(F(" The station select pin (pin ")); + Serial.print(STATION_SEL); + Serial.print(F(") is set to level: ")); + Serial.println(RADIO_SEL); + if(digitalRead(RADIO_SEL) == HIGH){ + stationNumber = TOPSTATION; + Serial.print(F("The level of the station select pin makes the current node set to the TOPSTATION.")); + } + else{ + Serial.print(F("The level of the station select pin makes the current node set to the BASESTATION")); + } + + // Setup and configure the NRF radio + // radio setup ... + radio.begin(); + radio.setRetries(15, 15); //the first is the time between reties in multiple of 250ms, the second is the numer of attempts + if(stationNumber == TOPSTATION){ + radio.openWritingPipe(addresses[1]); // Both radios listen on the same pipes by default, but opposite addresses + radio.openReadingPipe(1,addresses[0]); // Open a reading pipe on address 0, pipe 1 + radio.stopListening(); // top station will never receive data. + }else{ + radio.openWritingPipe(addresses[0]); + radio.openReadingPipe(1,addresses[1]); + } + radio.startListening(); // Start listening + + radio_data.topstationtime = millis(); // set the current milli second count + radio_data.topbuttonpressedtime = 0; // set the time the button was pressed last time to 0 + + //initialise OLED and display Welcome Message ... + display.begin(); + +} + +void loop(void) { + + +/****************** Code for the TOPSTATION is here - the stop button is connected to the top station ***************************/ + + if (stationNumber == TOPSTATION){ // Radio is the top station and sends continously its time and the time the stop button was pressed. + bool topbuttonwaspressed = false; + // check for pressed button ... + if( (millis() - radio_data.topbuttonpressedtime) > MIN_DELAY_BETWEEN_PRESSED_MS){ + // ignore if the button was "pressed" a few millis before - this is keybouncing and would give a false result and if the button is pressed for a longer time that would effect the time as well + if(digitalRead(STOPBUTTON_IN, STOPBUTTON_PRESSED)){ + // button was pressed - store the time + radio_data.topbuttonpressedtime = millis(); + topbuttonwaspressed = true; + } + } + + // if the button was not pressed only each few second data will be send to BASESTATION ... + if(topbuttonwaspressed || ((millis()-radio_data.topstationtime) >= MIN_DELAY_BETWEEN_SEND_MS)){ + // store current millis to be send as reference ... + radio_data.topstationtime = millis(); // set the current milli second count + + // send data ... + if (!radio.write(&radio_data,sizeof(radio_data) )){ // Send the counter variable to the other radio + Serial.println(F("Failed to send data to BASESSTATION ... will retry")); + } + } + + } + + +/****************** Code for the BASESTATION is here - the display and the start button is connected here. All caclulation will be done here ***************************/ + + if ( stationNumber == BASESTATION ) { + + // read data from TOP_STATION ... + if( radio.available()){ + // check if radio data is available - if so read the data + radio.read( &radio_data, sizeof(radio_data) ); // Read the data the TOPSTATION sent + current_time_offset = radio_data.topstationtime - millis(); // the offset between TOP_STATION and BASESTATION + Serial.print(F(" Current time on client in millis: ")); + Serial.println(radio_data.topstationtime); + Serial.print(F(" Button was pressed last time on client in millis: ")); + Serial.println(radio_data.topbuttonpressedtime); + } + + // offset calculation ... only needed if the variation is bigger than allowed or not enough values available already ... + // check current offset of the TOP_STATIOn and the BASESTATION if more than allowed ... + if(abs(current_time_offset - mean_time_offset) < MAX_DIFFERENCE_OFFSET_MS){ + // the offset is in range - check if we have already enough values of if we need to add more ... + if(counter_time_offset < REQUIRED_NUMBER_MEANVALS){ + //add the next value to meanvalue calculation ... + sum_time_offset = sum_time_offset + current_time_offset; + counter_time_offset++; + mean_time_offset = sum_time_offset/counter_time_offset; + Serial.print(F("Offset calulation. We already have ")) + Serial.print(counter_time_offset) + Serial.print(F(" of ")); + Serial.print(REQUIRED_NUMBER_MEANVALS); + Serial.print(F(" values used for offset calculation. Mean value of offset based on that is: ")); + Serial.println(mean_time_offset); + } + } else { + // the current offset is out of range so we need to restart the mean calculation and set the timer to unready state ... + Serial.print(F("Will restart offset calculation because the variation of the current offset: ")); + Serial.print(current_time_offset); + Serial.print(F(" is more than the allowed: ")); + Serial.print(MAX_DIFFERENCE_OFFSET_MS); + Serial.print(F(" compared to the mean offset: ")); + Serial.println(mean_time_offset); + counter_time_offset = 0; + sum_time_offset = 0; + mean_time_offset = 0; + } + + + // set LEDs + set_state_LEDs(timer_state, warn_during_run ); + + switch(timer_state){ + case TIMER_INIT: + // check if we are ready ... + if(counter_time_offset > REQUIRED_NUMBER_MEANVALS){ + // check if offset is OK - if not .. set state back to INIT + timer_state = TIMER_READY; + } + break; + case TIMER_READY: + warn_during_run = false; + if(counter_time_offset < REQUIRED_NUMBER_MEANVALS){ + // check if offset is OK - if not .. set state back to INIT + timer_state = TIMER_INIT; + } + else{ + // check if the FALSESTATE button is pressed - somebody is ready to run ... + if(digitalRead(FAILSTARTBUTTON_IN, FAILSTARTBUTTON_PRESSED)){ + //wait a few milliseconds to prevent keybouncing - this is a very simplistic method here + delay(300); + //read again and check if still active ... + if(digitalRead(FAILSTARTBUTTON_IN, FAILSTARTBUTTON_PRESSED)){ + // check if the start button was pressed ... there is at least still someone waiting for the run . + if(digitalRead(STARTBUTTON_IN, STARTBUTTON_PRESSED)){ + timer_state = TIMER_STARTED; + } + } + } + } + break; + case TIMER_STARTED: + //enable the interrupt for the FALSESTART button and start the StartSequence - no interruption possible here anymore, except the FALSESTART button was released to early + + //initialize the start countdown here ... if done set to RUNNING ... maybe check fail start already here ... ?? or in running state ... or extra state ... + startSequence(); + + case TIMER_FAILCHECK: + //check for fail start in this phase - interrupt is active, this state can only be reached from STARTED state ... + if(start_time - millis() >= STARTOK_TOLERANCETIME_MS) + { + timer_state = TIMER_RUNNING; + } + break; + case TIMER_RUNNING: + if(counter_time_offset < REQUIRED_NUMBER_MEANVALS){ + // check if offset is still OK - if not .. set state to TIMER_RUNNING + warn_during_run = true; + } + if(digitalRead(CHANCELBUTTON_IN, CHANCELBUTTON_PRESSED)){ + timer_state = TIMER_CHANCELED; + } + if((radio_data.topbuttonpressedtime - running_time_offset) > millis()){ + timer_state = TIMER_STOPPED; + } + break; + case TIMER_STOPPED: + //calculate the run_time and switch to WAIT + + timer_state = TIMER_WAIT; + break; + case TIMER_FAIL: + //fail start case .... + + timer_state = TIMER_WAIT; + break; + case TIMER_CHANCELED: + // what to do in chancel mode ? + + timer_state = TIMER_WAIT; + break; + case TIMER_TIMEDOUT: + // + + timer_state = TIMER_WAIT; + break; + case TIMER_WAIT: + // wait until the start button was pressed to go ahead + if(digitalRead(STARTBUTTON_IN, STARTBUTTON_PRESSED)){ + timer_state = TIMER_READY; + } + + break; + } + int ypos = 64-42/2; + snprintf ( temp_string, sizeof(temp_string),"%d.%1d", int(client_data.temperature), int(abs(client_data.temperature - int(client_data.temperature))*10 + 0.5)); + Serial.println(temp_string); + + display.setFontPosCenter(); + display.setFont(u8g2_font_logisoso34_tn); + int xpos = (128-display.getStrWidth(temp_string))/2 - 10; + + display.firstPage(); + do { + display.setFont(u8g2_font_logisoso34_tn); + display.setCursor(xpos,ypos); + display.print(temp_string); + display.setCursor(xpos + display.getStrWidth(temp_string)+ 5,ypos-15); + display.setFont(u8g2_font_ncenB12_tr); + display.print(F("°C")); + } while ( display.nextPage() ); + } + + + +///////////////////// + + + + + if( radio.available(&pipeNo)){ + while( radio.available(&pipeNo)){ // Read all available payloads + radio.read( &control_data, sizeof(control_data) ); + } + + radio.stopListening(); // First, stop listening so we can talk + + Serial.print(F("Got remote data counter: ")); + Serial.print(control_data.counter); + Serial.print(F(" time: ")); + Serial.println(control_data.time); + radio_data.counter = control_data.counter + 1; // Ack payloads are much more efficient than switching to transmit mode to respond to a call + radio_data.time = control_data.time; + Serial.print(F("Loaded next response ")); + Serial.println(radio_data.counter); + + if( radio.write(&radio_data, sizeof(radio_data) )){ + Serial.println(F("Sending failed.")); // If no ack response, sending failed + //add error handling here if remote does not recieve the data anymore + } + + radio.startListening(); + + } + } +} + + +//####################### HELPER FUNCTIONS ########################### + +void set_state_LEDs(timer_state_e state, boolean warn) +{ + // set the LEDS corresponding to the state of the timer ... as long as the system is not waiting for input ... + if(TIMER_WAIT != state){ + digitalWrite(READY_LED, LEDStates[state][0]}; + digitalWrite(RUN_LED, LEDStates[state][1]}; + digitalWrite(FAIL_LED, LEDStates[state][2]}; + + if(warn == true){ + digitalWrite(WARN_LED, WARN_LED_ON}; + } + else + { + digitalWrite(WARN_LED, WARN_LED_OFF}; + } + } +} + +void startSequence(void) +{ + // first - enable the interrupt + + // set the startime - this is the current time plus the length of this sequence + start_time = millis() + STARTSEQ_LENGTH_MS; + running_time_offset = mean_time_offset; + + // this is sequence of usually three tones after a wait time 1sec , in between the tones there is also a delay of 1 sec. Each tone is 200ms seconds long, except the last + delay(STARTSEQ_STARTPAUSE_MS); + // first tone + + delay(STARTSEQ_TONEPAUSE_MS); + //second tone + + delay(STARTSEQ_TONEPAUSE_MS); + //third tone + + // disable the interrupt and than + +