From daf596e54162a90f24ec70f34c29b870bcf734fe Mon Sep 17 00:00:00 2001 From: Changwoo Park Date: Mon, 12 Jun 2023 08:56:58 +0900 Subject: [PATCH] =?UTF-8?q?[PCB]=20-=20Interface=20Board=20v1.0=20=20=20?= =?UTF-8?q?=E3=84=B4=20Proto=20Type=20PCB=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FC_InferfaceBoard/DFRobot_GP8403.h | 104 + FC_InferfaceBoard/FC_InferfaceBoard.ino | 10 +- FC_InferfaceBoard/GP8403.ino | 217 + FC_InferfaceBoard/Processes.ino | 9 +- FC_InferfaceBoard/TCPIP - Write Read.vi | Bin 42610 -> 51566 bytes PCB/megaPCB/fp-info-cache | 157882 +----------------- PCB/megaPCB/gerber/InterfaceBoard___v1.zip | Bin 0 -> 190471 bytes PCB/megaPCB/megaPCB.kicad_pcb | 40634 +++-- PCB/megaPCB/megaPCB.kicad_prl | 20 +- PCB/megaPCB/megaPCB.kicad_pro | 6 +- PCB/megaPCB/megaPCB.kicad_sch | 1322 +- 11 files changed, 24785 insertions(+), 175419 deletions(-) create mode 100644 FC_InferfaceBoard/DFRobot_GP8403.h create mode 100644 FC_InferfaceBoard/GP8403.ino create mode 100644 PCB/megaPCB/gerber/InterfaceBoard___v1.zip diff --git a/FC_InferfaceBoard/DFRobot_GP8403.h b/FC_InferfaceBoard/DFRobot_GP8403.h new file mode 100644 index 0000000..2fedc87 --- /dev/null +++ b/FC_InferfaceBoard/DFRobot_GP8403.h @@ -0,0 +1,104 @@ +/*! + ** Modified by Scitech Korea Inc., Changwoo Park + * @file DFRobot_GP8403.h + * @brief This is a method description file for the DAC module + * @copyright Copyright (c) 2021 DFRobot Co.Ltd (http://www.dfrobot.com) + * @license The MIT License (MIT) + * @author [TangJie](jie.tang@dfrobot.com) + * @version V1.0 + * @date 2022-03-07 + * @url https://github.com/DFRobot/DFRobot_Microphone + */ +#ifndef _DFROBOT_GP8403_H_ +#define _DFROBOT_GP8403_H + + +#define GP8302_STORE_TIMING_HEAD 0x02 ///< Store function timing start head +#define GP8302_STORE_TIMING_ADDR 0x10 ///< The first address for entering store timing +#define GP8302_STORE_TIMING_CMD1 0x03 ///< The command 1 to enter store timing +#define GP8302_STORE_TIMING_CMD2 0x00 ///< The command 2 to enter store timing +#define GP8302_STORE_TIMING_DELAY 10 ///< Store procedure interval delay time: 10ms, more than 7ms +#define GP8302_STORE_TIMING_DELAY 10 ///< Store procedure interval delay time: 10ms, more than 7ms +#define I2C_CYCLE_TOTAL 5 ///< Total I2C communication cycle +#define I2C_CYCLE_BEFORE 1 ///< The first half cycle 2 of the total I2C communication cycle +#define I2C_CYCLE_AFTER 2 ///< The second half cycle 3 of the total I2C communication cycle + + +//#define ENABLE_DBG //!< Open the macro and you can see the detailed procedure of the program +#ifdef ENABLE_DBG +#define DBG(...) {Serial.print("[");Serial.print(__FUNCTION__); Serial.print("(): "); Serial.print(__LINE__); Serial.print(" ] "); Serial.println(__VA_ARGS__);} +#else +#define DBG(...) +#endif +#define GP8302_CONFIG_CURRENT_REG 0x02 +#define OUTPUT_RANGE 0X00 +class DFRobot_GP8403 +{ +public: + /** + * @enum eOutPutRange_t + * @brief Analog voltage output range select + */ + typedef enum{ + eOutputRange5V = 0X00, + eOutputRange10V = 0X11, + }eOutPutRange_t; + /** + * @brief DFRobot_GP8403 constructor + * @param pWire I2C object + * @param addr I2C address + */ + DFRobot_GP8403(TwoWire *pWire = &Wire,uint8_t addr = 0x58); + /** + * @fn begin + * @brief Initialize the module + */ + uint8_t begin(void); + + /** + * @fn setDACOutRange + * @brief Set DAC output range + * @param range DAC output range + * @return NONE + */ + void setDACOutRange(eOutPutRange_t range); + + /** + * @fn setDACOutVoltage + * @brief Set output DAC voltage of different channels + * @param data The voltage value to be output + * @param channel Output channel. 0: channel 0; 1: channel 1; 2: all the channels + * @return NONE + */ + void setDACOutVoltage(uint16_t data,uint8_t channel); + /** + * @brief Save the set voltage in the chip + */ + void store(void); + +protected: + void startSignal(void); + void stopSignal(void); + uint8_t recvAck(uint8_t ack); + uint8_t sendByte(uint8_t data, uint8_t ack = 0, uint8_t bits = 8, bool flag = true); + +private: +/** + * @fn writeReg + * @brief Write register value through IIC bus + * @param reg Register address 8bits + * @param pBuf Storage cache to write data in + * @param size The length of data to be written + */ + void writeReg(uint8_t reg, void *pBuf, size_t size); + TwoWire *_pWire; + uint8_t _addr; + uint16_t voltage = 0; + int _scl= SCL; + int _sda = SDA; + void sendData(uint16_t data, uint8_t channel); +}; + + + +#endif diff --git a/FC_InferfaceBoard/FC_InferfaceBoard.ino b/FC_InferfaceBoard/FC_InferfaceBoard.ino index be95fc5..8fe4c2b 100644 --- a/FC_InferfaceBoard/FC_InferfaceBoard.ino +++ b/FC_InferfaceBoard/FC_InferfaceBoard.ino @@ -54,6 +54,14 @@ int Wait_485_cnt; // ---------- I2C (Analog Output, DAC) DFRobot_GP8403 AO_0(&Wire,0x58); +DFRobot_GP8403 AO_1(&Wire,0x59); +DFRobot_GP8403 AO_2(&Wire,0x5A); +DFRobot_GP8403 AO_3(&Wire,0x5B); +DFRobot_GP8403 AO_4(&Wire,0x5C); +DFRobot_GP8403 AO_5(&Wire,0x5D); +DFRobot_GP8403 AO_6(&Wire,0x5E); +DFRobot_GP8403 AO_7(&Wire,0x5F); + int voltOffset = 185; // ========== ========== Processing @@ -161,7 +169,7 @@ void loop() { }else if(cmd=="AO!"){ dataSize = demuxNum(cmdData, data); - client.print(Prcss_AO(data, dataSize)); + client.print(Prcss_AO_Write(data, dataSize)); }else if(cmd=="PV?"){ client.print(Prcss_PV_Read()); diff --git a/FC_InferfaceBoard/GP8403.ino b/FC_InferfaceBoard/GP8403.ino new file mode 100644 index 0000000..af8a210 --- /dev/null +++ b/FC_InferfaceBoard/GP8403.ino @@ -0,0 +1,217 @@ + +void GP8403_setup() { + + while(AO_0.begin()!=0){ + Serial.println("AO_0 init error"); + delay(1000); + } + Serial.println("AO_0 init succeed"); + //Set DAC output range + AO_0.setDACOutRange(AO_0.eOutputRange5V); + //Set the output value for DAC channel 0, range 0-5000 + AO_0.setDACOutVoltage(0, 0); + delay(100); + //Store data in the chip + AO_0.store(); + + + while(AO_1.begin()!=0){ + Serial.println("AO_1 init error"); + delay(1000); + } + Serial.println("AO_1 init succeed"); + //Set DAC output range + AO_1.setDACOutRange(AO_0.eOutputRange10V); + //Set the output value for DAC channel 0, range 0-5000 + AO_1.setDACOutVoltage(0, 0); + delay(100); + //Store data in the chip + AO_1.store(); +} + +DFRobot_GP8403::DFRobot_GP8403(TwoWire *pWire,uint8_t addr) +{ + _pWire = pWire; + _addr = addr; +} + +uint8_t DFRobot_GP8403::begin(void) +{ + _pWire->begin(); + _pWire->setClock(400000); + _pWire->beginTransmission(_addr); + _pWire->write(OUTPUT_RANGE); + if(_pWire->endTransmission() != 0){ + Serial.println(_pWire->endTransmission()); + return 1; + } + return 0; +} + +void DFRobot_GP8403::setDACOutRange(eOutPutRange_t range) +{ + if(range == eOutPutRange_t::eOutputRange5V) + { + voltage = 5000; + }else{ + voltage = 10000; + } + writeReg(OUTPUT_RANGE,&range,1); +} +void DFRobot_GP8403::setDACOutVoltage(uint16_t data, uint8_t channel) +{ + uint16_t dataTransmission = (uint16_t)(((float)data / (voltage + voltOffset)) * 4095); + DBG(dataTransmission); + dataTransmission = dataTransmission << 4; + sendData(dataTransmission,channel); +} + + +void DFRobot_GP8403::sendData(uint16_t data, uint8_t channel) +{ + if(channel == 0){ + _pWire->beginTransmission(_addr); + _pWire->write(GP8302_CONFIG_CURRENT_REG); + _pWire->write(data & 0xff); + _pWire->write((data >>8) & 0xff); + _pWire->endTransmission(); + DBG(channel); + }else if(channel == 1){ + _pWire->beginTransmission(_addr); + _pWire->write(GP8302_CONFIG_CURRENT_REG<<1); + _pWire->write(data & 0xff); + _pWire->write((data >>8) & 0xff); + _pWire->endTransmission(); + DBG(channel); + }else{ + _pWire->beginTransmission(_addr); + _pWire->write(GP8302_CONFIG_CURRENT_REG); + _pWire->write(data & 0xff); + _pWire->write((data >>8) & 0xff); + _pWire->write(data & 0xff); + _pWire->write((data >>8) & 0xff); + _pWire->endTransmission(); + DBG(channel); + } +} + + +void DFRobot_GP8403::store(){ + #if defined(ESP32) + _pWire->~TwoWire(); + #elif !defined(ESP8266) + _pWire->end(); + #endif + pinMode(_scl, OUTPUT); + pinMode(_sda, OUTPUT); + digitalWrite(_scl, HIGH); + digitalWrite(_sda, HIGH); + startSignal(); + sendByte(GP8302_STORE_TIMING_HEAD, 0, 3, false); + stopSignal(); + startSignal(); + sendByte(GP8302_STORE_TIMING_ADDR); + sendByte(GP8302_STORE_TIMING_CMD1); + stopSignal(); + + startSignal(); + sendByte(_addr<<1, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + sendByte(GP8302_STORE_TIMING_CMD2, 1); + stopSignal(); + + delay(GP8302_STORE_TIMING_DELAY); + + startSignal(); + sendByte(GP8302_STORE_TIMING_HEAD, 0, 3, false); + stopSignal(); + startSignal(); + sendByte(GP8302_STORE_TIMING_ADDR); + sendByte(GP8302_STORE_TIMING_CMD2); + stopSignal(); + _pWire->begin(); +} + +void DFRobot_GP8403::startSignal(void){ + digitalWrite(_scl,HIGH); + digitalWrite(_sda,HIGH); + delayMicroseconds(I2C_CYCLE_BEFORE); + digitalWrite(_sda,LOW); + delayMicroseconds(I2C_CYCLE_AFTER); + digitalWrite(_scl,LOW); + delayMicroseconds(I2C_CYCLE_TOTAL); +} + +void DFRobot_GP8403::stopSignal(void){ + digitalWrite(_sda,LOW); + delayMicroseconds(I2C_CYCLE_BEFORE); + digitalWrite(_scl,HIGH); + delayMicroseconds(I2C_CYCLE_TOTAL); + digitalWrite(_sda,HIGH); + delayMicroseconds(I2C_CYCLE_TOTAL); +} + + +uint8_t DFRobot_GP8403::sendByte(uint8_t data, uint8_t ack, uint8_t bits, bool flag){ + for(int i=bits-1; i>=0;i--){ + if(data & (1< 250) break; + } + ack_=digitalRead(_sda); + delayMicroseconds(I2C_CYCLE_BEFORE); + digitalWrite(_scl,LOW); + delayMicroseconds(I2C_CYCLE_AFTER); + pinMode(_sda,OUTPUT); + return ack_; +} +void DFRobot_GP8403::writeReg(uint8_t reg, void *pBuf, size_t size) +{ + uint8_t *_pBuf = (uint8_t*)pBuf; + _pWire->beginTransmission(_addr); + _pWire->write(reg); + + for(size_t i = 0; i < size; i++){ + _pWire->write(_pBuf[i]); + } + _pWire->endTransmission(); +} + diff --git a/FC_InferfaceBoard/Processes.ino b/FC_InferfaceBoard/Processes.ino index ec23fd0..5f33a91 100644 --- a/FC_InferfaceBoard/Processes.ino +++ b/FC_InferfaceBoard/Processes.ino @@ -90,7 +90,7 @@ String Prcss_AI_Read(){ return str + FIN; } -String Prcss_AO(unsigned int data[], int dataSize){ +String Prcss_AO_Write(unsigned int data[], int dataSize){ String str = "AO!:"; int t = millis(); for(int i=0 ; iFf8X*}2 za>y13Mht`TzK{A-x%OS*(*VnyDl>=4FUr@Gaj;Lv3 z06d@oOB@*~V|5z`YdcG0V`C34b}kepM+#&) zu+Gr627@8pcxL5k2xEPx!QfRz{#77*pvvunvGO+dgM|ev!E?J{`H?5DxcF`wR^_-j zbVL#5IERkTc(ZxzDqotQ5VfiKFua@?|C6557~kc}p;t6u-F?1L-^8uGG`A9K(m^>= zv~7x)L^187l(S(je))R!zU*|LQ@+dU{YPUy$Ct`4iaHiE$`Wsmq!64YdqM&<{npMP;Chq>kLZ;Hke|-ij5Z_D2|G!82Nnb+PcVDJ{$&^;=?- zskB${?R#m#pYYtHf<}2}g{FB&XlfF4o>C2o?1*HAAJ!apcX~hKwSSY*tDR~cRURJ4oy1)c*>Ciz zvF~kl`5rdQ!`rfm?s(4ouJB&DpaY4vQR0rJww%HP6B3grnfzZ+F#)*&xXB9NvO1bdNiFg8W2RXBq$SH20 z%bi+f>ps;E3U&ZWtJH$&yL2xM5v;c`<)Hl6(GrK>_MP`wCy?LrgmSc>r1FNJwHt-B zpPZO6+_w9X_k+ZGhvxfFvT`aN0>PhA2on;{>cY7 zV=US2qxBT(t z(^NO}E9c*d&vsK6{c{iIkT=TvnrgBIy3cF&{62wktMhJn`B21b{Zii2RKRmg()0Dt z^)+b7B9YCHEq(0M?m{D#6b!$Na$@mrru{8ya*kE|c4Q4h)3yx5O?CDA(`Q5Yc)O`O zsL9?dsS(zT^W{Sb%O#WhHIc7SqUr^grwVMTF;vC3u8FRq3@9=dK5qqIG1+v5WWQWq zO1gfYV#~_#$-(5e$$U!#k}rZULg%wdsf$_m&lXHw*}>Po2#2d9+$1&Mj0L~hO(shF zy+t!timbvHdr00rPx$l5%>4aU(^^OO%YcpCQGGs#tWSbP_Z>X)7T)l7(=cI#X)zU% z&#Y_wRLRt+QNdxmp6%uC^~^jV+po85+cUgKZxUR^e#C-1v5^?d$>>>2Zlr#bxU==JBwUqa!6JJBHbN{mBosB_HM7e{h4(u&mxXF8zimFciivVS%VDUAIPn-8|H!)| z%A)Nas8}_wq*NV)i|;*QG50C1lJ`SqpI&TV>SAGJZJkBwh0l|fsMP)~*YI4M_XF9l zV{O$~N;LXM3z7l}^=I#4WttUJy^lMteA1I?C|@!aWK?Il(LT<$VIs+~*o2-drA$9-2E(k*CPU3W~fNhi71m~C9`RNnZm#*t8~j973B z?*{c_rD85#GS?I#k6BJ?<0wrL)8q2<1_58Ie({huKL=(DmtrH0g;q9*h~XS6$EcOK zR$rf^Xl4pp4z9CKDAxYwc<{=`*YavJj^n%7Znsx>zKmI8p@Oq}hkzyvjH{ozzU;d~~>x^@$ ziru`EHE*|*r#2UN6Ozm_OPb1tMLzyaOw~$kag#8-4D&d4)bDA>*IT%APPaMe&JKfx z!r-*zpQr-{o=u*p-?9Jsx#G_JuaBU=Id~qr_ZR)A>A!uh`8Tam@8o|yX58O|!JK?N zv$lOPJvF4O7Pfb${pFdf@!=oQ#>a<&39EYsUHOh0KSF*6-j{2UwxpbY?Py6cW=di9LjnaiG`ITMXo2@oBb>Fz z>E+4v?sVENx?uIQY$0*?jT!a)!c6<`gv%$Yn&!#pQH#zj3eH|nYmZAh6hEC!RM7c- zDp9%VR6cKS9$gamzd7~Wm~ceC#Ej=7ZndNv487I}LKj?XKulY1IY(um4m`xqT4_N- zW#4K+LSyd=?4zkMKw(c>cqQOO8`S5zP>x!XkANan5V5)3Qj2Ej*lrnh!xgh|Q8q6b zUHoS805>gs>6oFW$wNr&8Ff3MfYW(M3H9RRPc&kR2LA1YEM_~G_y)L($TTJK3&;zu zT#HetB_z&_5#*1Z7$Y7M*3hlhGtxLA;PT_FE1=HOv|~ydu(V>z%$T%eGStvUkO$RB zAoBk*t!RBt-eS1ea?I%V9fzNwi$c=L600sZ0%gVt1#5+s+L@lB#>k>SA!0N1>J|P> z9#&lhoe#28iiZI!YapvwY@cmtz>6qXdMvvIX??k@u4nlg3mgj??I|C!((r_Gf*lAJ z;Z|QRgyGf&AZSN62cXlHz@Nu3xshVkaYdjQd_vHcS(A()XX$*6$t+NHVrXi{6E(6W zu*`jhWPr8!*w~X;3%Aao-LNF0#)Y@_`0 zx@APvBReOdvWL{jM-(yEu(prVIdHdH(mQZ3mM{to3G7mh2S z6tX<4Trw-$q19@cAre|d?;xCX{z`#3C2inRG*-RWCHO~49o)GmSQEnDLP8PK@KfME0D-zC2^u-l?103h-_kQT8vFDZi znQOAnx)J)Ue_qetw`bZ~Jk(h?=k2J)ttPP4m2)c0X7|9~z`k;!sQOf6&^{oYIf^gn zO|!!%{l_U9l^xspWiBf}zJYT4m&Y?~h~wnWFX@~0(MqrvcU0Ty44yij$9fq@H3w`) z*LWi})5TZI5Z3rb=!cr~#dBTKJ7D&@2wyg0I)`HUDMA}WTY|PuwomMYfWwdN%!Af! z)_#q;UH*DOf#PbX#keJf&Vg-sR(=gxXl+MQWC2;wsV{+f0a@7T;U2M*)K(2iJ7NU= z_9CT2v?4)TbPdI?Mih@1#Jf(ho3w5b5=Pkj=w@gQ);%|1?+dpC#KPH^cW(>mkCqHh zRxc@rmem7^ZJO6_$!ezd<( z(VyLgvOVE$6a>B;JJdAs+srX{h%$(-=8_KJSrn{*rhrhZ5Nrmn!-gr)O1xXVMS zg^oei&%lPYa1qd*?mF zsLxqXwFtMp)5>#j^-P1rhYE9era!Z=alTPFWa=8y_@Y-!KI~=w!iK?c3Pbeue!`!# zcrLMciX7s39zrWIp{aBu9ODWdUEMJ*Q`~QR;caJcXnT9brgo-!A2KC>!R#7~Rnf9) zA0NA~x5z|jc6KD#W!in#q~cmXcEwTrWzlW5bn+W{WuI`NSBc{pc}i#B>c>qoozg)= z3~M~3#7p5E%zgHf_2MqGwS7dJ1qSTE@lwO3VLU_DZuhlKLe+JyqZm6a()sr7ALhph zG@7WSR(-#jGJkQr`IQ$UG{rwR)@~o)hen^MVjf~_YuZ?cc*Fi9Iw;YHhLM`cQPJsO zv9yw6E)si07R!}J9Rne~w37Tt+DG6gj~`vjfN zvR{!#{Z#7+qb9H6|LzGNrZ8ww8uc4lIBfc9*yh9VhbG_i&YTKt++#Q!V|MB~gX%C)ylj0F$KFtwQCc1 zQ(<>gagCV=8}+EA9bY`DipAUhnGmB;N0|6iMmmZF*@bS-QmtV>%LiURj5NzY5hJ*x zsVZJ#x6E=3Irl+TRr7mZWs||t^EcBDrC*+Gz_W~?xmMkySn-wmT6dZ>>u>2ny|LDm z{d&&W!(RZk;-`vPP7EtIIiIGtqNX*x)>#&hA+rMFCx7%*1k)Z zSCAo2CqMY9sD9zfXtFDlH^}{pYDry=p&&7l!tCw0oFUR@8g+!-dG!dZysINNl0sUE zVt4_M^CZ){hCYpKYK0HmFlD{9z$V;gu1w2U8hw*Ffe@`N()&~;sWLioBs$SGl}E_x z>!0Mk;j@kS_o7<*HMt%O7gNL6l^rGDZgS~XuX6%RJPN-`@-k^My5syv|0YyW%~RCw z|Lf!P&E{Y#?2d_MdEbZMc2*>`^mA5&nlR;k(Rb^!c-fYfq(}s*tsT_n+nv#qFWdBr zZZH(BVu+sWy>WB@#n)O?_Q3-#SyR2z-Q7y=b&j)amu6OMj_E_2VB-m)*?V-nb)Q@N zB1T1qUmTK3=<{ipQ6K&p-7*}RjAulF!z7!vz+uC!D7DhWO73Guulc0UPdJ@l+$Uxk z_3=F9bguVycI%y>UB0vYn^j*m0Zs<>kmmw1IG&8HzG6BA`cZ^QpJN*W@lL1DYZxaH zld$_?zlkKyu4l>Gp@+V&)%@!p++-0gXDTl&s;21u9}ICt zN>r0rRDFzK3?EQdaXt1>4PMLY9Gp#9QVTwi9ZaU*b&+Qg!D2bEn2+De48pJ+dM1#9 zTN^7HAnck=!P3F{>}Bu!iY_f?!;+7it9YuF+2N8j<&s4)@54W?1!)hwy`RM)?G0P^ zSg;tB7O2YSo^Q8D$g=tF6h0TWnn!s-iVxrSaWc*(ndR@+(<4O~;&(p!37~%>@-QvXbg!V@6~!C_wJVc$s9`KW&HUJDVOthz^0;1P#7kwXk3Kq#T!vXHG%(iQww%4V`p#W_0LzAe(p1|c;Aw$G)~K{M8MWzoa)qo3T}-1+1A z+HBQkp{Y)_?MCdc^6iHtbyDQCZm%gK8bq3e+6>M~k`+$^%C>%QyQ;mMKCnVy?0%f* z@=o@h_cr`}!*=0~m9pc{@q|6)ONIec*I49=MdwlSx~}D}Vjm_;zu$A+_RFCa%1;-G zrtr{vd_|*tu!Yj*DsGZ}6^2*pGOwOFjQ=#S1nnt_Kva-HquA^PZnZ|;v0Mfz!{M1n z^*O(tvYD;6@M-xcPvPm=F8CQ)FSa!fJ%KWfOy31t`&KxevQ31Vt_`*WjkReKF5aDk z-Erk(Ua3E@aIxq}G0{A+@oc2#Pt#tBOVSivjrm9GbJlr3qbQ%I;xjceBrVMc|D<`w zaE#sehpYi^yg;WEx$7enN+R1to)FBpuuORr`>3E(Y*hS*HTTKaG2ck3qx-mx)dao* z#FWE4Qe0-#EDaUopV@a^w7)SQBfvF{n%pwkT6_HBizrN3ds}SSKpwVrHS%)(Xy;|? zq+i!NzR!QU#<0}iTlP#bt#F&Cpxf=X?en}{3oq+ZuUxSv&8SRS$;=Bi{wm5o563jd zQ>;q4;S+ytSV%a=Imep^Xa1t#jX|}g!2HPb^?C%%oU&@u@8k|ny>;sXT0f1xl#yK& z75ke=?HwF%+sS;mx&EpkP*(bU^=wkWL~fe$seKUD07~r(J6*=+C~CK^sdovYO=+*t zP-#ik$f&}<6xeodby6KH>(-T#H}faV7t9eaovwtQHQF2?NVe_{(j4?%!udJUHm^ya zH@egMIc8kFXKGFn`!il4EdK3Q%k%bDN1mZ@!!{ywYGP zQADhct7qn7Bys~KnW|}Tsmu(AOMj9i`fUq%MeT~AX)C{@+c&W%`UVb zD6(|zA8Rn;bEF&Sl!Bu*VvneH5Z9=%{t$w$+Wg$cq>3@fa3hYrQ0k)6oS0DbdWz=Y z*L@NF161C7ikU-%+vuly$Gd_RF`tH2I@Twq@T6_$I+AV_L|{opPnCA&OT}T;$~snS zM8vp4N8g=%BU@wG2ZyvKo2D_nZ&2w zx19R)4aW?QqLv4eFNfjmwF*oZ%k}6# zd6WD7PX+(b5who_zDM%2ZV4Z;#NuBBnmJb+b$u~fz$_r@o~%EHuU`MbTr}JZSD(Us z7;|$kkX?D*X`7)y)@$>HrruJ>y)Q})yjE3Ii(k-GA8_g`AB_1n90xpL)6Q4u8_?*; z@Cp~xPD#~oc{fxm{OGd_IU6f~3Ni5u4V&7d2bvepJ8UMLwn8V6x!4CA^mGNEPqqgA zqBj_2s2+H#{qaL5VNfFWr9LuqYeBqi-8U7J(${g0H`vGUA(oAGxU7aRgq0UJ>wj`+ z>$mK=?;Tp@Nf}&ke#VLvkM77p-nXti8)?67H@ipnAeA%snCaWk5I*_OZ|2V&g8hkh zH2v042J1J{6Q%cg5VVvgX0bg2lvZ@pCM;4}7|8EORZF0yGwO+u*F3R6`29@4VC-H> z$zfQNSg>Q~`qzoM$D(=!WIj7=~nU&599JzXRJ4KYi5 zp9{H{Yv+?W2G25ysk+G6iEM{jgTZj@N~A6;!f9#F0r!Zh!1}Xl8OqTc*V%7FX;c0^ z@56si4Xz30Xe*VajU(n3qoHJe9Zln;r7o}YNB2Eag0UZFEG&ts=dHzPpp{OmEeaL1 z-)qV!4O1}uCUJjv=F=8^uQA7ZA-qU4zB|H9Uiv8F4}pH6tqWfv-?zj^LlvKU;>?Ac z!=>OGv$XN1c+RM1r*xThg57^0XcC~KgjwlpqrdE(`Vu@}zWq8hTCXN1U{n5NL36TZ z>}Zq;@fEhK=Oyj?Q<{R8yu|(=e6wG>sJx|5mSV^o!oK-><@hB@*zlQhq@42PYSMeH z2_KRED#!gQ^|mh2vNVM9)$Dvb-Hz{;`N*zYzXzq2lSygo<3hPOzDc1dgRDYH zzw|nJ$!9sGl2vu|!9Z$gQG7aiT&tp?BSB88fL`Hc9T5271m2CHY zJc{gF;ny2R6fr0FMM)0gQ3aZ>s4xXJ?&&Y3)EQb;_=opm?I2O7?I~|)(CQXF zSMzh}Gol!)Mb==voU(2x&DzJ-=y5JK*ZP#$;ZyMEh$m%L--(dshYx2VnFRfWkBT=* zVMPy-Kshyz~!IY!XR1RWiFbz)CCbbc`AE>eASgJo@Y~3jgj7mxleZn zey^`0tMeak`pBwY>b-8B)mP3deiDC9;l)GQ-WT zFf6q)I1Q=&CptRpU*GD;a=1|>zCfz`YN$d{k~906udX;^nc!Ov!O<(!S+OzGdpvp! zl`TbY8t7OjA2^B)oK$XaY}LKW$f~_DI|wgA<0PCc?s6*%FL1DFu;&q%E@F*2VI+%7 zC6jU(j1R*qkK7p6FSZ#b{KA<%)%kEx>L+}^XYF?>D?Dsc`f&X& z+aj^c1t%(Ds{zew{pd(OsB*i^=!MQ$g&nh>3mG(FB-KuxC?ERSVzSOMU!)12W1W5Q z*zWmiY&-6sZ6{xb)iZXS(NL1jGA^`NH=H}?@_tUIXPMLw+>R54Wzp4RV{^LL=GTLdneK4rCZ_s$Otc)VHyY5H^|0rnh@VQrnm3;`k6}_3;+9XP|&3M{@b*FTVs&eSB-$jeTvJ=n_U^)Y;-)w2lqoXD5^o zpHV%w&?kDVTwd|g_W^gnXO45K%zLSm6^J=GOsLlLqaAyO{wg=(R|%)1i`EBPqq}1S z9rmpE2fiPP@_u!gHJUgbeX026{nE>9x%}JSk;0dn8Cs14G?zDdn++3BJlc(JvsSAI zzGqx|>^L13y@+d#c^nuaHiaur&%XRXW~P_8b-o2n^l5<2v5rv4w4)3KR>1H;OFlve?nL9Z4HGO#Y zp9t)!5jXq?4krq)l`CY6kDJAhs!PO~jj6e^#xGVszNF~kPI5EaF;>nX-y8H19io>` zH^rx&1AkLaXOt$vrfUy;uG2s{r+GC$ah=z%QHXAbFtkXds?vmcAf)^tT`{tprb2Ipcn10%YWJOq?^<{TM+}{lc&_P#o&}i z^0ZO@28>fBG6PnsK04zN?ah~ut7R(RTHRnH=r5rn)0*&oqEg&Kc=v`Nt}P=0Cqb5s zZc%`4(T>H8cx!vnDG{xxy^8&5XT$TE9r*b<_e3^qoIjR(r>lm+ z%oKv`2am+uM1}@&Kdk=pO>#c_p3}WD-3bu{J1UgS@vp~15v4OnSZZ7YJoZ9q)5%2Y z51+kk#Pjye_kwRgNR|6AuMzyapJ$5_1(s&I`1%Y^?6{{U0%q@$-;F6gV0s2`cD6pe z_aUP`a>qS(C-37W#^h{QV@0-Wiu}F9k%4`W-3}r}Qqp{**a~vIwll8ZWv`v;XSh1} z?@>0$P?W$kEM=N>5rnr@8K|B3s*_K*)(h{7U|Vx%D^5^fUWPU|PShQKd4m*c?c>~W z^2q9t^CXMz<%H9#=d)y1yM)fR>DKtSG;tq?6;4mne%?cZ7vKyyAR+Fn6rX(c{`KX- zmfL2K9a+nVQ~JX-xz>qV1WkD@UQKR4x!<~kBmRacTeS7#-0ubJC$;uiqd6b0?qhr@ zdRsg8?fMlyCxUm*HW>%s$9`>%uY^eZvA=a$3T{@v-lqvM$gr3C+_2)6d%3mGBc-hr za@B&)KfSE!;eviC6=ykA|4~m^YId7t_add}WbqdZ2Zx}AzOH$m2!11dd$hcn0!p|i z_gglxOKC+#?Zm`3io;KA`O7HCdS>+VJK10Fu}>~0xmP96na6M|#}231ls?Kb@&Be( z`NBqRNPSuEkb+*iNA7T0?zW%9D_rBPxV8DsQ+AtubnMcatSS;FduLasuN}rBiKj7G z`X5nuGy5}%vZ@|WEHacv$d-l8c~Nsvv}L5EJd)=#;gh1~H)yCp_PkHapd?CTQ+R;W zO4VN$eaMb${gq(Vd5)#6XqU^6vHWpm$>T}(RQ6K=Om0cCkL>)Fh*IVH3%(tC6tnH}WClS`t3b2p1Rc$4k7)YffY1 zctT1_*A8YCRuOsrP1f0)JU9{ z6VXWTG+jdQ*zGK-Gn^}f5XbBn%Sc>mrARa@L(XLdf5|pHuh(_(Yb;<=0#NaP^^u{vAZngReB!$+@Y{DzjI#0Iz7CYmiFcg z*1j>#BEQ^z^9fGc$Qx?yKO37!zk|CzXrLRc%WdpADj2u^Mr_XF&OXW8 zoj9(bdi1*ZXu+yD)UK0ClP09W$WeLE7-_-hL-g!*pPszZ}ot&r#RrOD6y+)?&{WukT65APztJ_T*`6G_W z@{VH@XTGjzLGJIfs7d^T;nuV^1=H_h@HgJOU0@yU|9 z=e=)FWBIV7Ft+7=1;y>)t}}nDn?&KtRb?$cJbL|LZfM_wx2IIe?Ra;=UwXs4H^f5L z3zx2SsHV!|FmBW>8tlSdTGI&(oNWUIixLPt_o<_g*`KsYy(lRyt ze8t%B&rZm?f#6Bp%w*Q4np;UpYei&Ee{8Cw6UfQpJnT(z@CC0vA?3wtamh?qc8f7U!`+q+|w!Zkiz(O^adGa#+F@58Og5VF2ITl)usuuf!f>}DcsnD6h9u7j7wjGIv$nrFR2CN}5t1yo?bCUW=ZvhoE>f%;65Vf-qe@$q z3lqZ+^UiA46+HXYWwCf5*TH<>jr8hBgf$qyEio>u%hD-DWa<@Pl{K@n#<{bvFvWN{ zMc1*$65PRSd(z}9fqJqID$!>N@I9l$gG*;yZF^ch90jG=fwlYxR~otJHmOVLaZxI) z(gJ=)QBE;ZA+AqCUa+*WbGB2N6gLm7^_c6N z5^-sH?{H#oit5_5q`x!XO9>{k>7f*`p-y)knSNogYT{i&K8=>RO?~s`*`Y1`!ncDr zFarni0c6ySNk>7&UtbJrX6l&s9{q^9#!LJ?c|4nB`rvs1!4dmeaU@D9T5|q-CncCy z>!j1ib8|mF17mBWd3Rs4gKA@ZPVXPK@DKcNk9dC#e{^^u^0PtKl|7q?7IEiZK)_;2 zOUz;k>}gq*^J|+vd93*f*#{qZUHWtOltb;fw=Eac3N^R#Z^Hi++&*O)<6XI`pk+cY z?7=F;u2)q`)W~b83FW!Tt%rBI<(}009-X*nNzBgEYq+Vhi>g|xoZ}mSKml7bma_XZc>)ikAJXZ;8w|aZNH)PCZRPJR{1088a3-5p$$V z5WNcNZ*j^9?cE#-$`FN{=rYz1=k!i0{i4q}6727|v47h>6m6Jug-7&)$fn4und|Dy z4sBEW@Co|(0=ssyhk#mU>%~AY`h9l4ikUB-$&CG)x_fd67=*9T{CBDsHW7%f?ge@y zv3X(!iqr0eV4(Y@wvc8J`7pP|Tp{2|mSh)(HV;_0D&y8rS@vr@qUwFe_LhDs>^^(N z_KDBWPb?WLXD>KxvvLtjnD!__F3S^If*0nuaZO(a%+v14hoGa)`){(W`92lvIW3^D zy_!G$w!nd!741`9Q~Y&|<-I+H?Y`NxZIra@58KwE(Q&%2vZ^!1ME*Idr3muhelYh z@@nCm5`X(f_y-i%azu*9(An;A1{R?qmR`!F+|)*w^RWf%DQeIki?- zy&kT!7b#Ly=!3mwi|^1c#exrgQfhaudvU9!UBgZx6(Qc({0QZE!oZv-qVx*wzYdwj6knR=zdOiSkCU*p zZwab!Vau%hy4w^VI{(^l$9jJ*^laKS+XLfZ_blm=Z3EGjKp?^!q+7j;v8v>Kt&TPh zCtW8bFMfH_Ql_OF(*2|ek@^`Tzel5@eL?fRUl+yNYTL0(|?_C>j| zjm@7Pao2vNj7!*O?1UMw%kRU;b3}VPqVt_@Kx{TYnF`OQ$*u;dQS0sWNQ_699?W4x@Tqcq{8XD z-o=#+(>Ilw+1x4a6Ix&HTQ!y8H(v>V((!MMAkWn~pJh2|Vs}A1^M=Q^K9|wK-@6|| zi%lKp_AvKLbwDNw#U|r|KydXj!5(tA?gi=@Znw<=QUjy0k2hlrHJ2xD)$L$NhjzA6 zAu7pM1A?iJPAT zi{tdMa)t z5})6yA=sRr^u10IYkuji%BI3Td{wyHXx1USCc-{9+lXyA;cwe~S*{G$9Jz9eVE!j{ zh!{;*b^0vRe3w=BqaKRjo?I*M!DSf;sfdB;; z*|>?w62aI(hQ!B9D=eTjZJZXPX=a+)WN%q&g4*Z28a0^1KZ^70fEaa%cU(Q-vK;({ z*?3Tb#77X10EqcfIhYTMX$}H7h-ui)4vHqQnnaMM&D+Bk`Z#zfpiWbAw z13gw<#w5KWt_-_>5;ZQM2o=NiQ!NsP>lnFZfFOC?cEefJo(3IH|D;8T>7ZY*OIsG< zB~WX{?a{#>qGO}-dF4fTDRp&z@3%e1U@s15dyaMm;uS?8?Tta4FU`%LV*(%|sgkVSy)0*s6KK!YL@}bO6W!@Y^ zETEi{`TF;Fz1s**pRzv^$@pT_SKMvZBt9ujCTC?X=u^~0viMcs^U*B416n!gDd?Og zEC(oklH2Chf2}<6W$A9Fcq(y*kW({;%-N1`BaOn-&hJ&b=TBUZWUAvWE=@9KgFnzVKoDPrk|tJ zjGsT6eyfRf)pAR|CPT7OR9#YYJcoO#e81lJh3+-N*112t=Yy4a=zEW!z-u5ho>{IY zCMMmFsyKyVA2UcvNs=+hND>d#)kx!8h>>UBony*YM@K!bj=QIvA9qiYIa-0(8bvN5 zZ#)>6VR+!fFnRX`%lqN&mWlOl)CAMO-bd6H>wi?yu8dm_;O!=G1HXH2wIPo+HC3ap z*&)j?aG}r)!bb(Prw2^nN8DcB-p<24*xlM)jM@>8*E6Dd#xBP`Qsgn*bMzCf1nB@y zM)qL~G*pC_Fc`M7XI7<_lAMMrf!~RYu?+6-p>%)srJ*(#s|P%!{?;5!uTEdP?(}CI8a=43 zJsfyBB)U4|+T?0Y&~YN5q*{Iv!?-)dB&|BE;pbkA>&VwiXeQ6!w(QRvnOvu(BRKP% z)rGAaPKPd1LZKh`{SVnlc}W6GwMBTwIlT90G>kiHi}_I#xSL%%ZF&-l`ZY4FS38AO zTdBIV=8^W?6c%ZU#;O7AhtKOr;IulLh5fs~wA?0iy^30JgQs|Zq!jQ>GOe>$Jf54? ztYYht_opqw7M$TXF-)p{m?r$W70fMl0mJCUNm=P?9I6+530gboEMI1JeU>}kHl|a2 z!|n-|ImJm6nD9=^!ngTUkJP|1`4VPNS3$b|;gN^DrrbL1JyvTit2$}kpDbHDywhw9 zudN;`n-qG|c2KvZVE@dW^nA8M^m;?L3h(*_Va=}Bfl1A?ygvw5&2qvR!jWA`zFXAR zzBN`6*x#Qm+Em4$aQFPGmvtJt780}@$krUn=Pbnw8vjP=Bc*jqr>RF7Bx4^ssH`%D zwTF?HeP31C(g30T(<_{IQRO&fTAVMrtM_&M8IE#M$(zG&gh(t?Jjqbyr5!do5~oab+bqIlbRPv5w$^Lr63=)@ z{QA3>-191|I)x2q`+WehjsB8j|N5(rv-=m~hWv%ZPXkR$-6fC61Qe|?J_1}6c%_Xb_kXn!G`_}>yZTXY}+PT;JdS;ZxbNe%!}1`>EGKq!y^ zQ2+!5sP4!;h(O=ACxOTdK*%6tH_*}&B4I$145^@ve+EgW0MUfVDj+q!AE0h=9d}(}BnekiV6%bVDeNa7!KB@n(G6C1_~?*B4BPX zZ18~w9e_kg!U=4k-qE00ctHdTk`Rda0ulj{kAOr&qzf2BVS}~^B>sThdkRPnaCpxi z5FChP0UHHK)c_>95SatS1E|o!l;NOxp@X+>VNkH4^8%6%5$K?$fr2gzKHfkQXfabE z0u~bvnjpFvAkgtdw+5;_h}Z&>4-t1jG9dB}5O;`t0>;qtqSpY)XNW*!22vOXDNsT2 zgTVr7abRE=0zd+tQw%5(6+q+!NQ?o&)BzGth(Mis17l2opwfjTg@8bzjtM1@0Ej^G z^8vEC1}ak^!Ab(e0ubyTpn48ec+lMWfCP^M5MhXf0>TZcIsthE2qAQcSb&O94>X6u znD8YaHh>U8rwI?(5J9H^7b1ax_(7_EV50~KF?3{}0zyIyR9wJ@^e2!&35^`=DIAo? zD4=0LBcyNy#1{~7!9lU)d`Cf~f((KQWW@kk|LPCw9NOr+6!PV-^8y_(==efs89LZ- zm7wW12)-)dX8^Q?QXkkSlpC-bUZ6i5pt}z^2w<#4u+o3Pa)G&EfHs)Qz_$d@FM#a= zc4%>+9oQQ}8PL}oAOm$MnlM4MK>LB(2IMWEZ8NZy1v+!!6B%$2Nzgmv$P=Kf0R12+ zfG?g|Q+3l<(IB%m*_ujra!ey70S zcTm`Y4=_I{`q526DF?p6QHQqx`4g-mDkk6{f)LU{DFbux0SMLz5y+urj0n~i3Cs_P z8Wd*WuL6uG6X-x_LAezLv?D|VvQ`*4rJ%ThG-(YA@Iw#;d~bk0?0_B6A%G}E0OLfU z1qJwmGCIP0;0HQvpy@vslv$y7(4l;KhunXo#@`tD7ec8I(nE;>Lg+k02t^l!P;fzb zcW(py?yd(RSa%q}yUYvOfb0qb}a7Q3&r28$jr2Ky@gzA-p>V0HFwn>UVJs5EJYh48-7Fego@$mmO)q zo`F7KV9h8e0n&lBlmJK%{DM7&F@W*p0tE4no(+%*_yOw-195wIA9(=$b%8p-yUY&N zp?(40C1$7&;t0kD?4fl4YYn9h7%$Kt0t9n`5)_1YcNnNH4(fuS9UMR*faCy$0YaHt z1hiWPC<^S%00LWdnZHr}Zv-}Xa(94_fj$5rm=lzAVN#$U5T6i2nGHfHMcvhh07`># z0)PRZ$UOjM0rCTs1N+|qP#*Y!_CXP}2j}Gup>+p!D8oT`muJD+VVHut5{L&efM5;a zA%74;>j3cX0RgHP{#8d91gH$=2Vw)J0_0Z!RY44Y2B-!?O&cJXBcjh=h*Ad-#4HN5 z{s0k80BQjY{TreFbwEArFT8sW(FOg2y@crj1bYGlYjO7&U;ylXfx00;s6Pnp0UCh< zt&0g5kK12(_s9h5&_fU;M;ZAWm;T1xzYxmQkp3=*gR#It^8!`aJ;n9N_uic>EXMJqp->qXoq;Kon?SUI5(r3-6v4ZNd7*g1Q4J zN1%v+^3R0=2m{{Q&-m-csk{A2as{{PbqAiw|V z`ZtUAzli@+>%YeLpDh0G`~Od^|G)DO?Fh69cX0Rl*SP*`{CE2UO#bWV-{|k`{;So0 zdxG`>@(;n?=fAZ7tNMR@{|E>dj_)?e& zd73=`ADN%!DXI1Ar6J1vQaw{p6uQ0ZNHWr()O(|JvM#b-CTjm|ArzehP zU>_=>y~i-7;dhOi_)Wl15Mj%9u*IXA>qR-ouqnO-pG^|8q5L>E#DogE_#I;5i|_cko2zT|Y?y7xYeH9Yh;bAFR9=5@^He|m z`W%8~&hQPFuf?fahivhivqUD-S94DLB+2Q=;`)F59^9)hp*Lrad7o(&3HKarfE{Bf z{ZUFLQr8-vKHif_vn~Perfc>2XNni3_R2I^&i0P);5BB%=BawOUy+ELWhV({KMt#M zYIX4J6SOAuDZy}AJ%iV3Pr}M+!(8LJa;zh)+SAgpZqahWU)K_NFea4ns9a+r+GhW> z&0LyLny{u(pt7)PlBd3|DQ}GD=@fB3@vDWba~14J1ObwI{&LM6#1Z3Tq%!mLi3G{| zWRt{TZWS~kX`|OFOop!!P_SCe9v2)PwqBV( zEzjrX&uL$OvOKnTdqgyh$ogD7K=RrDMcO+CS<(b; zpkvRD%^lmeZQHhO+qP|6J2rQW9oyzT?{~k5i=X#)L_R00Dl5C{R7dnV-A`pI`B@}h z<2n~ag{x5#sS@cfTZtD}VKeDHi9M(iJL@3RaKwvRwS}m_x%obIn&h%LOj9F+=Cp4K zA$i&{yiB(RY@Qq%Sia&>$a*0Ci2Tk(3NyLp!ArFjbxVPTAncnwuAF>Ei_hgzL5S^v ziDeG%H2(le#jQG};E8Vi_3Csuy31fz!ju84Mn?O?RKY2?HLtG24MG(rRESsMUJ zw{tvwH<23Q{H6fm z?d>Q=zD&)i!8L~1K;bY1&@T)w_O|@|O>AIs4z_@Is3+m_F-vEp7R`xKi1}j|3un8b zHNuzur~qX=+=RCCJpp@fx=5RNR3d}8WZ{r`B^G$0kiC9x+rf5j`l8=KA*IX)b3VX) zODH=zdu6jdd)2wdr^mPV$2y=1z;m3bp)zFHh_FmiS#<-EzId4Ltu-QGJs1zj9k_(3 z|D>3KR2iVmGRndAFKSG~ptD@zmmL`Cl3QGSS*%zma|u-+m#r$*YDcTM#ywW9`BELp zomQJJ9;;d;D3iGV3E7!ess&ok;L_BuFgIKT&f1vODg}3@|IvyKXiZwB#4G&+6Bt%T zZIbHyT=#<_8lk`@+4a7GIqQ$_t7;5w}+lmHqx8{vFwO<%w*K z_}ghDN8TVrEPG=7c;nnVhb{i12g=+09ARg^$IkE{EqfyUYig%ui9#XL?|++x`V#Ocvq z=LY6S+GfW+4Bld!oDQ~N%)or%+<@Gj828~R{8_ru&2?7g-s5c7+=XI`nf3Cz`3ggCe>QvTO zP*Vxw`R1s@bo_f@5%?+*kt@hr6)9Emczk%(!Wfk=J}oMLv#e6ryl-VnI+xl7+VT#uWj zS@XpW_~u0CP997$<}faOu9J?Fr>4bkK8ah>KSg$yjv-24T9k+3MGZ^;8lHuJTXQP% zqnCqf4&$!m6nkA|Z<6xbVLxzuGV{>!&K{&O$6KrL(~H;J{1L;>C*WcB1G#A zp<0+-3;*%duo~`Rr~o5YiPei*G4p1a+lNIpk3;14iK&zgRZE>eSDu)ZKxhw@f6;7_ z6Ob1b6{l9O3&D50*^x~ku{+3VSNfA~9{#tOu!o2?JWRyJ%A({vG}?%W$Z&-!hOmZ+ zV->#IPWAXIz_Y%}+`be;`uV>arZ z`FtT=kzzi~+0!y+dqz?YD6ABOMEH${psp4iMYO=i8)>P|`zpE#~**)K+CxP&- z$~ghz>Mplm#EaueNUTNk3pA=4h?40cp8mo1sY)O00%U@lJpUI9%e@_Lg%u*qk6AGu z(2vP6!aS$bXF_NAtLfES+Ve~{J`KjhNyM8oo;TBrP;<4xjR=C%gqh;YCh4S4jKXPJI@?&e-zlmRfvZiTfplRbuzb(3h6@{;u#PN?00V$BqCV>>?U7eYqHmh zlSz1|R}=+kf3X<%gv1p1#@g4j6M`<~IcQWBIl{+8P~U_CMkb0Fi8z5MtxHsJ3hpc- zD7;9V$2q3U{5JZOv}=^l%oh?tpHWKm(30l;TKOE!mdtC5+WTgIs53=1v{C-Wo zzw$dGzTDf&;O4kP{+AY+e*clGN|!L(xwcn}$#OsSYU|0zKUt+{xlB%V6P3e%ofyg` zx16?`9=qWtvB5%si+ML`Jp6Zrw7eimdEuPVgsiU7B-6ofQe%~a>)DYMZJZVOaXPjG z(c1xuPA+pVOTwRZfmKpZ`Cr+y&;{%q|6N--oVOd=`hzlAYR+h9naF2z_9jfE%5{*w z(K=G_&G_}yZmEo;Z0vHsD2+?t4r+8rn^9Ngmjq>$#ADGja<>Cc7O~Br-RLhvX4BkX zwoUsj|J;ccHR5N>YzgsYGSA<2O+MLM(2$h{vmcBYkv~FlqDU)x{XMMEKyf>45i21_ z!+E?Iki!Y}DZAd;?m7}Q!iEd+9Wzi6FvK-R4h%IY`<-hGrCUc^{7)rNPw4Av{ zQ?jD}DB^&<8?Wvui@~idou^Yyp)0L9e)e-o*vlu{u$Rj5Q?;C}6nqJt|A2b)wcWw2 zd8l_zP%j51UM5Ht2YN~Knn2ytndW*^mtNc+Q{Zywiz$4-g!{t9#=@-|Rq&O8 zD;*g_+!Lp%JB4sb!&f|I!4*4Y!52HFVTR3xbtzbC_ny}r5HM%1$j@Jy*Th8OQUjgO z+=4${##KCh{YC6zg+T0ro*6o8gm;SShQQT~bt(gL`l$w=%gI=%Y_sJ=Yi)B55q6BP z2sgtWgUR*5V06lE#^@6FD~xB9p@f$v?vsv-Y}_Mqhl&Db7j$Y(#DEA&@OU!Char$n9R4qK z3rECitJW?n2qH&*Ji5VC*z%PXncCNX;Y`daoq4i!K!p5E@#}ZCgPWxwRVRS zs}s!XbDyh$k7AzQs=*%@K$l}u;$nHMSX^@?_zDoeGr@5ZcKbZ