From 0577a674e70951820a40e57d3f68ec07e7bf6736 Mon Sep 17 00:00:00 2001 From: Abhishek Mishra Date: Sat, 12 Sep 2026 07:57:27 +0000 Subject: [PATCH] boards/risc-v/esp32c3: add ESP32-C3 SuperMini support Add board files, nsh/usbnsh/gpio/wifi configs, and documentation with V1601 pinout photos. Assisted-by: Cursor:Grok-4.6 Signed-off-by: Abhishek Mishra --- .../esp32c3/boards/esp32c3-devkit/index.rst | 5 + .../ESP32-C3-SuperMini-headers.jpg | Bin 0 -> 64466 bytes .../ESP32-C3-SuperMini-usb.jpg | Bin 0 -> 69846 bytes .../boards/esp32c3-supermini/index.rst | 220 ++++++++ boards/Kconfig | 15 + .../esp32c3/esp32c3-supermini/CMakeLists.txt | 23 + .../risc-v/esp32c3/esp32c3-supermini/Kconfig | 8 + .../esp32c3-supermini/configs/gpio/defconfig | 49 ++ .../esp32c3-supermini/configs/nsh/defconfig | 47 ++ .../configs/usbnsh/defconfig | 47 ++ .../esp32c3-supermini/configs/wifi/defconfig | 78 +++ .../esp32c3/esp32c3-supermini/include/board.h | 44 ++ .../esp32c3-supermini/scripts/Make.defs | 60 ++ .../esp32c3-supermini/src/CMakeLists.txt | 60 ++ .../esp32c3/esp32c3-supermini/src/Make.defs | 37 ++ .../esp32c3-supermini/src/esp32c3-supermini.h | 118 ++++ .../esp32c3-supermini/src/esp32c3_boot.c | 91 +++ .../esp32c3-supermini/src/esp32c3_bringup.c | 394 +++++++++++++ .../esp32c3-supermini/src/esp32c3_gpio.c | 522 ++++++++++++++++++ .../esp32c3-supermini/src/esp32c3_reset.c | 83 +++ tools/ci/testlist/risc-v-02.dat | 3 + 21 files changed, 1904 insertions(+) create mode 100644 Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/ESP32-C3-SuperMini-headers.jpg create mode 100644 Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/ESP32-C3-SuperMini-usb.jpg create mode 100644 Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/index.rst create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/CMakeLists.txt create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/Kconfig create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/configs/gpio/defconfig create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/configs/nsh/defconfig create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/configs/usbnsh/defconfig create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/configs/wifi/defconfig create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/include/board.h create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/scripts/Make.defs create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/CMakeLists.txt create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/Make.defs create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3-supermini.h create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_boot.c create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_bringup.c create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_gpio.c create mode 100644 boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_reset.c diff --git a/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-devkit/index.rst b/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-devkit/index.rst index f95147757b3..761e69dc315 100644 --- a/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-devkit/index.rst +++ b/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-devkit/index.rst @@ -10,6 +10,11 @@ Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can either connect peripherals with jumper wires or mount ESP32-C3 DevKit on a breadboard. +.. note:: + This page documents Espressif's ESP32-C3-DevKitC-02 and ESP32-C3-DevKitM-1. + For the compact third-party ESP32-C3 SuperMini, see + :doc:`../esp32c3-supermini/index`. + .. list-table:: :align: center diff --git a/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/ESP32-C3-SuperMini-headers.jpg b/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/ESP32-C3-SuperMini-headers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..146d81cf9a079eed4cc1bb12882b3f4491ea81b8 GIT binary patch literal 64466 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 VtYDp-bLc3q=|62>zJXT<|JgE7NALgu literal 0 HcmV?d00001 diff --git a/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/ESP32-C3-SuperMini-usb.jpg b/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/ESP32-C3-SuperMini-usb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc9e5e791bf0ed5e9361288c99c96e4265502831 GIT binary patch literal 69846 zcmb4qWl&vBuDDcii(Vaf`);Mg@%rUfr5fXfQ9n~4<8>N4U>?V5RVua4Rx6_e zAR+#<9U2M-777Li1_1&R3IL4(151v{4u>VCicMkS1kVwKLn$7gi>vm%rfZ6dQ=M8u zBVp?cm#K3wo}^~tzgnq~pGn=@msg)15`Cfq1Mwd`|6ia1pIv@xg#WDN#Q;D+e-=m> zNEj&SPfec?LPB9c!(fuLi(#q4QgE0!VaHQ)2IbbkO>N;&iFe^%s;PhfSOy?}jsX$_ z3IiYl&}oTv0wUqNohg)|LwsS4f3s|yf52(~2X*eJJjB@jDu3{L)V!BH7D}u3YYo*& zdX0;jqP`8az$t6-KF7{VMG5mHJ#j3$!tG5q*b8=V=mWq%`;u;4cWm_lo6Gv3N$V7Q z0%Sh30I_fF9GT9g@NEZq*8+JIFvyk855NUhht!wn6*DkRncQ}wcUd^+2H7_S?u1p& zg5y8t93l=xZdOPS6gl*~CU3>}GBt2bj?VPV6V~S_O@AHlVyq_@hzT_wESUb?NjL0J zC4X{qd=1c}*l|3M6&WIU{}&J1qxf;~JY#lWLFJ^dQ>p|s*nOjWT*0LO(_vr@FmOuq zkqg#nDRV(`|8>8f18q$2p80P2diX*-(5&moy|Nj&Lu0`wGM--eN1iNpn38#;0rGGF z`ZC{MRBX0K&}>Fe1M4(B))C(jw!=49o9b2K1JFiI_{&upBSpyn?e{74xyXFFgFlYl z_sjx&Fd9S7{qtn~Q?W=!SgrS`M0;DzXfr$nPoJO!OR``JAsXC5U_j4a3Q5j zkGQJ@SLg$d z_FdC8OQgQJwp8N9LB-+&0MirDhN?JI$@!#Wz0f7&&Ix*%k#v%@H)hYkh;s^(Y#RYk zUgOaTx=!y2(Sq-U2EUJ{M?AAh%lto_tx-&!@H+imR1pP0z3dZr`Rsk%v&e69nUs$) z%Gde#(}tK=!&{nSPgioo*2-hxhCyc1kvWIaknF4TdRt)5fUxg3R65}B(x$C4M1GLw{1=l7OY+S;%v%||H>reBcx$!F zKJPyB7-Hk$Eb+~qucs=_HZQ`yFlqN03ilBKeyPv!YPcWsNAz>O4p{15z zeA0Y1WT>se`_L5dkiVcGsUL%WRIzcF7?b_`(*SZn$q(@0JvO-o_BC7-I`(dYz;tag z_5Dk_rjKyyT-9sOnZPHGki=aT;y>Ffin)F@TG$3;QsbT>hgm+$#W?y|GIPRma5u9H zLdXqkWW;n-zT(H7q?Y;w9e`e@7_02*D@HPnUP)FBcwT1gW?H9MC=NUOA#y9W#n9x6 z@SaL^Cg zNLj&2HZK6tcG|ER*Xl|l{X(g6VurZ9e;-PDQfk zI`=sSJ(%LP(%sT`LN)SEa*3@3^E*zd3l4yOXWGw}CaVO^SkW%3aWCPEu{VYISv-;G zvRe~5f+`gmQux5sB9UHYk>OPOBR&KBHGBBx1F@ zvvrz>sy0PMAU-Os$2$^UQvGbAg1L`Detds!o%;jOa54MxbT)BUuGmu{y7d9D+xQ8W zvC4k@UjJ+ByBU`3F3FaYm^`8G?%Qtu?mfzXn3}H=274f zXDzF-ssabEhq(@9E<`NQWd63h(_&n>({Xk`6Fpe0K7l>-__`VT+tB*0$7lR=k%D<( zH}#Xv7Tj^Cz~-d-!-*&VfML$ zM&-Nw@G6_Qo(0sFVor=;G+FQ{|K zmmd=wHv2w&nyZT2QrXI9_~WgX@AClq#F~A;iMmp13_L{oCxS!&!Le~t8WH52*T6`x z=E=X`;9Rw5voICMK5b9>c7#n3a~QFCXY(B5vANpuGA+{>B{N;n{NA1%Cjx}rS8IAF zmmAhsn*!hcp|PywZj%_Da1k(l`VpJ1GuJwsbo`tKi$A<7ERtfCcE4yKf6%{X;)N1p zS^xM)CY}6PMTEYPRZaPw{Oa9xjYl%h zYku<%72hu!4Q>#arRnQotf!?uspM?qeGAPt&zeqjux$|XX2rhd{rm;3YW?TM=-K;i zpke3v)u24YtI!qjAcp=lB45F~t>trrLHqhlILSK?bGKZEL_M9w-W15V*sx;Ax>d-M zyxBPacV(D{NICqnfa#8Ll(8ld=|TN%E=@T(V^6Q5Jbj+|W0?#UTq2*n#o6&PMc?dJ zVmhj~UkHCdiv9t(P~6u_VN!;teHHxvTYSDYB?s6)Z&Asi-W}Nw;CQl z;3L+0*_4#=3qR4SdXcL706g9oeE{y1-|v!AcbNQQugm{CiJR#yg12@u?piL9oaF3A zA5zhl!jozj@?9B}t=5H z(+j5Atk+3dI1lIT|CnGF2V=4-)VehXjgZRGtPZo}*-&`HKmD1>Pg)TS#tpS#xQamo z=Oxfz8~|CAkgZ+r{_R=rc$kZh#qLQ`-w1X0Aaqjh8><7U>`tAfadmXTr*l6IA}#k4 zM0=f0;Szxj%zA{lHcsTkwd@&cCqT-K$e#dC)8d_HH6R}H36?@9EFG^%&j+9a*Di^t zcj!jW2YEV{#fzo(5n%%^UYzwy20vCs&FVA|no~CSM-bHjCDHd-3iz{uR0M5GstCym z3WaGdXk-sKu73tY$j+3vu|_`AKn&!l2a_M^p@Q@U^EE)vQJ4jJXB-%6{(ye+rtt1Y zmlUBxRlU_N#6cDuLSEt9B$ep0qX*s;+ZLit0uBz$&B2;4g9q7iv-9pCwQ#eR6E~6! z)kq>6hUNZadE`3S+x)EfAw=0)j$8;Z*(D5Zn~fVi7Dz7EUXi{nli3cJJGN{FTUO^l znM)iDKqi#~wusAHZsb!9j6hLAt%K~_HG7z3iDDjau?YqlD~zknEx_N8{;Mp zWa9Vku{~Rx5@g^vgag-v~}6H7Qc`l!PNTau`s zIpT^B0DDbv=EC{NNbc%*QfM4|_hqm1>MTum`2cSINPIpw46&gTf6WM#x4H2PFO!p;;II@GlBJ z)ItjGWiFQMOOOkl5bd=o^z6lOpp_6c^iy1N6wZLNA`Zb)A1|s7sA@jZX1=9LdV0L* zMToLiHLC;_O?keI@B@HnXUF>b%hG%D+DUUDZU}{KxnUCgZ?%$)TKb+fA(XK(kC# zd4%k<`dVe*yemrM0)J)Ua`H;7RA&_0T_GQ(hRWJEZ@_1B!Yg;*8i@-XJFv!<%rbg3$$3nm2V zxC{D&F_$~b_brGmvgkzlkr60W1WeP+uHbBpY|q#XgzKCfPumQSn@$1 zjx&7w&5)v%bQFx$j$oQ?e7vAqJq53QW^A?Y>%d8ZmOfcFS=3i@XOkgRO)t}?+o9X{ zK=wOpipSj$l6G{Zn(w^+Gj45;GohI!VSE@^y+)6tV2BR2BCFKtQH@s&>F|zAQ zg5OY45h;R>A-*d`L#r0m4<$&b_=vf&%$%Ut^0-Y*|Az5_zD$E^VO_ir0FM4T>A5=C z^@g!Z3(oY=N|m^%W=ny*HvF_(h6Pm$c9-kxXb|w*;xSyCS+~}2LM<{@$2oA`&1uwR zHIoeEsTEbC1ai58T_~!Ei0vEQ(YF}S*Aye{&32#3Z+{gd1}H-Tug3#8^*-iSn0)XO zgA!v@@y2yzAAnLDdgcC4*F!4cPkDYq3}-A~0=$kJQS#7s#@X4P>b{gC^f%|;cRe7X zujWdBP%P0m_vh*0sc1H7N@^t2V$BFy_O+BYnr)?gxKQF~k}!O`fx082F z-h-(|qOsCcLr4q>YrR~kDZ1>&SepVpnJnD(K~Xt zdY(i}{@DwmjKxQvZZ?E_u0mNgKA&B8pAys4WYLP&%HpJAYWkI;Yz9n|~S9{?=BV-a4dvzrXR=-{)K zR20Fq;qtc6+NbxUGZ^2;Sj{+#uMC@zjp+vBOWu7$kzvW#Wg<`K>ovt5q3!{hK5O0D zqS_@vy=aldx8Di8SrZFBlkuWW!t>J;+RzS9$(zz9P)a&F2;v7QV>N{M;wWwR-tUgr9 zBbP5hk0Egrp+pOENVkaSB&n-CU9N9I68#+0-%YfKVwuQv79kK$dtUCEkzC!NL=|m5 zn%0eeu4vW099+Q%=+Jml+U>!dWwE`MfhiHmJx9(L1@U7uARO0 zyv+Qz9p!Db>7FppyEOVOJ7Xu%`gN|AJyxvIC$kO9t9UQik8`=$q1$_>f7-id#&#EN zx`l!kr>Qtgwp~Efc8Ss$EN=RftB0x6sDprd5Bj!5gJP`dTv$M z2c=Xg<&p=ZJKioj(dKKo(EVn^$rni`+*3Zr<9+Z#|BCYI{_Sl286|E_A11$a*5Ath z$bZ*#7ZsJb+h1SH(GbxZoIVp^{0g2!WqGE14Ur#!rSey%qKPE=r2X)Uh~R%p;EGz8 zV)-!$H$#KOxd3`nZ@NnFfJ{4;o1nClK|(8`8aro(0Xn(Dh~V~qy+k>UcKnQ{Ch zs4Rx@)tB$v*EjbuS^07@40*8)+8sZwptHW%6Z&(c%DFsiPL54d@PT8>sTi~_EAz+|Xn zU~zxPV@rtKELCuiA}E8LF+ogFeZTuv&2DYYm+Q<3{`Mu+KH0wWy`lc~G&8-CJdBXF z!SP7Idq8PAr&{0B!tvKQ*nC|7=(ZB)$|UQI!Ki#h9ep5YC;)3UKE#Fn18~A!=j5En$n^`Z z#(GIgg%7VH8A8D9doxIr1XtY$spAzpfvy9!`P17|?cF713rgtC+MUi+x0vwbG(57X zD!W0epuD6I5xIQ&Cz%foxU;y>zas3DM+qt-rT>`_5|kK}eOHOgw-@7b^kCyHE3phA zDcrYqDNY-!tcI53l)a}negCz=qqN_R7bXKSz;k?wNhs8%z3j1ZgTAyyXH~j7q}TIY z`0mG}@niNc_hZH)`xec{A;db1FbC_!6x%L*mtc&h@)pFa)p$V?(&Kpje*+FUH5i3# zJ|0y9peSO3tBg71WG|fc zGAHa>+R^HsLE2-R-*+OUpbtPF;m`T=nf(bF zF$V=sL!5-4w(KF@?X9}@v2fg0hT-O2hypG~{`PoF4T*F{ct6^puMABCpt=9%#qo0q zS@*F-W%c%P}EeVi#X&?C#|o@=jeW6P5F`pHVe7wsK%2d&}! zV4{EQ!C|0dfaIT-nAM-JCP9?ump{?%g*dv@56hVCt9tcp$MS55W*HjScg@{(5Pt~c z^-fgRC>Pn#L1pJ+x5g;e%7$BuQ1!r^LFa=@NqZDEbN{!Yz5<=;eg^3zY?IFb`Z?m} z#l-hc%k4J@+4KUZYnYvA=37+4Yd@wuwW-Fb@16MXf1L80paTUner6k1j zK)krR#%#y!p>$Sga=9?TsM4>qN#wG+KA3c`e0de+7}^YP213M+BIlEAMr@9$?YvL< zdhnL`inxoZ&cZ>kwc7ik*=h!D#SAA{mARJJ)Ms=SjuE%-wEnZb0XAAok& zY0wQ!_oh&aE#(2yG|~rv0th*j1pTe5KR3xp_|NkvO1vgY zji&FKW9bw9iZ_+5jW71&^2CA%g|bPhP7j~+*83*rg`PYq6vYfGD|>;etH{5uYRKmh zA%^JWrl_9cI%8C}F=T)aquCtFDoi}LnIN75dkAGdW}UykGX}01Dh;$57{PeH6ps~) zH9T;(ZW}OR`S_ja(;_j*dVueLnf^n~sW2ub$FSpFmk8D_YH(aH1kTe?Hrh0IVC>0+ zeNA;D9o>2Q-lTV#GD}T`s?TN7vjNnwmIzE=S4xa|x-GJ?D{Hpj(zUB+9HKOdQ;^liohBIQCR3!9|8sW61FzmJFmRD(0;W6{qH>hM73$9Z4uO(a6j@NY19ylQmy z>u5Gr` zBW49NGUVj0iR})UQe6@K=7h@uG)`}4lL98c zyZ1c5o00w=rgAut+DDau;w$YckaUddTdkwbZ|pkY$1m+IY8uFx^Pmupo9g;qECp}y zwzJZ$#lJ#)t0sfT+r5xZi-}+p%=?*tSP=<3MT1C_5hU#9yx(uKUK||XW}hA4#jo7E zgys2lIbc12xbKxtI~yokj^fuyN$OSD%8E(cC^I80R=pd;l;S!D8W7`i!E z94g<~tF$k07fKH2rrKcNuokAU25AeMB@(8H%?cpTO>Mn*PB)%M+xd9e5%=c_`dhJx z>>X6+v28_10g&kB8Gi}mcy0AxT``)Ups(ihhtCX=d>=+)VXWu*QSu^jc~NpgPj=Ki zP37ztZe(5ew$~R`&CvN)adVNIW4d#` zgxiTvaP)aGue5Q$*nx64jvs6}9q>0ZAlH+7)*(wAdbJjOzcKd%X=CPQMZ#szD_bc# z(B0g;^2)0kZIb46NYe<;QySTe#SHAWjl=c!Pgg;#Fr#6RyNqs_$}2|-{Mx@(J^+T{ z_Gh;*Rm@;Ca!PKKNBtV6hUg)dqLOZ^`Z~Z*%HX>IuR?S5GUm4W06Gmkyo%Q!fs^wP zvh+Wey;PJT8i?O&KyH=c;IlnHhP~E??`vWRm4&Nut;?uYkdnEQXem%pu5*moS#GQ7 z5-GyYt_ghO)`#mnHU+kR?t6=0BKjgB4#iyz_6q>9>;>(zQa$Vmtbe_#zeAoMvhON9 zlD=uso00%`s&l&gb*cU~u~PEf@a64yh6rbt)gqA_1cd&$ZuL}=_O2lM0LXzwFpS86 z_3jOok!Cs@#=-sEyvHPepEczlRoG&QiZ}w5J9(AcfE}32s0GEI@%igXG;qH~1Mel$ zb~zRoj-mN%dyjwOjLpAD_+7L)4q>ay>0I}2VQXxQ^!(U-Bxg95Wr;Hj^qg3)8e`~Z zhLirKT&q%G3Nc8OGC-5m=R^e&6dwzwY1Uaj%j+IVrAj4`d?)6%n<=otvLzlhORm^C z3D%+tZeJ=bx}ql+7CxSm9{2#b#8Tdt-Sp69J@m2r_F|y4eDQVHJGkg=Z6p2NrW1%` zRu@UC8qpm_Hu|8(eSHy#wOqunu_xomE+Kh<6E{Q@f+)(nAC@5>au#P(gv9LTv3X|L z=zc&flVd>Ra?g!=b>MZPAL40n+6EZJX4B38z4Zrm5UoM!0|5U8x8p@*HKnxE;8o{) zdx5uSp?*d2vPX>Gc!>x8^~OUDE|FQ<&R;x#my0#KFDc?^OB&CtTjM}x+!M!R$ffN4 zYmL2M>q*weznYlN#`78*e(|uqc9AaJl?}0|S&>c%X2De;a$?)+RAS-rR_2+MQk#Vv zy60#AI{R^ahKo7t?c=P+FZW`K73uS+N#`;2bo)h@Pdx&kFo@XUI9|=j~3mVJnS@uV1$JknYd^E>|HYuqt^Ptk0 z*4#QrD9!O@DUS>p7wLbNyH~WVHD+}y#PDGU*@1=cHQlC!LFelTBnCxB@ z?6_sNCS}N6KfPh+aQt0iLtqrX(|TYkRuk*I7hfo&CLy$(P|@%%wx^scpfUE&~w~*XPKn3W{ibh zOnI%fRqE_-)@v(z96av7@U zC~c%;Rzl;H*zDZOwO8eH0Y#)P8^1dH;b`X}2TasAcs>#9t&+cbTYvfRb6jyTiOH{3 z@y|D*$()*1aIkg^nAJF%va) z;~VNM{iRXcK6PORYLPZ@c&@P8=kA4ro@#1r3~%O&{W<$Ba@1UiHs9lA z4&|S1$*l-ZMfnbLm_WWJC~7b#@yTfsaeZP5(>@lj!cCccMtNpc(TUH1 zo-z)6M>U^fx4yQemChcd1j6;ifm)W9DoZ-d8-B>kH*C!cYOP7I$~PnqYD6rDY%;GnoC!R_`bhP;eB zrjJl0ldDI~JkneB@&au7IgJRUdSRY7Ew0gXmA$Sg96vxHqeM@Y(vHRFSkn#2h$RGonkZ)%6=s?UiF0sr*TiVk z4!89qDNky}nzTU1S0_y`8X2bd)+;TU5JaVe49Jn|+231=ZI!`I$@zS`s4_*?k{8@% zStT4}!Tc=*I(EAzQ!niyLjih}rK77}&X`-WM_l~iFFaZCWf?K8)xx)2X`3r7{yGy* z$HKD$u}_&wd*YXzi&G9B#H-(VO&ON(jh%p0Wm_}v^&R82(buuy&rEBCJi@nsK*`u8 zl^D4BxCB4Q1dBVXPZm~2j;#mzN3@fh{Lfi4{SoMZ3uK-etzKdf?&0I@K)#Rbe6R(ZoI6wSwm_m zhs%ZG-^Xuj1peSH>=!+s;_3I{-9ZYMk=%>e0|UMD^8qGBfiuIU3fs&PT=2h9HI1!F z5+Xkv0gWy`_8A}e4Bemhc8IaD}Ft8JlC)o;k$d*h|!JBChWVB z9z={^L{>i^f0aHJI>@X1+k(p|AEr_(!~2Byyj>vgwz*f4XN00RMQ$W1&o*$#$cn|H z;EP!Rp~XZ9%ylo({RO2O*-j zM1&|_B0RXtepZEEA8luF+r?k^R%aA!+*f!(oG(Ik-~7{fpK(-_1~}_)EU0{pZq|Kc1nqcMx62aW3-Bs z2U*ce7$m5>};P z5&Ktu%WSNX`K`L9DLy;UDNwjDjZ3+&ea=RVq@{2*FX##J4nleIouQRIixR)Nr2*Pm zje=9-y^fdDp=hEx^(eOmMmOETe#K4**AjZ$2khuzVLXCIbPM(F)=wgMKE~?)cvNh7 zq(Cx0PhGF8{eJb!Swt_@GxISMG*@rcSoLd!x*%yYGV-aP>YGpKCpRc385`S``X+^W zF5~T!$OtRlG{Ix89nVI_o=Ht2I-x=hf5*k-3PMF7J`vnvK;3=usK8Zt?flUgC&@_K z6@Z!DllgXq1?l?IO4Ug^>~~UY&vbwPKJ#yuYvu4~LJoP-LZ%D{Bqpp=mNx`9%d#-7 zgJL*GG{?3~BOJxLqtmk%jeXid$NbNk_(?OA7Lw-mlb(tt3ugsfBzN%ZRU^ID-)ioW zA@7E`X1jmy9xg+qVj2yg9XKcIzz9Et(NYl(zOFpx4*)I*jVxVbveI7sx(2G>(gRow zPG@{B`E3Gw=4!ON;7XiZyP-DgZF_4c%n^^kYlRo9>}(UngIb5XwVsv*f~KKk`N2W) zxx%J1T7g$(##fwrK<*&sluW1}>wO{=*)HeS#5moo6ZlL;D;cWIMp;flzS*jpyUOip z>%q=i3g678Fi9d~YC6xxzFZ+hg^3IYF?HpgD_T$ECbw;ZA~9`={mLu%9hN*K-Jq6G z-1^qS7B}>4dFH(%C~Lz`qHdlSGJ@6MfcSdJc2!tBjnmzh-gWg*@B8*L%QYOgMZ(H@ zP)afbyh}B2EHllQRr>H$bscqS9G)zWq6OZxSO%ez-C&%nk63GBb8Ma}Nr2YlaG5seGCw zo!*Gb4uWQ|GQ$M3GncTGbZ;{CTsPh^JNbpWaN6o=arFIk^Pl)+2|bObhIq@dS4 z1Ga`oO4qFA9xzyZSAvC&-&GCN+POVbFO3XZ3g&!VcM??%O&x90Biyrf=4hISb_FsB z@^10fd~1ig<5Os^yN0Vn?Z5a+(8JG88_x8-!?ch<{?p?QR%UPP7Y+6Z`&k``x&A6 z6{gf1$!yX3#A0Yles$W5h&c#Hy8dX7LjhZj7Sftz6fW2ASeE?h&o|JhkEVYBD_VXR&_bQ*EG=u7`spb05yHws*=Dlr zwk;pCNV>ILCNry{ok+hcrO_t7tk5M<2hFBsnOKoml3!GJ#GPO9GDcE4ohE14^9G)V!}iAsxf| zyziqfunW##@+MECOU!vP?k(T=L|T)eNxg$S(|6AME>~m{dKBC1W*ffcixnO{viGl_ zOF4$lcYqyC&Dz)aTMt*UZNff(TV9V9`0KMUx^GQ_Kt6c$!awY$ZJqAAmYL(w~x^N3;|J@AVI(Q_XjF zj&lglVsvfJBi|%QGnnZG&%hj?vS%NNX=>Pi$!&d7vqQ6Wi;v7v2B6YYMV%;Lw3*xFeE`Bfnw2YGX`g z_IlVFsW-5NBfx1N3_CCDV-tP%<3M>0~g9Yq~eTUQugJWfAXed?#!&AuYa=udHd`+s;({e zh3h4T0zJ3uE2E&Cg=f!Uc(v@4H!G_uE#r^b)+DAVc2O&(@V^AUq-ZAlPKqNJb7ZIA z7AwXaukyQr;>}CfdeHG8oULYLHuT4Z^eC;$j3(&6LE_K~zG%7`Br^(Q5=%%nt!Ojb z1r!ZAP!PE#Z^f?1$-6LZuxfoFX_#8MCgyNJqy(?2Q&_7>%oj@&mJw;Q%6m`I@&WF7 z%K$Z2JV{^zu5ZZME}|aw@yIT`WLGhz)q>KbRM`#c$C0IKi>3Mkb{xxEDfkHA*`V4*3qrOEOlHLn zX5zK(Vx}%*CS)5qPT0p7daGDRIh6Py^YlTA%jv1T6_g5#^L9lmtNrn8v^OGUYPLC9 z;!;1Iv1w40)v7bo73V4|U_H@?wNijBAcHnW;e**V?BFlsyk+t}wr%mbhL-8#qh8Ci zH#x~Y0SFgq3HCl0NcXsP4j_m7Rt`lfo12Gz&wQO}|D>*iE`uu%7oqoD=DU&lY4DJT ze;#loW7FflOr}pLyzo%ZKp>@CvN7xi1*bOasWg9BS%`AETvggF&`S+%y{>{E8x@|9 zk4x19B|%82xZs#c3GPHGlOHZx)THZFe?3vog+7IZEg%!))mYd+P_=jm-|Rc*^1p-( zJ2XTOquWOL6IXdVp>R?h9;A46tVhe$Gma3eFlx6eAg(lqdK(BbQ zuFi`wG49wecXYlyu{Kuyu5%$?9OHzvPcO6dYsPoyP|N#SOK^lqLC5J%ZTXgd~susiV~v4A*Fru9~9A`$>NA8sfHWMikbZ z*wjkRJt0(fIreaOnh^ZDD{h8=#5?Y!DV=CaQ&C%4$X7<$xmdZmq+iKf zh|#x4;<6FzU1-%(sTu>zq#$D7- zyOYY>QL``4Itl6eYNnu-UX%p8I99>p3!=8gj#gcc9WSZR8Izu%H5oY+?#_JFDuL4S zMmxIjYs@$^`wpM1`0X9?^PHPufmNBQC-9$VWDO;FM$3?YOIRz-G$!xjzN9c@GbO&^ z-n|C3{HWwuh^mhaUjym{=&QKaoU(rDAz8olwGh3!Y>Wx%C}=&=Q>cTR*`+&r$g4t` zQJx@KJIORA&0qOzGK+f_p5j_xYkbHIB|XXN49b4Gmjk(<(2!aHd5(e2AvaPm&hHzY zkc%;EA#d96{De<)v-!-}B6hb4rmC?98tK-L0o$n8(+=EM%)AK}LX6oaS-0KI zw~Ws5txV_{Uv2WgYDcDXN?$6gt^7OKs-g~^r^_Q=3gfW;Yv#fb+z<`T;xbh~wp3-$ z>xx1#xVAC8&lL`!ir+{x1UEL`E_wH+`ESlFuX`pNNo@s(5t)T_l~@EXCkfc}Gcvnq zx9Q6he!CV71>4?}R`5OcfwSGu3C}DPFxykPw)A{SQf$9L`dP!ev~tT1T$gq)sOtZO z3S9q}k(X3!5f@M(U1?%jaFYv-b53s_lSBK2w>6OS53(@vK&{m_3Ic9&2Imy>XgWRJ zQGt0)sKiumXi(5cHGaG{mbueSI4r?Tv2Dl|S!P&TibOm|Ym}99_c{?%kB_+8u=ind8Qc8n_yv zlH+NlB0<(meFvT6`Lv7QdZBH{BSqA{UVI2 zf2^vVC8&`t7v+!>Wyh)42ESi3XfG?-1N|5nov+u7?>}77ceQV+uw9M}`0d}pEDfvdPoJRat_HwXM_?xW#So%p z#bEO-j#eQrTaLkU4XYT2a{VVulIu2wEJ-~s*urr-EBRhkO+giwURM;l($B`q4C$Mp ztnzhk>qu7PG2lGeyE9+A$@~S^S1zeS^9(ass2Ik=SHs!O zS=aog`i4+bAY1LNv$Q4s4YI`^Zj~9&^5)zO_je`NkOUiR!+&s3S6-uP50iNaK^6+58ueze^`93bu2dV)5v3KRg=APKtpO}q7~?>=ed~lk z3=qpk%ZzsmLMjeX0teh)pU1&=q?NUP)ersl3{#Ir8fla+iq_k9JDL00l#3(`K5^k$ zd#-)`wJkKtuT#X>dzcBWJD+)hpRQR}OdM=R%F{_^iK}T$3~@nxoAW-qj+T_ia7W^u z2hh_%+qW9A&H-!+z*&}!&W><>f@l}ClllY#jV0&`Z$i!G^%zk`s7{>~sofaE?%LD5 ztBtUV|(ye#5q=W(kpxbpmJ9?Wjy_2+S{$x6JT=T#UuC#h)Q3wEKW4svKvrPH#bLiaqT`h3XR{NNyOr>kEi#Nd*a zD=dfty(J#E8=#kA4FeH|9g{I1-%KSs2!CJrndW!q+@`y^uV}2|?k}-gASg=da)jjv zm!Sc>n_Xiu++%)$?3nLRGXL_6a&UQ}`rRnclh7X)y|aogGR@HL#eW}1Yr_XKbDcch zOJ}+`IKZ?%o*=e8-f@YbzbYyt-<8=RNw2tXugc6)GYDH3Rujq-WOB%os{;Yn5m{HQ{E3r;cnv8Iebo^o1!WB+VK;chNvt*xH_@|95e>4$}#kcE3Z5=yYG= zq>({8MK1E^D#r4~bH@tOZA%DPT+{I<{s!Z=;?>~PU)xlbB0=qM{%<)+F-MVzpnXQD zIkJiAyfPQJx9I>m^p;HL(Kgy+`UEYK@NMC(6+MM#yX2(=1XBi_mO{_se4Yh%>$nNR zyV2<|{M{6qf^^ERx4E|4ol>fB3-gfhLSEQ{>URQ=z*_me_gQWX>z`5O;e0PEBG~>D`%XD3?qp997HzQAOFHeM=)99^D(tG|L`Nm(WNp0gL z#jBF--wd`?@vc#Hkv7qONk|1RPso7GDVeFFJ|AmfS|dmI{iGm_F<^E{$=(TDw`)U* zsc9^j%VGm~!OB2kPqq76#=4y8+~23?HKv-u4@)V{0{)2KwrNyARm8f zYc^&nOD+K(l<#($%y%nv&c_k-AUyPspr&CwfVh5N)RWCrx#L?rv<_upXW%eFC~g>A?`pV`&X(PN5cOA4ki3O?fpMc(=?%{+*l*X@*;

u%dGA!n_b|{>6a}v{w2cnySG-#tBwXCw9?F9`sh;uJ9wzOd3^dD~&t*N1fgHp^ z85qkqJxo1+TJ#fQcxB-}%G>w4&XT%yn=`Z#UrfS79y^sM)~Qd#p5kri;5F&cl+UEw z-GqlN*CVPN84s`~hxIAIxiFK|Bs6rmY21EJvcukxxG3Fe!5-A2;|qLMuyDV_#TMC+ zmmMk(b)$exmRjlwBM9d_`_b~bhCs+T_og;dt)J^pdQ`TvTgY`X#w6?)g6Ggv5lMsi}zc^OD2R4_Y?j@+*0iMW>`z^eiKe+Gs*t| zHbce-u&DBxH0oNV-R7X`tN7yp6M`#>}nbt7J(36bPd7xx)2pk?MGfgF| z=^{FZMhp%!$mCPi^pN3p_LJfN0EXTi>-%$TOe57KyMyDk3GRqKVGEF>Ka^+Eq1(W0 zEB)Dg?WNhME>s9WRbF_;K9$Yqd+K_gza8$ksozP+R(RaxFRmz^Z&&1Js^X$?8Zw#>#ZoAHNhcwb}SZk2DdG|M4)n3nGLFbs~^joko4*V zA8th?$;!mSHLW=%KEp`094z2_^qQ|bXo1lZt)yJ9^!UAQXFzk50ckCn^-wkW5*eiKLttQ&KjrHvaqN3`sfu7~5(`D|x14;1`%JsEa z0P5%@H@U7jbk}^}FUh!O&M*n527_PHrGjg#JBS_dV|HW5)}k;&NIQ};SfUrE9w+Ni zwv(qen{y1$a}nwQ^$-uPE6?8$wDG0yOXTUp7wTXJIW=o|W#iu5*n2)(ZCgXsb^U7N zhrGIerHy?NLF_7+@e6*zyLX-DuGTATCzIs2i08{6Q}0cO6s?`sK2-^v&q=KZl+$jb zqbHAAJRS!$UArs7I(uU|GRb{YHCMdi{OtG0rK{TmCA-aCjV6W2e9S z){ZlSNhN`>ag0=#!`EoH{iCVJe$^Vz54fpEhq1i7_S2wbuQ;Z6NxZI|b2zqH2BRDB$OdI2b>Q|SoVadSa6|6 zdXIWZ1Q9`OB$2$y9Fc&3FW!W=t~!W9!>8r;%_Qi*BJ=*Z{#BIU`$JX#0H&YHvXV+0 zZ0`ibMc1Fq0Xzy(@wbQrJc!6oBAq|5nzF7QR~YY_(b#vyf@N+hKC?a4wiL=r!{LfZzx#>?&u)xVzgpT( zB2~riqoC{h27@%RTwC7Qg)8#o1XE{<4mVz#r?s7&v(0Wmcj@l6aHoc5HpsKiJ#pHd zAn^YHQZbZ?Q9vAmf~YxF(zDVEmfe>S>7EbR?QO56NbfrS{CgAJ)g=2vTvhVUohuA_ z4%OOY!;8jpN}xYPp-17Qk}Ee*C4B+e)J-mee z&y=9-PHVJn_65ubp&8@$`Ef=~v2V-ya>>>Qr%2|X^`$?g7ZZPDb@BmQR~hyOl-X>( zd^-<=>Sh=juF#Le5hy43VZDgOX!vMilzfV(x8Q$$gGqp_cUwx zH@ssVQb7>^0P3#1gJE4U5s9P#3}H`dFnD(`IgrldIp(4Ix1=I!jIk}+yJ9a6k%5)tem}e_8RH(>hirIQ`hwwFX@p7v<+I+U9#h=v zOk--~2zGv@b9OD^l^#|&3O!9pfA$~Zh>xy4wQ|wpA(V__k=*J!)xF|f*u*1P$SaZ0 z71v%3_|>&;d=kEwcwe>N;kV3I_6Ox1up2*4^H5`i;{J=a zcU8=mmpVLlS62~aYx&|*8cV3C%ZjqsAtqrOyMV@lKPUk-L72F%wQQo$2+wP4) zq*xoSG85$o-xSrYPa|oT))w)phS37Fsy{jP$I_diVSjTCf)N;y{LlT-LxK`9b82a{ z?6fOA#c2Ab=()DjnU&`jqogp;V_ipKy!;evFqZn##uQ@`N=N$F9_m&wS=q)QD{&JH zWskKn8K7%cgjuO0jIT9cqSqTCMa*}CyHi&2Bf+a%cS$!80YM}{<(T~kJ?oh_4epVv zZdE7Pux>S{V!`Bvcq=j}-Frr4~gTyY!CG|bWzWEB;;v%G0utMIE@uxbJ^&>498gu2P^kcu>+M}AS*c~c zoVR^JFcf!V+K!gSLub;ixn52U6Y&yDY?iQwMI4-Z*5I+aRWr)n5sv*wy(E^cu7^*< z+>WF?XWF%O1KK#61C;Ivq|$uS7e&C$A8UEirYU)h@q(pQ{Tpt%uSh@knUZVg6~ zDP4*@4$=9ad{Glh-?fPL;)ya!l9eh$k=)XBcNc+}6CQdhV8+oIVgL!_qqN0yT zGc@e%2KK#ubrqj!h(88rDK_k^1(fX;PbbU8`*yGq1s_ZToxco0tT4(#$fj zj(Uh5{i=PnwLKS4*cy~Z;uy%z5RgBmQ#)5h-8z=K`*UdN6Ka};!j|&jkFAwJ#H_`VbTja9Q2B%BH25bUZi5mezM_IbRJDlwM{d7=zD4{8(Ot!U?03}FU);|AM~mW zZQRn=D~rt#TBCSIP8Cfx&8OQNgD*x{dKz*OhC_$P8Kja(128S~WBJj*tolHN^%KX_ z7^N6E{{U(t+Z{de&uUT!r)>755?VYO);Q0vt!#`j$plsq3gn8i(pWy3tp)B61lGX> z@N0aI!jecGy9$_iV8MJwgE{SiQ37%^nv?i+;XFgM7|ubaKFPeUskTD?V@P=D;GguQ zo>i<$$X}vIAo2dRI{;q!Vr-PaBk4y*Exg--jFHbh@j@a~bfL_wkT^XjC(|@38bFC0 zKy?ldXfmW{si5jt>_PRTBDc6$b1ncU<;^6K9}TI0(pt(}i_iM4{Oc(suC&u2n02+J zV?3THb7;DG0g}-;@5L>9JHIceN`uqAWN}{w>GLD!zcdG=6#Ycn+BK2oVHx(LMw1L- zNwr24L^wD^_`LmDPO!$J^F zvi|_@QKX7dKoFt&nm!u{yt326nfFz#7-a+ja-bdo z>Z9Y2%YKCls*DyqcyG@hyph0tJXT#mb zI#;tEb4rJ@Tau55B0>a7&!`k?+gboR<4&?aHapXNnw7f0&36)k{vpi`bqgDTm$+5w zA1Mt_K|PeC_HCoh)=?xN@(&oH$)?zW^Fo6?v)+-up=kzuxslF28=6WruAmj;Rvw3{ zmjkevlAR5env`ioe{t(ZNn>X^^r?iXImsM~YE4=v#BXd##{(jg4QrvhclZl&V4C5^kfD&wRcPI;*D)~A@^e8Rq>?T$M~|>7tGK!NPt)s+G2yT_RU|nmyD`h6({P|$=`|F=9_it#zMUJ#Z))hvhRV+SFW)U~i~$f zwna?53WCaguYT7k%u+IN4m0}ITjFM~ZK`hWn`u133gMr=TRAm7@J9YSdpo$>s|6Sw zcI`#vGU5Se!fHZ7S*+Y$K)ysT7fhs*fb$p!fk-2s(m4E*L~<1%yknF4&}Oxo`dh1& zmM~&-g=WEUJ*##)Y}&QtX&gc%$Ii#FsyamwwDZ6%7T3&@PzHJA(b{#SE`SSbqz970 zbDDQ^qV3>gi=yJ-j2Cgh`%_D9tHrrv5|jY?aZ?O&RXRWxTxo_$WMc%VgYxBhKYDGs z)8|MF#q$Lj$E`X?yKha;Rlv+-^O|svRfs7B?d^OSm2Xo9#l5nE*|taWAbs* zX-1aw$E^VvAiRJclSf@!M4F6}+ukvW)UjYO(nq19ba~`!)s+ucBp*FN{UQZYy0>I* zHg2D61RU;Y8t1&6n4&W`L9M3S+q%+{Mn=c>{|a&z;2Xd>fC$O6&F+|nN|Nu?&&W(LwT7#_K#@?Bg?KY1$=?Loll%^b0Q;L9Ex-A{Tz zscl+@8=HgE7|+^__y<-|GZ@tOZuqS&%)-;ifqDn=5!}QH_A{{SkBpSOh*L2z!BrAw*Zh2<@#<7ld^6lxP8b5G*!t7Va(P%KNg4To_Vuoz{{Za&0O8*M0Q^5&?#+d)0jxt0 zT=Cq?fXoNXq<;yhx?s-Ki*0hui3X)@=fa_79n^Z$RH36{q++ac{t*W(-a$?v*;^bWay_JhP9_LGvnz@c}Xei zN4jA7=d~h~<4^z-fYqtlmUbYX4|*ku^OcFo%^)nMDo-0bL^^TWg&e>Kjn5<=MI-Y} zHt6bkBef$p3}os&W|)N%RrUB%@e4`t?|*KcS691+5iXvwM$Wl*Jz2t^PfA-ajXFF# z$63{1Pm*T6bBQ{5``0)~(py~%m<~brr>yKLITR|beF;3h@ zayodY_P)F}%Wn5K5p;Oiij^NWguwO2z=Rj45 z{{R!Pr6J3!7d<)b1#L{l4@#b&dOQk1BH}VEnQ|GAas~x22dD#zO>Yld^51$^LaTJI zByvxsI%-9egMrRzO|#p_c9LAeW{7u>s~M!M_-|}h)tSx|)X22SP1OGY6LRt_5!=W7 zF-AB7lb1Qc!4xh)Do5);-00` znD4EEil7$Zqg7IIo<3H^JXvZ96nE4#Wqv$T3(>zV{qYwLD6wmQ7z^D6d?-LHG zwr|ibF`&)U}o`0=K!tVh< zU`6IYy$rn8bPLN+bi0^klRbmv;<-oh3x6E@+S=V15Q&pjo}a#T%So1NJw{lVb^w~q z!LLoY=Z5a?S9`wBPpu|=uH{(mDa>!E#|I`0nS%fT83wRUtB*4zR*D6m4nA!5qhH8q z0yG?hocqxtw zI^?IySr`IpUAXig1GN341ooEK_j;_6u1TD)Tb}q)zyhKBbVX^Z-a&5>h9J2Smd-fs zPb|Uh6sgC6i*ZXW^!ariW#lY;h>)}6wrS?)RJYRh_eGPRGDiH~)XAr6cQ*Par6*Pt zf~qmvn(n9b*+RHfKs|f=)Fb5CSIh{Yl&)naX{PFtkEx<1FXnk;^B=8gq>WbsFnx1H zyYxrq5IURk{VM*D)oXIdsEUO0eza|c>)FgYNo76pNEAryT0%41wJ8h|E`Xr>(zP12 z{cw<|=^*)Y@K4s8ZKa;aQcGoo7z>QB9q75P8MHQTu2AGtlv;^~&e0WAtm+x^IXuvk zaE!)nf(o`bP0GKAb_D{dF_37F3n9|d!g%jx#viKy_o6pW2Znll-6VX3m zwRk+Z-Z?Y!`U7Ya!;Y*OC zo^LD4fOPwj+}1+Z3DjG!pnh!7WAkE^Gyt|eK+O)~=Jr$xHbVEtFB5!#yhb!V{gw1d_ep*_>ZRDSn8c?aysF?xA}M< znOoYck=0;!sV2=S$B2K2U3>8Fd82Rrv9I~UHpG(10+^c~o}BYl4~d>FZ$A?5ZLRkn zwLR61m;8%c`TJmL-jV>gqW3p+<4ksmUFVJ5XItKDgxPnz2ridB%JFMJ>~{ zeOpO}cr?vQ=Gqy@?_!QZ75@NAN7I}f6Is}BPt?*N5Tmtpui^W`{{Rj5=GWA2_Z7{% z>Rm4ty{xihpyQV{&YSy2w%gm%{{TU>oo8EFjA4{uV(w^~`P~A_(g^~(hfy`ut;kg#)l+ScE+^$scLKbsE=y@`w1OpE z7U%6mX|4YN5)gMjwQTs;;oYXd@fzcAzNd?40!wbLSyRzZ)~Z`hi1mQ6v1ARwKDB!s z9xN!4Tot?Sk#fqp2RzbN7;t}DI`H*s5_{&iDyNb#4nXf#1j)*GUxAF{(vw@<7$*{} zG0Be0AjqxE$KWH#?kO@UU=?{|=zS@OP$=t}WVq^)$jS6kfGN{XlNOjGwKu3lQ3Na1 zA^gotiCa5C5X(s15GpAIf)(l2-|J5xB9ch@(>=03$CqK=pKYx!uF_YA2X#dyi1ZYS zboHU^ZR5GL`85r@we=lN-ZO@h-Xg$LF6OY^J8E^c)ii6ZE=dML+(uN9T@T=oj(eAE z?0qLX=mi_ofO`YpjO_4(L>Sgj;W+xx zapjD9`U+9<1>oTQDNUxIJ>)XnL?aQWcXk4qB!wd;Gb0eIiUA4+S1f(;N3t_Z^DsEz zW{YU>GNk^Ltvw=`9C6y5w#=-%!%tDbGUJLsV|5uQftD1LQX}Bg{{S36 zon;&FcOUdu`BqXWHI~E)4!gaE;HMj zBtl5$U(nL4VQm@Ajw&Veh-@~K+CW-xuh)~>oo<@mFsbG-U^@?b0C+sWVvu!KPQhJS zm0Q!bRO4ud@(VwMSl#?tWu(+Yv{er5cegf zD*NJPPp&qziNw+E-6VM^nT(E$Oo^b{LMk~u?^C)^5EHmnHppoixj{$ABj zs&1Bt>0{bSD|1CV+AI{|3(IvFX%1UB zthzEn{3}tAt0j&U9-`w0vr)RZxe>;YstC#CdYYtN&{A*)%aVIbi4nsHq{#IY{cWpi zbB4BzOjBb*G=hMHJwx34HaFg#IuZiT<3+bOwjG>i1n6p)uK5%QSh z)6$9C*Oxcfw-PYw>+Eq=ZE(Hlxy~%KaqNAHR}wSr>%>5C53Mr6IODI92dAw`qK-(C zdl?WYk$;PVYAGe8k-Ni!lEiW|#ziRQqEugoXW^ri<>p8EosR>BGzXMQ{aoUZCC6KI zNDo-xgGytUr1!}G04gXO7O~$On(d@=kK~cbAo@{sFT`}Yj>%tYf)N6 zpSwSRKZ+#itVJp$O)9m<>pZ;uYiw_Lgz2yqtp9 z104F|qq=4DMRgS6`Z^n{Iqh8=;XjCbn_bk`M6#F9WnQkV=cQ{u5=o?H;`BuAYdQ;) zd_wT<>%%>J_HMa3nnE%JK=iTu)Ge=?c@`UZqF+F$GHcO~6TBwVyhqY}jc(PJ?KxSZ zPC>`LQZ_$>$4yvE7PsWa4;hTJ3ekfz<)`+8d}FYvou%QX;@$d`I(%~B-;o;farLWS z)9{bJE%hib<3)JmVI~Zq6OMgrrM5qX`ag#HYR9Em-Re4&r{}(%J$-=m6)wLz{BZ|) z-WBx#V?RnCBO*Wxn(9-GFpvnf&6m*YIu@WTbsJcqcz|3hbrLCbw~p{BMF{xdnile% zhV~}mi5|UQO4L8`NVrkb2PfK_O`Y>Jmz91@L4;6Aory$QIJiB?_O0|fyl#uij#&0I zZS9*wc#O@|y(1X)qSoR>V{R3rLNd&2Nefn#{?WYlhO&e3mY?|6{&kd-Y+MQQ@Ng*T zB`Dy44Ht}#7Ze}>HDOx~j>>Rbp0&dOKJ-gFbJD;MprX?_?L!I=r!@;jwg6U?b$2v! zqJ%0Gea&ntb|C#I;#433N8YM)k+DDkM51Gy(TuFl0}_3xW2dC4&S=Gqvj7-W3#k#R8^6J{N1aiHD3?mU99@NEp2OU1V%@ZpS}iYVovG{3o>1g zAg)ln3d}ly9fctLVWy3=wB4z+w8-Lx3Ynw`IUr*M)dMKWCcqRMB~V<>f*Tun zWVnn-r1f+WO)i$x-88evV~mn;qncSg!p~_F^>raVJaJ8z1`#PEtSS0u6=iab2FEE* zn`dotaM4REDg%<;>PBsJOMNnBf_Yw2y_j%mhfBQDptWOnZ!?0}^8g~AZS|eEZ+e$- zhRSx1Wh@x|XnCCQcm-%<#S_azpFpVwvEvTr)pq0?UhZ-<%S%%f7O?<`q>f1gxu}lW zy1J9ggmeW#fyNJidKLZdiFXY5vr6LfMkQ7?=};)0sv23_p?FSM{VK;lbXG+sn+=$= zhOyzmsiMbYHIqwwaM4Py@|EsshgXemNNag|8eJNGF-Rz6x*_J?mi_lW|v=~wU z0Obb9xuwxrqyQ*fW4}dB`3xUVYdN}eiMOEG+59{LCFv~ZEadV{IJ8Ks})SP(jW{?yKn;^`H_#6)7v>=pw@Uk( z><_}PkNX>7?f(Gm_P3(j>Fm8yTxv*}l28VD{{Spij&{LlX&mCyx5AD77CdFL@TOfy zLf7p67Tu*YT}$QSRU?j*>-trB7Qw=d1K*08lG7N;>dzzG_Mml!2dgdYGgw#5>_#)m&1|G` zxMBz%oMw_@gs$j%vGUNE=af#bsI7+Y^M)S6fZb~6fC2WTl_KO$a_YzGJu67cKQ9N~ zjzbvgP)<*%=M)ZzqLZz`VdzN3B*;pr(Dfdm-kIir7^%Y#(vA<*y-sjF0HS0J3Bkbn z(nz5rDg%S}qil6;M@rPwQPQs@wY!WSi6b~X_Y{zD-1a`SAOKQGBAq~s;awZ|#~pjb z&j~iahPGN;z3LT9iP+_)ld`J&1DHCLLv{~Y~Lej@_v2JpNjov`@os@j-{sjX0;&rc&2gtsN=>u&-a-7 zRTN-o5su1Y3)}%bE@exJ^vD<%9%O@+#($kQv%AP-VoPT^H7?ZjJzGZ7*8c!k(`SkA zMq_E=AQA2f6&0Q`lJxmyXvp3ip)6)T*4pynz>TDCk5vbQPkIJ}u5SH$-%ZnOWVmno zaj79ky=KYU((e85XQ0P8w=+M_GYp83a?F0httfW{ei?3=Z1z3Ty@odFn&s4HOn2wn ztDaE7!i-TDpR#@08`6Idug-up<$?fuXJ$-05$l?O_>sD;H&2KX-CA7CZ86eW&vW$l zr+*fA{g&m1)iixK$($f-squ`qJ5@Mlk>4!er3;Mnc<^g3QG1CcNYQUV$qJn z9qD{&4Z4#JtVnVBfaaUD*}=C}CkNh~kmsy*XNoYPRA}6Jo2n-u@gN5ka?5lZPJk`~ zg&1F2rN=V*b!LV#;0S7zq5XzA^;Q_shFHpdZ$KVH>sY#nFB{S!rN z?UiE$9&&)w2tzR**)>SZaf@;WKsc_-@N(|eHU*qSFHb=4?~2IBjFCXn?bys{F$AxO zIG=SBi^VU*9216>l3+WdTL2HW;KgJ4;Gf(;xYn)ZwV6>hkeu&OJfaa6UV;7m$ zu%HLf)#4|PoK}1D^!N9S)lDaj{{V;}!#Zt&{{Z=1QVWk0{CT^T=e)9lRrDT40Q*(i zY?c0BEk-!XtrpsJp9LZ*1ml5$O(ainqU7=B>CGUFc7@8{+8xWP@1HMmC^MGJ06IX; zS&-btZ5P9szGhx(2e|DexAA3z1Jrr`MyDzscZxQ^I2b@Vu1*l zp_XgsSs&$5z$di^?q`9;ut3d@NEG5CvxXKS!%W8vGtDMh?S3WXaK323P(iIl&VxxG zOZy-EwUqVKaqge_MP(%Wm!BvOF^Vx_Ijw}j6llopPF%W3qW4-=1B_9qiUxC9!89OG{ftCP@+6E&7wHzXDl1Lw|3{5RYVwVIvVBTuY4E|ivo}g*-QQkY> zQ_%kaW8CUD5?Kxz74R5S3PmA5C^UDIaBvG10+5$!wOjNU=62%VQW0X{jK_gX?d{_L zV~qEs5(i%3H{Og3AY6qUd(}^vm8i`rtd4+7w0l#3Ec$$C<)lIfNUE<<)2{Tb$u*Va zFC4MRM@tNGp7m?!TY`PLt;eaw3P{L#2iC0*+g=d(jAFRmx>DHcNHOO_^5^gGS~!_I z0SBe#8upzmc^j*RNa>g(G$yr009v8Ep)TGD#kT z-nh&0ak%E(zlmG)MlA(|Yi$|>z{h&-JN-@e?TcPokP1dldlSWZ*SS({N5nm6Th+28 zxVn-+80R@Pb}K^(aY3=BM{uL|j>)4%YSAM6{baX#PbiblVG=6?$83sKa!kw}aC&$E zQVB)WZ`MPgJ+cS}tqu-%3uMIT+sb#dxxe@bta>fX3jJkDcQm~sZCdTL>uo;W9!1Aj zKo~x!C$&WFVAcHJJ_*Y6oP$e?>zOnBQj(+4_ozLO2jy@@<4*~2GsZ|$tBWrRbng!4 zvy#J6y4=WHGl%`q4YjOt>F;x`{F zjxc_dgffucTttz6jp@->HU@qVVMov4ii1i3Z z-A4Arb)W|wgK{ZVgIkLUukKx>TV?AJ0l}ujEHD265{_qyy-39`wMCn5YJe|DG4>wS zYkQ)z=N8i7iqfw{#P_JH4%P+aFOJgV!(%Nt8C5#)x>W{`9O#GK&N z7p?laa!SW^%24KqZ#ytSQNIQvR#if66{#zyZw9C)RsLU zWS#)4U&HOQw5GJWhhIn@V*!#&sox21xa_0VsmTM9qU){~LVguD4}u#*!fUy=EycXr z&EH$zz1&?v5D%3GeJhjqo~NN+Z{2q9Y(Vhow^wpJ3Pv#*IRFnqNOc)3AZfJyChBP| z1cddIfaBAOYgn*w3H>S}`6WTHfbHJsXaMvBjxk57g-nspe)Iu_85kyptP1rNIQ77! zN|{*9zE=|Co>UxGEU|!cy!vxm3j;R{e%&-FB10eU&J8`N6||Qtl=AWFD{S3rK3!#|Dy1eI8u-a&e53IH4))A(2ZDe9!<41_&e!VAh#S62Rbg zIO38>YmnVI`E$qv6gCSd=5CNU#T6Q7sFpbU_n~LX8BCBp=_aLwA~0_F>?pT?Fm-)< zdr(U}jAU_-VOq(~0`c77QcSRu*l}CroMyDxErmI(R&*9qK%GMj}IIC z%0nqW;)(%5;8yd_c>M)BV$iNwyj{}wCx&;r9{aKQtGJ`-wvh%sFbMXl&qnaqf9{P2 z>s;IWM^)4`i*U^);zE413*YAKaZLl~MqhEobvK0{imN>f!<|3F{oSL*9*L&d{5qwo zb8`77slK>1N&XW{nk`o5l0#a#KTBKa?JvPi5~3+fFogLd8N@in!)aLEn` z%dScK=AHMpy>GlX_0sJf0O|I(lHwaE0W9b1_oSPX!!7BxG|PMK!J|oI1m#s({=KU9 zfba{#fpL!7(wc2G8LwuQE~Q*c-1<@rn{x#1>ZJUq-n|3x^TQ7W_NU?fJ|jxewT;(3 zftq`ppWd=DT>QDOx`Nya=E!+1~&1?JCW&@0x2R$#X@mIrrAQiH`g|Yp?M4uftdIGWC zw^z_r##Z~Tb^2aZt}c!vO3Ax)x3+ffLgbNDe(3R*`$F8}%HF}{h#VI7H9OHfO52;7 z=vmoF(#pf6fDJb8oj1e1BT!52z>2bw)D}j-&)S*xc^xaTv4l_AGYzUYSJtj|ef%{! z0alZcJ7YCG0huC^r93Wp_oxoPs_EL_i0IloBH98J1Uyxp0>>)H76Ugx&Uoh(P8ZTu ze-a9NMR-Z0yRt+-5f~(lsi7p$>K1sjOv;BOpISQN&eY8zjH=;#cjl8@L2GV|8OSUS zG3sdWxqyuLjYIy3tfc;Oe~z-9N`m2@^e{Ub);*|dIj9o51~mwFqX6fypr{$`MuUM> z5{zR|my<`L^F*&CVwFUs)h{%(v6u=`8sr5X=+7(x-^of3#Vt`TUVP29MPu`NXx|R;7 zvBgO)Ex74$w1ussR={P)(u<2Ba{8`>U%?5fwM|OWPxv{RK3UdG2cG#>44NjJ6|ifmWjPoQ?}7eQ(XMEkWcpN3XF2Lu{`Pal zOLrEHb*t!;TOuq|o>h6`s=Y@_+?oxrHwDB!SjaVxi3{9Ay-%CjdIqKO2Aw2kFVOsz z*z6Ux(q)Qe=~EknkpA@l05+I>g}9egiKKPQ4vd`9TWHCw%^khOg_TsXr^9OmN9BcF z4|T6K#-SC-7%SudLNDysXMbMb$}YrU(a{@c{<;(2aWRc+%OMolys4VF+n z*DI^c6><0*DYx3PN^FI~G{-)*QfONe^IWp{h^}IZPhiHc zZw_oD*g6YEs9r?j&som^aaz+B2JLC(bBu;V^O3@+yk(vnj})#9HvULdP)DJv^yG|Y zrJf^evF;xcFZBoj@_M=uk5DQ(r&+$EszYRqs$^ijOmGL*if0W9k~}2wMDH@H957rAEOaxf%D(J=$9-4FqhQ2QqtO ziasz@5Jn9Z6rC@^iad~1mQR~K^TkA_B9@CUR||{})`8|TFd4_vv>4|FiTVy`SS(IZ zkG(R9SmD(Cp>sxc*Cpz#V`Ugn555 z^2fGm(^47_Dl*b!AM>JGaVK!ZeFZ61W*t(tf5Iyjx@76{&{7GJ2pHtDztVt2rz8S1 zOM^d0RsjR)MR}{%a=rM^wJS*^P(T@6Ioh5L>^e5QhOS86}%rx z+2^YRp4FlGNn$hD0Yi>M8+^;3){;vQKTcVHoe1Q20+i$to-vHlcE=|;U680EiYLR*6VqgBS67$Tl4~sX z%?uGt#K#*S;v?3py~n67sjACsCR4;*(c z_JP8`Na`-<>ze0J#LlgxU-+ih8ZLorquW}kQkKw!M?T};hmX>1_tGBkiX zwMf_i+dw40%44`j3`aF9v!Bg@ivga(qncC+HTTcRPH4;BVo`Eovy4WneYrKER)Z-9 zra$dzI={V&pH1*kXx1>;#1OP#xyN%=F7JKyEc;CIJ=l4eK*OooW zX*9O}Q|IPh-_ozEa%8g?1Hf+bboUY8Zjn)JZj< zxWxJJ5dQ#he=5pF`%X{#i~Q>;?Ipp$P=#oBp@4r%fnCc&5`JnjfCdc@BRq3ZMKmK2 zVX0&|=E48JT?7tGV&av@fG$YMU!m07|7c^^tLDHt9B`%o?mt%6V~z7obHE=es!^-bIZ zkF9CsKixDnk%IC#`qgwoFuXa`2@4NP3`va9e+LWl2(1}`Z^{jAW<@-ZDZp^)R9zF# z&qZg!AXCmLrnHGpJDO4PBOZo{6Aq)0Kb<>ws^n%rfD*k7s&4y8;!FgLl5^bEeW+Z^ zF8RG_4ni{l^s6I5RDFIqfnSvyCqGK8rDT_N>MI(O#oM2yZfVZ2<=}r8v8~je8`Yr1 zT1h%U&pZK1<+-|7=|V;i88ouq3FVZ>ZxLq$JbO|(x;)n|_$$Xv8rKV1IT+*sPXMIw zUhA>D2tu$Yvtpg}{lmI+hLY+lSU)ZaDi2TEfoH1im5L#CV9z3ca%8}7_NRR^O{ICO zM)OYAmVH@t>*_cjl^JAcz43o#IP~fP(d3IhEiy%}>#1!kKAgrYhwEoC@W;P;ZX25I zcPtv4M<1C19SW;~#aNq%a!0R9`gY#(?6iAyA~;C`{K_`RWiGh(m z$Za9>a`WPA8zcAz$6ghsd*WWR5rXRLPlS1^)G&Er?@T+Fe$Tk{)w63z;Z-@v?@St| zp{Gk@Z3T={`N+S$mD@c>*bhJ{wi|nyoI0a8`cz@Tg|zb8D%{OqAQrXt!?7kvv z)qbInoaV6dSY?>L_+F)>=D~-6$Q>EqT&2_9L(~kG0EGH|>N{a++Tw}a5I|HlB z`#(#wKNE92>;b~_(ml!TP9KTAX3FWJv$nq%GfDpd5Mxiv1b@PZ>yAx9@GNZZC7SLF zhlx5=sm@sT$GH^@+!qqv*_kJ49#W;5ow85d)UhB2cD=m?$m;q`*zGf9zTV;2vSHEp zF0-ZlmN#z@1Rgo74n4DXxOQON8pi6m_?w0}fOgN;s;gH>iSmpOI$gKa=BO?>P5C!@H{2DcZKrZ+)Es~tUWQIa#UpEqMFP)exGs@#iUu3 zmEik&)9#6rY(C?(={^`*7h@6$N>@-7ZuG@0LOIzPhC#+DEK*9c4<(o};B@z?EE`7oExt2UZy+%02;8y% z0BRxB&Ph;f%#;98{9(pH&%GX#J1{_Vk9q~rNN$=mCj*XX5sbJantv9mJ*1 z`c5RtAKny`6|z|1D)N7oVTn2F%6_yUcq1N|p!tlz^$Z`qZBNaS`qY$AgC3ro zoEj8Syz>ZRz+!RFrEcEd;`ZoUT13)6)3Ey2OL$%2w}%_g!ttfUtUTMw=rhX3PL+cM zj+GQPMpGaIca=Eebccly+nbwa_*voX^T9ga?hDk%RCp}Ba5LyCkk@wxqqwzMZ?!9l zB`(C_j&V<(A?%s<4)(s=(`q*QjFzp^^1^Zy`yZ`COPu>+iiM4>;N795uxP3F&+$WE z+B%($){SXz(PZ9dl;bNQ#xmaYlf-`#cL#~vsB3!i+s7iWLPu_a6<6Di^%GfSnZg6f z-~cf|kaS2;jAQFg+<4mU;Bu^&DrrD#-C%H)SWed0VaIP#Pxi3cU3EyPs^0kKqgJsz z_e&D@YLNBX=@5mMVA39XRMn*WA=GVG>sX!agso+AZ7^s4(%nI^t6 zrg~WV)bYS=9>l2W`3EM3%l=v?3;Bp~HdF!Vb5c0;ZA)8*DImK+1b_E={J*6~EtGj= zW2m0Sq_zqBKTcU@)Ic$3f{Br+bZdH2ENnr8({CSg*Kl?aYQ)ZDRH({pwLZPF z>Zp~N;k#H({gAW+aTex$YgG?3-|S| zgSA(-uon%N`2bLTO>`P>(7e0j9&!O&g%aA?qFBaCcg1aBjqI96AG?fp`qF5wrb~HV z;xYjoXTLSMC%R1=qY4bCusqh1<0vBf6aJlL7v#Yr9}u zHH+S}IpVj2nu@s?rwvLG@kv1-=e-(@P;j(d52Udq%_v4Rkq@vGp&EvGTUhd+B`l4N zEr`h23J!jh-y08FSsN;@L*V-g7C^cTNj~Yu8J!Lo5%;C*D;TmE15AGq$Ga0pM=-}E z(2t7wT@E&QXr$-V?s;>XCRw@$3({db1CR-<5-C4A5P|0pA&>#v(Z+VeNDJ#1c;E^4cw~?E4>Np4R5# z)+w46=`s$I!_ZSy_R}=X$}$gfY2q2?7UtR|Oh0^zZoPY`rja^2zxjC;d_?ZyEclt} zw{a^icAleoY4MQhmlDEG11R8{Qkz!xiP(;l&^+v+;1 zU0c}0Y7_y}81MBoR4(cGC&3s2@jIc`zN`a1X zkxjN&v)fLE7yzd@H0ijt_SYk_N4Jd{+7S?S9Izhr#0NPQd_cM|Bpjf#pB!0^ej)j8 z!kAv~o4dC&^UFXmU7Q^*p zQy=}FZRfa(*nC9Ozi6%gc5n8nKAqtf*0zbRb!`J%lGr$l%trjoeE_I~i0}MLi}j6C zBSLTPs*$~7So&8?i}faxYWuoPRUHL|v>~Gr4u!@5{{UaDSzCj{{gVd0Z>8zFF0X4T zPPu*~*FCXOy?kuMI<0_dVck5KTaRRc~mH}%Jo$ISG4-Rat<8o$r1)sg49}01N%R@-O_RkwW@YifFV#%ae>)8Mh3M{PNo2Mr+@1pO(wm67@Z2klM>aIl(27Md$z zvi&~(w4n<0gp_fP>S;Ho2>k_XrIh3nG3`o~bd;3&df70(`R0?EUj=;!Y}T2H10^fPe&+y2%!g7 zA75(HTn9qT2%(ip03<0C%C)eg2c<{XBD7!pCbP<1@(=T@A~YE+2i($1mdr)LGBG*q zD2BpDRZeKfnL=VRN%uXeCK;IWPu`Mb9#3))+KlKXBh%j;W{tMCd8Ufm9-lH-2pF6I zPr0kRcm5f*y*FmqYWrtfhj2SV=3Xtb{IIq&fPF{StCJ!)h!1sIlVfxG3VpSI40;By z_WuTpr6ydL0ehOV^uGzU%dMFvyt>YjNh-7ljs^{9>rd;lw@YdZW&0ZGCT_~>jMB@W4mXXQ25X%fR6*Ud zz@_Rp-8R$gm~_dO4MiP~ekpz4kk>bDI=L#`oO4aL7P48-<<6xgQ`pn?kkc3g&%$H5 zrylABMsDre+J7yN+NY!D+cq!i1~X9IY_IJ`DtdwJYENk+wu^7q*e6J;GX8{47xM~m zw+s_2&O6kXPttVlX+-xIZ4)L3PHBe1M1+#@i3j&hKSM5)Yi02lXck8}SYm8(?rWLI zbFby?dcVV=rV4NbebcL5!KOp-ntXxy!C}du!Dp#z4VTDH`E!bJ(WBCCEycyWK@a%3 zrwfbAOJv7VI||4$ZFMwr_g#FL+v)PYhl)t8bZB72jQ(o_-_o0J_NKS0YM&5q(i>sV z%=pLYM%`;SGfm}MsOmgty=kqMB}sKXXhS29`F_=8CRV#~Je5qogpKs$7Crh)bh{&I zuG+&K=0K0jXT5YLo@D)%3doNq0k98h=Z!KUZ>&IVt~~W-A2B~#=xqVzh7e@Q%6gvF zzo&gG%l{mV9lSC5jVz^@9+U^18Wb{lnv9c42Ukhw6m;-I zFGQ|bbAEi=bwWk(YZ%NEvpk8Co)`Bk3zXXbHdw`>*y{NRgR&Fo_Fo9g{ zRD(pP@pSBs-W06h#yNya2|W*8I}W&X?DU$KeX}3al(5aT3vag z>N=LSd8kh+<3^e7ME)_pR2+GF`MyfO>K3Qq4vkIqp_fY(U2>(G0iRqBr(q z;)<_WjGvbyoKbks5ATJQt>M2Akk6QXyrp*1Y0QWgc@go>9~AeeE}e7bTc)Ele4ja_ zf0VDaM_}76EMh<}Fnv`xqa@q@O{26D+&rF&Mk>i08Q?ty1i373=i&;k$7;*m`<~x( z*y;8fKHSr-?6m0omYc~?^Pbt_svXN_);opN+a7d>Ygp?y+Lg31 zUa4r{S#u@;&nr-6g6{hIG(gi$A;OPRXt-MTI^63EpUid~ur-+R5c}laq^wn+g(8*1 zZ5_L#>Iovo>RABbwN11?45yehn(WfqgZV-)QP0#d4gf{iChw z7c=Yoe(vromuC{eC+}h;`}$Q&;bc*NWaepKq#1H>K9x3>OGuD;agKj81B&N!Gd($+ z-wUkMG!d1GCO=X8^rkv~@7sF{78^rjdFDk8CEeA)l3%y}l)lf!JwE>cP+QG&NV&GR zwQo8*TXhc1{{Tv@CBBX}Eda+n=hlL{&r605fx+YsYH{Y8`C5R?_*_{okbdgehj!@R zCT?q{)HJBHw2C1Wv`zq!k4{H(RR@Y56=~ZGUb(!s)aSlyt79=kj7Cp!nw5BRwwkYs z$#rtz2w^OMj0}%cQN8DLsq4DN;<&rJNmdamLzciq13jwvBzEFgH291U+S6bzZY|X* zIP7~?&+i{354UQuc5j65x^z|4=hkAgjz&EyMoFoI{vK_Pmn`=Ci_MjLVMa4srdAFK zS)e%hR5?J|01!Q>rWpGD>CaHLn?=^{wCNdL;BtkBAks)77dHV}un#7z2DvJ?G&||- zCjjF`HE~Lvty{AZ%V?X4(Br6s{32=wd z$o~Lr(3S|n9E!=~7~qT*##PNC(u>nq7_Vt*YB;nrtR( zyO|akqaLhI1#3#u^<8^jw9#~1DQ_?DBoRXdV=U}x_jB!C?cs*)Hd@t$ntlDQ7|9vP zQ`}+42lS{o^R#x57uu9~nc!CY@Xk9KH6JSNE+7)TmSnQV-l$KwrT!9rBDGHpw$8Jr zTv@iL^Fz^P49E9q{j&b0Ks|?gl5G#ftQH;-Yg$h8w*9xLG=5ElQi8>qySuUUUMrif z55-L_(7a}D-T0jfC0ck5=pX!(bryOF+Mn~*D;OTSh_9Q%`7Np4laj%QQurv`v-ni}ol$d~4V z+S;DANTrKjSnkKo)H;WJP&IRTCD4Wf!VoY5@F}FctmWO=pWK|9debi?n-I&&p6q*y z&}iBz0OM(fWOS3JPUGvEom&{6Z&`E$$L2p;itBJi4gMp32*~23+Dys&1`y!zYK*_- zqHw>Moo(S~QWO$?l_SzE^t-m{)L>yM3<7hEQ&yEUaomR>1gD6v9`f(Wvw-0DYobpJ)t#!drMSj7${{X1fl)K}{ z{Zm;7!p42|oTJC|hq27e2=|KRN;2Jp;ggHFZ6yWlMlm7txt&gPviOw@a zMaa%+ija3G#qFFCMh3%RPzO(AlR;h^k9vhGnlcX))`#_|w9gl34ff>jP%_)ZA+s}E&fLuAbFYO^yT05HfE9@MnUn|s@dmNQXy_*Oicv4QG+{5>QFkH z9Q_4CE#qS#JtT^rU!?1^u4d~jn893dIjDWD+ht-30HUyu@XzIPdbkhGHdEf48krQZ z&(f32b?~~(gOyzNrM4&cst>=VH0vM@N&WLq8@a?42FmE13sj>{y0^HzjpUu1ryL4= z-4_1<8Mj2pjC`?`BhsslKH=cFSI-%#-PY!@{>r=tAuYs-&@-GN_xsjnPBYmv9UAnl z3s=RPOUTEbnrrtdzQg3vpe*_786uNh>XJh-2|%B#2GE@Hb$Sf%9~E$ z(=VjCxzwe&o?k7J-C4;Ak?BpkWFt=0EUsQ*^SE!9^CvYe+>N16x9qfCzq8?r_R1#s ztK1&BPBKn2P#Bt1BxTPTz^w*`mYs)!xk+T1uWzpw$2RDJT;C_|t&6>DY{bUg-D)#A z8Fvrrd*d|(+|gR!U8Hui-L1P0tjygqo%Meed_>l)O@^boujIEq z&^b`we0QkJYIlXfR|s*8sKGUSZEFQmpkm}c%&$`09rJmiAQ0KYZsuR#%PvX#aoU&a z{vi!dU|m?+ZQVNB>Ca5JX&z)C`yWcKnpT=#sTi{!?0cGb#iTnL?Tx`(hLL(u4(sYk zsG4a8kq^?@Bo8CDf^YD*q;6eDMAC#&CSZ+D5Y_MDB=#G_YqjL6(aDmf3-B>q=hNqC zmmXUy4=naIZhjt2zp!UjxoH0YczE=pMbropB7uc_MFj3-cU)YNN9 zOUX5OVX?F~R}Oko5V`6kdsNfK%PW@gUr}~aLv-|$#zrbHqyEs+^@#6nrSc?DN0@y9 z7&xNZ@K`M{f8&AS=PE^zgm(s+^!YXWjX_0)obyhHs056X zD#_a#{6lMM8gaaiJDJ#(Qs0`8?45SYM%>ap)$DMBItvrq-h}nqENn)8o=OLQY8R>N z+U?Mu4NBY@G0@&*cx9;BKDBG^-6Kxi7aF#&r0X`UAOcqm{UDF0xy@A!bCX5myg9Z7 zEXnV8Cf2fP<8JD*=^BZgtvo1g+3c15@qN!u{I29<|8tk|5C~M}Q zub(V-N@hzt(+{2SlX+vi1vsO0E7F}mYnzJiQqm;5d&psl z&qCV50{;L(=~PjUn$V2?U@|z;i35?_HKU9lma-VGW>RB`*?qvF^fDit`DUzCpq`Kc z$21bhs~(1iKslgNQ7Z>w_pSF_f30h`Y#i43BLH*jNkwlQ@Hy>@QEg{;d3hD3oxHaf z6CRl1iAysdUzs+-Z4Q_PuLY9-RL&+WL)3@-KO}Oy(({!C)W?5tlBr2l_ zJ+tppO}*iU$=tfIlgqicwX%n);729yi0_s?ze=d&vAvYW7n8tLN0gFUnNWaNxTCBI ze=-xuBRDl7-gkOSYSTfa=y7RrqZH_kiO3%L^{Dol{{X!a{sUJr+l8nW?KF`v!;n1< z2mo1nJNlDBfBDV#t%3K=NmPwM^G>k#EODB4yL&w)76{bIa7J0Z1vEn;is59(V@}UD zopmRhA~Q>j;P$2_laQINE+n~|u0xufZNG+}OoApWk>527y@k?3?HEA(s1+*Nx@^}F zyy5Vwdr-NK0wPMk68%Ldp4`PD5r9;W;q6mhm9=**{kzYn?c3|z_VQCaQw4>C6zFF! zp2Yf9r{T7{t7#j?#tk;+Pc~Naf_0Fi>T8<}WZ;5VZGo<2U`Blq59Jn{7sMGd6J%=q zdKj@sj}AOaDi~~iRY$)?b=-Q6p`_`Jt8Oh~2<;(GwkSU_9)sSgJ>U4L*0lXnWZUuE zM{JBjHOhiof@Cl`+XdPz{B5Wa#BKiSvK||Fn<5h1A68|@_W=I@T29^@c!CHAW9tBq zLme)^{9*W&d3-HeTPR`owu}a=i^3ljH?N2=Ot4(Q>lO^MT@V|eL5eKtk%74MtN#Gz z`helgZ}(i~f3^26i>*NVzJYmQjUWM~Tw<;LDJ{*lub8B#Kqo%cA@Q*_IW1s)MU-K& zf!LpLX|HQrnKXD>Odf;-sQXpgQEwr>78bjy%b&JMMHJ^f)tphUk_(gA0osFW1lLOO z$~psnQI3B~XqE}>uNrX7-A~dGdsCWf5+(eXFK>qt^e8-HwpTij_$@#C&HSq=i}t1W z{Q>;zDI~aXccEmO03x#^G^ut$$k^PeiOc1$5GCERb(Ps z{#4sy+*mHN8tQVCfVa(o=~7=4^{u7*IV`kOG}i~YD}bV^sN|L+3{8SPt5VA>tW1xS z_3u;&>DS>|E<6t+TQ-1l4^aYz7cz`yf@CCff-56_nE}Qs)6z2;;5Y>Lt=!xVgDs>f zh{*-m4*b*x&>x6XjMV=CP?_6h%b7t0eoBbi-$n|=A&h!w9M#xHqa*IQ{Z)YGxPrS==dBla}9QUS8V3yUSCajO@RZ7~Tlc2%kmB*LBZq$-6JLZ-{ z$;Wzm5xAAon?r8{Xx6D|pD?e^Smb}{OuFr(S;(ljaY|WwiH!bJ?0&TUWfR4tNAi)> zw8499?Qls(CqA`}j{1<d$pfU#Z~IOnOc!N7%}!SG?pX087Y`vAzz>pX zTz2mmQm_|4K~52+&BBP%7LA8F#weLG0sjERQozK}pW9?`cZ$BybsH`J0Jm*ZP}VfN zn^e?LtaC~M>jYr`07_$%N4kPrR-R;3kad8kBz^s=OQ~FIH_=8lJGo~N0wY-oJtCX0 zz-NL^vRkK-j?}_&e;}(?J4&C@{{X#lbDPlqyrlOfrJtyr&_a>OqhrTbPc$Y2JPL;D z;T+fj`H?5DBocY7XyWSWCm0>T&S=pY1QumLeOuOqAwa!mJE;e!Oh*U#)3g)P7HOi3 z>u^Z=R5zvp^`hlRj!v$DgWD9LrPEA>C6aq~&;8wpo0!$&d&YP_0?<-#4k=GewRTTH99|DpD(C^hp?~>q-`~gO8b0znLIyfK~04VA7r2Yw5 zU!m0P;4z5|#E!E~jU%56gUy>H+4SENu4B7oc9j*Iqtoe7HJ->xlN%NE8LdVEv~ZIi=86(h-Nc4 zXBZyUViRroM1k*G$24q(c~r}tXA-RXW_m28$a5wGtE1FJsO4D*9b#eXS2)J$>` zLKkj=eqbuW(@u!mTEn+=qj7uCT4}BZL|_h2u%XEGhq^0qm#!2ShHf+Z(0^P}*OK(= zGiB2~XC-@Q=|uooXRGzADOX_hvv}`E&hFDv z_WBryOq1}CL_r0V`Zw3?b))NgEO1$!b`y9kRkHB|j!5(eJXCYXjTgfGui`4{UKr|^T8wZ8__^JK zMkLPx52zJeYMRceuWAPW09d}7?&G0jR+Y1b0{{wCq>agGAQ90{X0~jkl6%{$ zu90;-lXNdab)58p*a{;D&>A`t7G9zO$GEBPi{ZrEkXk*0%?vMtHPnL$KGmVPHB+>e zUGttnr_CDUMi4X?v9xj?(|QlRT~huY_WNmGY+IZ6-ld4Zs#|w$`+c*owwng0757hf zjE)U4+aRS7=SFO)r2ZpMqwILLy`+}6kolf#I;qI^8Kk-=iyD@Lb1c>tv31CXJilR| zTvdAPg4ud8)$R{8M_U7&ny6wjxe9K{b*UEQ)O4*%!xQZ*w>|I&VNIG! z7rrYVg3pK~P<|+HY_?=RaD&NT3Y4;YlahW{z8HrZ^U} zpR{JC6-2D-CjjP@!*6)0=ZKk5e-WU=VW@eL$ksO^KA;O2n;*{<@vlAO`BtxOHLPJq z1EEa+06KyDrD+ZS09EX9y}I>?*A4fp8^V1jQ`TXY-%YkRET<(9Wd8svuk=`?NG<`( zCJ)R9AI`e(@HeMhHlMk*31cQmoGLh8qB1=wY`Dac7L{yMdPjXK$+Z1O9a!nDWin6I z(j)1?C)%YtChFXK0{f;NxevzUi7w&EU#QJ>df07EHt5{zx=_8pb}bb1N6O})ULkDw zwV(S#OVV0QazH$h^sZ>*h`yICR%P!WFjcBnlbEHrHw_M5|VdlJNr z#6hreRz(Zh%Li&QWHfMB8=t}^{#&w%tLawG21I5*we0I zkLQx>122zWPHOwQ+}mGD)+d5H4z*9n$i$L)kw|8msCo+7rw>-%9;&|T-20CBRiq*B!-p;n=l*r@r z5!#mCTERY@*KHpPaY)k9ky)Zvj4ENAdQs?PyY@Y&{v|)1Wib3I{{Z6TtfZ3RVnt{- zG(nS`*1Xf4=Bx}QbY~!Yr6rCy6de6%gE=%GHlJdN$O&q{Pc@Bko-;^{rxXz{%}diw z`jD52K^zJfnnB|~ts(QyD}H(Q6yBO~kUi6YoQCWua1vb_>K>!PC}?+n81A{IY1c=-kw+&H8b0I2 zebsY1%=(K4UIqpLr$~Hk-ongVCaKb&LEe`68_v|j3x5IOFx&WHx#pY&(XZnN(V;X{ z+f8h4%oEO1;Txr*#~}S`Sr>|1-%^ocn_QpEI9w(N6xTb=X}G3#4d%)+T2Yd7>qAYJ z;qv*V&}jMr^&0t)%V}kt0^Y}ZDwnF~i4a(KZN zksWXOm#bz6j9?%g56W+_-LYFBjpG;xy*Qog43WC^F!c-Weze?n?7>8`T1Eqm@B1ez~dLbouEz%D787|8=zcvF@6Sr}$qsK9Wc zeosD9IKV!XFscb@19Xn(wkX?sTZt{^o&^PAQtVjc08BN8hzVAa5*Jgh6lA; zAAA*?BnC6SE(*wQ7gV=qjaDgFmxyuIKviD6l_Lj{MCusR_2}-P`BFp39jU_j#+N>1 zLn`Z^=R!=)hKEIT`c_x!V6$5$t{ZdfINj-W<; zXuM;b(aSky=#Y{<>2u*bcAgIf07_fsbDymjB6OZRd(h>JpyhdAdeXQl(8G#MU*22ABzE^Q#Ig>T2*h;{V?`CmY+`^^=QS?X9F78h+S+cFs%oa+RJnM% zhsn}2lTUiCz}0MS-E3`Ux{LU5IsR1*w78zi?JjNGrbIbY^{W?c__Kecq_S$UzM(NW zQs??m@`*QFIz__hwo|)6gJIcedsbazb=*Chu>I5k;feI74ZXj24$;x|ttW0@J*B>^ zf(wRIhG@s|=j%!LhVs=nhO_aPz(*SK94Yx!RCPvM2Bssn{{Rz|Gu{dLR@s=ySg|CW zl6`A=II9zAcu#w}G{wI7=q-`|04lqVqxw{1SlhB`8^QD*w7HRAqxVgaO-t2jG(0ER z=JuIKC`j%q`_U1k{5jlQd~=752~V(PZqOv>uLQgfUyy+*X1-}@_R zUg)wxB!*$q4_6CNCw*;GY1$2^Zwz+(@BQx%gR5@4jVjT>FFQFupy$1IM%Mfl_*tRr zI)1&YYxnz-G#+G{eElLRNgpms@_yN_C-CB1Xg4d|UMXnNI{HVc^se6UBgTs@TTaw; zEy7+lu!W_L=0dT>1YisjSmQs;)Lk~mmX%!iuY4kA`0X}$nfOoe{{V1bMSZ4EZL?Gy zG%%Cv-})*HzEjT@i$kV=N$Pf7+n6Mh}3*P*ZfV~*IMq2x^HZB29brm-mP@Z z_aq)!BVNnxOKpD+yPhs%@h;g3$`gk6nma1z>#8%VWG5-LWz%|(#@8OG8)@D-Bcfl@c#h)pV+J2i1!NGtUn68L$vW*ZQJSB+CH5X+%M)!40h_F zi0pBSm}~wYcx$@#WS4O5Ei+VTPftnX1bgEZMZ@6kue24fwx@_MZ+M?J1VMU_=*FIW z8P+uoJ8^1S7UjL3O;4!0voRs_>&;2Jv@`P)tx_;v->an({84SatD@}72sXyr)AU%N zfBANZ7lJ)#&%m^kCX>8kg_F!Ig>&{aSK^5zi$t_^f@fQqe|a-DRAbOpGvJ?#y3d3A zit=qUZvNGd?;dna#X-kzYfl;GScz0*Gid>KOzV1gG^P8SP8 zvsRL8Xj9DKutGEXif*~qt*!11k?7E~XE_R3n&(9PXX`yH8~9&h>b-+p5(OH68k*XI zBk;dYjDLz^f6|=7^#DcMyKi+vE^d~}C1Kq~zc{DOxvN=2pEpU2s-@RCq+_cWtmddz9!Dgz9!>!GwYPz zLYDTTV+E`LrY^T|w*`&zM2K#`H$5P8M%}}A1%g0H{o{7earL61lHgssNz^0*{$@D9 zqcsbX`gCp>8U5D3SNVUgjHrJ&moVkY(m18;GfcW zvI>Ka^kS(sf-(nVLse|>DkQ6!84E!uVli3J^?_cZh-j|D7nUnJK=-T&^gk`CHm(i6 zg2Y}$904>1LO7)h8O2uTBOr{BiexyUL^@uN@=JPiTM!U)RhNoIHyyx(N#{u2cb^d=)CuJUZ5Qix1hC zHi{Dq((-^wKA5RKzu*q#+FNYy4NFqf8U$RF^DutHJ?gE|^&MQlnkF{A8DS4ltMmPnjJ<>~Uvn6FJJjWUL#%eHw3&<5Xcn#jvk^zEnSOM-is9OVp86Pm?nmZCp zYlq!(e-dIC<%z@TEEWF%v{!bUJ>3)z2^yZFfT&#^gLJ^Ck zo{}*`T=eItDWISU)Hwk0S&%+oUrLp%*%&+{b!F<(5>wnB4J&~>?JC)c$pZ)LK-S`T zGz&;%;iVyh`r@9n%{%_gh`JCuYK*BvSkisgufkXl$(}&bzzTN^LHq}I&+fyK(kUl~ zS5aEu-Lq-wE)-xly*TNio50(sLa0@cf`5y>BJk4Ttu-sVzlJj?Pc>At@ zS7ywjJ&8~c7A21B#2I8uQ3>+br~%%gPj_%_z8p91{jpZ2_tB=-_a)Y*!C;lRTXWnf z^{U$P)5(?NBj#T9r3OnM@{b6ttq&&}7E2>&I9N=sr!-OGmB;|^NtsDBdrhupXz1{Y zHKW>u%4j5URv?@?LCs@U@%619O-VqZq__nikwA38;N(`YXlo44zbX|EFbH!#&Z>t`afb-2dWrUIetpH051NNa2?Lvvnb1Z|poYPuc zc?oLW-rGnPE1QT&9lDC*i-P9jJwa|`m4wROLQdyC`KuE_pTfJVHGRWve%D<&cM}oR zew7ZrO(N@gJbGAbJvvD`V=^AHi|&2uro0>B5<&O0woec@rNxYzY}Pfy$C>SsgX= z(nlj0BOvomnvAzG?`C|YRm(v z7$+I^pfX)k*V%M<7~8a`$^QWK72w=DQ2BBO~Ixn?u!-dls8E;17oZM2OQ-<2KwlY{6;YS9odcndMj3QC&(yyMKD zRJ(Uy{voAtZarm}2UEGueO#K1UA#*OlI`c{9APpu{HX*>4A+8C(?JscRZ_&Cy+}aM zV5xTpg=%em&vz!d4W0bYDoA=m2JKUQ5iPXO#9R*6o^YPjg(PKxN0nDnwK1tB zTyl7;qVn?6&&J)kbEsVzEt=qr^VkjHF`80q7Z2YTyI#Rcwzci__h0B5xr?jdWgrt*$e{mw;lG;f$u zkmPjZirdp!vN8|4%F8z3QiE|PV&;+Dyp1Muewd>Qp8o(U{Y_|=>Bx~!)YggykqEP> z$&i43D{?!9%#PrCnio@nmvO=M^`Mn$I)PwEwrSEy4a`pEB4Wq+Qiy{U>uhGUAwW0) zAE2Q|qpLLP1gXb_&Z*)=XzQG&dE&Z`>el8<$a)l*hA;u|#d5EP>cf7)I{RX}a^mfo zBl50_&KrO|C~3z^=z2!q%MhHc$uTkGr9CJxrk@mvaeF+H75uR%tT8R*4dzH5d~(zq zNp$-#W4Q)NPj+tNhF7H@8E^jp;jjMyma@0;5B?A5Sx;pp=jpbLbJQz79xmNfdAYOC z{ImS%LTeM>s+^ZD&@wNwPA!n1&qEfGkJP%d({tc51{ zRP>Q+Ukbn86ly#Ywh%G;P}o9;3?Dw!w>!$4V~mZ}!cHw$+*W)te}0sx4f!HtK#+7d zNsNMN!^)9?fL_#B!>^&N7Q;QoEqfWDwvKre1#^M(bNr}2N#KNIpK6b(_g4OnjTZ8g zi&5?;8YZhbCg&3A= z>P0_XXiFSoM(ajzKq(BGY~Xx}As+auhD%&Ha?q1RmIF?WBlr~bB8*EQPX?atbQO}v z%$9dqN&LM%g$Cb8z7qVglDY0`r)0OEnI9g9DB4UXpX!iDX1M1RHnKs^YDIBpbNf74 zL2no&hG|IW`O;CN-i!uJfkXbJ9&Ky8M0-xb88zmT8w+(?l)?3>n%gAiFFs{l0KYKc z3S)yxxJgv>U<2<{-M60&$eXgHL$8Huo-8kAl{{Zr$ z&j&=^N~ETJ1sMjHbEw@drJR2}hrT!i+|-j;vDU87#6_VPql9^3mkKaDXP)$K-PwDW zTb5^vc&y`sGVb1I^yAiq{ZkmvQSJbKQP~-I?1+~*5AR>qMPq_nR(olPZj*t>2kSzb z2xf@IEM%j8l=Hjxwf5M(hR*KgC6vY_QimXC(wdj3#yW|s8#7)6v7XVmMm&gs`kF_6 z;YaSY>w9~Sm1YZ$I*2(mt5%E~7#r1aC|aB)?;6a+V}Xql0SR>At3chofbZD%bUY*6#twKLpK z$~?1`1HEfP{o>kJooZNa$0d@AArpYzC>6W+6t7K%8ud-f1%flxBYi!oyxkM>#gUJ0 zO)s(0^$kTtOADkda!2|T=+f~W>V0qT{gjhKjUwsk+fA-1+= znm$~So~~%@3#XsD@c#ga7zS(h`;;Bud~LizkVhP^aUv*qK;s`uif+9vB(OTQnCVqG znN9`??d!><`}$2~{6)UpHdgM?+H}Vu1BE!`RAXD$pw%oEM3>8R`J>Ns??pEpiJK&S zd0iwLv}Z?tCRnEdZ3I^z{!KsRDC}^_cX+VGI+>0D6}hagh3i>c+qJ}~NFpKC{!~&( zVURpB;r^bLJ=%76+A_tgPbIuvc$74a$x+X5t!hg!h*?}_CIp%Ln+P^JC%_6JceVFT zjF#5-+jCI2mhF1rSzu){FS_J%D2tu9uUV@b-9AfP44*u7f1O@B_lX*&>D*R(g7)oZ zYf;ewQGptP`9P???bqek?gL)LB=blB(m*Z00hs5CgL6SOOEyh5V8Z7WP!)LCG>eh< z;+G_LrZ8o?R44dRGm5pf&A*|;uwL%pPJ$bRkC{42CpAytWA&nAow5rENpPPPZ}ZYx zBGY|u=KUl80M?8_rVsxBc-;R0`D6X*yYE5c&{dYH3?VqM(+_+5qyGT#$NSMw@E~S8 zncLhlibwiViz1^^gQ-I(a7aG9(k8i0>EDzT(=TtY1XdPT60?3#5Y&%L@Vk6#G0ysK zfp>5q8I_O>FY`6qo)tcut!>ff*jR|t+o2;^R36^=%|rY%hUI)>*L3JE3|67oG-Tjb zG@8>|NCTy4z$Efl7v5=lj-7EdHzZJ=nppH(JZlUj5IGJt9ZM9b}JE9*qNUlNSiaOrrTWf`yCd02Fk(wm; zt$~w_f%l@%u~Y$FCAZqO{-e|JR|UZAF@Z>V^`qL@tX*NzhprE51`x&oB)_kj;R#3av3hVzzTU7s_+twX>OG(N325XSP;VmccJFT z2ITWd_%q(vhB!Q0ytK(>GDQ@K%HVJfNE%Ek`Ggi9)}z{M$oCfQH<(K(<@=g>keKFP z0Uq_u;&EYgGm_}rXqhbKyd})mkg4nhVVm`%EtJ_FmUx(U$}SJ|rptscbmj|E035$r z1Nu^nBv_A2+Mk%@uyWa>=&Z*MQ>4=@k@QIZUKsANRB_d-lPf{-Kiy#^j#shb#e$jdE``s$BnzL?!5y-({xnxFD@Wa z80zW!)Lz8J3nI&bf(gOzQ-2w+ue7b7plfiXz&SL%%XaczHO^KAV#^xw>T0*QkzUkt0}kSxFZbr^-dz^^gI&11jR`#u+L^8( zHkV5zXM%XHiY6A4PnCx(f%H9+pc%S>I0v<8L`#+~0337cNe#`xIZmIk;+3Nrlosgh zGCgY5LIXzR5J++9&uTNu0Fd|%jxkzj!Z*wLap^`8mB&dZxFVb+iIGB{G6!y|3ab&{ z<^HreSceVhed}s+IKkqbLEWjJg>kI@BHJMtQTem$T`3fHqgG=Tv5~z``&TjeZv8v* z+yX&4uBZ4hX&hIAPN}5;1yR^yhRE=)hop%$i)(F6$33dyznG(M6Hl6aj&gzeM<+BZ zi)%^TJc)^e0HBWawRD)CW%DISKwP(>p_S>I;$QxQf90&FKPyWA0LC}-tfZ3j$EXvU zRRoYL0>}^EkO~-VaYVVcx;SSnHlF?>$Dm>n)$c=+{@z<}C81KIwJ~)cN)omzpFn%9 zF{-@q0O#zSt!IKc#sCWFPPH35JY^|6^k*)`=Hr!v!UkyV_6OF7W<1BYTHMLjFe9@ZLBD%nAZ^L1^yJ1q-Qu8`&Ro? z6~4W5cQVHnn9F*W;+#SL5MLvC~0%Sc|{vP6+ zziSyI{oG?eQ$|^NiyYSy#$+eC^k1z&LPylEcBIF+2)Q18lKAF|LJELDJdb+np96eD z+BzQ2xJA>_JFwU>1qGxy{3T~PtH@4E2VZF?}Xc9W(|7s=G^qQ6gVbE zVf61@$Ha1&qhXDXE(8&`+%7lcw#Six*k)s#Nfo!F_D=h;b|&R}Ya5Ls>N~AU@2laX zVuy}PV0u&K?}r*g?W=oTF2L#b@yM#S{hH&S;x(3@A^1&oe{Zgf%XPg$(-CF)lzM^f zQhVCu6T0U( z^a7}D!#{@c?da{cwU)0opiUm@@xrJdMIGzWz8lGy;x;+hK_6~Eb?YAo>hqjNK{PHT z8sHiO+>`$Rt5Em27ZQldqVz5YO5^pUnvgGKsnkf%siPfnI*7+=kej`;cemoOywMqM zqX+&jDVQ<)j>fu;-kArmy4 zo6hpB$7ku-Egtv^NnHIYBWdRUYQind)@UE@MFUWsG0}hEjDwC*%?eVXdIqv zGt#V2ps0m$;1Z;}a^g6=AlG7bEESJV26^|WXNJ~SU$w4U%21L=gV4jAo@y|gk6W5+ ztvVali%(Z1!kl&e>QUh2$lC6wd3SKiKrM{-K7zVPG2H}idGfww)PL`@-Xb1KFLLUa zknfv~GV`a-x?l%v0C+#GK4~5i?5*7k*y*v~+v+h&5=kQ^PO(XyZ<8vvsInN~0Q#bG{+^l^j(N`jocbeUy^4zDpR?w<7@JuU{2>M%|jO z%`#i+b7|lbCGymvkRITgpmf_!PC+NaTQ$SDIq6=b&#e<5@fp5Vm#5@P!?p_sjn^o1 z?i<-`lG#2;*RWnGylR(XWOE}oK?DM6;(dj^6HWc1`W50@vA}j*b$tM)ORXbOv6Mx7 zZza5k_+?V3`ieD?Mmky3XGlo|l>4dgopV;x2Aa~WR@lLf7ad=7QNo0K(}lj@)x?oW zC98;Cfb)B=G{1D{siJD}+eb4>uMm(kFHg8UWcrGR<}tyI^U5wfdGaxxmO%{{Y1;G3cnCIamJ4@%viZdvf7ybQ>O( zPMhKcSY3qzM-qz+uz+5l`U1kY#&kwVeMSa2w|X@qEOyp&V4FtvNg>^ zZ&^obu!8~1$bY_lGxV;1D-I_#mWnpCplpt!S3>xTHvZcDAZk_?PJ>a@xw%`htQ0R=d>=M*D{(xq}OM)w>F@~Y;+s@k~uz9EZF{3uD)0R(#qSBM;Y&Rx(X6zKRS|`@hzV{mF_t~~`_&`kuZ-4Og@l&64%3d( z-LvJ~PJqb2Uawj&^<=m;p=GhQPUXr*GOl5f{IaJE52Y5xQShX)`;l6fSC(g$*t0Pt zlj}v%w2>=*xuupoYH*zY01z~*Z)tJry24t@vlMUoUFuV~HZ`u?)1lN7@<)-Fe(ACD z{SGRbBxw0BluS7CminQ;E%vNn8_LsIV2>|32Ax}`MCBJF>&-M;5ZZp3&OTAiI?2+q z9H?{s;4xgT8Rg%Sy1CkYCX|h>{911pDs9~6?wwhCn z{EPmy5j;{j4-Ldb@;cXw(*Vi{!hg+#$;Z4L9E>F9U1$n!Y!^JWygzjEv?$%T6A>s zPi)e!j*C*Yj%dN+hvNp$xY%3Ov{?0NuHa>PCKwF-{9=lhCoR>(fx>qh|K91pDmD9me|ovZWpoTkm)uhHe!aG+Z?I#g#>lqKM zfLB&pH0D?UAgeDbIP{^i2TItwDD;|HE?=RLx*wUy;L=%Tidjv>)4NI4$o>#1!r~aM ztvuUqhi2{vzpXdTcjm$HG1y_{I3#;}(8}~LiL(Cysc%_E{{UrezyAPDWh9rLW4&y5 zpsy4vEp4@LziJwHpb8rIrYhEUkz9YzG-aYj@{cf(ze)wdF_@fCQHmP8a@Co8CASYL zMDi7!q$P?D)Fk+<RG8lTHb#vVrmnq4qcdXyb_F`J|I?^hKlUOgciyO&o3S zlq=4SgYIbP^_E}zu|xf=u5!!G4omzsZATs{A2j5Y`=-xnc@!2?LXpOtvk}QZdV9Oo zqSNgSo{WUMDF#Ge$~|#Wdnw_$nmEA0X75%NjfK6W07jgV$u)_X=EU&lgZN&f@XQlt z!1h4kJQvqB>=YPD98xP=+A)x>36N(b`qCv5Ex|Glb5E%LjXsGRk?p(L8b4VbNXPznE z*`Sglublc~s*o003quj@$qj43G^9u zX)SfSb|&9Edm;Qd$T57pcg-5BCIDw74%N891DY^o@CHo=Ty1nrg@9j3(3XQu1U$y< z$av$RETMuc!?-CQzIg3R4_d>^V_g)M zUE|O79zUwa)4$XWH#;G?xbeJ_YWDH{O{zem1HeD66&kRS!S88wU~_DQsP4n7`WjKq1FnHJ!o$JUGBqK^#{W z>x4WoA2Iq9?N^7uNVf2bb~dWUII?D!c;khwJ5fza6EsobM;SDxStCeUorW>*NbU6K zqMp}Dv@aUm%nhogby^?_G7~6L> z`wuD-B6ZYml};C^=M`q`O{-(4X{P#nfF5Dh(9MdethGClcOlld6 zQAoh(;{v)D$0NQ*mE;gjh}N8m0qsiew(9P06K_5diD<{k<>T`K_4MM7ZR2-iIkk|? ztq}6akKAx+KZSaPmY3H$jAPH8qiDjD+o*nO(%URo*LN2Q)>)79tjXj)vzaF$wM(kg zw031KJPzR4$_bc=EBPuiPS<_U%5sg4YTfN8J8?O18gaP6L;yby4B^rgDkFztJZ z5Gvs3r$6aTTVCf*ftjzRk~CmJF@cl(=;*+HE1CxuxhG;AEn{OG2g~>zg=A`;CTg05 z8cn=v*6~@(*0>oAc^&;tM0aMZsP0|QX%+qBPGn%Yf8otHYJ0(B(Z6C?#znG9U1W6~ zXZ5BFZD-8a?XIpIg^j@`ii#NkE*{ICYv63nhD!RmKi8FYYg=1x=(fqGLuS%k^rI}o z;E;#8$n8~kh&cYy!a&Ag8T#^SS$(|pyNigUhcigz4x#>LqW&Rsty&*=0sf}5wBKA# z-(LDF(f%igPG*ZMH1Z8Om$$F}{uCv@HEM+2=rz)>8Y?;XqaptQ-c-?aIDhw*r&YV9 zC(y1VHnJ?z#(*9J98owa$jAlvrMb)eqe$N)b~1`p5P}E0PD9+ZN!ZQ{7x-VuX?17XAI)0Y`A6fqSO4#w15rm!UKJx3HD0P;7Oz~_)CF=?7ymVSH4&oS%<2Tdr6Q7w8Ql|gUsaw)uNGW9w0 zqRBb@w2;pU(%Lt-MCvA0Bzl97} zag1IbZN^|eOW2R|HI=G;4g9MyzN%c$_^eb<7ghwvN0Dino6i z@bvhwA0L_}{{Skew)F2EgY;k!ahmBg*IqLgHgiCf(vmE(1w(SVVtqNqC{Yn!r35KF zWYQv!CqrcC*NRsPm5d=^52YG_C|DUdZhn=KMK$2sK}blxk$xgR%iA8JvUi_TzGhLFm3ZkK3R7y++D1}b5Jw;m)FD@(dHRR_AM>oD ze`pWyJ!LCNdGtG0>qEV6jay@-vEMXoV=e_04Ic}1$QvE1C0`d|2*T3JBN*i3ov-$^ znoHY>StXKa{LYSkT>H^FRIz_(ZRMF%qR0tT*wnjpYXef4%n?iAC<-ys1q&puX#gVH z$a&n`J`b|4uI<|1Zj+4Wlk=KasL0Q8^LG@GW{hdE%F37lApsb<6kz1gG4keyl*L-! z6V`>3s=yETg<8x?#4s{(f%U4RLnro}C;URKX32>$-x;oFSpH*Ixqqhyu;%=a@T5C? z!7Y1mY`g8;(uA;wBq`v^eT4zMD3&h_+j!jD*~4gO@*`Pa_p%UhSPFTI#tmaf@SaVV zZ5&Gsq~dJ+%BQ%fqigrm=n1FIs7%&r^DITOs&k$PrE`!?skzQ{qz3NduJ-=`y3)nd zvK=&ykT3xI7A%&2PelI!Wf-~8Y?gIPNnS}XS;tNleX;LESy>T$Vm#uUn*QEhMpgmD zEV#sH1e#A_a3CytI+?v|Yt)di+Oe3pp1VsMLe2Xr&d%D`TZ2}3EQPdU7@AomxEWOd zcOs*xxV)KqgLJU~j>prAe%bns%r{pn9IY9i-O~ftieiLe`g%@D=RWzYwmMHy;oWgd zpoqWqP9*%4C|CJPpoDx}FwPlOokJ1d1lND~Z{X*LT5gMFs@m=Ad2X5nK6K-)j#Ls( zeQSz$Rh5pNtLYwGiVIuB^O5`~jQ;>i?|%v|-v0n%*xfIfVrUdANHADqy$^wr>S~yc zb4g?OSn*(RPwc##{a4g-4h}rH?=5Stz%_j-WEvKYYQWp+c99T!q+nu|8yiNGt*xSF z_bM|=I!0(%uT^#=E;d*{V7_}ZNaJpC{nArsYm9t6SU=$v72SIqX=@r}(rVg0q|vGt zWMmj@4D(YgRCjz@Uta7TQrAvkE~K|*k0%`BvbB9P5===qL=6H(3gmsoB5)^_le1)n zwnsP8^JjLojJvY_Z8uMf!q3lSirzE80OFV%1xO~HHJe#1^?SQ}j-|LsnO-tGVEfZy z$wnk&is9lTXr=cK8v}9L&~JgyzaMlFBzPY%qHluv3jW5WM{U|ChmdRL;4Jb;R78D& zBBHv1>9zx>IjLjH$sBh0G^ln%W`*Q}{5V?dOBk5kTn1U?VlWV%z*R{j z2$*x0ZUr?yqjL-cfrS{PZK!G&A2?ir>?&A#V1stg{D~*>S3iqB4wxR;8h1RGA3T*H zk(?+B!AI7c?l0uETxY3?raRqI_4DKhDx9-pflcqMPV8P-+20tgIB;A?C_O{sxSHbF z>>qVuY@K2#H|3VGs6i9KY1JTEP6t*FKdntS&dIsdKMgnDB1v--n~Ua@BDe5$^yGfI zst(svnI|*J6R{tZeQCzubn7>|bX$8>)Gt3`ET&^>ta?H9z^hK4;WK3is$4dqsm+w@ ziS%E=vE%Ndkj@p9;Eric^iOt)rS}V3DWG=+64hsJ^rWbNMgI1-NPa2 zBDVl0p5E6o;@J1&O6zY{KlG;CJ59XPgQV%@u}-6t=xOpdkLC>Mc|018Z2eHns!VQW z1-dv6c&SqBHr6ph(?qeRFdgH^SJ?X3J(|b*#F5Efxu9jk9+@BM$lBZbkNYV0<1tCM z?-$9#;B>I6`Y0qz2Atd?fxtoB)!XK1+V z#X+Kw~mvMDm9zU{Yk_(e=Czjsh%VU8jK?+aak}y;`D!~0~ zpta8thVI%LMug7=rM8&C*4is@1daY82Q?es$M*i8XpmXihJFvi#HvT!)_~278aysy zJs&e6rR;9%_Em0@&UK4&s!kjef!msv_=2o8D;GJ#LB>zi)4FV^^o<|Sv()4>xl<%< zA4nrTfu?=@oj2BOPDzKK=4emVM?OmoXTe>QbZp%-L&}RWn@MvI_fV$qTCKHewO5~& znIp9hEPP7jaX`rRt;WaAPoeart8&YxK50;XQ_d)qhG|<7LnEK?sWsAm68Iys_ocm~ zY8N-N-%h=3fON+n-lp0ghITtEd+PQ&Z$z=$p<*SAuZ&Pn)ZvKj@~Rl}IP|#^&p_6- z4>a28)4Ieuor(|?eMzKM_&+>Ic0^_GW{!?soK7SGslPp>xtQ zqF$6!_7y3D(_vbbN%nd$CmljkO=3+Xdx*8R%xQ~34dGIYw>5pm;vLSHq1pUR!=9`c z3IO*c)5hiSn|kOwVq4u#-p|R1bufPyw*yCNX-c~kOM3(qF zl*;4z(Vy6@>8DP%>!@h0D>q0H#y_8W%ya@bmq+CW?La;Tz~jJ1#?bj=qEbQZF+ve_ z$d0ahnyaqjybDi6HD{}R(z5| z-bC42R}+wx_`(In0|t)y#rm|8=e^@)7C(djIl-PAbasocGBunuv?AwVP}Jf z68BR}Y@qERT8Rt*5_?vDfwiAf)lj_Zh!_*jD$4N%wA)R;qG+~Ld`6=85qWm-o}++! zn&&yrscODvlj261c7KUb^suX|!4%l~M&h&9H%|1lyVd5;&v78=i|8}!K;}au`FQ{Z zQJt|3&E->niz|Mg5Uq@Wq`wTT%6&MhFGA+dL6MM6bsyt$9kn*MqiVVyt!Z^Uh|%06 zGKU}x6+9Z{-Mkm!CM8M1t<4eJ@fucEdxOY#x|cwoxd*G;wHVP5I)T9)f;~sI0@aYh z3BVZcXyX3>C<}pFt2m%5LirxYD$GEMGagaY+ zEm)Q0o<}(q(>@+N zH#<7ZtwA7hftnv9rDT3o+6$OXlL)|#agqnEYJ2NgEZLI{Cr>>807@q1?4r1i&|16B zPF=kKtit5Dwr?*#Dr1xNG$Oe-d58X+)>6)^&-^NXI?72eK8JeU03K*-&w4nmpiqFp z%^4pu04TpqP?PgiO1+#Ep;#orvy2|}-IrDPIkF`gpoy3Jf#S_-V{%VPXcO^vU zhLRc*yQU8>P&xY1KyYaL9X|5@Zz|d|BV#xfsV%Odn8xt9VZj*fR#+TbsIl(;CeuX( z0!9F#sy=uWB#P($lm7rJQ5+X1pC$hQl~(5jTu`~y!TplGDVjUz*zh`sHE73oZq{Lp ztHN_oEx)Ik^;p*K7V`6wF^tlUSuYn_p4U%})&kg3^sG$CnUNrE)h|)_YdU=&3Da!c z*O~*(*RoUbrdi}BLc=^(*5%L3<{qDFHrqhfZLFNcV$6&44D*U*^BNgSI3a<-6v3>0 zh8v{wWaQ&*ISnn{?xZ%;M;Z`0C)S)SnG#H}>J=Qfk(`cknskBLB*#}!p=OJWQJSjtL(bSF1MYPqQHLzb^AJ~B#;NaRsJJ*ouh4NB}<#t0LE7eMsr;2 zt9~and%Ia}?UmvOATswgN9+5CQrtS5-QV2FAtaC)iN$7Wn!awe5QAZXos)Ls_7&sZ zbiWOMq`6L;ex!D=c=AzuivBH6a^BwC^?6dtS$d918K#!UNgnhp(Gul(sm9HqG;|lx z&0vBc#`Faxa$MZKtX9TCV~pe}JPJ#98%b)x2hHh4wdyM5j%b(E)JDKYdv~i@8;3y+ zE=D_8=9hMpn+V>;=be}^85ry-t~I;4oviJgs-9ch6(Q<#q!(EF$y|jrgGG_9bx9_0 zpnw+&Feu36aBG}=E_*i)Cru1Z<9BuBeo~0^TQ{>?32tNy-1MAt?@^20uc*hXEv#QO zZv81BJbtE~E@hbRr|EKv9~cK5RE)+R{?$VB(r|vc#Z9>qKx~__Xc@GuJycU$vtzdY zLT_NMO@?5r#{ zew7ujOC~yHJeR3sO6g^1&Q17PdaMy+<4oZTK?bj~NBgRl&SkdLAyduKFR)dg~8D zo*dLB)8du1wDix3a`fp$%%ffv*|;}0pLrd;U2#TIHHi@pbB|hrc!12;mRafP^1fVm z{c0y?a@n!;+A5j=UqC|*qoi>CgTX6)p0xAkv}*{bPtM({K1kuWgZ|o4rq0%x`xiU?fFxfIaypsP$hqbpyFHp0*j3 zhEswl$T1^={V`UmbnbDtD@$(K>njpPr(VevXSfHktK(yAovEj64MTr#eajZ5acLWi zZ6nR;{q81FIPxvyf zZw%UnmqarDM-7oxvRF?IAz3ao@&5oZq<&Iev%B{;i*0qM=(?cXcR|Z~-0Z7Kv^qz6x-_9Ga8eva=)*1IGu7h-hyO3b(ksw6@U?!;iOm zKc&h1+-HGWw^ERWCnp~CJY@6R*i)*|3LeeL{{Sk&0w@C*?V8za5&$RkptGLe)7p|$ zf_*^%ocEv*0KphFg^o^hTle*(nvh5(fcoPV(>@zrTiI-@GKb8#PykFK1V@LKGg0aWWAE|d1GsX-ZdHM6gzE3Db?n>Tw@|IKZww7 zo+#q$uraGj01@{%`q3745=@dC+m(fYA#=t))GE0h`$m8N0MS`Uzh%q+0FM5(l#*Nk zy{lurX?s@18dlp-vx*XMXaL-#{IjA>QSOpZW8(Cyrmg!%55?pxPcRRJY zfvV)h1aWc#n4Rj1eqBD_{{STjZ?(<_oo+t86%|VbZqDp}gEh0KK5(Sx*zrP~Omo;< zY}WNw{U`ecEgRrGtBXj~{RSyxZuE?RAx8vc;C84Hx0W`;DF^FEMUr}RRl85eJb<*Z zzAn{S@;Uzi*eU1s);@#LYF$Eeao9RvYOVODMwb5$}3;k|>kp^>WP z>Sd!T*IjU&ErMhQCY>QskXN-Jw}nSYY?eNPpP{r7plO&QY6c`KXk(w(T=~ zIg`uu>+eq!+TmjV0BTv#X1^?37(n}q{{Sfr(JL-M3J3L~?4XWkU`fFArBd5Erd0KP zDWc+Mg|iVTXxQ!Ifmyj_xbG53-aV9rM1l__5*HZnNny6JvA+V=QJo{|h9Kv?T^s!G+(R&Z)Mci!wVe@qTRV0)gbU4O;TCOOg;7Kjl1By_{mpz|8J}%K= z$B;>{vaxj?yS263*!2tD*y||96<7rW*b0sKw|S&Tpy@hJovAI`LOBX^h5DMVudQ_( zE0%`nJZ?P+@AVYdA#&xMl76+Pi-uU{xW2&Yahkrb>ap=QEv3hlQy-h{T5f9(=B#C4 zITflG98qL_XtF>(>uyLiyGYTl^^3nE(gu}}u5cIXO-Q&jZgJrb);?#5;ucSYgQP{$^>EvI}dt2LY5 z4S!L8w`viQiq;Yv&0{2rzl%F-3scp8$kSd)<{wro9{#f~#ed%!7T0D@E7O~MN?ba|2 z3Ugrwt!jVJH43v4AGN42e$|yB)b^&Kr$%NdC5O^j`5&z?GL<+y{b+_r*#)%P&XOm@ z?XMJrSy@?ARV=L&nh|_}qzq84?dH0Z2kRst$@rg(Vl5%r7J zw=K_;80&mfy?d^J*q$uyExWX}?LPT#E+)EAErCq>A74tPHS5&A)TFqLdQ_4?G}#nwBZZ6- z$ABt9YoV-Btk-SS$Ffl|;<6VPwDz&2$uc&GO!oSH#Oc?6|q*H-tg~S z+`R@EO})9`H%>_(K~}Dp_-ETMr-`+#TJ8x5`Iw%N4OK3s1bjKkn~5vMfVq!HzW6;) zEx=)n)T%3`ir`4#bib*qt5N(VCZ}a3&c@vk-pGSL4>1`h+ajqwUq#n8e!V8#-TG|S zR|rT3L5%%D^%W>HA;|tytx+rwkLn5KT(Sux0f&C|pzd?%X_DUJZ8Gg+k&D~8`Cr&m z_CqLeLn$0$iL^Qoa5I&lI_Ht;Mq`7J1p%9$dHPaG7t(r&^t^8kcWdm@GG1+1r3^t?kw*dU*qkpVu{!laabX6MrkT)3o!C zitLxR{C`vBM6R_tt*%}RaTH*1e6jwtJ8RJ^fj2qzrgqCr#~hPKL(~W&u5?0`SozZW zmQ95Hb!r&`j2w)EOx{sh2&c#!uSv-{A+efkxIHr-D0p0XYTDFcVcRI;(a4rpAI>yXSJcF?IaZWV;pwz`R<{g_(7*cUYkFQyv7?nAon!iWTJWF zMn5h^FWs`o`(fa=UYH_9jR5w?ddGO)@XssJpqup2hqQd7{Qc4<)!3exkrh3$ORaCi zkgPC$#YSRRW7`6k!o>*Z2Bjq3TJt7zpX*Az|U<~fSz1HAyq=$3`kJ<&%Ws=-(P0JNc89!&_kh07XmTY!6a ztavGZYSMJd%NhA2;aBNV z4YzGpI(?D)o>6k&I-URmi(OOZ>0m!fY`UGiS@CNh)zkH3cV7_^n5Eo z5pYg=vCTBjptlFVdNxAJO1BiAQb!*3y&E?4yr(xL%07Px-!9(kQb??$bcg^OtmKpG zYHMzh>ADBT-Ydgl)KN-s(?7ER0I8_fiEb8BSbWXfH7xO4rU9d9wvCucr5 zH12GZHWSh-8c8(#Ly*DqyZZ$NzSN|e<(@S$p*${0$Lm|M)uy+XEJ+`FZ#nAZ(7Jie z9AaT^+E}d4$P)Ukd9^XQDXnPOly#B$8`XdGs3r7r!z)D~!zsbyraNvx@J_Dm0xm`e zuhyEkC8{Q%BwU{{I*w?3NBVM@k4snL40h$=N1D-2JRiT^MKf5QIZ!SK0!q9I_mee%-4lP?LPkgTY-!kmIM|J2EfkIM6=9Lhp4pygflY zl>QYR{{T}-Af9;S>q!|{c0QG%A`}CsKG~x|62p!Frwk1hTrAONl_5S3Dwri24etG<6NDN7OjatzYv`9-a7ov$nUuZAVgPxNg~0 z7(joKHIJ*z;9C=Xu9rcqTv;<3E%!t1_fb7hRfblQ4I@rVTP*yIDJ>%pa>kl1ZBpiG z2bsbC5It#g`BN@Bf`iBFLAU9J$WW?B)4f7Cn%2-jzbaS1d!BFdi?qC#M$|>T%w@KI z86S{pF}!p*Y;OhSnxBTB=3iiaszt0q3AJ~Zs%fMOi%NCdEbU9XSw3TL$T;kK(=ty& zX4jRgEGIutGdO(BHEO5r-m;9D0?EOmjc+b7!nj)Q*!Qb{!mX8etLqkansTql-Vzo^ z973M0{Hmn4UaQ!F>{wS?cqtTmUdY@ULdPKfl^WiS*cb3yJG0OoX9MmNK0c@@JN5gqA z5dKJ1L#bH~IHLO7oZ!=jtq6lqnFsK>AJ&^|q>SzxmoqbVI+O0*i5ht%Wdx1}eJaiH z^J!df4dEOJfucqO1aME*t33sZ!sHxtT|M|{5DS}`(1~QX zcvlQ@Xj?B$i$>Fu6Q~6OdDvtr$6-xZrteadrKIzs&Rgq6-94oG{lwQw(h|gupS=hy z)~vClo>*_;UQK0VV>PV~cOo z+FVw$MK2&0=9S6dmj3`V6p}k=*l>BJ{v7zzb+dpiV%Ce6tV=^av^B{jXVQXA4lr1pdsJ1wWQtIs$Ok7isJM_~g8u;X2>Q_B z2dr^d_*qTm>S?uO_>EpJvz&X>w|Z#*0JL;SZ|!-yw#rEu9J+VN`&E5mcQuTQG);mk zOBV9FXv}ZMK~hJt7&Xu2!!VpnA3=Ktji_nP(%+}$k{s?q{{RXi03?#UiaIFE$Q1@j zIK@bw%WvKxlj2^|RzH*ssQS{Ab+@+sO4?Ump?{D0)2I=~ebs$W-irN3?ivlQd;XYW zHunv_{{ZpYD)tDp%^upt*ZwY3=SmNB9hH9mzsjT6t^WWL!#q*%Jl8j^aXhUgu6m0x z&P^n|BwRLo=9EpRa+YpJ`0RDzDYcOmdTvQ>rI9g+lObS_S$|VHz zO(cF**m+`uRKrP={x&dA6)L{lT9xLC+S=L8@CbalF1kKI-ix18PloBV8he4r2l6TZ09u=8E<6Nl z^v1;yE;K*;!odr{r^OQy*TWU{6o*%oEV&-kCYnP!vq_h8mc=(~Q{qO=JWpj zmfANQ4xK{<;nD-;cn;I@`=7du_ znI&TU4p^QkZn2{s9@5H5Zk9=|6Ro2I@_PzFZy;G!n;abTN_Qrw4xx7g!p=%Y5SBi| zwg7hU(bDsmm_JJ-(jT9I-`|py=@OGBPhnC$=^e(cq1kJZA!zO67S{w1%6$p@)LTW# z6*}9x+G%1~uAob+NryzX@^Y>#KPBFjqDG4$bT~Nw0It*hB6&S3&?-2}^G7T(^cIo2 zYR1*Je#6uk<1{U1Z7xPRds)YrgY0|KEjvcrIv$}7<g%M0S4Rz8>j4O?$uO)xz>3v4@}^xnh6H zoAprncl4sNS*2$_Pf4-!@8kDOn`YJ}hVxr4%@VJb3lzX(>POrCX}5MxvTW-WU(M&a zBmAl3TGnl6hAlTshvBsN7osSE&Ih?Zr23j-+(5R`vTl)&HHK=aiFECG9(epx>UEgo z#L}CG8NI!c?tA`$L0z!tnhRV>_(m2#p?^mXs zjc>yVw74+WHZSL-ey#71=4y)4PyM2p_p1|6)h_g#^t`i_tb-XIhOxCqZhJ`Va=QHo zAN4p=MfXNP(77lGUU>{~LHg2}ei{`oG|{LX$u#jgcy+o{&%bN!3sZm3HM4a_&F)nH z0Hp>`3-%J*M{{-JlH7taV20fF{jyFfrq3SRc_aEPxiE4V{{T!dlB4Sn$K_T5vA>DI&|qA8Scx5l2+_GkEhz2 zK+ee2Vi;_x=k%bYo7Ip!bzl$Oc5j4W=_eWATaM%Q_6no9;#woUA9=*&dr<(6n(G<# zuPvABD9e5>lkO{}yf3|tv}a&`kHZUyUhe0`Y0@R+MezMnW81zcShHDQIix)J61CI? zs@rzz*E{of#bu^JEU|{df#@^dtPQ~r( zF#3B^?YunAN=0r@Lu7;AhRn(JTpHh`Eu2_}J~Nu{smq@?3}tnjf<`}hX^;a_UD~ES zcI{97Q;+9S)gbX*W-++IT!vU4sR{c@Q5BISa@Ej(hn-L1H5^RcFwA_S$I$v$KiUjh zC^d2TK&E{X@&LsTS5lGgD=S$Wp`=!s!^*z3Jxaqx+|vP~4PEluYEmo?TdE-Z2M5#| zZ`Ah|iKFRX8Fi`K$t(Q9RkB4d(X}nRxpcVn9r>mkpDc94dmj=f>rGm>fZiOu{c~?^ zPTtjyRRm$k9@#aG7IQ$^A)*ztKtqXWT=(K``MKTNw0d+5&jK7qi|bc!;df`rr|T`O zJWQ^sj((z)>HZAtD=o(l_Fq(z^^g47@33G00Hh8DUVC3hx6u5HYg7mofEXCgYQ0B2 zj*HWb{!ti>ECji6ui`4|<$P(p4qu?R0M#jH3f%5s7-SZ!+wnmjJYt>Hbn{d-oTWAI zF%KZ-x-A&qGk*&wP!}TV{jvKC!~Ky4yL)0KmOu_!Gf#HfmeKKhNt)48JA36*h`<2T z4%60l--wJSbz1ew9f``li9%tv;D}$t)6KO1BIszFbc{phYV`ZTNqy zZ7umRzOi{M0+1!fa4Nmuutf&un8Fkz5=I6qqkJ~;S4Q4i3&*TY92d%%b!-65R1b=u z2%ENJX&_`Qdm462~? zpizY%Q}0Jy$ifJ0M9c8#a3*7tPtZ^(ibZ^4eLwuV$~WOHzwz>a<*cNYFFn_RMgm7_ z031+-XqBeGx5@8E+u#=aQ8Z#VN|8}2_JoC(_owP;NO2&?r6~AyJml7v1y;^#W#W*H z$9Q#wy)t4`oC;ZQY+fdvk4$5XpHoN@OdtZ38;5IUi?WIlz@7r=BY5ozS=<);d|O@Lnm_ZA0!Q_x3_ zUVVKj(g$dw$znfRW`af_7Nt!)GJ&4eohu39c9=O0h;IqSucT54bNuMPiD#3n_di-d ztVrb1h}k#>s`P+Ie!21vbY6Oe3r&WIj|m=uz%_n$IwN*Wq>NRd9$g zozhsE?b78#VR4EoZB5;Sb$*o7Bepo8g4JlpZP*AW>iG^E9O6`l3#FMlv&a;eQh{2^ z?p9@9fCvYSlT9(tBu|idr8>5uajG*sflx3}g%}tE0+S%x`yDFsbwfNQq;o|_T0@Kq zCD^quYYsVj2khcV`Nk_zvM??lOgYbCIB4>OA2G&iM6gQQbee=MMli$*a+=(i|V=JKu(GsNkjMI6Q zqhruWrJByCcdKcZcBV8)?IH5l9nYyX7Dcu|;H%X0pEM1Qtc4Jn!%Rx31KN|h^`}+R zC2`f}01v$wHvFzQkP-H+VKWC7xOs6WB%P>Q11djJIH|skrOB;b$rN&|Fv5me?i=#P zgSq?EG8-9f6_8>6)b(Mh-&*K*I($J=JAw?SoUk65tlXyWcIK7SY5I%taYQxGx-#VH z(%-t+`QB2Vl`=QX-&!tP6DR~ZU!iIWy0Hq%k(_s>1R|&zC;ULv2OS|_ks&1RDZi>q zSLk-?UwU=a!%eVl<>|^S+)3;C22df{oMr^j-#hEj_tB&2OU$(C9bQxrx7Xjo#f$(wx z?^(IWdA4%89V0c^kd_|Gb=UO07fIDlm8GAGHshjew&Xkd^p9$9w$Ux8M(gR1tm8SQ z9&8aFrt=-oAYzM>-~wOEarN{RG)yfVs^rR*&fU16>e1Y3yJd9SCrPb*-!ei6&7bz8 zG`AN!Ls4V|giN=tIHfk~FJLeU0Lbh`YQoD_(R6)A%GvGAH>0JU#(GE6p)?`G<@ZI6 zP40-tBByl`(|W+tKtLVp!e0$F4N7w&-ly`Qw}qFBHn4mgiCnaiyu6SU z9>fN}j1&Aqt<51Oxv+-T**wWug+v|6G|g+_P26+!wd#Dl@rs&lZ39-(HMlQrC5~?) zy0F8xD=$-MoDH59rk9cWX1F|dtTovhe$~?AhgFI@&01*INptya!R)_!OBRQrFgF)a z$AfJm)E+6p!b@c;xv+DF^^hug>BZ|5tph*A1ZrLnE3l!^Y)avZ+nRaM0Nd< z8tIej`VzcyMmoe`@Wbs*y9ZGHp{qIsWtCBbr>G!vR&4Sug|UWG516=ao^UEJrR_;{ z&C2_SLb!-5nd^#C@{>=Ij2y$Xa-J-*K3A2`8}>gha$Tw8_pMPB86yU|8*unFb-1-@ z^*Oa@p))yRsyH8NZjbQu)R|p%57!)4&Mb{&L9RTke2`rx;5b!O0z|e!frD1}gp-J( zmL8xOoZ^EYfl|dHB%1R$Cjct;sTPglmF9(bvs&se@*kM6;Lw@u634Zr5sNRR>nirq z^lLo_YNoGw<WxUs#6I5ihf>r;=&dEn%^o>WKcE!Sx3|K=3u~DaqNW2Lf2Al9 z&24Cp6e)6h=NPQ0Favp$lC7U4xcsT7aP7TX_emP2ha=cs#0$m==`HP2PXs(vx!l*y zwzoShdbOi;^*0@OqLNqCV~^uz5V{@^HhA`^_2$Hk?j+p0P0Q(elugtoQ-J=!k6M;i z10{^K4pd;tEp4#u=}!RSC4A><*l$dUHdM%&%$7E<|^w+|8j013qxb#r@pKbvuI z^1t_qtJMA-k~x+s^;rRLKzXgt_uwZBRy^0R@H2wRF3ZN%~QeX=M-FNZrakp3`SJ` z^9&47q^pqr77zS+{{YQdPX7Q62mKi9DXk^vP@w_Zva+;_)oK_Rt>cW=R#a8t3$oS$ zk($cNim)Ldqg2*bR7$=+I!2R}?OIb=Sx^YG+7?c6LtfRDl?N+Ywm&r;A0$>*R2++g zw6;IXLMF1ZhCQvuaMifnnld-}@CGX@DTr1^&=KDfoLy9fi zFU@6TI0;Hh8Xj>%kl=7DD=IXtX*&@PN$){dIjpR!DFotoA$KP<9N}v#DJ0`a!Sg2~ zit6d~tgNOAPdoy*7!1IXL7qY|ZR#sG%4oc@NAVQ2({XJ-??j?!U z!36!QD=C!@?Jbdm+jSM?j!)LNZ*bCEIu%d=$iVGcSyEM%miIHtq9V!$f4fcu3v!5n z9l7stGTe7K{BJ<1AF_cJ=f z33JlNky%+tCMoMl^Ab{qRxuCY9DiC*J1n}Kfn!w3@7#*Y%4G!W6mVL^86j3;y~(G$ zNeo&ug;B`KZcI zO&v4>&5(oZ6?vXW#d;|aodFmn90YjWo0E2iM+SBYqeH{6;8r{*HT(5Bw%#60DB6`%1Q}IShW2v z8^~c+o=!`@IQvmB$tCgguBDOO91eINVOd#8Brl6-atfIO9s@RL$*=BUl-(Iw*y8}6 z1!ZM1Oi{4jOxMdRV96lKbLmbg5ARLPuF^knPo-sLAekc8ZeG~5(GQ)6QR+G7inr;P zOBdG&vavV{cmlGroh0dLZw1UvZ!}?-puR^Qov5uk2o005h#r7Q9-ZqeDf}iWR+nWQ wwsNsJ0FnZXVw#}yuQi9VGqNu@Vcb?$QzlMd*_glav;P1;{c9^LDI~xD*-tmV4*&oF literal 0 HcmV?d00001 diff --git a/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/index.rst b/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/index.rst new file mode 100644 index 00000000000..6b23fee2371 --- /dev/null +++ b/Documentation/platforms/risc-v/esp32c3/boards/esp32c3-supermini/index.rst @@ -0,0 +1,220 @@ +================== +ESP32-C3 SuperMini +================== + +.. tags:: chip:ESP32-C3 + +The ESP32-C3 SuperMini is a compact third-party board based on the +Espressif ESP32-C3 RISC-V SoC. + +Typical boards include native USB-C (USB Serial/JTAG), 4 MB flash, +2.4 GHz Wi-Fi, Bluetooth 5 (LE), an onboard user LED, and BOOT/RESET +buttons. + +.. list-table:: + :align: center + + * - .. figure:: ESP32-C3-SuperMini-headers.jpg + :align: center + + Header silkscreen (V1601) + + - .. figure:: ESP32-C3-SuperMini-usb.jpg + :align: center + + USB-C, BOOT, RESET, and status LED + +.. note:: + SuperMini is not an official Espressif board. Pin labels, LED color, + flash size, and antenna layout can vary between vendors. Confirm GPIO8 + (LED) and GPIO9 (BOOT) against the silkscreen on your module. + +This page documents SuperMini-specific pins and NuttX configurations. +Toolchain install, flashing, debugging, and peripheral support are in +the main :doc:`ESP32-C3 documentation <../../index>`. + +Espressif's larger DevKit boards are documented at +:doc:`../esp32c3-devkit/index`. + +Features +======== + +* 32-bit RISC-V single-core processor, up to 160 MHz +* 400 KB SRAM and typically 4 MB on-board flash +* USB Type-C with the ESP32-C3 USB Serial/JTAG controller +* 2.4 GHz Wi-Fi (802.11 b/g/n) and Bluetooth 5 (LE) +* Header GPIOs: GPIO0 to GPIO10, GPIO20, GPIO21 +* 1 RESET button, 1 BOOT button, 1 onboard user LED + +Buttons and LEDs +================ + +Board Buttons +------------- + +There are two buttons labeled BOOT and RESET. The RESET button is not +available to software. It pulls the chip enable line that doubles as a +reset line. + +The BOOT button is connected to GPIO9. On reset it is used as a strapping +pin to determine whether the chip boots normally or into the serial +bootloader. After reset, the BOOT button can be used as a software input. + +To enter download mode: hold BOOT, tap RESET, then release BOOT. + +Board LEDs +---------- + +Typical SuperMini boards have a user LED on GPIO8. The LED is **active-low** +(drive the pin low to turn it on). GPIO8 is also a strapping pin and must +remain high during reset, so do not attach external circuitry that pulls it +low at boot. + +Pin Mapping +=========== + +The V1601 silkscreen uses two rows of eight pads. USB-C is at the end +next to 5V/GND. USB D-/D+ (GPIO18/GPIO19) stay on the USB-C connector +and are not broken out. + +Header row next to 5V (USB toward GPIO0):: + + 5V G 3.3 4 3 2 1 0 + +Header row next to GPIO5 (USB toward GPIO21):: + + 5 6 7 8 9 10 20 21 + +GPIO functions: + +====== ========== ======================================================== +Pin Signal Notes +====== ========== ======================================================== +GPIO0 ADC1_CH0; preferred general-purpose I/O +GPIO1 ADC1_CH1; preferred general-purpose I/O +GPIO2 ADC1_CH2; strapping pin (keep high at boot) +GPIO3 ADC1_CH3 +GPIO4 ADC1_CH4; JTAG MTMS +GPIO5 ADC2_CH0; JTAG MTDI (ADC2 is limited while Wi-Fi is on) +GPIO6 SPI2 CLK; JTAG MTCK +GPIO7 SPI2 MOSI; JTAG MTDO +GPIO8 Onboard LED (active-low); strapping pin +GPIO9 BOOT button; strapping pin +GPIO10 SPI2 CS +GPIO18 USB_D- USB-C only +GPIO19 USB_D+ USB-C only +GPIO20 U0RXD UART0 RX (nsh serial console) +GPIO21 U0TXD UART0 TX (nsh serial console) +5V USB 5 V / external 5 V (do not combine with USB 5 V) +3V3 3.3 V rail +GND Ground +====== ========== ======================================================== + +Do not apply more than 3.3 V to GPIO pins. + +I2C is routed through the GPIO matrix and has no fixed SuperMini pins. +GPIO8/GPIO9 are a poor I2C choice because they are strapping pins and +share the LED and BOOT button. Prefer GPIO0/GPIO1 or GPIO1/GPIO3. + +NSH Console +=========== + +``usbnsh`` exposes NuttShell over the USB-C CDC/ACM port. This is the +usual way to use SuperMini without an external USB-UART adapter. + +``nsh`` uses UART0 on GPIO20 (RX) and GPIO21 (TX) at 115200 8N1. Connect +an external 3.3 V USB-UART adapter if you use that configuration. + +Installation +============ + +1. Configure and build NuttX (USB console): + +.. code-block:: console + + $ git clone https://github.com/apache/nuttx.git nuttx + $ git clone https://github.com/apache/nuttx-apps.git apps + $ cd nuttx + $ make distclean + $ ./tools/configure.sh esp32c3-supermini:usbnsh + $ make V=1 + +2. Put the board in download mode if needed, then flash with ``esptool``: + +.. code-block:: bash + + make flash ESPTOOL_PORT=/dev/ttyACM0 ESPTOOL_BINDIR=./ + +The USB Serial/JTAG device is typically ``/dev/ttyACM0``. External USB-UART +adapters are typically ``/dev/ttyUSB0``. + +Configurations +============== + +All configurations listed below can be selected with: + +.. code-block:: console + + $ ./tools/configure.sh esp32c3-supermini: + +nsh +--- + +Basic NuttShell configuration using UART0 (GPIO21 TX / GPIO20 RX) at +115200 bps. + +usbnsh +------ + +Basic NuttShell configuration using CDC/ACM serial over the USB-C port +at 115200 bps. + +.. code-block:: console + + NuttShell (NSH) NuttX-12.8.0 + nsh> uname -a + NuttX 12.8.0 ... risc-v esp32c3-supermini + +gpio +---- + +NuttShell over USB, plus the GPIO example. The onboard LED is registered +as an output and GPIO0 as an interrupt input: + +======== ========== ============================ +PIN/GPIO Mode Device +======== ========== ============================ +GPIO8 Output /dev/gpio0 (LED, active-low) +GPIO0 Interrupt /dev/gpio1 +======== ========== ============================ + +Writing ``0`` to ``/dev/gpio0`` turns the LED **on**; writing ``1`` turns +it **off**. + +.. code-block:: console + + nsh> gpio -o 0 /dev/gpio0 + Driver: /dev/gpio0 + Output pin: Value=1 + Writing: Value=0 + Verify: Value=0 + nsh> gpio -o 1 /dev/gpio0 + Driver: /dev/gpio0 + Output pin: Value=0 + Writing: Value=1 + Verify: Value=1 + +wifi +---- + +This configuration enables a wlan network interface that can be configured +and initialized using:: + + nsh> ifup wlan0 + nsh> wapi psk wlan0 mypasswd 3 + nsh> wapi essid wlan0 myssid 1 + nsh> renew wlan0 + +That associates with SSID ``myssid`` using password ``mypasswd``. The IP +address is obtained via DHCP with ``renew``. Check the result with +``ifconfig``. diff --git a/boards/Kconfig b/boards/Kconfig index 07dd1583209..640e56c916d 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -474,6 +474,17 @@ config ARCH_BOARD_ESP32C3_XIAO The XIAO-ESP32C3 from Seeed Studio features the ESP32-C3 CPU with a RISC-V core, supporting IEEE 802.11 b/g/n WiFi, and Bluetooth 5 (BLE) protocols. +config ARCH_BOARD_ESP32C3_SUPERMINI + bool "ESP32-C3 SuperMini" + depends on ARCH_CHIP_ESP32C3 + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS + ---help--- + The ESP32-C3 SuperMini is a compact third-party development board based + on the ESP32-C3 RISC-V SoC. Typical boards in this form factor include + native USB-C, 4 MB flash, IEEE 802.11 b/g/n Wi-Fi, Bluetooth 5 (BLE), + an onboard LED on GPIO8, and a BOOT button on GPIO9. + config ARCH_BOARD_ESP32_C3_ZERO bool "Waveshare ESP32-C3-Zero" depends on ARCH_CHIP_ESP32C3 @@ -3910,6 +3921,7 @@ config ARCH_BOARD default "esp32c3-legacy-devkit-rust-1" if ARCH_BOARD_ESP32C3_LEGACY_DEVKIT_RUST1 default "esp32c3-legacy-devkit" if ARCH_BOARD_ESP32C3_LEGACY_DEVKIT default "esp32c3-xiao" if ARCH_BOARD_ESP32C3_XIAO + default "esp32c3-supermini" if ARCH_BOARD_ESP32C3_SUPERMINI default "esp32-c3-zero" if ARCH_BOARD_ESP32_C3_ZERO default "esp32s2-kaluga-1" if ARCH_BOARD_ESP32S2_KALUGA_1 default "esp32s2-saola-1" if ARCH_BOARD_ESP32S2_SAOLA_1 @@ -5270,6 +5282,9 @@ endif if ARCH_BOARD_ESP32C3_XIAO source "boards/risc-v/esp32c3/esp32c3-xiao/Kconfig" endif +if ARCH_BOARD_ESP32C3_SUPERMINI +source "boards/risc-v/esp32c3/esp32c3-supermini/Kconfig" +endif if ARCH_BOARD_ESP32_C3_ZERO source "boards/risc-v/esp32c3/esp32-c3-zero/Kconfig" endif diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/CMakeLists.txt b/boards/risc-v/esp32c3/esp32c3-supermini/CMakeLists.txt new file mode 100644 index 00000000000..6a2df2bad9e --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/CMakeLists.txt @@ -0,0 +1,23 @@ +# ############################################################################## +# boards/risc-v/esp32c3/esp32c3-supermini/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +add_subdirectory(src) diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/Kconfig b/boards/risc-v/esp32c3/esp32c3-supermini/Kconfig new file mode 100644 index 00000000000..7804a3b8d5f --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/Kconfig @@ -0,0 +1,8 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_ESP32C3_SUPERMINI + +endif # ARCH_BOARD_ESP32C3_SUPERMINI diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/configs/gpio/defconfig b/boards/risc-v/esp32c3/esp32c3-supermini/configs/gpio/defconfig new file mode 100644 index 00000000000..bad274c1bb7 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/configs/gpio/defconfig @@ -0,0 +1,49 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ESPRESSIF_UART0 is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32c3-supermini" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32C3_SUPERMINI=y +CONFIG_ARCH_CHIP="esp32c3" +CONFIG_ARCH_CHIP_ESP32C3=y +CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_IRQ_TO_NDX=y +CONFIG_ARCH_MINIMAL_VECTORTABLE_DYNAMIC=y +CONFIG_ARCH_NUSER_INTERRUPTS=17 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_DEV_GPIO=y +CONFIG_ESPRESSIF_GPIO_IRQ=y +CONFIG_ESPRESSIF_USBSERIAL=y +CONFIG_EXAMPLES_GPIO=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/configs/nsh/defconfig b/boards/risc-v/esp32c3/esp32c3-supermini/configs/nsh/defconfig new file mode 100644 index 00000000000..a2d1cafcca3 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/configs/nsh/defconfig @@ -0,0 +1,47 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32c3-supermini" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32C3_SUPERMINI=y +CONFIG_ARCH_CHIP="esp32c3" +CONFIG_ARCH_CHIP_ESP32C3=y +CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_IRQ_TO_NDX=y +CONFIG_ARCH_MINIMAL_VECTORTABLE_DYNAMIC=y +CONFIG_ARCH_NUSER_INTERRUPTS=17 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_UART0_SERIAL_CONSOLE=y diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/configs/usbnsh/defconfig b/boards/risc-v/esp32c3/esp32c3-supermini/configs/usbnsh/defconfig new file mode 100644 index 00000000000..2d5c46472a7 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/configs/usbnsh/defconfig @@ -0,0 +1,47 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ESPRESSIF_UART0 is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32c3-supermini" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32C3_SUPERMINI=y +CONFIG_ARCH_CHIP="esp32c3" +CONFIG_ARCH_CHIP_ESP32C3=y +CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_IRQ_TO_NDX=y +CONFIG_ARCH_MINIMAL_VECTORTABLE_DYNAMIC=y +CONFIG_ARCH_NUSER_INTERRUPTS=17 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_ESPRESSIF_USBSERIAL=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/configs/wifi/defconfig b/boards/risc-v/esp32c3/esp32c3-supermini/configs/wifi/defconfig new file mode 100644 index 00000000000..cad5b405e3c --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/configs/wifi/defconfig @@ -0,0 +1,78 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ESPRESSIF_UART0 is not set +# CONFIG_NDEBUG is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32c3-supermini" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32C3_SUPERMINI=y +CONFIG_ARCH_CHIP="esp32c3" +CONFIG_ARCH_CHIP_ESP32C3=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_IRQ_TO_NDX=y +CONFIG_ARCH_MINIMAL_VECTORTABLE_DYNAMIC=y +CONFIG_ARCH_NUSER_INTERRUPTS=17 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_DRIVERS_IEEE80211=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_ESPRESSIF_SPIFLASH=y +CONFIG_ESPRESSIF_SPIFLASH_SPIFFS=y +CONFIG_ESPRESSIF_USBSERIAL=y +CONFIG_ESPRESSIF_WIFI=y +CONFIG_EXAMPLES_RANDOM=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=8192 +CONFIG_INTELHEX_BINARY=y +CONFIG_IOB_THROTTLE=24 +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDEV_LATEINIT=y +CONFIG_NETDEV_PHY_IOCTL=y +CONFIG_NETDEV_WIRELESS_IOCTL=y +CONFIG_NETUTILS_CJSON=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_TCP=y +CONFIG_NET_TCP_DELAYED_ACK=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_UDP=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_PTHREAD_MUTEX_TYPES=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SIG_DEFAULT=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DHCPC_RENEW=y +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING=y +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_TLS_TASK_NELEM=4 +CONFIG_WIRELESS=y +CONFIG_WIRELESS_WAPI=y +CONFIG_WIRELESS_WAPI_CMDTOOL=y +CONFIG_WIRELESS_WAPI_INITCONF=y diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/include/board.h b/boards/risc-v/esp32c3/esp32c3-supermini/include/board.h new file mode 100644 index 00000000000..1357b86b172 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/include/board.h @@ -0,0 +1,44 @@ +/**************************************************************************** + * boards/risc-v/esp32c3/esp32c3-supermini/include/board.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_RISCV_ESP32C3_ESP32C3_SUPERMINI_INCLUDE_BOARD_H +#define __BOARDS_RISCV_ESP32C3_ESP32C3_SUPERMINI_INCLUDE_BOARD_H + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* GPIO pins used by the GPIO Subsystem */ + +#define BOARD_NGPIOOUT 1 /* Amount of GPIO Output pins */ +#define BOARD_NGPIOINT 1 /* Amount of GPIO Input w/ Interruption pins */ + +/* BOOT button (strapping pin GPIO9) */ + +#define BUTTON_BOOT 9 + +/* Onboard user LED (GPIO8, active-low) */ + +#define LED_BUILTIN 8 + +#endif /* __BOARDS_RISCV_ESP32C3_ESP32C3_SUPERMINI_INCLUDE_BOARD_H */ + diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/scripts/Make.defs b/boards/risc-v/esp32c3/esp32c3-supermini/scripts/Make.defs new file mode 100644 index 00000000000..48299c66787 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/scripts/Make.defs @@ -0,0 +1,60 @@ +############################################################################ +# boards/risc-v/esp32c3/esp32c3-supermini/scripts/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +########################################################################### + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/tools/espressif/Config.mk +include $(TOPDIR)/arch/risc-v/src/common/Toolchain.defs + +# Remove quotes from CONFIG_ESPRESSIF_CHIP_SERIES configuration + +CHIP_SERIES = $(patsubst "%",%,$(CONFIG_ESPRESSIF_CHIP_SERIES)) + +# Pick the linker scripts from the board level if they exist, if not +# pick the common linker scripts. + +ARCHSCRIPT += $(BOARD_COMMON_DIR)/scripts/$(CHIP_SERIES)_aliases.ld +ARCHSCRIPT += $(call FINDSCRIPT,$(CHIP_SERIES)_flat_memory.ld) + +ifeq ($(CONFIG_ESPRESSIF_BOOTLOADER_MCUBOOT),y) + ARCHSCRIPT += $(call FINDSCRIPT,$(CHIP_SERIES)_sections.ld) +else ifeq ($(CONFIG_ESPRESSIF_SIMPLE_BOOT),y) + ARCHSCRIPT += $(call FINDSCRIPT,$(CHIP_SERIES)_sections.ld) +else + ARCHSCRIPT += $(call FINDSCRIPT,$(CHIP_SERIES)_legacy_sections.ld) +endif + + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -Werror=return-type +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +# Loadable module definitions + +LDMODULEFLAGS += -melf32lriscv + +# ELF module definitions + +LDELFFLAGS += -melf32lriscv diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/CMakeLists.txt b/boards/risc-v/esp32c3/esp32c3-supermini/src/CMakeLists.txt new file mode 100644 index 00000000000..3b8f69d9955 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/CMakeLists.txt @@ -0,0 +1,60 @@ +# ############################################################################## +# boards/risc-v/esp32c3/esp32c3-supermini/src/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +set(SRCS esp32c3_boot.c esp32c3_bringup.c) + +if(CONFIG_BOARDCTL) + if(CONFIG_BOARDCTL_RESET) + list(APPEND SRCS esp32c3_reset.c) + endif() +endif() + +if(CONFIG_DEV_GPIO) + list(APPEND SRCS esp32c3_gpio.c) +endif() + +target_sources(board PRIVATE ${SRCS}) + +# ############################################################################## +# Linker scripts +# ############################################################################## + +# Get the chip series (remove quotes) +string(REPLACE "\"" "" CHIP_SERIES "${CONFIG_ESPRESSIF_CHIP_SERIES}") + +# Board common scripts directory +set(BOARD_COMMON_DIR "${NUTTX_BOARD_DIR}/../common") + +# Always include aliases and flat memory linker scripts +set(LDSCRIPTS "${BOARD_COMMON_DIR}/scripts/${CHIP_SERIES}_aliases.ld" + "${BOARD_COMMON_DIR}/scripts/${CHIP_SERIES}_flat_memory.ld") + +# Select sections linker script based on boot configuration +if(CONFIG_ESPRESSIF_BOOTLOADER_MCUBOOT OR CONFIG_ESPRESSIF_SIMPLE_BOOT) + list(APPEND LDSCRIPTS + "${BOARD_COMMON_DIR}/scripts/${CHIP_SERIES}_sections.ld") +else() + list(APPEND LDSCRIPTS + "${BOARD_COMMON_DIR}/scripts/${CHIP_SERIES}_legacy_sections.ld") +endif() + +set_property(GLOBAL APPEND PROPERTY LD_SCRIPT ${LDSCRIPTS}) diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/Make.defs b/boards/risc-v/esp32c3/esp32c3-supermini/src/Make.defs new file mode 100644 index 00000000000..12d7c0666fe --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/Make.defs @@ -0,0 +1,37 @@ +############################################################################# +# boards/risc-v/esp32c3/esp32c3-supermini/src/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################# + +include $(TOPDIR)/Make.defs + +CSRCS = esp32c3_boot.c esp32c3_bringup.c + +ifeq ($(CONFIG_BOARDCTL_RESET),y) + CSRCS += esp32c3_reset.c +endif + +ifeq ($(CONFIG_DEV_GPIO),y) + CSRCS += esp32c3_gpio.c +endif + +DEPPATH += --dep-path board +VPATH += :board +CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3-supermini.h b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3-supermini.h new file mode 100644 index 00000000000..b485fe0796b --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3-supermini.h @@ -0,0 +1,118 @@ +/**************************************************************************** + * boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3-supermini.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_RISCV_ESP32C3_ESP32C3_SUPERMINI_SRC_ESP32C3_SUPERMINI_H +#define __BOARDS_RISCV_ESP32C3_ESP32C3_SUPERMINI_SRC_ESP32C3_SUPERMINI_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* RMT gpio */ + +#define RMT_RXCHANNEL 2 +#define RMT_TXCHANNEL 0 + +#ifdef CONFIG_RMT_LOOP_TEST_MODE +# define RMT_INPUT_PIN 0 +# define RMT_OUTPUT_PIN 0 +#else +# define RMT_INPUT_PIN 3 +# define RMT_OUTPUT_PIN 10 +#endif + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: esp_bringup + * + * Description: + * Perform architecture-specific initialization. + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + * Input Parameters: + * None. + * + * Returned Value: + * Zero (OK) is returned on success; A negated errno value is returned on + * any failure. + * + ****************************************************************************/ + +int esp_bringup(void); + +/**************************************************************************** + * Name: board_twai_setup + * + * Description: + * Initialize TWAI and register the TWAI device + * + * Input Parameters: + * None + * + * Returned Value: + * Zero (OK) is returned on success; A negated errno value is returned on + * any failure. + * + ****************************************************************************/ + +#ifdef CONFIG_ESPRESSIF_TWAI +int board_twai_setup(void); +#endif + +/**************************************************************************** + * Name: esp_gpio_init + * + * Description: + * Configure the GPIO driver. + * + * Returned Value: + * Zero (OK). + * + ****************************************************************************/ + +#ifdef CONFIG_DEV_GPIO +int esp_gpio_init(void); +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_RISCV_ESP32C3_ESP32C3_SUPERMINI_SRC_ESP32C3_SUPERMINI_H */ diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_boot.c b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_boot.c new file mode 100644 index 00000000000..88d51c4917b --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_boot.c @@ -0,0 +1,91 @@ +/**************************************************************************** + * boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_boot.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "esp32c3-supermini.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp_board_initialize + * + * Description: + * All Espressif boards must provide the following entry point. + * This entry point is called early in the initialization -- after all + * memory has been configured and mapped but before any devices have been + * initialized. + * + * Input Parameters: + * None. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +void esp_board_initialize(void) +{ +} + +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional + * initialization call will be performed in the boot-up sequence to a + * function called board_late_initialize(). board_late_initialize() will + * be called immediately after up_initialize() is called and just before + * the initial application is started. This additional initialization + * phase may be used, for example, to initialize board-specific device + * drivers. + * + * Input Parameters: + * None. + * + * Returned Value: + * None. + * + ****************************************************************************/ + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void) +{ + /* Perform board-specific initialization */ + + esp_bringup(); +} +#endif diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_bringup.c b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_bringup.c new file mode 100644 index 00000000000..4b0f86f6345 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_bringup.c @@ -0,0 +1,394 @@ +/**************************************************************************** + * boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_bringup.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "esp_board_ledc.h" +#include "esp_board_spiflash.h" +#include "esp_board_i2c.h" +#include "esp_board_bmp180.h" + +#include "espressif/esp_start.h" + +#ifdef CONFIG_WATCHDOG +# include "espressif/esp_wdt.h" +#endif + +#ifdef CONFIG_TIMER +# include "espressif/esp_gptimer.h" +#endif + +#ifdef CONFIG_ONESHOT +# include "espressif/esp_oneshot.h" +#endif + +#ifdef CONFIG_RTC_DRIVER +# include "espressif/esp_rtc.h" +#endif + +#ifdef CONFIG_DEV_GPIO +# include "espressif/esp_gpio.h" +#endif + +#ifdef CONFIG_ESPRESSIF_EFUSE +# include "espressif/esp_efuse.h" +#endif + +#ifdef CONFIG_ESP_RMT +# include "esp_board_rmt.h" +#endif + +#ifdef CONFIG_ESPRESSIF_I2S +# include "esp_board_i2s.h" +#endif + +#ifdef CONFIG_ESPRESSIF_SPI +# include "espressif/esp_spi.h" +# include "esp_board_spidev.h" +# ifdef CONFIG_ESPRESSIF_SPI_BITBANG +# include "espressif/esp_spi_bitbang.h" +# endif +#endif + +#ifdef CONFIG_ESPRESSIF_TEMP +# include "espressif/esp_temperature_sensor.h" +#endif + +#ifdef CONFIG_ESPRESSIF_WIFI_BT_COEXIST +# include "private/esp_coexist_internal.h" +#endif + +#ifdef CONFIG_ESPRESSIF_WIFI +# include "esp_board_wlan.h" +#endif + +#ifdef CONFIG_ESPRESSIF_BLE +# include "esp_ble.h" +#endif + +#ifdef CONFIG_SPI_SLAVE_DRIVER +# include "espressif/esp_spi.h" +# include "esp_board_spislavedev.h" +#endif + +#ifdef CONFIG_SYSTEM_NXDIAG_ESPRESSIF_CHIP_WO_TOOL +# include "espressif/esp_nxdiag.h" +#endif + +#include "esp32c3-supermini.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp_bringup + * + * Description: + * Perform architecture-specific initialization. + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + * Input Parameters: + * None. + * + * Returned Value: + * Zero (OK) is returned on success; A negated errno value is returned on + * any failure. + * + ****************************************************************************/ + +int esp_bringup(void) +{ + int ret = OK; + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = nx_mount(NULL, "/proc", "procfs", 0, NULL); + if (ret < 0) + { + _err("Failed to mount procfs at /proc: %d\n", ret); + } +#endif + +#ifdef CONFIG_FS_TMPFS + /* Mount the tmpfs file system */ + + ret = nx_mount(NULL, CONFIG_LIBC_TMPDIR, "tmpfs", 0, NULL); + if (ret < 0) + { + _err("Failed to mount tmpfs at %s: %d\n", CONFIG_LIBC_TMPDIR, ret); + } +#endif + +#if defined(CONFIG_ESPRESSIF_EFUSE) + ret = esp_efuse_initialize("/dev/efuse"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to init EFUSE: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_MWDT0 + ret = esp_wdt_initialize("/dev/watchdog0", ESP_WDT_MWDT0); + if (ret < 0) + { + _err("Failed to initialize WDT: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_MWDT1 + ret = esp_wdt_initialize("/dev/watchdog1", ESP_WDT_MWDT1); + if (ret < 0) + { + _err("Failed to initialize WDT: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_RWDT + ret = esp_wdt_initialize("/dev/watchdog2", ESP_WDT_RWDT); + if (ret < 0) + { + _err("Failed to initialize WDT: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_XTWDT + ret = esp_wdt_initialize("/dev/watchdog3", ESP_WDT_XTAL32K); + if (ret < 0) + { + _err("Failed to initialize WDT: %d\n", ret); + } +#endif + +#ifdef CONFIG_TIMER + ret = esp_timer_initialize(0); + if (ret < 0) + { + _err("Failed to initialize Timer 0: %d\n", ret); + } + +#ifndef CONFIG_ONESHOT + ret = esp_timer_initialize(1); + if (ret < 0) + { + _err("Failed to initialize Timer 1: %d\n", ret); + } +#endif +#endif + +#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER) +# ifdef CONFIG_ESPRESSIF_SPI2 + ret = board_spidev_initialize(ESPRESSIF_SPI2); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret); + } +# endif /* CONFIG_ESPRESSIF_SPI2 */ + +# ifdef CONFIG_ESPRESSIF_SPI_BITBANG + ret = board_spidev_initialize(ESPRESSIF_SPI_BITBANG); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to init spidev 3: %d\n", ret); + } +# endif /* CONFIG_ESPRESSIF_SPI_BITBANG */ +#endif /* CONFIG_ESPRESSIF_SPI && CONFIG_SPI_DRIVER*/ + +#ifdef CONFIG_ESPRESSIF_SPIFLASH + ret = board_spiflash_init(); + if (ret) + { + syslog(LOG_ERR, "ERROR: Failed to initialize SPI Flash\n"); + } +#endif + +#ifdef CONFIG_ESPRESSIF_TEMP + struct esp_temp_sensor_config_t cfg = TEMPERATURE_SENSOR_CONFIG(10, 50); + + ret = esp_temperature_sensor_initialize(cfg); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize temperature sensor driver: %d\n", + ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_WIFI_BT_COEXIST + esp_coex_adapter_register(&g_coex_adapter_funcs); + coex_pre_init(); +#endif + +#ifdef CONFIG_ESPRESSIF_WIFI + ret = board_wlan_init(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize wireless subsystem=%d\n", + ret); + } +#endif + +#ifdef CONFIG_RTC_DRIVER + /* Initialize the RTC driver */ + + ret = esp_rtc_driverinit(); + if (ret < 0) + { + _err("Failed to initialize the RTC driver: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_BLE + ret = esp_ble_initialize(); + if (ret) + { + syslog(LOG_ERR, "ERROR: Failed to initialize BLE\n"); + return ret; + } +#endif + +#if defined(CONFIG_SPI_SLAVE_DRIVER) && defined(CONFIG_ESPRESSIF_SPI2) + ret = board_spislavedev_initialize(ESPRESSIF_SPI2); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize SPI%d Slave driver: %d\n", + ESPRESSIF_SPI2, ret); + } +#endif + +#ifdef CONFIG_ONESHOT + ret = esp_oneshot_initialize(); + if (ret < 0) + { + _err("Failed to initialize Oneshot Timer: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESP_RMT + ret = board_rmt_txinitialize(RMT_OUTPUT_PIN); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_rmt_txinitialize() failed: %d\n", ret); + } + + ret = board_rmt_rxinitialize(RMT_INPUT_PIN); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_rmt_txinitialize() failed: %d\n", ret); + } +#endif + +#if defined(CONFIG_ESPRESSIF_I2S) + /* Configure I2S peripheral interfaces */ + + ret = board_i2s_init(); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize I2S driver: %d\n", ret); + } +#endif + +#if defined(CONFIG_I2C_DRIVER) + /* Configure I2C peripheral interfaces */ + + ret = board_i2c_init(); + + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize I2C driver: %d\n", ret); + } +#endif + +#ifdef CONFIG_SENSORS_BMP180 + /* Try to register BMP180 device in I2C0 */ + + ret = board_bmp180_initialize(0); + + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize BMP180 " + "Driver for I2C0: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_TWAI + + /* Initialize TWAI and register the TWAI driver. */ + + ret = board_twai_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_twai_setup failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_DEV_GPIO + ret = esp_gpio_init(); + if (ret < 0) + { + ierr("Failed to initialize GPIO Driver: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESPRESSIF_LEDC + ret = board_ledc_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_ledc_setup() failed: %d\n", ret); + } +#endif /* CONFIG_ESPRESSIF_LEDC */ + +#ifdef CONFIG_SYSTEM_NXDIAG_ESPRESSIF_CHIP_WO_TOOL + ret = esp_nxdiag_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: esp_nxdiag_initialize failed: %d\n", ret); + } +#endif + + /* If we got here then perhaps not all initialization was successful, but + * at least enough succeeded to bring-up NSH with perhaps reduced + * capabilities. + */ + + return ret; +} diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_gpio.c b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_gpio.c new file mode 100644 index 00000000000..08c7223d824 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_gpio.c @@ -0,0 +1,522 @@ +/**************************************************************************** + * boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_gpio.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +/* Config */ + +#include + +/* Libc */ + +#include +#include +#include +#include + +/* NuttX */ + +#include +#include +#include + +/* Arch */ + +#include "espressif/esp_gpio.h" + +/* Board */ + +#include "esp32c3-supermini.h" +#include + +/* HAL */ + +#include + +#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Onboard user LED (GPIO8, active-low) is used as the GPIO output. */ + +#define GPIO_OUT1 LED_BUILTIN + +#if !defined(CONFIG_ESPRESSIF_GPIO_IRQ) && BOARD_NGPIOINT > 0 +# error "NGPIOINT is > 0 and GPIO interrupts aren't enabled" +#endif + +/* GPIO0 is used as an interrupt input example. GPIO2/8/9 are strapping + * pins and should be avoided for this purpose. + */ + +#define GPIO_IRQPIN 0 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct espgpio_dev_s +{ + struct gpio_dev_s gpio; + uint8_t id; +}; + +struct espgpint_dev_s +{ + struct espgpio_dev_s espgpio; + pin_interrupt_t callback; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(struct gpio_dev_s *dev, bool *value); +static int gpout_write(struct gpio_dev_s *dev, bool value); +static int gpout_setpintype(struct gpio_dev_s *dev, + enum gpio_pintype_e pintype); +#endif + +#if BOARD_NGPIOINT > 0 +static int gpint_read(struct gpio_dev_s *dev, bool *value); +static int gpint_attach(struct gpio_dev_s *dev, + pin_interrupt_t callback); +static int gpint_enable(struct gpio_dev_s *dev, bool enable); +static int gpint_setpintype(struct gpio_dev_s *dev, + enum gpio_pintype_e pintype); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static const struct gpio_operations_s gpout_ops = +{ + .go_read = gpout_read, + .go_write = gpout_write, + .go_attach = NULL, + .go_enable = NULL, + .go_setpintype = gpout_setpintype, +}; + +/* This array maps the GPIO pins used as OUTPUT */ + +static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] = +{ + GPIO_OUT1 +}; + +static struct espgpio_dev_s g_gpout[BOARD_NGPIOOUT]; +#endif + +#if BOARD_NGPIOINT > 0 +static const struct gpio_operations_s gpint_ops = +{ + .go_read = gpint_read, + .go_write = NULL, + .go_attach = gpint_attach, + .go_enable = gpint_enable, + .go_setpintype = gpint_setpintype, +}; + +/* This array maps the GPIO pins used as INTERRUPT INPUTS */ + +static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] = +{ + GPIO_IRQPIN, +}; + +static struct espgpint_dev_s g_gpint[BOARD_NGPIOINT]; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: gpout_read + * + * Description: + * Read a digital output pin. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * value - A pointer to store the state of the pin. + * + * Returned Value: + * Zero (OK). + * + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(struct gpio_dev_s *dev, bool *value) +{ + struct espgpio_dev_s *espgpio = (struct espgpio_dev_s *)dev; + + DEBUGASSERT(espgpio != NULL && value != NULL); + DEBUGASSERT(espgpio->id < BOARD_NGPIOOUT); + gpioinfo("Reading...\n"); + + *value = esp_gpioread(g_gpiooutputs[espgpio->id]); + return OK; +} + +/**************************************************************************** + * Name: gpout_write + * + * Description: + * Write to a digital output pin. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * value - The value to be written. + * + * Returned Value: + * Zero (OK). + * + ****************************************************************************/ + +static int gpout_write(struct gpio_dev_s *dev, bool value) +{ + struct espgpio_dev_s *espgpio = (struct espgpio_dev_s *)dev; + + DEBUGASSERT(espgpio != NULL); + DEBUGASSERT(espgpio->id < BOARD_NGPIOOUT); + gpioinfo("Writing %d\n", (int)value); + + esp_gpiowrite(g_gpiooutputs[espgpio->id], value); + return OK; +} + +/**************************************************************************** + * Name: gpout_setpintype + * + * Description: + * Set digital output pin type. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * pintype - The pin type. See nuttx/ioexpander/gpio.h. + * + * Returned Value: + * Zero (OK) on success; -1 (ERROR) otherwise. + * + ****************************************************************************/ + +static int gpout_setpintype(struct gpio_dev_s *dev, + enum gpio_pintype_e pintype) +{ + struct espgpio_dev_s *espgpio = (struct espgpio_dev_s *)dev; + + DEBUGASSERT(espgpio != NULL); + DEBUGASSERT(espgpio->id < BOARD_NGPIOOUT); + gpioinfo("Setting pintype: %d\n", (int)pintype); + + esp_gpio_matrix_out(g_gpiooutputs[espgpio->id], + SIG_GPIO_OUT_IDX, 0, 0); + + switch (pintype) + { + case GPIO_INPUT_PIN: + esp_configgpio(g_gpiooutputs[espgpio->id], INPUT); + break; + case GPIO_INPUT_PIN_PULLUP: + esp_configgpio(g_gpiooutputs[espgpio->id], INPUT_PULLUP); + break; + case GPIO_INPUT_PIN_PULLDOWN: + esp_configgpio(g_gpiooutputs[espgpio->id], INPUT_PULLDOWN); + break; + case GPIO_OUTPUT_PIN: + esp_configgpio(g_gpiooutputs[espgpio->id], INPUT | OUTPUT); + break; + case GPIO_OUTPUT_PIN_OPENDRAIN: + esp_configgpio(g_gpiooutputs[espgpio->id], + INPUT | OUTPUT_OPEN_DRAIN); + break; + default: + return ERROR; + break; + } + + return OK; +} +#endif + +/**************************************************************************** + * Name: espgpio_interrupt + * + * Description: + * Digital input interrupt handler. + * + * Input Parameters: + * irq - Identifier of the interrupt request. + * context - Context data from the ISR. + * arg - Opaque pointer to the internal driver state structure. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on failure. + * + ****************************************************************************/ + +#if BOARD_NGPIOINT > 0 +static int espgpio_interrupt(int irq, void *context, void *arg) +{ + struct espgpint_dev_s *espgpint = (struct espgpint_dev_s *)arg; + + DEBUGASSERT(espgpint != NULL && espgpint->callback != NULL); + gpioinfo("Interrupt! callback=%p\n", espgpint->callback); + + espgpint->callback(&espgpint->espgpio.gpio, espgpint->espgpio.id); + return OK; +} + +/**************************************************************************** + * Name: gpint_read + * + * Description: + * Read a digital input pin. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * value - A pointer to store the state of the pin. + * + * Returned Value: + * Zero (OK). + * + ****************************************************************************/ + +static int gpint_read(struct gpio_dev_s *dev, bool *value) +{ + struct espgpint_dev_s *espgpint = + (struct espgpint_dev_s *)dev; + + DEBUGASSERT(espgpint != NULL && value != NULL); + DEBUGASSERT(espgpint->espgpio.id < BOARD_NGPIOINT); + gpioinfo("Reading int pin...\n"); + + *value = esp_gpioread(g_gpiointinputs[espgpint->espgpio.id]); + return OK; +} + +/**************************************************************************** + * Name: gpint_attach + * + * Description: + * Attach the ISR to IRQ and register the callback. But it still doesn't + * enable interrupt yet. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * callback - User callback function. + * + * Returned Value: + * Zero (OK) is returned on success; A negated errno value is returned + * to indicate the nature of any failure. + * + ****************************************************************************/ + +static int gpint_attach(struct gpio_dev_s *dev, + pin_interrupt_t callback) +{ + struct espgpint_dev_s *espgpint = + (struct espgpint_dev_s *)dev; + int ret; + + gpioinfo("Attaching the callback\n"); + + /* Make sure the interrupt is disabled */ + + esp_gpioirqdisable(g_gpiointinputs[espgpint->espgpio.id]); + + ret = esp_gpio_irq(g_gpiointinputs[espgpint->espgpio.id], + espgpio_interrupt, + &g_gpint[espgpint->espgpio.id]); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: gpint_attach() failed: %d\n", ret); + return ret; + } + + /* Make sure the interrupt is disabled */ + + esp_gpioirqdisable(g_gpiointinputs[espgpint->espgpio.id]); + + gpioinfo("Attach %p\n", callback); + espgpint->callback = callback; + return OK; +} + +/**************************************************************************** + * Name: gpint_enable + * + * Description: + * Enable/Disable interrupt. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * enable - True to enable, false to disable. + * + * Returned Value: + * Zero (OK). + * + ****************************************************************************/ + +static int gpint_enable(struct gpio_dev_s *dev, bool enable) +{ + struct espgpint_dev_s *espgpint = (struct espgpint_dev_s *)dev; + + if (enable) + { + if (espgpint->callback != NULL) + { + gpioinfo("Enabling the interrupt\n"); + + /* Configure the interrupt for rising edge */ + + esp_gpioirqenable(g_gpiointinputs[espgpint->espgpio.id]); + } + } + else + { + gpioinfo("Disable the interrupt\n"); + esp_gpioirqdisable(g_gpiointinputs[espgpint->espgpio.id]); + } + + return OK; +} + +/**************************************************************************** + * Name: gpint_setpintype + * + * Description: + * Set digital interrupt pin type. + * + * Parameters: + * dev - A pointer to the gpio driver struct. + * pintype - The pin type. See nuttx/ioexpander/gpio.h. + * + * Returned Value: + * Zero (OK) on success; -1 (ERROR) otherwise. + * + ****************************************************************************/ + +static int gpint_setpintype(struct gpio_dev_s *dev, + enum gpio_pintype_e pintype) +{ + struct espgpint_dev_s *espgpint = (struct espgpint_dev_s *)dev; + + DEBUGASSERT(espgpint != NULL); + DEBUGASSERT(espgpint->espgpio.id < BOARD_NGPIOINT); + gpioinfo("Setting pintype: %d\n", (int)pintype); + switch (pintype) + { + case GPIO_INTERRUPT_HIGH_PIN: + esp_configgpio(g_gpiointinputs[espgpint->espgpio.id], + INPUT_PULLUP | FALLING); + break; + case GPIO_INTERRUPT_LOW_PIN: + esp_configgpio(g_gpiointinputs[espgpint->espgpio.id], + INPUT_PULLDOWN | RISING); + break; + default: + return ERROR; + break; + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp_gpio_init + * + * Description: + * Configure the GPIO driver. + * + * Returned Value: + * Zero (OK). + * + ****************************************************************************/ + +int esp_gpio_init(void) +{ + int pincount = 0; + int i; + +#if BOARD_NGPIOOUT > 0 + for (i = 0; i < BOARD_NGPIOOUT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN; + g_gpout[i].gpio.gp_ops = &gpout_ops; + g_gpout[i].id = i; + gpio_pin_register(&g_gpout[i].gpio, pincount); + + /* Configure the pins that will be used as output */ + + esp_gpio_matrix_out(g_gpiooutputs[i], SIG_GPIO_OUT_IDX, 0, 0); + esp_configgpio(g_gpiooutputs[i], OUTPUT_FUNCTION_2 | INPUT_FUNCTION_2); + + /* GPIO8 LED is active-low; drive high so the LED starts off. */ + + esp_gpiowrite(g_gpiooutputs[i], 1); + + pincount++; + } +#endif + +#if BOARD_NGPIOINT > 0 + for (i = 0; i < BOARD_NGPIOINT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpint[i].espgpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN; + g_gpint[i].espgpio.gpio.gp_ops = &gpint_ops; + g_gpint[i].espgpio.id = i; + gpio_pin_register(&g_gpint[i].espgpio.gpio, pincount); + + /* Configure the pins that will be used as interrupt input with + * falling edge. + */ + + esp_configgpio(g_gpiointinputs[i], + INPUT_FUNCTION_2 | PULLUP | FALLING); + + pincount++; + } +#endif + + return OK; +} +#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */ diff --git a/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_reset.c b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_reset.c new file mode 100644 index 00000000000..adb00a80b75 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_reset.c @@ -0,0 +1,83 @@ +/**************************************************************************** + * boards/risc-v/esp32c3/esp32c3-supermini/src/esp32c3_reset.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include + +#include "espressif/esp_systemreset.h" + +#ifdef CONFIG_BOARDCTL_RESET + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_reset + * + * Description: + * Reset board. Support for this function is required by board-level + * logic if CONFIG_BOARDCTL_RESET is selected. + * + * Input Parameters: + * status - Status information provided with the reset event. This + * meaning of this status information is board-specific. If not + * used by a board, the value zero may be provided in calls to + * board_reset(). + * + * Returned Value: + * If this function returns, then it was not possible to power-off the + * board due to some constraints. The return value in this case is a + * board-specific reason for the failure to shutdown. + * + ****************************************************************************/ + +int board_reset(int status) +{ + syslog(LOG_INFO, "reboot status=%d\n", status); + + switch (status) + { + case EXIT_SUCCESS: + up_shutdown_handler(); + break; + case CONFIG_BOARD_ASSERT_RESET_VALUE: + default: + break; + } + + up_systemreset(); + + return 0; +} + +#endif /* CONFIG_BOARDCTL_RESET */ diff --git a/tools/ci/testlist/risc-v-02.dat b/tools/ci/testlist/risc-v-02.dat index ac60ce2788f..a6666f43851 100644 --- a/tools/ci/testlist/risc-v-02.dat +++ b/tools/ci/testlist/risc-v-02.dat @@ -5,6 +5,9 @@ CMake,esp32c3-xiao:nimble CMake,esp32c3-xiao:gpio CMake,esp32c3-xiao:wifi CMake,esp32c3-xiao:usbnsh +CMake,esp32c3-supermini:gpio +CMake,esp32c3-supermini:wifi +CMake,esp32c3-supermini:usbnsh CMake,esp32-c3-zero:wifi CMake,esp32-c3-zero:jumbo CMake,esp32-c3-zero:sta_softap