From 9317b95af113d6e29db19fc2ecebd261d6ce42d8 Mon Sep 17 00:00:00 2001 From: Felipe Neves Date: Fri, 9 Sep 2022 20:31:20 -0300 Subject: [PATCH] boards: xtensa: esp32s2_franzininho: add support to the ESP32 S2 Franzininho educational development board. Signed-off-by: Felipe Neves boards: xtensa: esp32s2_franzininho: remove docs section for debugging since this board does not have any on board debug or connection for that. Signed-off-by: Felipe Neves --- .../xtensa/esp32s2_franzininho/Kconfig.board | 8 + .../esp32s2_franzininho/Kconfig.defconfig | 11 ++ boards/xtensa/esp32s2_franzininho/board.cmake | 9 + .../doc/img/esp32_s2_franzininho.jpg | Bin 0 -> 40886 bytes .../xtensa/esp32s2_franzininho/doc/index.rst | 93 +++++++++++ .../esp32s2_franzininho-pinctrl.dtsi | 67 ++++++++ .../esp32s2_franzininho.dts | 154 ++++++++++++++++++ .../esp32s2_franzininho.yaml | 18 ++ .../esp32s2_franzininho_defconfig | 24 +++ .../esp32s2_franzininho/support/openocd.cfg | 4 + 10 files changed, 388 insertions(+) create mode 100644 boards/xtensa/esp32s2_franzininho/Kconfig.board create mode 100644 boards/xtensa/esp32s2_franzininho/Kconfig.defconfig create mode 100644 boards/xtensa/esp32s2_franzininho/board.cmake create mode 100644 boards/xtensa/esp32s2_franzininho/doc/img/esp32_s2_franzininho.jpg create mode 100644 boards/xtensa/esp32s2_franzininho/doc/index.rst create mode 100644 boards/xtensa/esp32s2_franzininho/esp32s2_franzininho-pinctrl.dtsi create mode 100644 boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.dts create mode 100644 boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.yaml create mode 100644 boards/xtensa/esp32s2_franzininho/esp32s2_franzininho_defconfig create mode 100644 boards/xtensa/esp32s2_franzininho/support/openocd.cfg diff --git a/boards/xtensa/esp32s2_franzininho/Kconfig.board b/boards/xtensa/esp32s2_franzininho/Kconfig.board new file mode 100644 index 0000000000000..3f78d5baf931e --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/Kconfig.board @@ -0,0 +1,8 @@ +# ESP32S2 Franzininho board configuration + +# Copyright (c) 2022 Felipe Neves +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ESP32S2_FRANZININHO + bool "ESP32S2 Franzininho Board" + depends on SOC_ESP32S2 diff --git a/boards/xtensa/esp32s2_franzininho/Kconfig.defconfig b/boards/xtensa/esp32s2_franzininho/Kconfig.defconfig new file mode 100644 index 0000000000000..4ef2fdce9bb0d --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/Kconfig.defconfig @@ -0,0 +1,11 @@ +# ESP32S2 Franzininho board configuration + +# Copyright (c) 2022 Felipe Neves +# SPDX-License-Identifier: Apache-2.0 + +config BOARD + default "esp32s2_franzininho" + depends on BOARD_ESP32S2_FRANZININHO + +config ENTROPY_GENERATOR + default y diff --git a/boards/xtensa/esp32s2_franzininho/board.cmake b/boards/xtensa/esp32s2_franzininho/board.cmake new file mode 100644 index 0000000000000..2f04d1fe8861e --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/board.cmake @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "${OPENOCD}" MATCHES "^${ESPRESSIF_TOOLCHAIN_PATH}/.*") + set(OPENOCD OPENOCD-NOTFOUND) +endif() +find_program(OPENOCD openocd PATHS ${ESPRESSIF_TOOLCHAIN_PATH}/openocd-esp32/bin NO_DEFAULT_PATH) + +include(${ZEPHYR_BASE}/boards/common/esp32.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) diff --git a/boards/xtensa/esp32s2_franzininho/doc/img/esp32_s2_franzininho.jpg b/boards/xtensa/esp32s2_franzininho/doc/img/esp32_s2_franzininho.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fce18f48e63d22b9c847c0883daac2447fcaf381 GIT binary patch literal 40886 zcmb5UWl$Wx7cRWG6^9mgTPW`Cw)ieCZ7J^V?$Y8cy7=N&T+5H*1&X`7TXE<1|IWN0 z?#FwQ$z)>BGnq_sPR@B-c-sKrffSS#00;;G0K&fncv}X@0ucWv2>&aP{$(UoWTbzB zhJu2OijIbXj*f>-oL`yo)IajTmROlK=`*g{}((m z3KA*;A{qewU#|-OKR9G0L`+mvG*q~R_zUH`a z7E^%-iK<^i_;1DnE1oVtedet&vSrAV$O2^rG(vtFSnK*5>S;8nmc_BNmjR%OoRxhme`I2m&quO} z6uy_oOHr3me*;u`tfmU|G3^#F@euq*p@%sQYrblgJa2(2#6M&Z=`Lt7mrCTZc!rA< z>tORkEGA(9=svTiF5T}WMr_(*0u5v9{B!=CuLWxGk`D1sMUvIX*M{7y3BQ1)hCl4L zQ+Ug;Vtotr;>6(@UAU|Km~+KmoI1BrOTJDK6NAMbIBdhSCLuxk{;3J${f@j4nDrxt z)5GS|4f#n9>uNFE8gF%&22y|2Oa($AcO~DP3lL`4D^@@vkhrY|cwszl^cS`n_4rq4LEQ;^{#Dl9iOG-X`v*|ROGotbN zXd}a}UBys*dq!KW(92%@?_BK+$cFlPx?b5L&org4aYLGe_9J zUW28*grxhD$>idJvK6o3x9vfd^`Xs4X#3bO50s{^%toG4I&x;T)HEGxp(co$D)3>v`BAE-9Oc7QvmYWiDh;{)LSxaYdBY;zDmzg%)) zb4|m@`aU8;m0ez*sk8*UldOq4X)xBVhB*^Ixzz1+0ByUR6E4cb>hGlL83NHX6&U(; z;G4sF{W*;3Grk?~IvbeO0z0(O{~=*Bf1Hr*iWTP5ULr`_Jylwby{Sl1E>?6g&#wqq zyI7PdIxzgJ^{wI?&ohZy!c^@W03W}}=yGV>vf5P#QP1+fY`sYl>C4oOTnKPN()bu# zH=n?Td!4hiCPQw4G#ZY?Zv36ZJ4zw(hm}{GkP_I5 zOs95~uD`m)P)H5*hTbq_NzIEBTJ+FOsB zkCx!!_fqxKS8%(?7}v{bh5gxzQ^+zZWtbJLuM3b_&Fjumf ztHj*E{8(4o0WlzozlSuipHm&sE@uuiRW~9nlYMsg%a|6L-Bkpk*7TJuOK-K zMLzMJY$Aqmg&sXWSO2)BvMf+o$r(YbW`AB9ezb60t{>8-3oXycE9d)5w7F(d;$mQ?P z#Fud;Ss%OLfAfTdF9Zq0Lo!cT90#N+QhxsGzq`_7I~Gv|Oo<5$lNNpvkf zqauwg?!CtmnQaKF2CLM$6h{mw~V zTAT3MdzxTpIR?u?tuq3?5g|BzJ}*GkqQ%|Aqq!N2N5eNJ(^;!R%}z*=a;*ZFoW^BDx^dGAqNuPgxTvNGeyc*ikt9 zB~V?PhA&x~>%B39n+N-unAc#REwgUkdu)>dlfq*9Y?4!7>V{8+=}wFTbF(fbX~{%T z6g;q^szco*rUO-!x1oX?vC>`v}Rfu$OTjLnN`;a;zfd+L9UIlEBKH^?jADuYF(|$cMHj{IS`xn9$x~!BXE7#U=&q_UEj9s! zWi)Mnzmkpsdx~YLM$V;#ivIVXGV(VIj^e)lb^K zcUB$U)KA*S&hXAZo}$7svBCjga7xXtgO4O6e8We>9C>LSK2Td&>k<)#CDocO5zko` zFI37<*+^TvV9_em7f>0(RGRiyJs)>z(-vCI-YMIVGhV*|)Fd0dsZGg3*uE+cqb0oe z^(h_MMJ8(Fi%oklE0P@Ff0uIZmsSArHLl1?-5Q@fnH&z;Nd0b)7Chx{qSJS|<*Ct> zO1)SdQ+G6CU5(r8jF3~ztg_*}w^OES5gj)eFpmxbr~eXh)Cq5lMNCA~Mn|P-NRAPA zKDT_;Tl4A^q2#ymnNJgj9+lA|_2o2LZ6)B7)}8KL42&j@Ol2v3z?MfxX7_&XaXCMy zj>?5QPBJ<}LJ`xYEZW3WtNBOhG&TS57h?~-&5P6h%!zEF&|(D-Kg7le zGvpEGXzqq5pfmrZ?Llr(OvF7V5^uOsZ0KBPX%MsGD*wdD&-u|c-VbS&lG$WY#(Y(W zsElfuuKR*JQj*d`&_mjYmEs-s3;CGvWu7&KXsa!8Gr2KJI8YWj?&tmj zf1p9Hku*5gTI6d*h(r@IoGdpQx^yG+hrq)!V&f_dCOLE*3v(4E{-GyJl3PNvy zLNc_Q@w3TKirPEycXg1Kv}KHcFMLoe^66hG34Gh$QM!yIW@HS zNt_HyriKOw)k``C=gC!8$h8xX33i2ve`))`WCU6V+b7xCl_cS(c=cv#d8)>WsKl3* zo44&>Owl_}hh_4)C%srb^UbuQs3zAmL|inM{})=!84vKDLIBq#$KmR7iP0m zDzBt>;4BHr?U*m7DMcTZQ%k-#N&0rN?!0!N`@t*kj~lXRsvKk08xsxc+!WH9l<= z&u6Jew0>C=M%Uj9Vh!s=jjFCuG+xsCv8*lqlX3}+cVu9j2Wr8b*s(W&XGBety<2F^ z@UG;oNU}?+kWeK)0%os!Nz|mM1xSQ2K5*PU>0}^f<8oNY4unGJJ+%n^;=O-Ph?l_FMMy)unBp)l~zhkFT?7WRJh zH$WP^5{U}*26(Ys=&K)~YI2F35wVu@dl%3kl6rzQ;}wQ44QiQb4AK3TiO#9&4d4al0w!;cevCk~3z2xsKvH*_)U{6z;D!x4tY9ag4*FK!HhU zXlNSG!ewRiR+Gl=k);E)fXe4W1qBJx8JWgR%^I6`w`263NDc5>+QtELOdqm zRf8#%oU}@!j=U9~j-V}_FmeCIze+Dl)M2fuXY`Sbmf6ZXiFTUuwFKKd;3>$k60`Y= zV?hjdE-TSUhzk=}ff@`+V~2wFvrZ7Ab3oK0{LZ3Wt5h$2gj9~OOYr`%%mg}-AK<_` zm<@bc`Z!f{lrz|y4w@Tj%AlNo$W%Thmz4K@N@(a<<;cKjz@&i*x-fM<>g>iwv~3>j`hb{ zt|{M1dhd=QzT-PeIuf~^-nVE$|Eaw%kIDu@zJyIDr=p-3S0kbV6(k!Lf}?c_gWuPE#Tg+ z%}|3+@K(q|G+x z3gvw*DFSi)lyC!f@nGo-dUE`U1Vny<2k-=#tI}d8k8g-9rwy*!NZgl1Y_ z_bV64vinV|<}2<{=0%$HVJAzl!Eg1{;CSt#4YA+@v|utvo=?lTLg<$svbP7@Z-B4_ zd~M9cEVqo~5n*Qi0E*V+q~}PUA0ja{M;CK~znUlTmQTaKA!wNrLpQyLXS7Swl;zUn4@{RLa!J1KKr*8DFzmIxc-7D4|R(KTqJ zbwECLZ48eHl%po?vi+RzuT8*tPi$h@1#viP#E9Ckd8eWA3K>Jn7Ud)Q$6kkQ%f)nJ zq?R;)7Vn#xb~K~OY}X()>8b}+&5@^dj65IHJMka+deisG6+OVHCEftf{1rmLKExxL zauNlvo;Sc|X>MJ2knOs6gha%*gxT8G-nb~u%GRqUjH^{`mOthDvGEH?BB8TRu`dc+ znY_Cn2+}DTF_tkjf~m17D#Z9ZZB}UHnetRwbA*EioLz<&F7ESsWr{C6-vH9DmJ(+{ z_cnZ~Yna!)DVT zo#-j6R&j%0x0+6gfC6NuAf6?S_4zX{LJs<@uU=h*l7sAH`0FW&(-X&$?NIZ9Cd+td zcmcTB)0;lWh`}H5bWLLt;a!B_`8@jIip|_J_I~UAV`{u%90$*Pym36CFk4w=%$<;e z(Uk{<$g3)#4LI!={To0*J&ozM>gVF%J6Qv8DCAj3G})zOb}`+^w&(PrcjcFeN3#Rw zbv(Uhk)%S#G#hN*x_D3%13?Ow7n#$})!0}(D}cNwwkd1ZhZQ1LnPvWU!=-1854_wWM(Sg0|jNp6D&-+#B^h!hfE~wB%^7ZHl3)=4Gq~ZsLu$XXEmKU-3pbo zgq5iYbsR;<%j4LFAt47XF`J+q0%fM6$tX2o+F99|+XQT76F$BY8B*4sq^rjPdzh9 zheb9RuF^v~YH<3jC`rQd!NVfhFPbtR;={z<6*t*Js1lo(+#cqQ?P@<+&Q@);`bpIIhA%Sgxf8FG zZC=&*y6GUn_{cIYbv$Ps>wq|#c@HgV$wC>k-ly$*^PKis@qa4U)QdDeMF?G6U&VuI!wv2&5wU`NMMjaK#nN7aM7zt6D1E@xd zy{U^90(#v2M5SryBZX_+#E|B%X~Ga7%OH5@<#C0aqFP>K zNQsh{f>Qc@1m9I0C#_l;e1E~E2DIYm{tVLA7OJ^dvIJve60RZ-n|~9@bM7tU7M~I7 z4e3@jYsQr=FTRs)qJZ^l=@8YA!qJTM%$>mnxkZ~5Pbo=7MCPwrzM_1fhux`MZHtG< zaUbLtxIbT{ug-6u$P%QAar51z5w$mfkOPn_YSATm$#sczk9Xc(F-4)#c#N$Ij(f-` zdux|``s9|*u2;nN2C!Dhx61ffY@#q|xD)KPtRYvqeKXi96Z#}sPbJ~vb1$cK&U6 zZj3D?3dGv{(dpzM@SxVF4lbHIY=?z3*rahj6S~@ToGJ><3d0e&B4Ho0XQ7&GnDMwz zu%0LqqQv=$r3omukl2oMZ?Py@v(Ilum(;t8Rnbrp_|cd@W+r_zAzqD9koOtKzaByj$<(i_|;rt<^*X>+9=3?dQmjN^w!!h>obAkGw=A;Rp+$_+k{q_a;my*_k&WhI~8Q*5BhqK8e;!tZWSc53jjrD7$%!}eQA zloE&7d!-DV8oQG7c$RV>r_9bP&NZYD@|9PMFJkE(1=Vj#vz}2#2_-Jof3p4f&2cmK z(cv(bx$$GNsh9#%(Sk3Fzdufq7fPLO%Ng^ga^yLyy5@#7(9j=UVzQ=secrY{Mc+kM z_?&O?4PYhr6cnwKojmQjP^L|gwe6!r1>VlTU2~ajG3hAX+|8%drDfU-V29^l1v9N1 zalGC$Vx(qB*?>f4>7_6BS66Y3&9>YGb37S4?3-;m#S7vGQn2Y0mFUfA&HjAWrV3k9 z4~;Pj@xj!juC6(X;(C`+i|Yq^S(^S4M4jR6C(2v0;7Lv&Im~1bECA`+$x#+bc2q?Z z6y_J^D$NlT?{!9Uo)S<^pDKu2)oAO-T`rF()u_}vYyE4GO^Y4j#@?^24+4;~YK?UR zlqF=fm}rNSfX!K^7Am@E?gvHAK{GX!Eq3xUDbCu9Do`uHnwZ;~ELFd7J#;5m>n6S_ z2l55gNQr}^r)POw^I?gXl}Ope{Df)0)cN$`6ZtvTnhB_DhLsX*M}+B$#g&@LK?}y6 z56~AL9$KJ^0r(toWv6XPovje_JyqZ&+&1=rHzl(*nXf(0E%!hD(SLyyX7v91v=K-} zQV$8tT?je+oo>v=DtO4vD8KC~kh?pstI-ZWe_DbWc#KRncyNWU61y(wYOBew;PUt_ z5%P@GD#ol)*=F$eTc;*M;L<8v-u4bs*OnB{3&y(F9<$g=bnji?oB{NLAJ-))aMWsuJ3u$cNQ zmBFmT5Ri(RlFU0$LT)o+(nCo20~uML1^(>3gadVqBsNRGGYnYHXg^Y9z2K@~*{fs~ z^_3)aFQxIaS$>>lhr@L1V0-uFnO3KtwLTT1#i$eyRd6urgCQl0x#Y!XK@O4nLQ}7_ zzj9KsmNq>#5*R|qd}0`K#yU~-Nso)NHuf-=fzs*H`BXz86a#p_aA>ZHmB0**PgO5vuE;v;c=M-m4 z<$7Exx&g`(Hdr(P-L@a%;rG^6)S>#K-m2}CmX+vgYDzy*TtzqhWy49bN^`&zJEvrr z?MYBlzj@Fhu>5y92_2hdZQCDkU`m`9X)JmPAM0Mv!UUfxyy9C@ zGWY&CDm_uq-`djoZX5~YV43EIPVUZI2n*HaKTdY8iHb47kSwzm7t~+N>i_E*#8_3Q z*yK@+0j4J0xxd)`?I>+7eRr^sl$nP8?1PjJV=+eYlI0Yt>WlC>@v0sx3JW#{b zJo7&+boG1~-jp$MXQ;|Ihg+4emxLyEo6kqpALY60043qN`O?!Qu*n>kv_+X{a1T_EayVYmJVw1X(KDhSbH+=}>T?R!AXgUnWR#I8Pf@Qhr zsk$UC--gl%Z22a~mjWwea~RvX;Ym;6;#Y1FhtSSp(9PmnnJA##Y_==CGNX zXO=9fXqK;|&cA(3&EfyAI_Gn}?m(4QD(_hv)%iKCx9=B)cwR|mDwm{Bi9@oapefxXd=xJe;8u=PF z2Nm)eTffcZR*op+Z4-S~;ow99kw}k2hVJ?g?*phUKiB1tI5wyk)xv&i8GkH5raHjD zWc@`Yw5*#QbtQxX@l@kkY0H6LHi(5Zacy7%heJr0#RFIUOFODWihr`ogc9v&vxKeo zq@0s|ZR7;aX8J)YW=d1v87O)GXjs((g$y=`^A-Bx2Kum7jfA!VQ&&!c2fQ`2Nr z8>bhCH7xp=w06f@2=7aE zq|ey3I6J0PTSr+_x5LZ1KheXiTzLdU5BD2!1Tb~}?8fn>{`!l?IMpC_z+mj^@Vc-^ zc=d5uwY-!O-|QyB|Le#b0F{E#N3#Du8-?Kw0Me(9o=wkR);*m+xO*V`GmrU`HDjHX zp^27_#jZD-?4b~YN`j2j8GI}7nG%>x?Ut4<{Ha`saCOI^TkDR(wy8%Qdux2Nf3K9N zg>*NcsFb@{iu9Xws{%L8%z_R05Ja(47V0XFd>)D-J9(S@M|lnsG_|a+w>Qt2uh`&$ zO(PLME(9CsEO&BfW)N_DZBFx*HwcaM^{*vH(E4;9fqVk49;gJ0uK>_GRDVF?zP6gV zIcT^=R>LRGMx}%jD$T7vaI_i0pZ148{*jz~JcG}F)h=&Za)l2%vm*;}xy(>dg_~2G zPTw3JyaAl&80Z4Xf9$!?f}FAs%5KzGy=Ikhg#Z{XHWK|wg?Tu~XYD&33fe8QIyl!T zx5JdF!4lEJ3m@P4bzjY-)Kf5|!hikp7xmAJsG=5Q`}hE0_*N79Y%>~O|? zh5ynrgv&VeplO#KR=*;+@QB(PmPII2g48_-tJGT$=CS_%u`KKfp>ZAakUX_Pbi%5J zv+%pkPT*>?s&Bjjs!L8=dMxtUIUDl>3!{E(BF=`P5S5oAQ0oVh@GnttZ6RAvowlEL zKC(c@c_=l9qF=evC3QZ_%dYtIiBw(u^Eia)1%w;%?C=oD=q~$^Od}b~bS*4)j5Q}} zNJG4+*Cqp#`o66lY`Ts1b=W4=RLJ@tv!qF9l2D*=Z@~$NYq_Marb?qQe%z^SG=l39 z_JeVM)@p?<35hKsX*&aHrn8g}p88N{dzSY^pl<-}3T67*zaEs#0&2&keQgiCIyOqQ z%HXe@Kze6sB(rjZ?GHo?J~o2=25ic^nvm}EzhtM+LM}$B)FU=K@tG=CFFAtCn-bOa zic9*h5WqC*9qdeF3qOBL{47|;QP~@~yPkUbSG`3MzgDWo?30VRqi}}J=U9Fu(L{b= zqr>2t-LDLEL;8LhmHM6bDnUv(jzw$3Mk<^jU@7np{4pv#E6Fu6k7v%=vD1cU5C{M$u6#jy<`j z7-|q@h@dhBo6J9+xxSH35enNtHF7>FHQe(MH^hl=g;CM1gqKzB^e4NzDVd%1c+MSc z@%P~6f1O;>023?O-P$77wCfN@F^oDy4rmvJ#PJEaCla&Z;pJpWEQVEwInNy3G>MB) zQf9o%Z==0Z1Ibz|4MSlMHjx`!f7Gkph7)J$63b|f6BD0tESe|8Co}|&9RnVZT|2Y& zBDhZf+0>9qflR_woYO(H*03F2MebXK{Q~gRU?n_QHkY|q3I5|jxpbBf?&_+cIeMFi z?!+(1(+f0Z>#{wb@Wds_s*HvbR3D_uz5!16Urz0XVkCj6>jhOfZQ)f$dziIZM?1)>*iXJ{VX092=Fkn}nUdCqSgD!qd3DehK_b8hLgzk-JorPCT7`G0m80)NJ4WbCEH^P0qZ95V#2bP%rUk{MMb)XSRdZv9++N zS{}q)&K#h()LU%nLd;O`>C*K{9e5Ua?1 z41WMrp*ND)?>RaO7xJBL*NfY%c$$w!v`fFz87P5_&S(vG*BNS^EGu^_HB3Iel=L{D zSg3~u^X74O#;FK3h?o0YWNO6ki;2jxPiN2ee>5sPy@D(q{yjrg7*kPh9n;7#R=>rwEYEYoju#A)qmX4>?kP$};aZb=L)hO`M zY8$y>Puks|#;T97)3p`5&)`kl4ltX}?T_3I6Y++Wi%(Gon@H zrAn8vE-+A>it?F+vw{hA#16d0a}E`Z0XjsYd9bfm6LNE0_}qJw+U~K-YTT=9UC5hS zOwT$d#X81^Doj5@#^CI;aN?`EaLLpa{nxO9(XsU^1gM0e^_$tW`2IV*$9X@M+Mtm5 z>`YP@D<#tcQjIvJ2$Z;~k!TcM5jc$!j3zz=ZPA&v->A!eQ%Oz#k!+$xPvcG5P~x%J ztVf6CuNDf5+|*t~qCPrA@)V!cX(NNUXX4Pg?@L1vILZq~b?Y19$+_CeH5cUA#0UQG zwKFFyejMlZuQC}Cq)x~9(8|%2LS<7~%*>K`%O;yX_7GU=d|{V!eBxS#N!a1}{Bw@w z{AMMEofVkehMWXa88uL!6u8hOF`j|*7rx&!W3Wo<4cXM7MCm?w>_N%rCn5=+b@~EW z<-V7hb@GnP_jxSqP9>R6q`zmSVoP%EQL-u7FF@y@XKot}CUS$>^9URXPGwcMmRgEK z>a&c=P9(IoSyZf1_8pJ3Qc`ckhG{4q!t$pjc@n|8+Bg>|qQT#0{zEEmPHs6s=Py() zpyV$ai?@r%cn2)0^%VIv`wOLOwXXtB65>?N4;g#Y=pn-txf;&okIoq#G zs>O?9x{c-?OxnKKGpQDD03)DPj(KiTi3k8PFB%8#s0<-CEbbK%FD0C39x%XttlRst z-N$*55Hk>6&o&F>Ezt%yGtL?_D!b-S`gEDa%_KtdJQcFeM`HIoD;hiKpw8ty%#0Q# zkZT-}L(AUnUeo$d-WaX>f?023HF=V-yIq^vOBjpNLPp z@jmOCXGLU^lY2rLi6QXEOOb5mOq*6ky;(W5D=kgR1)DAD3pJca#HKb$dX#DdO?BC2 zAWn`gr+1h8eKQsDiU)qsfoFBUi;Q2JkCg;&;%rSg=>DQ59Gsg$@edQY`rX8Tv(R^|zAUESz!1YXyS@6qT#M zuf()?$EQ5jxJzJ(SD)yI)RjOL|EyX5YdhSRGO&rmf~tNpTHF?tM&@>eKkE5=dApdx zDcye&rjfW}7h6PyIpYHe08O&gCO>oSIHpKn|%jO2l0lTk2s5zLZ8>xh1Dc^i3$ zEG;S0Y8UX663)>zwaHcs_|25t+zslswP2Q0$xzBEt9C|2(AwBY6-e#iw`eL9hsEek zffaYf>bb*4@v6Ik^KvdCxAxSJZjF++i3@sLaUP+as7UM2vaq^xgfUn_jVSI}9_%94eO71Kx-3Lgh>DS`;$J9}eIK@U9+>|E1xJ&! zi2jIGv!x4au(BSG1$lTwl=etL z16*(x?_#Ocq#X~TS3)+%Eo>c^RSPXn={O(nx=lC#2}BwI!|*;jKBD#jZqPM4pj=JH}JAmmCNLN{EnKDL!e$ z67|mzI<0vAM5SyI_D;OwHU^pf3{BesitW=fZ0fJ4rfkOXt~52XFBdwH758>{D_cxo z#W-w^0uo+08>GjibdcUEyCt zEp(}RR}CEDG*OF&73W@#+F5Jrs0C5r!;RNKyn z(`kQ0s9n^%t}2FC4CA$nsR@)B@*G=?2vZtFDZD0|oqm7NoQ5;=POA;@P^Lkx?7r=O zbP`a1Z75aLkJ)PV-$YRAIMu7?U9Az!`;V;8c`Lusq9bTj^U$(vxTpI77V(9cf|H6gu3#~RY$v0q-$V!VtGWfbwc&ONAv}KspZRO zJ(Nk!YS7p0C6I?YQH!1#v|xh9>yc4N=@y%}GD5FHNuykrc}ROf^3>W9ye<_Uv_iJP z2t;a6cq&pOOV6`Gz;NMvzehcY!2Td#R<5L@F-INAe6*={`3a;2vY90e#ura{olEQ4 zBz|r?iC7+CVHPGJ7yftk%F3IGGBA%I$*;W!>znvI?rLJeQ%l?H=JsIh6( zWPAlw4_T-SAA_GgD8ARQv413Nj?KceJnwEDn7k6(oCT`!dL3N$GztTZZTY(0Ct zf}Pe+oEifeb}T>+l8zB^E~pP*XxZ2J;o+5;B;}%Y$9cu4vw_n3DOXOT!C?U*9$3sG z`bQe>g4qOWDt!Ig?2WE}jL!Iwy6ElTI!4GfP;R6@TJO2<>|!&L!!N6&v`!!(>IO(; zYkD8k0HL35GVk>KTo7Tg-PV8jGij+EQ}C^%dYKvM7k|hJS)Icc^o2}&TrHibsw`+RIbf-NEwNLxs#pNhoM6QPgV~nfa zjNMDY)SXCrvpB7>k*G48&ACfE_9Fq& z)V~03!n$8${7Z5Mnul@f=>&4t>J)Uc-+}D4D}`KvtJIvOSwBy%r>xt`R<+ht8j}>l zd*1-SmhaV${{nf^WC)XG;!y=jXTFZh3tUzkyHw83ox*3#Xd#8l73>G+$YpMi*{<4Y z^enE$azG;nwiM=$n$Vf!8X97H^PBmBuw7zcrh$)@_S70N4G|s!rf3B=0wuFyAFBgO zh87#PFpsPUs}V5J$Q7v3KGGWu>$q)Yr!6IzWrG251fDZA8IuwQ6%j=p}M_3&lw)g(iy-jflDt;Z9aHLF@~i z9%~*eWv6%aSJB-TX7E&1>&};d$SfM73~ngEA4-*@(9;!*EfKMXgkonXPdS4)Q+;D1 zFaHU1(Dm2(dDfXjKB7My!c-OErcL#s$xA8IKVf*v%=9ktna5-%$EZcbs7;zCn3Wpw zMPx-dg4Ul&DXM{u8!Uv$`Bh;vuDNw=fqyNZzFn#*$Z2__5OFi&6wMwBUF@MjdC+P0 z#cHg6nV9OhxAx612Q)PvgIJ6l;qd&hP$Ha-uo+5pC?eeqw4iTBuBKYw^|`hVQUuwa z;82RjQ3{9&c)%J%?9mAhXV`G_g02BV`7((cSBMvgRFc`|elEU4=`F9^qmYT-L#DOa z8x9d4y{u#=VWm-Ec^@(VxojX^Dz^1N6^?4FAwka-rA$%4Q5LM18>7gRkX9AjDojAsZZE){tQ-R1!tmB77h=iBj@8MJEKM;%h}@5RDp~1zA~--Ty#X~ z4lPhGZwzmq3BLxBNg5d4Wf|Otwaxl<*|+x>8GGhIzL!jazH!1W2*6_Cz|r`kL4{BB z3tkoo8BHP$I?C=^qkW1MKs~;|KgJa@k%-Q?oMZHRGum9ml=8HnH9s}2w$y_Bv-)X2 zmdX1-nOkIj_y~MjX4(0O=WCS#;Aasii$?F%V@|BGfS<;l;e|MA=rm0YkH%D@l!Cvm*0S#e}O1;;xS`{ zP>X*a=to->sdPFwbM+gzfrDI~*eiN!AFU7! zY`UfL%nrYsVSb9P3XxEa3#XOqLCxduUvLlfILyVhe zsakh*c**!BSny_=IDud>G8G#V42Cjj&fkz4sst#R8!^_msHW^lvXxp!y9AI5+rH^c z-0YutlWsJ?z5~Sjt9D;DNrRxPj*%{Ma@aU(&WDq5G0IF!SBu~5Kj5lNd#M;E4$DTK z{glo?9HNgzWo)T&F7)E)vyol*8ghkyF^j02@U6A2w6{{}Rcxg+*B8FqB7QU^j|CfS zdDP^i1FGk<_ioSPvkrJNZpj5XqO!GUrKoJ1PGXN2jCVSUn-DZ@vivt}tB5Yk%qgR< z$aqBH>tgtFTZO0nvLJf(zmRHoi*rXQ7Og8K2@!J&k@%Xxk!am-u%FTumsYE(N2caW zuIwFa;%Z(dr4oq;+_o;0&W%{3oEC9I=kHKTuao(x=*1bD!>Vf!@oYcJdwq*jjHCH2 zY!F`6+<5uH4BA4~d)G~A!~*}$LP0HV?X0jQx!Orwt=MUzBTy;hOMdSuGH+zsHHo>( zN~*c=ow5mE51nIc!bn5QoKdmeptfH(km6DJyBB5vyhi=fg2*1j*1s>o&`C&UaRn!Jy<5TiK)L3NFc$auHNsB0UpF z*1y{);N}zb3&^hafkx;AWox(QzTu|`M*kC#stl%0*bC;LF-IuwaizR@4E zQ4;VIDy=g+S>;BnY!-LpL1UrKjj%6FhvDk4W7EsEXz$L_;hRm9Il3E>XG$PZkAMF8 zX+@Q>P4G$N#F4d#VuJF_(N{E!(p=|iwXED|>Toy0oTiOMZ%NOXZ<`J~+cuu;Od^>` zC^8+`KANOLyJeIf-0W+GEuuA>%W~VVb-4DxJ(8(P0Z2Ta)^$s+-^*WD~S9ZIa%r z(pA()g3n}lV~t&YU7$W(+_|Kc3s27Z!T)~%e?Wl0!-%Q4EBsWcOlIDzHB66)l;j#) zz$QCGkq78_;Hdjlbb@APT5}L?Tr3o$maC09qrUx+-d&faq?YkX3Rfgp>zVGiYzv7b z>y~#rfu|>F6?Vx>l$q_3)GiC7A8K@saiunU@n1mwCR9HWt3Y+5l81aE*jUUM&|{F~ zWS)o1N+88ly2NP71zn?{5Iy_-+D(FwrQG%_ZBKZ7nq)pEQmU64A7X^d;ZDAY%UD(q z(F6{pWDjW?hGpQ)vfNF`1kh^|G=Qf#BTTMEJD&+-QwnZaq%+hf=SizU@}-s6OpIG-?W_veE6ZuGxI)2<6Yw1gn&1 z7{*eiw<*^BR*O%qRIR$$r~uW&LPIY&q&B4`O$54A^KKj{Eh+?H1CVs4LBz{RA*|E| z`pwUYhBM(QnoHA44K(L9M&f{5rs9;+853^Lk4Y6eurzuYry7!~FEpoG^<=NJQ;7}a zuM5IR8-tAFI$07e3Y%NEt1~42R9TfC(M?aMM|C{G1fZ2P;!wOLSR`a*bUHdqr&lNx zh>-6}i&O}86(Ll&jZKwRsqc0n27AoMIZJO~CG-yI%18vIB*kmB8+xBfpKn)e$6UFP z*JmbclY@&7a{SxPyr89aL=dpjIa^R8atOf+eZ}6i5RP(t50OHVLR?CP6lxMiU=-4{ zP|CTDY-5DmX0LNukZwC3(|r@^E-FZ`QE9%Q#Fm>OAuTlN3Vqb8yh=t!`Ob8T*R0t0 zEx%BW#HkgIRJym329+E|W@Cl51iX;SIg9CDFcw2tQ9F^!W05W@)EiQvLW5PC3X3&d z(%>;I#4_>5JHQ?G@bTL{H2r19j@(P0y)J`Kx?<63i;`$Et0EMdfmTz^A3vQ_M5RhX zvy_}*_0WW+DJ0&V@V;LjdljEUGHBRSmRKf@*k?hQ0_L?QBi5DKad7gzIr~DgQS^EOMEtt-5Lq zw)<%rk0EFcsR?y`(02e6@6?*VanY*wExT6Y#dS1FYqDJwULDzX+M20S-TJHMaRtZ9 zn&nqHODoV-BfCTgtwVq=upYV z;0&ZFDGJC0;1E!XyK<*ue6=2#8o;%z3u)=8LhkobQGTkoa*2`1IOhSy0H-;}DhT9O zN=XZd)vGR_!-;m?*9z>N#TH_+iOjykP{p$Ii{FqTA+<0Tl_@PYm4{NWFbU=WrlG;3 z)amXbl2+?Z`om7kj?=hhSyOKmIto_Xg9HqaIq{K$f)o(?HdP5rlbj8jO4>YQ3(OB^ zI~wKD?`51xR}w`+rA?>FR2WsoQ%zagH58%7=Q6hW*D?Y*Let8l+CL2`1oD>{=0;M2 zg$}yS=SZeTxg-b|Dwu6_iu|rn-9fx%w&nFmRsiLA=Nl!#j_@4MxPL7n-8EM$Gj2{V zU6%w1@Tjy)XdjbXZCt6B8EL}#(ep|KI*=92cRx$ntaI@a;-i@F)^0W>JrC9q8OU+# zFOk|PMotSYPaLZ4SZ|pRj%74MnM#m4%Gq3Y=}ERR7E?1Ss{a649mnMt4w+nX>0+Zp zu0?f=&OAlN`3=X!WJz!-3Q3IjSc*wcIYW6087Tx{4(?5+NveKQ(>_SJ!y9PFSgh99X1xaLw`p%oh=PfgshE()ulrTdL3?}s>ME(8D&c<5*=%@d3>uuS8;1^ zoN|NolS=QKe&3bFS#daR>o*N7g*f*kYEy9tacSl4R&Y=d5U$Z`0P`L3r^}Z7q)vdj z3w7(#8e9#Tj;+|#h}?jXpoISb7=10IkP1?e6NK{-puEejseevI3e|$E<~$Oo>H?bk zP^b_X&JgT?u!dux^z9yTYXl#pcGRI%ffn*fq6XLXzB;=}pv9EQs7-ReEo7y*lxI02 zg(v9;CoLrhm&Gil!{ni+_G?vI)Y-O;i$;-DtBj&$wQj?4u!I5$a!k%*rK6WQTgyv+ z!KmD^L5pjN7kxry{Te-BF&&#}<-@gOI-$(jcB+(ij*q00n9Vkx;qRS^aee!?_2D-Y zDHioU9E&#FX|)P{sQ95#+bZNxD~#|D&v*i&q`s$lk~6lq2`V&KaL>vFaH@p3ssY$M z%yL~S9EWN@E!JDFI~Fp;i$2Dk8Gfpk^OVb~ECvzG5=d@8Y_s4&)RNe%-Bo8GS+)`& z+LmR*NqSS1ShAdFXUWroXC znoUxWxT-RWxmMJ6A-H=m60lIILjfcyIoxTIyTqEEe#Dh#Q7N?ssMLyVN^p-?D67{{ zhLyXJ%8-K{Ju-%|kd%@}jYO?(s}COk0RBa0XC9ViL5XDTtmV7Qyu#`i4=uYgjcQHe zWT6mKA9fvT%dEmn5}~csg?6!`hXS2QNdP+XxmA*RIfe(5xW?tI#SV{WDn*@1VTlyl zZEkb#N|!B?ye2S6O50-`$wE@tNX9Zoh3Kc&B+6T8sMn2JQpG|YWhgGIS7%97J~Q73cJAZHoIi>qvkBva=U z37MJPMeUbVR4x>R)g?VUSsbz*mWGH3ja00=9%OfFGu=TLfTWxbtDho&n^^T?{RZbw?HOLC5P@uJ8TjXGf*zDikPds5(Gxyr!weazb*Y zqVIY`(BWP@C${*XK}d2fLLwb;P5o7J?hmwdKG1bYf`}bXuHU1rRyFUyJHv$4B?l!( zLZ?zvwT$ws=_MoBukY%f+_Z=2SETx5=`F37hyafa>zi;fYs1``z+OD5WpXR4YPwHg zw`5#+K#??-aW=)C9Il0nE6y04QBmvDT8wogCmQgB&A$5dW0zfKf++A|qQ2ed!3XWR zKrXj#vR|jGmnwP@S9u=N%9WqgU+CyO`w2tqLfT4PO0aT~oju$44BKAxrq`*(DwPf1 zZq0u|;Gz=cw^@vtl=YL68(w>={Uj(U3Lnxz)oG-r zMtHD!j@3!%SF}5M!?$!gSu--h(auGWR)@1A*}evtP6y4W-^w+FBYxl~-K;x|=YF7T zQhfDb*h$hBZ7Ls5N=66=I@|zKGLT1(MzkFi0LVDW#^d*Eu>+f7zBk6EppABkjKJ|i zF^$hC(OS(yZF>@_e#l`aM0KV$4Yi~cxiw&vD1+eILY+UTk@d7ZqSED7?wC}VZ7Jze zo=Z(Ofx3w}0DH;CrQAWO#&+U~ZPHvzv^#mV!(rByluCS&>kKG)@+bU;??ig=YcrMRL>)}<1ql5$i}i6?WefyYp+ zWR0_)W1Vuw$In;^CkNrDd{cC#1T5nhT;XD8O;6F5`f<|_sD1}Zg-)b~fNG&Jy}BY} zfPIgkyK%0s zQB6{R{TWF424n+Dn|%qZrlO#8a!AW{`(fQ#Qi_Der}oYl%JQjgs3@tGhp^*mS>^;|qOqn5VoA_K8BH`hBgzMT zb9j4bn0&0D8Z1q0;))MlK?FNqPE%zNg$Jv&(TLEM;a~Kl>Qq; zjd8%@OqPYu4SeFMI#`lwEiE9nwu8Wsg(QXL9qeNS5wK#Jc0;r;`7>?GxTwWp_gaTB z=!;4uBm>ns*<8I-&7T|(0GpLzl0s4kP^Zcj&tua_c`wVImRuVvNFi%T29+R#vUlmz z6N=rOt6rlbmo6LYQz&f8Vl7G5Q!E67-dZq|(+4S5a6!;&;<+K!>z$i+)h^FwB0B~l z(%DdLI3)6|N+nAqZk3#50-mE&D%Te#*0{+)uxhgEFI@EqEk93;&9dZ*bS51~It#K= z@_AFrIh;}(P)7X9Q3@J^%SC3jKoO}Iea~W5XV3MA?RDzY1 z9(<_;fue$|mCP%g!AcxU6Yg;m?o_0%gxZ7)8)wiuG>Gd_qB^RbQOD&XolU1XP?)M* z13F1U2te$aN|V|WR1&PHBqJ(O9HUd}G?*9f4=7OBa%Zl*!^YH;R;L<#r`m1KQw`?S zwGKxLile*Dj$pKG4$c=9k$2IfrtzN&O(||Er56M1Oy)a*gueQalya@rHcHe8%GJ0W z$;{TxPYWtMFs;3HOTe`(Z#5sDHW)oIT{OBBYubhEtgwyO}N^cT2xZBEhQ>Sfx!eF!3Sawj<#eLr^S`n zvip%_w1I+WC=Nv_wII&#w{T9A~xBe4ys@{kkSEh*}? z01A{&=Wq1Q_I{?j`-ENwKllqB_;>>LtTVxo@;q=@dKW>bcsb zHEmO1DVEr2%&ktRa`$B6D1EZ#r#l!)T(p)|+97Q#0JOB_ zwH@$I{Gf9JjiJP@9$FkIYFxTyD&W6lDN^ObsXF6Gqf0C7oNo_yyr6`Fj>Ri=NLSVB z0(7aXpjV`^8Q zavG+t47m)_sd3r?U5q&nAunmpv^x8d8Ey2c;Hoy; zO;w9Y2oacwgpSP}FuqhJDZo(g3|JXFI^vbh!`XL5k!VY!L8lig^mohYr_@V%Uu=jh z6?V!C3-7JM*k2&zNK%!~2D7c(ItK{vYo6@qjZ~(&9hg?cbg8+oxZwpZsbGNM-6<^$ zEFocB+ow7J3c}E7Ou*N#INoJ1Otxg_QO5<>VaF(gO#1dNwp0v9N^YlxUGjR z7VV_fuj<8SAfsH>3b1KV8gG>-Wlk-5YYIRpakT{}B_N#RQwUrbyK7hd-)j7h)T(t3 zu&9egKBgOLnBiA46qGtt;Uzt?SK1WQ=*|QHzkOvYqo5p zDJ^pIE19;+!dqL5Qo>LNGExZC+S#GhFIeA^HncWvn!;Xsw{cx8Rn)07AcU2vsWH&v zTzv>yQb0)xN-}VEDxE-qwk%>S6A)ojD#70Rc9TF90ih=QBvR_vXp$+dU`tp<&BOjO z$fUPaW|dQcAx*JSp-Sx?0j}7fgEmB=_vsqPc z`KnF0!(OzWV0qBB^DR8CwpGf61C?hz6{i|^1XW+OAxfdf^?Eoiy-KRpDoKX{^>gyP z*h&k5q$R|X96YMVJ5F*r^ci}$6|Nx|F{yGW?4>G-(Dm}`tgXbB+$nV@bSx_al#%t5 zkZ^sp+`@J>8N^EUhXkj%4^t9q` z2N8gQBeQc1&BBUWaeR%*IST>o6%Q&j{vk}eE>w$pdvv;eNvA1w%hmPLX!Q6XjMMYuO>pE$gSI`V%v;bJ)(?Qj39-nJ({+2we2y@ z%m(@|)a?Ep*_>jNaa@;bIHf?lZEnUqN%Z!rRfq`e(w8|{OQER6c^#VH=HvlM?vQg3 zqF*;VqTjS=5uV}nswEBBQ56Pb$f;FQPD4fK)}YzKmB^O42dxE1Sn< znOJIEZ77-prES@fsJMp8R}JktM-3^B-c=sTw<2VU?YUgH<~LD}>rIfjvA#*=`II_c zDpH;85C~FvQb9<(*jtKo+@N7-*>|=0HFNC;=%d zCngz4gykCfk6l#`Oo3Hp*tJV~YyFJIn>b4OTuO4vht*P&M^Hk6AidXNQK|NgB2DpE zMGBP$JA$7YQ~tS7eVmepf>MB|d2zQY0N9;|+A6KGox&(HQ&W?Ul)R!`K^1IQWQ%68 z*Vmy2BNJ$kTh{~3(rNPKLax9=QsBzN6QC&o0+O_j?i4m9JC6;t_j1FbP@&N4yi2eA zi1Q2vV5iRk!GlwFpz_|TR-8XSQl9C0L!R}XgV-=VnkBX$d|JbKg>NmETT@ORML`Xu z)C1D5&$0>h`?KR&390NR!aN}NbI!3g$f zP%K+*T>YOGZF9rJ8-H(CQG@j=l5#6N>{6ckL5A)^LWpRKzSe9 z8Wl-tai%>TU0YdB{>>=Er01pPUzHOo03D?AQIfCj``b}G+w$)+)8(K^6gO6Bw*AzC z2;uE5-c>QhODVu{`N@*nBR*kKhBc#{K8W7`0K!$0yl;fn-{1cLaiP#r03Mp~C>7+Z zbJHhQF)N4z{$%_K{Gmy9R-dB(0C9^4!s>LJ6OA+*x;^)1Jr*30nTSQm5T_Ve!+-@K zXKlxZK+$i~Cxi}ExQ5NqK&a5*Q)(=S(&a*~)I=;1l2TXHZ?-)3NqOkgnH#?(-uj}fG+2_w9etKN~Wsv5;gDj!Gi&*O@A+?Le~XX5_= z)(Gn175DY((CZ5bhnHej5pBySq+R9+(LqqeY=6Th}*|Yr)05t zhG-r}(nuieD>0Y1*m?n-rT}l;0W6BvH-R&JQJUk%cP<6y6(~#*&0bQJy6^!)g z=Z?8K!X79$x~xjJGC(1eoRQQ36_cgBL4^vU-7@~7!bB=Xbt*2$Xkjp=pyBpC$x+ID z(6k*4gYR?XIK26Voo^=gFEYYi+iV<&*i}ImBcGv+KHQ5g6l|-Y?F)?$H*`9JLC8D! z4R!>TZVog;3*lncd8v0>O=Msutr0|xvUiR>zjmY+wY$SxuJVCFgx%iU>5>C&4_Jbv zAt!RBD7Ks>AQDf21nGmAq8V(s<4XVvo=@ixqCsm|LKc!ufUo5VEubwP5LE9q5Y=*` zwbL#9 zGFwW3hn;_)m<)iFHaVP8p?&r^|j1iX(u`4eHc8+I@*hEaU!>9Tx?Xhhd+wZCCEcm%9My=l})8Dn<({i z_jzhO!66AsMiqi^Mxn{KC2*68bm-76iMC9te0B_2@}{msjv*wJJKB&EzHjLzAv0^rd7D)_1lKuG=661X}Q54V48aB&%`W#&fBS{)#UWXuLz6 zS&q2ZFJ&5SyqkWS+lZ4fKgIn`)a5EA#HbK?`lU)zN!(L9-vBt4&6OJCzh$&30(YuE z3IpOoAUsl3hMrqPutSOoUK!1|PJw0S@bfEB2< z>Gwy`h*vszo#^R7tlN@EnI@XHR9c$L&Q@B8qL<^ZkpW3@j3r5EDM@jW%rdl)MoEU} zs|UhLnkNB$5>H$Oc>FXn;Eh@ZnQzOs?YeCufn9JrBjx!j4K37!V6>-?Gl^NqN>b23 zKU+OXRy9(n?H)wr2$53SRD&91F3rVqoN}P3l>$g98Boa_qX%F@7ew-+gTpQjI;r%o zSp_JiDxwH98eXHOxzf4THDyJDLiSHxx?|5s<=0`Q9FfnhFRoFt2ll*v0O_VhI<--3 z&X9RwscKVhC~~&0RTPyW1L**vj&DD#bh?>FG9@~Q@tml<(`Dzfj$qOg)x{2pN^%KW zwog)_sY=zPa#1NQF0GeITD{cy!ZxJVrMR`jb;#&aRE}m{ETKtI!AV#-P$OfGV0=c6 zmemrZ5C}l zG}q{t6b9DoX;QiUR%1!sFSMj&Eh=n)P@n-NI)`a0G_6ctD;xNgeuO&%RWO}!0>uKbxsX>G=4Q;am)l^sjx=Sf3+vI{OeN}6z#A>^cL zo!qFlPwC^aO;WrnHEtqnY4txAlfI6y~i*D*p|Yn5D>PUAUYr`sy1e1#TUHws^@Q&Uhk z6llm*A_!Md;V30ZZCOjCxRoVASqa9WKuaQ~)!lfz&pSE7=hZ7LlCak+X=*Kxs#2bj zQE)seWGrxH<;k?^6iSpf`D}pN=aEb0U;+kl5tmo)lL!E zP0D8Bg<7X2h5V%KL>QCl!Nr!tiAWeJEb>~1tgtVy%$q9K$4nFFN zvX1v_%g}&2ZWA%af)qA>aHYBa3Knp!)S9^ylR3DhQR`A< zw&QXdWzf$tjM~%?hLz0PQkMreAQ(HVPdr1U)A&!s*yy5OeY=T(g*fshAgP5Y4s>$1 zJ1`bTdoP?&NeOd(Bfa>d#nb5NN~~7thL>y7YH5HKM54DcLr#{`qP|5GqB~ndTwJLV4(%scw zmeOWC%TbGfpa%Oj7J^h;7D$0t7*2;=tRj+ebEqdd1N$u1V5~CigO(|}CWdwGOb0yyCK??zG zsEiN@J7Bt2XcW}ZDff->a5HSvDbO2e)hiQH)AN>*`O=|+wVx)z#=|y}drzY1`P3>Ci*8}Q$9TO2%W{Xm0CCJ0VT`r=?i%^Q5(4;RVBsNY7 zN|urc>YpiPW|wYJczaBC_^GpRQYplS*HoGumoO-m5s;LZNCW^7fHRH!pssORqd97a z!ukYSR2NhVE?b4Lr5trrF^TUS?iS|V4s^p3*^IlPRr>W#P1|y~N}Q@zBzDe%f6as4 zY1cLA=8^i&E{amsLj8Y8p)qI?XMA{zQT9B3Gox5jbT)O`AsMB^L#1 zFjUtQ&?$)h5w}G-zWLuz944i}xBV#X8>Y1`Rc55RyG+!o^(TypD{1rCIsrQ+B@QdP zkOnr>Z)T3qZty*G`#rku5aVgfO671TC{XZF=ziTA<`~P8%WYRG1XT2jTXZfMqlj@l zP}oQ!!&+}SpO-``tx;W|UKN@Ql=8n#p6o{f^KHV9*{0pGu-p#5Iwx^#8C-6gUum$I z_Y5eNw!(5!45;XFW2b|ip!jHI$h?9^2fMC{!{0L!Ejp~qMSAIf7+p5dW@&AVfi&vV z!ZlFv&UJ)$IkS>{HPLBM9SGZfX}IaR(>M~4=|QZ@x35|~dMW-hO_3VQJ9iBmfEc6XBxuc`LX*7A;!nS7|DT zA=)g%l20N&b%K1d+l4>-Emvm$0K4KWOlYd0_T4@pkKTsz{{TxU<2s5cc3Ait_CRP1 z`!~{-Uv-AwZKaeY-ek4Qbu zaU^waJz(5)!O}BMNX@r0jL<>+yG5Ys=?P-0$n=A%$3uLuWh=Idq0psUjRA*Gan$+c{*BNUo~2%$hSA951AOnTfdJ=N21YgM2_F4)LltNz@b+wKw0fTo z>TaPCZUU1_b=6@pswf09eSy*QD(SgwpQE9in6e<$q(hS0nUKqcw_8}jN`b)#T!OxJ zBq>NKR#K##5PS$e1a${ROXVrLtlCEs;vjm|#r&UgHjnai+ekgJ9s%@W(fVDW@YQgi zLc}ZVJ>ak{@c~Y-H89){NR;}>@lWJWap;InR63K7eu{MEIc9J&WnD+IuicF~2A%yj zASCk1cn|wSh7x?cTy)ez&bFPqIDrC;hm#62xt^OXXSo(TX)Afvc?6*6G^z4MXiaNlz%@Ei{45;>qv{ zKvDQq>C2sFc%g*aS@RGmRtuZSW~H1P*?Pl zF|knFAnW7mhzkVo?FW5d??a9$w@$0bvZbh(WH=pwl{vDM2hKJD@lpUI^pHICULewy zFI46t!NGZknZ!060*VwJdPUc;cxLsfSQk~}cU12i?bzf?c*s&=ut+6oVUdpR#|3#i zbQ&tkVxK87C%I27;Ab+%Z>5{?Asb= zn{?U~YwnkBRW5pT8;YR5T750~$V7*U-w1C!$9|i8HA^ZgH;&-T4NJGMjJi!tdP%v8 z^XX~ByI$_#oEr4m%+apeQ-o1+q1#l7_Arpx?>eQcmz605g$=r$e0F}PDfgX^BrR{Y zaP)O21+q3FO$7j)9FL!IKda%dwl{a9ZLfNIXL5I4XlDpO!`wo>AH>4&&)_Ezhfs z9KzC&6I%Vz#yEL`G^V|5+Bs>US4hzIYthvesyrF8+iFi@r@IZ=Jj8@&Zs`kYBd_^1 zk@`nO$0-r`kHOe<^g^f0yXg!$O{YYvdhJ1S-;}V=t+y2`PiA2=&fo)>1*s~=7EYSw zrZW|pjl)x_h?huYzO<=)pQKZTnnFcQE2nQ&a*7OJxN7`etJ?e}qszZv zrA=R}RnbmUXj5%ELvs|ev)$g(RQ+RPAu}Z02F=16MP{U2tsx;b& zTXJPBBan9L!)+*&j#gB8j>#i(O7_-V6!LQ{6(p37Ty7t3+wX<;{nusArBGgGqi9u{olcC3!e5Gn5JS}WTstJP?=sqP z1<}fTr6FZ0jUa<#SnBw$Fy!p7_r!)7Iw*p*T!H`q(v&(>(t|i|pzz|+u0^LRr(bRj z0k|eyM&Yor9q6o*%(TZ^LY9}}s|#_ZwxCgk=aof6pYVllaJEG1Z89alUYOBQWtfoB zE*nzNgd|Fi?>2o-a|-2og5g_EC0GhcAcSSza;lRWpimISuWqexRGn%UtVwOK!wXx} zT~{)lknd&8lZ6gpfq<0kAER7$-PuU5PPC-goJ|HyRw~R_sExx45>}?$RCTuE!iXv6 zC{_D_5Yblmo*$BtYf`O1ZbrP9Fq`kudds>$oFFSH9))=b?>BcZ+ z^0cpz`gm5d=uQ760({Mge)GN)3cS0hv@FC~f15(hIO*4{#f7So73Ew!h*q#mQl zfJBP(lXbCc(bZd_w{OsD2{NhF>U=apgt4E_sR3PlmiAOY%5#l-TV)9(u}mIk331uB zmh9LzR$x+vBv+D@gJLOswS-mcp@Q}MB;5A}(H_4{Ut@39qBfXxg$GapZD@5#D{KIi z6d@px4|j2?osq*Ei-=T-G3oWTY1F4AJRbs}qT??mzGS+n;Xn{cNaj%-!azQqtAXHkB-nbf}~Nq9~D4ylo5mhexbE zRI#b`dB3Vl zyKmMUH7kCHeN`g1sMh0>q)4btY^Rx$?1iAV^rg4nQE^G?fy$GBUvH}li%;SGZr`lf zaIC2@k|tYIq14QmD+OgK-{%$|Lebt2Bm|B39W>WRYN)C#3hlujhXPFrv^34tHZyI` zjM7oagc&O!0+j3(j$i;B+iTlM+1n9mZwr^h)^OR-R+Vy+5qccCMu68_*u-+&xD@XW z=!{XWQ*2ZrytP*%Jx5fvRsx(pI4SxElal8;UQ%vS(*|=Zf#iu#d4#(Ha z2rQ{w$!TRfE0i4JAe4@TY8w9l7p;a^olW6QuI=wUI9e5npT(%`k=1H&{Nu+zRUl{j zTk0PwlUTa$R;!#vtqZ=U*dioT87xz&<2@LTp6EZOtgQIzL?Oq|(Tg2UP*K zppGw^lyi=kI(S!cf=#o3GkEbfhidS?h!mQ|RhUb@E_md{Y`EY-d5FsIKCF;JoFpG+ zq7*3g$~P0AyKC13tFH59Yi(2OY&9t{lroYTVZ^DX@xCw#2LutkHts%ypJu~LugY>MoOQk_&5l$>xMwonIslmq1MbG5M4Mi*GVk)zQCb|T6+>>( z7+ms`CB{mpi=wG)&8jMU4pfJc#Y^0+mtLvDm)WZ+^_mnH5_)W)S>K@8`+Ux~XNor~ zZ#1Q~LXc7ib^BVJq>=(gWt`hq_&i;Aqg!=1Sh6Kh{kk0P5nykP-Jkr$#JCpQA>TWt-A9i@Ot3m zrq}=sjVh$Ct{_m_{`1y7AXk@JIjlG?9fcJd7&YqkiNc+R7#gFEN-k&ki z@TbZNBJr|GLZ0Cb5ku<+t2HLVz281@qJIvqs~)=o>a!0Fp+jnYHB*^os^rxf55-EB z5tXe)B(|rHQbu_|In`z%C0^Y~?F)f+rxY#wjlKR(oZIfC9hT5IaR;==;euN0{3%ite}g)k zWGA{2c|1mbEa(1wdTUkJI7(kZPY!E=z4?K>NjdlWzwFS_Ss?ijA1!hu><-z{hX`bT zvCrbU_@Hl2bKOtCpD4YajhEGjGVHGKvK_xrq0???&Mg9cYu6Ct$ZrKB=8{mN*e4*6 zdoi|j9=@o&A+va;RJW@(b==&@k0~z}Zbm>+=K4tnKhY!hXcIxLPPeamMZrv0Ekc_$ zsd4g11#PG(1CIlYA7MJU-jlR=H+_X=ahlv`o}F2Sgv%)(L43IZUeUTwwFg{^XADLM z!#32H97_|)p&@D?Oo3{e-)R;V)iHNwY~nZy!9q)t=Dg9&R&*55{NlNZoElP3J+XGT zxWI1Wjz%~0jgWeKHPAi5MMdw?uVx+J32w6uY5PoYe(eg>Fs-_QtS9F7>PKC5pH&SX zbK_J}{V?j!mhLOjzR~aVk*Q6uWcv(LBN#{{R>hf`LPM zBw%vX)xZAlRlGZf92Y}H*XLUfEbS|mkYA^%c!9i7SE@&)b_81Pkm+2+19`NEZ8ILdRDU&3O$pyVE>+ouYACu$X_u%jTj`|bobkTO(Bz`*m- zt$vKWZDj9e2RXWSbx6nm0I8|(4R{yC`(E{zbJi@UjH*NzWYQs-46oMa1pLAV7C-@N zO35S)An%=NHNxHxw<@<9n`ue{z%4gAYrZ6x!0|=Clr4p%6LYe1*GLX=QTABk1Zzqp zfbBlkh$)FvXSn2y_L7!8rPUN?$)xC9c}mFYbX%9e?lLM%uD`?j)6c1V?>HMm%G9Hh zqlF#GBH7Iw5+)8Y$ zxnNvL<@#8oym9s?OmZx%$~ir?pIm1f_vr7B#Ts^*{5`=$yp#LG&H_ZV(@F~1P$Qtn z+71$5be=PCSrDpAM96hIdy(pqqrA41+l3sjps55Y0YQA}AdQ!?%5)8;P(2j=4rxzU zD^-unP9vZ%HR|M{Qmv`H_ZkkYkjhe!lw@*~%af9I^WNFHZwpS*xTuMNSEtjfFpDa2 zF{C!A%O64J`9SX^&i`Wj2+C{;nqhC5u2GM8l1Toh2un*r0?7N3pZ;VQ0O5GT{D8oVnajN6@?s!Eip zjwFq_PBOB5LIwwk-&E$#xhhxZ6Q8ZzQEE)VahDwx`n;vK9(6tB@*%LL6%w9MGs+6G zqB?40KZZ8b)H8e3DGa{TQkaWPmg`-Mc|851l#Yract^4(G_ z1cdg8VmqjL^`wvJpqzC2*wJjTGgW|sW?1yp5Tz0nJPzn5PL!r>sCDQvo2W4#p}9_CQU*^X<^`JK(=L8QrySeTKhuN5muu2DsWVkyg(ei z-#rEkcZADIu6Tb^wBTRO)j(<6tr66gY3XQTQAChfD(!njyVb#j<82c-d&8>_h`yB! zaVD2etV!ZyXjNIp>r*)((q9;C;b8XCP?Bg~Pgqg>@l`vEEE7uvJ1S zkxnqVONW`p`voaokxGxz<~t}K9Y=Kv8%DT_u*?9pj7bwTMN+b(v@eo@xJd@o0)n)$ zh8L~7#*+qzdK8q&iykqq{=((hFk-Yq~|NbcM3^3#s;aaX`1~3nM!(zSfWo6la?cQ_5Q0*alR-sN!n)R`pw`hc;#CRm6!D%MT4ia*%rqvb z%(kU6sWFR53glU7MIk}l42_frh|aS1+%k~{&N?57aCO);!mlLw)^`>7+%0l_c20t%2 zQhtaU5OD4d;ZLVj=(OP;MX@#2FVw1(_T{AqpnVBg`L{Vh?|cX&L!tC9YQ$`sTvN1k zbj8`M5sVe^hmPA%f_Stj+o4$!FHI{*aiLsv+7;mjvo)sfIxR+smm~5vww#p`P)gF` z8&Sw#&6F*&a8jiXVUTr{YZ4Ro1d0tH)X{Aks_L%JuSo^Qfk!Ap21;0EDFdpMdSs0v zx;TSiS(jU|%QHBk#1tcybb2eObFm|2rbL03*g)8FjGSx|H5$JtH?`-&D-N%G+)dN% z`+=E~zaj1P81N${i9L!E``PVesNj>$gpGh296Xi2fR1v`$U0O4uB?GEVPg(dl#|ly zUl%M%P(_M>BwKwePWCIu0qoaaQOk^ApZVWiLR0}bBb4{N^@<(fasl`0wn7k+NxW>*)Z2}?F_fq* zdk8t-?9n%kagiI+$A}{(LHe?#42*2^XnXy=3y4t*A5}vKd}M#mj*EP43UiJzsvMyy zsoOMpiAd<4cnu_t{ir&xzIJh@54?v5i)YRpG&ZoudK81;u>wMI;o;@4GmVDh8)sNn zdC~?_I`u#DHLiB@^9NQ4R0L|J1pOU`a#EA<*MyExanxjMLK09^0NY4q4iAbHp``b{zN=S^*Il-xlqQ!~lNAXkI6_=kCjKLrmwi{-JXSL6dN_ou zwIrnY6hn6ba}Gki)e+c0BgbkYdyp~H8=nnqQZc#qYj8jZI8Tw*iX)o?IrH+>f)vs* z3sX-A5K2~_iU$QJ-ZkQuS0PJu^C?FvC#lymaz=dob%Q4(A7;H7g5~GhSNILX>$n9w zA&9G@PjL0^BA!;sK4q1&*U0&3LRFK~14cUuBE7)=Bw6lZQW=cZew>llorBoE0P)LC zC0l=+&}fY8em>1taFfMx(uehGH2W&$4(gHF4CjDf7XJXgkzTQ5@&~p&=y8mX!&<0q zoz4#W^o)_exQ$}A=y&tgiWP|U04u}o@YUq>d7m4J9*WoB1uAYORS3pv~q`kH1rs=U{i>b#1dWo8u=>wDzWa*vIq4@Pt&V&De{n8l^xYK>Q%7> z93R6-NEs(qr_#p8MZ3qu+|V0HqTDSBO)atA?LN33{gv)ks-liicFFv7?*YYH#_)D0 z+sVX&M&qdLH4wiNl3pJ?DWeb+iInxhhQn2*8@KH~8uvoyJDP$m??E{fL0$Q ztlCNJ9#F_mOpKO$%ui9od+E1}iM#5-d*NcB=1&6vlJVm= z674=0Su}KA)d6(WV=A#$kf#EiX_rqVRyP|0l&!)%d6A$e46T-~zBAD%^BoLQ`%@;Q z`i{)TXcrv;m>y^0Sw6(1=>_w2yLjc20mv@%npp z)I*Cew_D>4CJ?4Xq}A2Z!UW z`U3&7lqjf*>Oe?0`$w`GFBqSi!xkpo+e*|ELrj3GzTw*vE5U-#qcuY2tkfy>OIoox zE!INXb~AM#$yJ?Bv@Uh}y=YS+hYK@MIf9!)$VV~mxSX6GWv8aO@VddZ zZQG#JcuQ`^x8}!T$LHR+64NfD9y?<$K3pl}jF3DTKv5(BqE4+YGaIv4O=@La!AtA$DQziI@t%chC(j)x5`qTnk3#4O-^Eyt*tnlK@#dtTSmR7EVoc^ zwMePdOO9=mc*D7vad2hQUk|Ue1qC4ozJ-pXBPme#=*`7`E5^Gmx?k|Cc+vPLZ%CeH zLZ{RjexXy4uFnDP;uKm&7DiT(F}ca#Q0_8amQCAvw{Xy!ofY@u_Ep#FsA&Rw$pIo( z5O9^apQemsBO^IFfTF)?-Bv|D1#5@Vu8We2$b(9&%6Um)+IoAQ)(&+B!E%M z4sov%K)#XBI3(U2naPO>g_jvO6y__S&{nk28dPfvqoy^N#0rc%!nWix?G4ySu3Ol7 z$VrkxYI{i}6=ey+kb+f(934aHG)67{A6G3)O6jg$QL1&uXR38g*GmkBQlzC3*>y!= zC@U&15%fj|+GXNT5@;~4Xb)W#2X33Eu?#??QyN0uLPp7LDMrnpbjI2g%Bb-o_igqi zO*}ZZ)(SpKr6?JWpo|{T{C9KW6YkcD3wFpAG1BGa{Q_0lO`wTom284JTPn<3KDtzI ziIrOOwCsxWkV+oA?-xl}rP4|sbt?Xo$_JI9w*3x>_7z&tx+5Y_9G|~O^iKB5^ahnRSNiIJYwI{u3tjhEh#YR90!+9VG2=0aigUH z!<>Sz;~VGOk~(aDzY z#=d%|0|x`!qfZx8*xK9}h&fc2_<6M^m(4A`t6-$kzl>yFI zGn5ZJ@|}l|Q@*KSUR8|bV;J!|@D+1&XB+hCuYY4)9NbQ5fBk>;jC%dEoSQ!f=NDZz z=b?0s(|Fh89$tT)en`h&@8(WbzQa=+>eTdJsz(%9hJ+ zD0T`UGNvTpv9EB>}opxw?A+)wNF667#lWM>k1ezXD7rvE)I(TvDiz!M>elOJ{ zDC~mkg(=Q))lt9XWa&ZR&!YS2%zimK&?gBlO=GV3*-Vcwz<7;Pj?jhRD5U%P>&|nW zWm)&?!TpuR)6B)@2VWL{k`(&pK=Y(q?AjmA7e-eB{T&;b>do=}DUr>|%49@PN%JHp z80q8Sch@%k9{3qCl3@Bm#46?+sKmzo2I?6*9sdA+sd-T+brX)8{o2?syM+LK<2v{D zYlHxDaffTthL7^bJ#B>?)fP2GiYI(#jM_Wej z;zZlBM;B?-r|NMdNO89i!jkSAOC~^3bP^m=3bq)@BRcuxk&}=K>CkPXE#S1({SSCc zT*z`oGF3)|`ocy~l(?A;pzZw^7mtps)3_H2rRQaqF=Y~>QBu=(1v^`>Qh+bn4W;oM zCD~_D=s*Ahs1~cx)4(Xf;a-VWm~^EaY^M(Pz_A>hc>e&G$BKU4CO(L?B%tSw6pmq& zk5+2~13CQv0FWnCm$bsR*bgDC(BiO9F(==rV*ufR%NRewZWj8>13&O1_==0JeGnr|DM9fOQRGj9+wFs@ULJ8Ia;-r=04U>I z2j0jb#b9srj~BVxwr3PzS6$+j5~U5Ky3DA7 zw6%` zaJSYN3I70s{{XnJD7fR$_CaxJ996gbxa|RJbc5&fyL+|SK8MmkQdPw(e54HLuqQwJ z-BVFENGimKbNc67iL#T@OMqki;on&GFAcxy!}tjEjfDOI{{SR^h^YFfaByk+1PFE35zK&uE5d0&;3y!z)#|epQZ3~{!w4VFuQWt z-#XnPI6LFa4YjBAMlhYTuF1hx0N=yguD2Ax4I`k&G8K(zRm`AyyS_d;)oRAr!o2jp zl~0vdxS-P@w5O&^eGIaM{beZNYeg+6Nm8;AB2c9$0hxmx1wWD=iB}cErogLRuY8G3 zQjQdeh{EMKJ^jY>`bR-ksFfa==rmp9B=#EO6bmYzu&PC$2vV3JW10T|rzLwG^64W! zNg5ESWnBS2{+h4g=~IlVabuM6+Wp*+J`fLCFxq^CEi&oJu}<98<6gicKu$-8n8vyV zfTNA|uGs6-?bg5yft|kXSm8Y*-eiQ5t%>W8J#r_!2eWN%Km>qD+s9n$ z8%#1xd~ZNCq_GnSCy{N>n=dXMUQTNx7AC-0jsS z$!3>Wl7z7&p^#B8lmM3scEa(o$6mfVGHtz;?dhx_o0eS4T7F$1zR|Eg(oSN!bU<#C z=o*noQIi!32yT?z*D$b7$V*8$ z#(XpexOka7uJ#C&u!xu4>jm&Jb9Of+z& zof1-_O=%^$6*makK)8}nfPI-GS8LD$$e>&IHxX|m8`f%V!eScgGL&49u%#*2GU49` zkvRixRlB;piq{qHYSWGdyEdyK@=AdxnZ*&myBeusQ}Z+YD4WAw1B;hR2_Tx4F7)aG z962c?gy76fNTP~xkSa0>wR=oKZM!muZNgjB_(@E~m)YN)VbR!YK}^=ashMB=o}EsDy)_QRZ{4`G{`= zVU4|`O@g4vRu5eC&b?Jhpq;k^uKhJNLab;CABYX{=s5V(vG0YNiosNzCeyK8^JVA~-#hY4^-%NCfjEs17>8jM(2O5+c zlHu@3`{B&GRqEI6nLzO;?twox4#bn~I?Ux*#!rs=Y!wEQM|cl@M%vGmQJ(6;mEnV{ zEkq^QR5+b% zlqCR!cCi$aN$N5{_v)>T5QimP-0FYa6rbjYcydWg=p!^A0uS8+5(g%5bB>2zb9Dhj z*^$>s1x2!)6#?aqd+V)WlD=b)Jz6RuHo=8?!tyYD4n}pc$11w*^l|%ifm2!|auemP zeR;eN_D`O5n$|VhR4vE~&M*(3T^j9y^3S0s6R8DU&QU7V`rLE?2?0;^1t#LPCqhGhZlxWwc=q!*wyOB}*~5#&Hk6h2B|x7F!@MjN zO>t-23Qu?-c+vzeFSKx$&=K7O3F)6bXr7}#ZjlMCj;9I(a8Hkpv)5YiBic1)1QAgQ z_EnW3c6Zy)TVw(=p1vJ4-e)&}N`cmfdqfe;GvS{dZCKZ3RfjI=2YE*4GRlfUp z4K{qB$2kE&A028cO^>WP?XPVJ)Hc1)_{6CZX2+EoclrBMGjzqu29>l0QsktKo960a!wsGqh+{g*kKzx*4*d@g(qsLn z&H!A=S^8t!xY5spk(i;iba6UsX>p5U0+j_T$1Ag3?l7Nj6nVYFN?GGrefa5m!L?+% zmG?@hECQ_f94DswF5etZqS>}Bxof>(+p?w9A~#g5Q`JsDVYL(UBamag%gn5voWmNf zV%VN2>uHh_gcnULw4O-1w`pqh!&wPACYEM+@I!azoXwai67?53-ZWbe@A>S2t&2P#d`*n|A> z5yP6&VIAuHFa}V_&%>^_jTPy0*oeXkI3Ib@?NuK}_XBA*z1JNi0JjlW z1w(Df1QFN6*{RP9===<;abBA)jNQ)M>PT{?@+Q2~k=t#7&y|pnNIfyvIM6d(BoflA zd2-H;kWJDl;7k(E5yw21(((;Xia&S|F5|0>!s4Ye&x%2bYf)oT@Shh#dq+=}dDcPq zXe2?w7#P)+xfQ@0j_It|+`2C2r_Yw;rw6IBq~&C&ft2I{&~MY-rf02g0XqQ?x5WDV zBA{~9^hVrLHrqHOApP1G3&mNI!`fxWodgU08o9>mHU~0HO+6y)%-Y;S&_Ookr!0oM zqQ9wO3g2KymYHWrXt1;|3PwQ#n;VXrG*vB54j9SoxXC4jocCY1&nU-%!uHRB>7KaI zuDNdT*|aHfxYYsFB}5RqBgs+QVh1-*4}O|2AH%6d1&+4d{4onSMCR2&Ph!*O0p}vp z;?|^3a5*k>%jPdibh@FAfE9ED!y47v+imqJC&Nl=lnZD)p393AN0711KZ!^L4C8U& zd~v2H_(I?hjM>2EQbZmb_@1X`eh9GiOK>I2mbXXIFO*waO+7I6! zM13D_w(Sq_cku$~QRR9{<~o&RWkC%FllSLeJB`c&FsA~E8OS=dl{!p{7x+0NS`61| z&8llDN@qJLw-NO?=Q$}^PDV#SK-EEC3@fG8Hr35*Jm4U53i<&g^iJs;_-mMOR}+#( zA&Ad7;05PxTJusUBHf8$s$8_Q09gs~H!!_7IPJ5~fsYfd{{Sj_5a!+on@x-1HRza) zNN!CILoN)ZP24fg-Z{#KF|KWJp8b&@wT&8@`awTJy%e3gjCPsMx_7Ve+E2Ib#;Jb)r#iQhQlB5i;nyVOKV{GNkv*G8hmBM}} zrNV?;5*;IR*-MVU!Od^$+&}io_=lWma8-M!xWs{roGsSS9QsNCcd_C$VdK@>)83Sq z2P?|MapARr!J$FQ6+fvPc;jJfV5UJ(`tqI?2DPe0I4e z!?vn2;;Hlook&W8z(P_8%Cn8O(swawCoyK64yTfZ`$JNWo`^L#N|Pw0Y@3wnxF0x1 zE_8BZwA;hIooD4TK+kEvwDi<9&K&V64+N^pts!~whH!n}2UbPI`)S zgnhv3!Rv`X+Na_kaKF^Y-95%8YPu4ytPi(3^j!$#06VbhzM!hHxQ3i_S#{)(FOwbe z&z6#YN?%2_C|Xsr0YCYrgvWZ7Jc#FARkmG zbQQ(UoyR^tI?-1`RG>Nc_vlgbb;L=<8m4iv{vheW{{XwM7f!fRfThwZDF>lc7f1U# z&#W5vhj@&7p*x_l`ARSebL=`GaI*gZZiVR?X4I7b0A$m3W{~QSPR(bLS@J8B zBld=mQ3&hIV7dqQb?Xr>Cf!7)=`{>A;!ik)?g7q6)zEWuEX>Nd%9JRik)H8Lm7Fj% z>RbZggWU())~4MXi?>BAI07QoUu_sx#XRJv9|AQMH$prY=p(J3rk8X9Rl`9#CBPczd;}qTIeTDwmH~ zE`PhG9rgk(jsKxX-TLTiyy_x`zqqf ztMN!g3x*q2W&(O;)aAtd7tNu0x-+?6J=*ql7UZk&4vMAGr>>_*p17TvioVfII62aB zjF1(PpJ>z!+c#o~#l2M6Z-`DDecD%s;tiryG^L88lbF)O!jMb&S{CVDGrxRJP0k4X z<_@(NJ`TS=U*gbMyg%@igzu8TZt+=u}NJy za+*>G4pe}gj|BogI;zqwo1K{tw&f0a?3PlpA}^E>eDSJB1!qK*qVT5{370z{lbSP6 zg`u`3hc__rnFF3Gdi9I8pQb(9)c$E-^W&`6YqJdFihCj*DBt6KEBz%uj*1+8{{YH< zvHpn<{{WXpvstRV$NK!g*mLHHcGvn#ziB@uK#f00d-c!!tG@kavsTm1gyu9yLGL=m z{WI{^Yc=B<2=nU?f9%owfd2r?xRw6^=(&G}vstRA2*1(Z>K`!=u%Go7`+i0M?R^w} zuk6wppGbbG{56`*Sp+CgJ_l9Kzu7;Ag7t2v->lYYT*h%~k<3Inf6CRb9QqFXhvBT& zX%m?kx2Gt*oN506@cObn(0}-Pq2uWvf9%$4HOn{~{+#ds0IQ!kvSQz-PuWk(6dr^1 zN8zp8`X2@V0C!oe)w$kbg-Fas(!Z2W{ZxJ$c!~MRAL!`*>DFsBq5lBT!3gI=wI}}o z9kg%sw*LSW>RH9V{GhHM^o0KacUi2}Re$P;`v>MBtAFKB+8-!xseg)euj|$OG<~u^ zn3MXd{_=I2%~$a+^5g9voE0t4h}}=~(Ek9dcmDv1qNN-8t=M|1GjYczUujRZ9-^UeONzlwC3@8xiR^`gJK ztk!6><=YUhIw$;FkN%3U?~QL${!%^Z{{ZGSn#~LBh?`hIkLA@5>kr^`!uRqvzpGF8 zRjk%%rZW&Ou-#MsOwa1C_UYy~^SfU2_zh;WM=L1sk70k}{&)Hx`)5s&f03W`bbcpU ztkek2U2&D=*&d(gYPa=GehJewPw{e{`s45#&1Q{GQ5vBz{&1E3N`Jql^FNfr_pAH5 v&1R(3L}!~5`*Zo(@9Ib3brP)q06)q2{{V37HJVu0`PVvx66feq+aLegd2$tp literal 0 HcmV?d00001 diff --git a/boards/xtensa/esp32s2_franzininho/doc/index.rst b/boards/xtensa/esp32s2_franzininho/doc/index.rst new file mode 100644 index 0000000000000..20ea1c864b477 --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/doc/index.rst @@ -0,0 +1,93 @@ +.. _esp32s2_franzininho: + +ESP32-S2 Franzininho +#################### + +Overview +******** + +Franzininho is an educational development board based on ESP32-S2 which is a highly integrated, low-power, single-core Wi-Fi Microcontroller SoC, +designed to be secure and cost-effective, with a high performance and a rich set of IO capabilities. [1]_ + +The features include the following: + +- RSA-3072-based secure boot +- AES-XTS-256-based flash encryption +- Protected private key and device secrets from software access +- Cryptographic accelerators for enhanced performance +- Protection against physical fault injection attacks +- Various peripherals: + + - 43x programmable GPIOs + - 14x configurable capacitive touch GPIOs + - USB OTG + - LCD interface + - camera interface + - SPI + - I2S + - UART + - ADC + - DAC + - LED PWM with up to 8 channels + +.. figure:: img/esp32_s2_franzininho.jpg + :align: center + :alt: ESP32-S2 FRANZININHO + +System requirements +******************* + +Prerequisites +------------- + +Espressif HAL requires WiFi and Bluetooth binary blobs in order work. Run the command +below to retrieve those files. + +.. code-block:: console + + west blobs fetch hal_espressif + +.. note:: + + It is recommended running the command above after :file:`west update`. + +Building & Flashing +------------------- + +Build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: esp32s2_franzininho + :goals: build + +The usual ``flash`` target will work with the ``esp32s2_franzininho`` board +configuration. Here is an example for the :ref:`hello_world` +application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: esp32s2_franzininho + :goals: flash + +Open the serial monitor using the following command: + +.. code-block:: shell + + west espressif monitor + +After the board has automatically reset and booted, you should see the following +message in the monitor: + +.. code-block:: console + + ***** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx ***** + Hello World! esp32s2_franzininho + +References +********** + +.. [1] https://www.espressif.com/en/products/socs/esp32-s2 +.. _`ESP32S2 Technical Reference Manual`: https://espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf +.. _`ESP32S2 Datasheet`: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf diff --git a/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho-pinctrl.dtsi b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho-pinctrl.dtsi new file mode 100644 index 0000000000000..c00040066e069 --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho-pinctrl.dtsi @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022 Felipe Neves. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + + uart0_default: uart0_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + spim2_default: spim2_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + output-low; + }; + }; + + spim3_default: spim3_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + output-low; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + bias-pull-up; + drive-open-drain; + output-high; + }; + }; + + i2c1_default: i2c1_default { + group1 { + pinmux = , + ; + bias-pull-up; + drive-open-drain; + output-high; + }; + }; + +}; diff --git a/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.dts b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.dts new file mode 100644 index 0000000000000..f7492d6966205 --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.dts @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2022 Felipe Neves. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include "esp32s2_franzininho-pinctrl.dtsi" + +/ { + model = "esp32s2_franzininho"; + compatible = "espressif,esp32s2"; + + aliases { + led0 = &user_led_0; + led1 = &user_led_1; + i2c-0 = &i2c0; + watchdog0 = &wdt0; + }; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,flash = &flash0; + }; + + leds { + compatible = "gpio-leds"; + + user_led_0: led_0 { + gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + label = "User - LED0"; + }; + + user_led_1: led_1 { + gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>; + label = "User - LED1"; + }; + }; +}; + +&cpu0 { + clock-frequency = ; +}; + +&uart0 { + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&timer0 { + status = "okay"; +}; + +&timer1 { + status = "okay"; +}; + +&timer2 { + status = "okay"; +}; + +&timer3 { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + clock-frequency = ; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&i2c1 { + clock-frequency = ; + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; +}; + +&trng0 { + status = "okay"; +}; + +&spi2 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim2_default>; + pinctrl-names = "default"; +}; + +&spi3 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim3_default>; + pinctrl-names = "default"; +}; + +&flash0 { + status = "okay"; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserve 60kB for the bootloader */ + boot_partition: partition@1000 { + label = "mcuboot"; + reg = <0x00001000 0x0000F000>; + read-only; + }; + + /* Reserve 1024kB for the application in slot 0 */ + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00100000>; + }; + + /* Reserve 1024kB for the application in slot 1 */ + slot1_partition: partition@110000 { + label = "image-1"; + reg = <0x00110000 0x00100000>; + }; + + /* Reserve 256kB for the scratch partition */ + scratch_partition: partition@210000 { + label = "image-scratch"; + reg = <0x00210000 0x00040000>; + }; + + storage_partition: partition@250000 { + label = "storage"; + reg = <0x00250000 0x00006000>; + }; + }; +}; + +&wdt0 { + status = "okay"; +}; diff --git a/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.yaml b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.yaml new file mode 100644 index 0000000000000..cf4d884291d34 --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho.yaml @@ -0,0 +1,18 @@ +identifier: esp32s2_franzininho +name: ESP32-S2 +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - gpio + - i2c + - watchdog + - uart + - pinmux + - nvs +testing: + ignore_tags: + - heap + - net + - bluetooth diff --git a/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho_defconfig b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho_defconfig new file mode 100644 index 0000000000000..0e8d4af0b02e9 --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/esp32s2_franzininho_defconfig @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_XTENSA_RESET_VECTOR=n + +CONFIG_BOARD_ESP32S2_FRANZININHO=y +CONFIG_SOC_ESP32S2=y +CONFIG_MAIN_STACK_SIZE=2048 + +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=240000000 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y + +CONFIG_XTENSA_USE_CORE_CRT1=n + +CONFIG_GPIO=y + +CONFIG_GEN_ISR_TABLES=y +CONFIG_GEN_IRQ_VECTOR_TABLE=n + +CONFIG_CLOCK_CONTROL=y + +CONFIG_BOOTLOADER_ESP_IDF=y diff --git a/boards/xtensa/esp32s2_franzininho/support/openocd.cfg b/boards/xtensa/esp32s2_franzininho/support/openocd.cfg new file mode 100644 index 0000000000000..f75d53b0b34cd --- /dev/null +++ b/boards/xtensa/esp32s2_franzininho/support/openocd.cfg @@ -0,0 +1,4 @@ +set ESP_RTOS none + +source [find interface/ftdi/esp32s2_kaluga_v1.cfg] +source [find target/esp32s2.cfg]