From 4854e70c0ebf7fccc35fe0fd4b25b7bd6ce727e3 Mon Sep 17 00:00:00 2001 From: Michel Pollet Date: Thu, 17 Dec 2009 20:31:23 +0000 Subject: [PATCH] timer_64led: Brand new example board, opengl display too This example is a real board firmware that was built and works. The firmware was adapted lightly and now runs perfectly in simavr. It's a "stopwatch" timer with a lot of features. The "board" generates a very complete waveform for a LOT of interesting signals, like the 74HC595 latches, intetupts, SPI activity and the lot. This example is the crown jewel of simavr development so far, because simavr was design with the goal of being able to simulate one's own project, for real. Signed-off-by: Michel Pollet --- examples/board_timer_64led/Makefile | 45 ++ examples/board_timer_64led/README | 21 + .../board_timer_64led/atmega168_timer_64led.c | 520 ++++++++++++++++++ .../board_timer_64led/atmega168_timer_64led.h | 62 +++ examples/board_timer_64led/timer_64led.c | 356 ++++++++++++ .../board_timer_64led/timer_led64_real.jpg | Bin 0 -> 96442 bytes examples/parts/hc595.c | 74 +++ examples/parts/hc595.h | 57 ++ 8 files changed, 1135 insertions(+) create mode 100644 examples/board_timer_64led/Makefile create mode 100644 examples/board_timer_64led/README create mode 100644 examples/board_timer_64led/atmega168_timer_64led.c create mode 100644 examples/board_timer_64led/atmega168_timer_64led.h create mode 100644 examples/board_timer_64led/timer_64led.c create mode 100644 examples/board_timer_64led/timer_led64_real.jpg create mode 100644 examples/parts/hc595.c create mode 100644 examples/parts/hc595.h diff --git a/examples/board_timer_64led/Makefile b/examples/board_timer_64led/Makefile new file mode 100644 index 0000000..976db0f --- /dev/null +++ b/examples/board_timer_64led/Makefile @@ -0,0 +1,45 @@ +# +# Copyright 2008, 2009 Michel Pollet +# +# This file is part of simavr. +# +# simavr is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# simavr is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with simavr. If not, see . + +board= timer_64led +firm_src = ${wildcard at*${board}.c} +firmware = ${firm_src:.c=.axf} +simavr = ../../ + +IPATH = . +IPATH += ../parts +IPATH += ${simavr}/include +IPATH += ${simavr}/simavr/sim + +VPATH = . +VPATH += ../parts + +LDFLAGS += -lglut -lpthread + +all: obj ${firmware} ${board} + +include ${simavr}/Makefile.common + +${board} : ${OBJ}/button.o +${board} : ${OBJ}/hc595.o +${board} : ${OBJ}/${board}.o + @echo LD $@ + @gcc -MD ${CFLAGS} -o $@ $^ $(LDFLAGS) ${simavr}/simavr/libsimavr.a + +clean: + rm -rf obj *.hex *.a *.axf ${board} *.vcd diff --git a/examples/board_timer_64led/README b/examples/board_timer_64led/README new file mode 100644 index 0000000..6378f98 --- /dev/null +++ b/examples/board_timer_64led/README @@ -0,0 +1,21 @@ + +timer_64led +(C) 2006-2009 Michel Pollet + +This is a real life project, see enclosed JPEG. + +At atmega168 drives 4 74HC595 shift registers to drive 6 LEDs. 3 Buttons +provite an interface for "start", "stop" and "reset" of the timer. + +The timer handles multiple days by switching to display "hours + minutes" +instead of "minutes + seconds" after an hour. + +The LED brightness changes if you stop the timer. + +The interest of this in simavr is the ease of making a "fake peripheral" +that simulates the 4 shift registers, recover the PWM duty cycle and +send button events. + +Also, make sure to record a "wave file" to display in gtkwave, you will +see the Interupt flags, the shift register being filled, the latch pins, +and even the PWM duty cycle. diff --git a/examples/board_timer_64led/atmega168_timer_64led.c b/examples/board_timer_64led/atmega168_timer_64led.c new file mode 100644 index 0000000..23a11db --- /dev/null +++ b/examples/board_timer_64led/atmega168_timer_64led.c @@ -0,0 +1,520 @@ +/* + atmega168_timer_64led.c + + Copyright 2008, 2009 Michel Pollet + + This file is part of simavr. + + simavr is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simavr is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simavr. If not, see . + */ + +#include +#include +#include +#include + +#include "atmega168_timer_64led.h" + +// for linker, emulator, and programmer's sake +#include "avr_mcu_section.h" +AVR_MCU(F_CPU, "atmega168"); + +PIN_DEFINE(SRESET, D, PD4, 1); +//PIN_DEFINE(SOE, D, PD6, 1); // pwm AIN0/OC0A +PIN_DEFINE(SLATCH, D, PD7, 1); + +PIN_DEFINE(BSTART, C, PC0, 1); // PCI6 +PIN_DEFINE(BSTOP, B, PB1, 1); // PCI1 +PIN_DEFINE(BRESET, B, PB0, 1); // PCI0 + + +#define TICK_HZ 4 + +enum { + TICK_SECOND = TICK_HZ, + TICK_250MS = (TICK_SECOND / 4), + TICK_500MS = (TICK_SECOND / 2), + TICK_750MS = (TICK_500MS + TICK_250MS), + TICK_MAX = 0x7f, + + TICK_TIMER_DISABLED = 0xff +}; + +volatile uint32_t tickCount; +struct tick_t { + uint8_t delay; + void (*callback)(struct tick_t *); +}; + +enum EDelayIndex { + delay_Second = 0, + delay_Update, + delay_DisplayChange, + delay_StopFade, + + timer_MAX +}; + +struct tick_t timer[timer_MAX]; + +#define tick_timer_fired(_t) (timer[(_t)].delay == 0) +#define tick_timer_reset(_t, _v) timer[(_t)].delay = (_v) + +ISR(TIMER2_COMPA_vect) // handler for Output Compare 1 overflow interrupt +{ + sei(); + tickCount++; + + // decrement delay lines + for (char i = 0; i < timer_MAX; i++) + if (timer[(int)i].delay && timer[(int)i].delay != TICK_TIMER_DISABLED) { + timer[(int)i].delay--; + if (timer[(int)i].delay == 0 && timer[(int)i].callback) + timer[(int)i].callback(&timer[(int)i]); + } +} + + +void tick_init() +{ + /* + Timer 2 as RTC + */ + // needs to do that before changing the timer registers + // ASYNC timer using a 32k crystal + ASSR |= (1 << AS2); + TCCR2B = (3 << CS20); + OCR2A = 127; + TIMSK2 |= (1 << OCIE2A); +} + + +enum EKEYS { + KEY_RESET = 0, // 0x01 + KEY_STOP, // 0x02 + KEY_START, // 0x04 + KEY_MAX +}; + +enum EState { + state_ShowTime = 0, + state_ShowHour, + state_Sleep, + + state_IncrementTime = (1 << 7), + + state_MAX +} ; + +uint8_t state = state_ShowTime | state_IncrementTime; +uint8_t digits[4]; + +enum EDecimal { + d_second = 0, d_10second, d_minute, d_10minute, d_hour, d_10hour, d_100hour, d_MAX +}; +const uint8_t decimal_max[d_MAX] = { 10, 6, 10, 6, 10, 10, 10 }; +uint8_t decimal[d_MAX] = {0,0,0,0,0,0,0}; +uint8_t decimalChanged = 0; + +uint8_t keyState;// = 0x7; +uint8_t keyEvent = 0; +uint8_t keyDebounce[KEY_MAX]; +uint8_t lastKeyValue; // = 0; // use to detect which pin(s) triggered the interupt + +#define PWM_MAX_DUTY_CYCLE 0xFF + +#define STANDBY_DELAY 60 + +uint8_t pwmRunning = PWM_MAX_DUTY_CYCLE - (PWM_MAX_DUTY_CYCLE >> 4); +uint8_t pwmStopped = PWM_MAX_DUTY_CYCLE - (PWM_MAX_DUTY_CYCLE >> 6); +uint16_t stopTimerCount; + +void pwmInit(void) +{ + /* + Start Timer 0 with no clock prescaler and phase correct + fast PWM mode. Output on PD6 (OC0A). + */ + TCCR0A = (1<> 4); + OCR0A = pwmRunning; +} + +static inline void pwmSet(uint8_t pwm) +{ + OCR0A = pwm; +} + + +void decimalInc() +{ + for (uint8_t in = 0; in < d_MAX; in++) { + decimal[in]++; + decimalChanged |= (1 << in); + if (decimal[in] == decimal_max[in]) { + decimal[in] = 0; + } else + break; + } +} + +/* + 0x01 0x01 + 0x20 0x02 + 0x20 0x02 + 0x40 0x40 + 0x10 0x04 + 0x10 0x04 + 0x08 0x08 + */ +const uint8_t digits2led[10]= { + 0x3f, 0x06, 0x5b, 79, 102, 109, 125, 7, 0x7f, 111 +}; + +struct { + uint8_t b[16]; + uint8_t in : 4; + uint8_t out : 4; +} spi; + +void spi_init() +{ + spi.in = spi.out = 0; + + SPCR = (1 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | + (0 << CPOL) | (0 << CPHA) | (0 << SPR0); + SPSR = (0 << SPI2X); +} + +void spi_start() +{ + uint8_t b; + if (spi.in != spi.out) { + b = spi.b[spi.in++]; + SPDR = b; + } +} + +/* + * SPI FIFO and it's interupt function. The function just pushes the + * 'next' byte into the SPI register, and if there are no more bytes, it + * toggles the 'latch' PIN of the 74H595 to update all the LEDS in one go. + * + * There is a potential small race condition here where 2 sets of four bytes + * are sent in sequence, but the probability is that 64 bits will be sent + * before the latch trigges instead of 32; and if they were /that/ close it + * doesn'nt make a difference anyway. + * One way to solve that would be to have a 'terminator' or 'flush' signal + * queued along the byte stream. + */ + +ISR(SPI_STC_vect) +{ + uint8_t b; + if (spi.in != spi.out) { + b = spi.b[spi.in++]; + SPDR = b; + } else { + // fifo is empty, tell the 74hc595 to latch the shift register + SET_SLATCH(); + CLR_SLATCH(); + } +} + +void startShowTime() +{ + state = (state & ~0xf) | state_ShowTime; +} + +void startShowHours(uint8_t timeout /*= 4 * TICK_SECOND*/) +{ + if (timer[delay_DisplayChange].delay != TICK_TIMER_DISABLED) + tick_timer_reset(delay_DisplayChange, timeout); + state = (state & ~0xf) | state_ShowHour; +} + +void updateTimer(); +void sleepTimer(); +void wakeTimer(); +int startTimer(); +int stopTimer(); +void resetTimer(); + +void sleepTimer() +{ + state = state_Sleep; + tick_timer_reset(delay_Second, 0); + tick_timer_reset(delay_Update, 0); + pwmSet(0xff); // stop the LEDs completely +} + +void wakeTimer() +{ + stopTimerCount = 0; + if (state == state_Sleep) { + startShowTime(); + tick_timer_reset(delay_Second, TICK_SECOND); + tick_timer_reset(delay_Update, 1); + pwmSet(pwmRunning); + updateTimer(); + } else + pwmSet(pwmRunning); +} + +int startTimer() +{ + if (state & state_IncrementTime) + return 0; + wakeTimer(); + tick_timer_reset(delay_Second, TICK_SECOND); + tick_timer_reset(delay_Update, 1); + state |= state_IncrementTime; + return 1; +} + +int stopTimer() +{ + wakeTimer(); + if (!(state & state_IncrementTime)) + return 0; + state &= ~state_IncrementTime; + stopTimerCount = 0; + tick_timer_reset(delay_StopFade, 10 * TICK_SECOND); + return 1; +} + +void resetTimer() +{ + wakeTimer(); + startShowTime(); + tick_timer_reset(delay_Second, TICK_SECOND); + tick_timer_reset(delay_Update, 1); + for (uint8_t bi = 0; bi < d_MAX; bi++) + decimal[bi] = 0; +} + +void updateTimer() +{ + if (OCR0A == 0xff) // if the display is off, don't update anything + return; + if (!(state & state_IncrementTime) || timer[delay_Second].delay <= 2) { + switch (state & ~state_IncrementTime) { + case state_ShowTime: + digits[1] |= 0x80; + digits[2] |= 0x80; + break; + case state_ShowHour: + if (state & state_IncrementTime) + digits[0] |= 0x80; + break; + } + } + cli(); + // interupts are stopped here, so there is no race condition + int restart = spi.out == spi.in; + for (uint8_t bi = 0; bi < 4; bi++) + spi.b[spi.out++] = digits[bi]; + if (restart) + spi_start(); + sei(); +} + +void updateTimerDisplay() +{ + do { + switch (state & ~state_IncrementTime) { + case state_ShowTime: { + if (decimalChanged & (1 << d_hour)) { + startShowHours(4 * TICK_SECOND); + break; + } + decimalChanged = 0; + for (uint8_t bi = 0; bi < 4; bi++) + digits[bi] = digits2led[decimal[bi]]; + + if (!(state & state_IncrementTime)) { + digits[1] |= 0x80; + digits[2] |= 0x80; + } + } break; + case state_ShowHour: { + if (tick_timer_fired(delay_DisplayChange)) { + decimalChanged = 1; + startShowTime(); + break; + } + decimalChanged = 0; + for (uint8_t bi = 0; bi < 4; bi++) + digits[bi] = 0; + + if (decimal[d_100hour]) { + digits[3] = digits2led[decimal[d_100hour]]; + digits[2] = digits2led[decimal[d_10hour]]; + digits[1] = digits2led[decimal[d_hour]]; + } else if (decimal[d_10hour]) { + digits[3] = digits2led[decimal[d_10hour]]; + digits[2] = digits2led[decimal[d_hour]]; + } else { + digits[2] = digits2led[decimal[d_hour]]; + } + digits[0] = 116; // 'h' + } break; + // case state_Sleep: { + /* nothing to do */ + // } break; + } + } while (decimalChanged); +} + +/* + * Called every seconds to update the visuals + */ +void second_timer_callback(struct tick_t *t) +{ + t->delay = TICK_SECOND; + + if (state & state_IncrementTime) { + pwmSet(pwmRunning); + decimalInc(); + } else { + if (tick_timer_fired(delay_StopFade)) { + stopTimerCount++; + if (stopTimerCount >= STANDBY_DELAY) { + if (OCR0A < 0xff) { + if ((stopTimerCount & 0xf) == 0) // very gradualy fade out to zero (notch every 8 secs) + OCR0A++; + } else + sleepTimer(); // this will stop the one second timer + } else { + if (OCR0A != pwmStopped) { + if (OCR0A > pwmStopped) + OCR0A--; + else + OCR0A++; + } + } + } + } + updateTimerDisplay(); +} + +/* + * Called every tick, to push the four bytes of the counter into the shift registers + */ +void update_timer_callback(struct tick_t *t) +{ + t->delay = 1; + updateTimer(); +} + +static void updateKeyValues() +{ + uint8_t keyValue = (PINB & 3) | ((PINC & 1) << 2); + + for (uint8_t ki = 0; ki < KEY_MAX; ki++) + if ((keyValue & (1 << ki)) != (lastKeyValue & (1 << ki))) + keyDebounce[ki] = 0; + + lastKeyValue = keyValue; +} + +// pin change interupt +ISR(PCINT0_vect) { updateKeyValues(); } +ISR(PCINT1_vect) { updateKeyValues(); } + +int main(void) +{ + PORTD = 0; + DDRD = 0xff; + + // set power reduction register, disable everything we don't need + PRR = (1 << PRTWI) | (1 << PRTIM1) | (1 << PRUSART0) | (1 << PRADC); + + DDRB = ~3; PORTB = 3; // pullups on PB0/PB1 + DDRC = ~1; PORTC = 1; // pullups on PC0 + PCMSK0 = (1 << PCINT1) | (1 << PCINT0); // enable interupt for these pins + PCMSK1 = (1 << PCINT8); // enable interupt for these pins + PCICR = (1 << PCIE0) | (1 << PCIE1); // PCIE0 enable pin interupt PCINT7..0. + + tick_init(); + + startShowHours(4 * TICK_SECOND); + + timer[delay_Second].callback = second_timer_callback; + timer[delay_Update].callback = update_timer_callback; + second_timer_callback(&timer[delay_Second]); // get started + update_timer_callback(&timer[delay_Update]); // get started + + startTimer(); + updateKeyValues(); + keyState = lastKeyValue; + + SET_SRESET(); + + spi_init(); + pwmInit(); + + sei(); + + for (;;) { /* main event loop */ + /* If our internal ideal of which keys are down is different from the one that has been + updated cia the interupts, we start counting. If the 'different' key(s) stays the same for + 50ms, we declare it an 'event' and update the internsl key state + */ + if (keyState != lastKeyValue) { + for (uint8_t ki = 0; ki < KEY_MAX; ki++) + if ((keyState & (1 << ki)) != (lastKeyValue & (1 << ki))) { + if (keyDebounce[ki] < 50) { + keyDebounce[ki]++; + if (keyDebounce[ki] == 50) { + keyEvent |= (1 << ki); + keyState = (keyState & ~(1 << ki)) | (lastKeyValue & (1 << ki)); + } + } + } + /* + * if a Key changed state, let's check it out + */ + if (keyEvent) { + if ((keyEvent & (1 << KEY_START)) && (keyState & (1 << KEY_START)) == 0) { + if (!startTimer()) + startShowHours(4 * TICK_SECOND); + } + if ((keyEvent & (1 << KEY_STOP)) && (keyState & (1 << KEY_STOP)) == 0) { + if (!stopTimer()) + startShowHours(4 * TICK_SECOND); + } + if ((keyEvent & (1 << KEY_RESET)) && (keyState & (1 << KEY_RESET)) == 0) { + resetTimer(); + } + keyEvent = 0; + updateTimerDisplay(); + updateTimer(); + } + delay_ms(1); + } else { + sleep_mode(); + } + } + return 0; +} diff --git a/examples/board_timer_64led/atmega168_timer_64led.h b/examples/board_timer_64led/atmega168_timer_64led.h new file mode 100644 index 0000000..935b506 --- /dev/null +++ b/examples/board_timer_64led/atmega168_timer_64led.h @@ -0,0 +1,62 @@ +/* + atmega168_timer_64led.h + + Copyright 2008, 2009 Michel Pollet + + This file is part of simavr. + + simavr is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simavr is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simavr. If not, see . + */ +#ifndef __COMMON_H__ +#define __COMMON_H__ + + +#include +#include +#include +#include + +static inline void delay_ms(uint16_t millis) +{ + // uint16_t loop; + while ( millis-- ) + _delay_ms(1); +} + +#include + +#define printf(format, ...) printf_P(PSTR(format), ## __VA_ARGS__) +#define sprintf(wh, format, ...) sprintf_P(wh, PSTR(format), ## __VA_ARGS__) + +/*! + Define pin accessors. + given a pin name, port, bit number and mask (how many bits it takes) this macro + defines a set of inline accessors to set/clear/read the pin + */ +#define PIN_DEFINE(__name, __port, __pin, __mask) \ + enum { __name##_PIN = (__pin), __name##_MASK = (__mask << __pin) }; \ + /* toggle pin in PORT */static inline void TOG_##__name() { PIN##__port ^= __mask << __pin; } \ + /* Clear Pin */ static inline void CLR_##__name() { PORT##__port &= ~(__mask << __pin); } \ + /* Set pin to 1 */ static inline void SET_##__name() { PORT##__port |= (__mask << __pin); } \ + /* Set pin to 0/1 */ static inline void SET_##__name##_V(uint8_t __val) { PORT##__port = (PORT##__port & ~(__mask << __pin)) | (__val << __pin); } \ + /* Get pin value */ static inline uint8_t GET##__name() { return (PIN##__port >> __pin) & __mask; } \ + /* Set pin direction */ static inline void DDR_##__name(uint8_t __val) { DDR##__port = (DDR##__port & ~(__mask << __pin)) | (__val << __pin); } + +#if VERBOSE +#define V(w) w +#else +#define V(w) +#endif + +#endif // __COMMON_H__ diff --git a/examples/board_timer_64led/timer_64led.c b/examples/board_timer_64led/timer_64led.c new file mode 100644 index 0000000..5fa73aa --- /dev/null +++ b/examples/board_timer_64led/timer_64led.c @@ -0,0 +1,356 @@ +/* + timer_64led.c + + Copyright 2008, 2009 Michel Pollet + + This file is part of simavr. + + simavr is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simavr is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simavr. If not, see . + */ + +#include +#include +#include + +#include +#include + +#include "sim_avr.h" +#include "avr_ioport.h" +#include "avr_spi.h" +#include "avr_timer8.h" +#include "sim_elf.h" +#include "sim_gdb.h" +#include "sim_vcd_file.h" + +#include "button.h" +#include "hc595.h" + +enum { + B_START = 0, B_STOP, B_RESET, + B_MAX +}; +button_t button[B_MAX]; // Start/Stop/Reset +volatile int do_button_press[B_MAX] = {0}; +avr_t * avr = NULL; +avr_vcd_t vcd_file; +hc595_t shifter; + +int display_flag = 0; +volatile uint32_t display_bits = 0; +volatile uint8_t display_pwm = 0; + +float pixsize = 16; +int window; + +/* + * called when the AVR has latched the 595 + */ +void hc595_changed_hook(struct avr_irq_t * irq, uint32_t value, void * param) +{ + display_bits = value; + display_flag++; +} + +/* + * called when the AVR has changed the display brightness + */ +void pwm_changed_hook(struct avr_irq_t * irq, uint32_t value, void * param) +{ + display_pwm = value; + display_flag++; +} + +void displayCB(void) /* function called whenever redisplay needed */ +{ + // OpenGL rendering goes here... + glClear(GL_COLOR_BUFFER_BIT); + + // Set up modelview matrix + glMatrixMode(GL_MODELVIEW); // Select modelview matrix + glLoadIdentity(); // Start with an identity matrix + + float grid = pixsize; + float size = grid * 0.8; + float color_on = (float)(0xff - display_pwm) / 15.0f; + float color_off = 0.1; + if (color_on < color_off) + color_on = color_off; + + glTranslatef(pixsize / 2.25f, pixsize / 1.8f, 0); + + glBegin(GL_QUADS); + + for (int di = 0; di < 4; di++) { + uint8_t digit = display_bits >> (di * 8); + + for (int i = 0; i < 8; i++) { + glColor3f(0,0, digit & (1 << i) ? color_on : color_off); + float dx = ((di * 5.5)) * pixsize, dy = 0*pixsize; + switch (i) { + case 3: + dy += 3.0f * pixsize; + case 6: + dy += 3.0f * pixsize; + case 0: + dx += 1.0f * pixsize; + glVertex2f(dx + size, dy + size); glVertex2f(dx, dy + size); glVertex2f(dx, dy); glVertex2f(dx + size, dy); + dx += 1.0f * pixsize; + glVertex2f(dx + size, dy + size); glVertex2f(dx, dy + size); glVertex2f(dx, dy); glVertex2f(dx + size, dy); + break; + case 7: // dot! + dx += 4.25 * pixsize; + switch (di) { + case 0: + case 3: + dy += 6.25 * pixsize; + break; + case 1: + dy += 2 * pixsize; + break; + case 2: + dy += 4 * pixsize; + dx -= 5.50 * pixsize; + break; + } + + glVertex2f(dx + size, dy + size); glVertex2f(dx, dy + size); glVertex2f(dx, dy); glVertex2f(dx + size, dy); + break; + default: + if (i == 1 || i == 2) + dx += 3.0f * pixsize; + if (i == 4 || i == 2) + dy += 4.0f * pixsize; + else + dy += 1.0f * pixsize; + glVertex2f(dx + size, dy + size); glVertex2f(dx, dy + size); glVertex2f(dx, dy); glVertex2f(dx + size, dy); + dy += 1.0f * pixsize; + glVertex2f(dx + size, dy + size); glVertex2f(dx, dy + size); glVertex2f(dx, dy); glVertex2f(dx + size, dy); + break; + } + } + } + + glEnd(); + glutSwapBuffers(); + //glFlush(); /* Complete any pending operations */ +} + +void keyCB(unsigned char key, int x, int y) /* called on key press */ +{ + if (key == 'q') + exit(0); + static uint8_t buf[64]; + switch (key) { + case 'q': + case 0x1f: // escape + exit(0); + break; + case '1' ... '3': + printf("Press %d\n", key-'1'); + do_button_press[key-'1']++; // pass the message to the AVR thread + break; + case 'r': + printf("Starting VCD trace\n"); + avr_vcd_start(&vcd_file); + break; + case 's': + printf("Stopping VCD trace\n"); + avr_vcd_stop(&vcd_file); + break; + } +} + +// gl timer. if the pin have changed states, refresh display +void timerCB(int i) +{ + static int oldstate = -1; + // restart timer + glutTimerFunc(1000/64, timerCB, 0); + + if (oldstate != display_flag) { + oldstate = display_flag; + glutPostRedisplay(); + } +} + +static void * avr_run_thread(void * ignore) +{ + int b_press[3] = {0}; + + while (1) { + avr_run(avr); + + for (int i = 0; i < 3; i++) { + if (do_button_press[i] != b_press[i]) { + b_press[i] = do_button_press[i]; + printf("Button pressed %d\n", i); + button_press(&button[i], 100000); + } + } + } +} + + +int main(int argc, char *argv[]) +{ + elf_firmware_t f; + const char * fname = "atmega168_timer_64led.axf"; + char path[256]; + + sprintf(path, "%s/%s", dirname(argv[0]), fname); + printf("Firmware pathname is %s\n", path); + elf_read_firmware(path, &f); + + printf("firmware %s f=%d mmcu=%s\n", fname, (int)f.frequency, f.mmcu); + + avr = avr_make_mcu_by_name(f.mmcu); + if (!avr) { + fprintf(stderr, "%s: AVR '%s' now known\n", argv[0], f.mmcu); + exit(1); + } + avr_init(avr); + avr_load_firmware(avr, &f); + + // + // initialize our 'peripherals' + // + hc595_init(&shifter); + + button_init(avr, &button[B_START]); + avr_connect_irq( + button[B_START].irq + IRQ_BUTTON_OUT, + avr_io_getirq(avr, AVR_IOCTL_IOPORT_GETIRQ('C'), 0)); + button_init(avr, &button[B_STOP]); + avr_connect_irq( + button[B_STOP].irq + IRQ_BUTTON_OUT, + avr_io_getirq(avr, AVR_IOCTL_IOPORT_GETIRQ('B'), 1)); + button_init(avr, &button[B_RESET]); + avr_connect_irq( + button[B_RESET].irq + IRQ_BUTTON_OUT, + avr_io_getirq(avr, AVR_IOCTL_IOPORT_GETIRQ('B'), 0)); + + // connects the fake 74HC595 array to the pins + avr_irq_t * i_mosi = avr_io_getirq(avr, AVR_IOCTL_SPI_GETIRQ(0), SPI_IRQ_OUTPUT), + * i_reset = avr_io_getirq(avr, AVR_IOCTL_IOPORT_GETIRQ('D'), 4), + * i_latch = avr_io_getirq(avr, AVR_IOCTL_IOPORT_GETIRQ('D'), 7); + avr_connect_irq(i_mosi, shifter.irq + IRQ_HC595_SPI_BYTE_IN); + avr_connect_irq(i_reset, shifter.irq + IRQ_HC595_IN_RESET); + avr_connect_irq(i_latch, shifter.irq + IRQ_HC595_IN_LATCH); + + avr_irq_t * i_pwm = avr_io_getirq(avr, AVR_IOCTL_TIMER8_GETIRQ('0'), TIMER8_IRQ_OUT_PWM0); + avr_irq_register_notify( + i_pwm, + pwm_changed_hook, + NULL); + avr_irq_register_notify( + shifter.irq + IRQ_HC595_OUT, + hc595_changed_hook, + NULL); + + // even if not setup at startup, activate gdb if crashing + avr->gdb_port = 1234; + if (0) { + //avr->state = cpu_Stopped; + avr_gdb_init(avr); + } + + /* + * VCD file initialization + * + * This will allow you to create a "wave" file and display it in gtkwave + * Pressing "r" and "s" during the demo will start and stop recording + * the pin changes + */ + avr_vcd_init(avr, "gtkwave_output.vcd", &vcd_file, 10000 /* usec */); + + avr_vcd_add_signal(&vcd_file, + avr_get_interupt_irq(avr, 7), 1 /* bit */ , + "TIMER2_COMPA" ); + avr_vcd_add_signal(&vcd_file, + avr_get_interupt_irq(avr, 17), 1 /* bit */ , + "SPI_INT" ); + avr_vcd_add_signal(&vcd_file, + i_mosi, 8 /* bits */ , + "MOSI" ); + + avr_vcd_add_signal(&vcd_file, + i_reset, 1 /* bit */ , + "595_RESET" ); + avr_vcd_add_signal(&vcd_file, + i_latch, 1 /* bit */ , + "595_LATCH" ); + avr_vcd_add_signal(&vcd_file, + button[B_START].irq + IRQ_BUTTON_OUT, 1 /* bits */ , + "start" ); + avr_vcd_add_signal(&vcd_file, + button[B_STOP].irq + IRQ_BUTTON_OUT, 1 /* bits */ , + "stop" ); + avr_vcd_add_signal(&vcd_file, + button[B_RESET].irq + IRQ_BUTTON_OUT, 1 /* bits */ , + "reset" ); + + avr_vcd_add_signal(&vcd_file, + shifter.irq + IRQ_HC595_OUT, 32 /* bits */ , + "HC595" ); + avr_vcd_add_signal(&vcd_file, + i_pwm, 8 /* bits */ , + "PWM" ); + + // 'raise' it, it's a "pullup" + avr_raise_irq(button[B_START].irq + IRQ_BUTTON_OUT, 1); + avr_raise_irq(button[B_STOP].irq + IRQ_BUTTON_OUT, 1); + avr_raise_irq(button[B_RESET].irq + IRQ_BUTTON_OUT, 1); + + printf( "Demo : This is a real world firmware, a 'stopwatch'\n" + " timer that can count up to 99 days. It features a PWM control of the\n" + " brightness, blinks the dots, displays the number of days spent and so on.\n\n" + " Press '0' to press the 'start' button\n" + " Press '1' to press the 'stop' button\n" + " Press '2' to press the 'reset' button\n" + " Press 'q' to quit\n\n" + " Press 'r' to start recording a 'wave' file - with a LOT of data\n" + " Press 's' to stop recording\n" + " + Make sure to watch the brightness dim once you stop the timer\n\n" + ); + + /* + * OpenGL init, can be ignored + */ + glutInit(&argc, argv); /* initialize GLUT system */ + + + int w = 22, h = 8; + + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); + glutInitWindowSize(w * pixsize, h * pixsize); /* width=400pixels height=500pixels */ + window = glutCreateWindow("Press 0, 1, 2 or q"); /* create window */ + + // Set up projection matrix + glMatrixMode(GL_PROJECTION); // Select projection matrix + glLoadIdentity(); // Start with an identity matrix + glOrtho(0, w * pixsize, 0, h * pixsize, 0, 10); + glScalef(1,-1,1); + glTranslatef(0, -1 * h * pixsize, 0); + + glutDisplayFunc(displayCB); /* set window's display callback */ + glutKeyboardFunc(keyCB); /* set window's key callback */ + glutTimerFunc(1000 / 24, timerCB, 0); + + // the AVR run on it's own thread. it even allows for debugging! + pthread_t run; + pthread_create(&run, NULL, avr_run_thread, NULL); + + glutMainLoop(); +} diff --git a/examples/board_timer_64led/timer_led64_real.jpg b/examples/board_timer_64led/timer_led64_real.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfffc0a64d8542b9eb77b2c64a8d8fd428204749 GIT binary patch literal 96442 zcmeFYWmsIz7B0BkaCfJ13k3Jz?lca8;O_1YAtbmY5G1%ma7ch8Xn;U)had?A4FtC^ z&G()2opa}zxpU{v-&xP@+V8GfwQB8JRlBQqy?r-#w+i5?C@3ocAf%Xq%mCnS4Spf- z?_di6>goVH003wJCI|(9AQ1=vBNN>F6hHw0up9{QFHDNWY9NAt>41GqW06-q7$a+w2US6JL$Up7GB}4zgIVqsObwFSUkO~4Y{^k4IRPaCc z+ft$b|5sah0Fa9DkIv`R*n2x5G~|7Zz4>>$Jlx!GK!5As-2uQG@ZT5$M`Fm| z7_>&LEivMNjFZ?e%f8l?}>i*(yK>_`{92vF$ z#0K*7Ke2%v{&#G^pnvx}NuN+nk((orAZ9GhEBw&D#yG<>_W?fLjhOr>v-~E3F0qyxiPEqC7mJynJw8UQvEw zQC{J{j35)+s|CP@FRUQBTM z9ySg>4kjiZ2_8Nn5iv0_7A`3n2@x3q5it=6g4Bn?&|xriB5X`-qW{-&*9$5{h7ETA zXafBcJ>(pP!cb7r&@nKPv*GWue~SOB5cy~VK_Fl#{h|0>zD<~={tLW(J z=^Gdt8CzM~*xK1UIC^>e`1<(=1V%;2#6FFC7N44yo{{l@#HY;OJB-Z}bxd~$kresOt)k8~Lfg+idH z_b!9Le#j359}1)6K_QUVMz!!Dr00!5Ba%resQ-k{z=t>_w)7mwAYtTRV>-I``Y)&d z*L;rr-*WmNpZ{_B?jwMY2G{}R5D*;z#s@+0L3axP76kcKfe*n4B!Qc+kbIqO&7FYl zeSIZAs-TIK$)wSU$m7$K5+E&c3dC;m`3~?EwD?(-ZRtSz67t;Og`Y2i^&N#=<`ry+ zdA;0(<$H33{$7Vrh<{(9Qu_Hf){i&r0m*w$G@p`sioRFJ+sz@o@-R^BdH)Rj%q`g} z9BL;yT9%8O{`wE`7kQbH;Ju>4O7k#L=Ra5zCvDQ1o53{PXj>;GqjQ&Pre@!i8|yQw z*He}IxvjmTzKTO04`zBDb2cd8dggEF*PheO$2IUSUXJ?~Ut-%}Q$=4xHB19gk;O}|ytd-OWoe+77 zo{@JtWJ%PdBBNp5t!syRS=X}!LgL|4g@{H11FpW+PGKLTCp)K_x|81fY}4|oN=l=q z&;B%1jbvEcs#Y5G|%bufpZnCw;yFG0EQ0BLl|u1v;Z0sZqo4*^QoqVxNcdjNc-=)$68G z(Xt6_NX{rTG~`LHfp(?;+dtANZi0|8ksEZ(?I}61QtICIqhH-wzk_{3x$%H7`4MZ` zn5jlmH(yP2%}LFoJ*}A&#AMbk@fY`(qZUt<97JmeHM;k&IMIxJoMCsK3F%vT?}h#n zl8Q3pm4`z#ynUK_cYyeWM`PQ8`&IEEk9sX7`L-!;v;@(`(|!}i=B8_bw6Njj8H9L{ zpW8?M`saZJCyxXrWBy=XxY@tVW1b@Uvqf&WDW;cn&4ZPBf*vKs$yeN293aY%u0nq13u%Khz93 zy}koX(2YpoN9loqZ<{9HBzf`@{49e<;%bFBGX8d~mLBIwPdWVw!2~>>d zFRb&rE2?5f?*QpT#h5ON`O=bg)wnu0Mb=s&xSO2jy2RE=br{K?vB1(onr||34!+CK z1BjYptIe%ur*D|&QacsR3s`?Vt6N}MC277E z-|j+bpYl;PmC+<}$Y0lK(upx}sWt+2+Z6hgT!LKSPZ_O2^8;?>*Lj`Y$(Ogq>SGcTIfq10@?%SmkdK{mv* zylA$td-3@4SbzMNH?>L-wZdo+=1)rNmUEt0-xE5?HR&rGh+;)}em4?-ZMy?bXNUC4 z*!jFSt0x;p3#U>YezL+M&USUAF;w07#JGPS_JYz9^QR2>o5=PhwUbmk2nT3$!xiR5 zDLU@}bcqu05h@tHz6d4-D5*cqV5uY|#g`LTw{v0E;H-jdi&V(|L-Gi3ZpLL;-3LpN zwIHwHD|`pUtF>TnPOZl~8$k~<4Wkm9jQ0vxa!ZxVw_CHL6<8DAGFE|AgRpS7jLitU zx<17J77L27wTSyHo<3*^+Wo4jGv{TNNQ?ayfuS*Es%#Sy^r?$WJxIM_hCf$ zWr*@~7KL|Mn~tAV%H&LE{#sIG2dp@l{-U+$M!tzcvX@$dF-^&&ogrQ?&7S=YpR4n4 z_wX$SVY0gNp@!_k{*w4eZOzQbGYuUkvp>$oOiR6H(%hR_>MjMsezS*u?h?ERTQm7a zWq2dg((qDa+S{+SCG`M8r!3|2UZsfpdsH}zZ=!!4&Xl*SxIv{`2HtZfm1I%cW-}tDqrfbx&OUGm}eqG{D`cQO4=ZH zlRMAgW3OF}Bgtoky|h+_`|8EMN6A*lLf`>%xVgEz@Y(JY(e>>~&C3t6MHMT-gl*%& zUPp=_uSj2HFD&-(EX5rZ+ghV=Kc#Fxg+#na`(^g&u;>rb%ji(aU}YNm$XV?}Z<0yH zB6%Jo;@mc}2U28To!{=^V24JfBg&q2>r`;*N%#@7j8}%e*9;M zS%~?uSz@s^+}zgOm}#3T?CupUGY1hCCL0Mj<@39(dZ0SPSyfY;rg@}#BuYifS#AGk zGL&iR#^)%^@JOMoXz6E}A^uX2o0qHkmmqMg?t?ih@1>P3flYSIxuH%q*ILw8_#MFW z!k zhWxd5Li?1WKcTQkpufhI`4b&#CRJLZ=t=b*5OdX^R1j=%cu-b5-xpSBvg4uZ=i*+F zvc4kZiWz7gO~XMox9)*AC?hG z2Tsl2z`8ycncY57(BWp=k>b_@Z)N7jkFa!@2pKs|UVB~JmtD^_r)K3cCiVB7uY)Ii z?|_e1x6{^N9Qtzw3-h{8Uw(Zua3EgI2N^)=B>hA>OY-hpw1694<=3?!YMD8;)B@JS z>U?fE?kfPTF7l(7XzMl4^p)x39Xr2kIY%?{i#N&K@!6R?`Y8#RKgZel#3?pCrE(XQta<7% zMn8>U+uSlC9C99*SM;bas2v-lzDMQ5yP^?HA*TwjJ`SJxq1y*GaS29Y*o(>`x3rbw z$NIOgU#@HR)IFCZ7Z(X~Df2gwov|@d=a&ohH`}=Kpr=T2Udbd={RK#smzG&lVFBusf(jO$Y%au)pds$f;5t*v`GxB$`+%uk6`~x1jslxHQZm9ZOPv7%cQb!BxLDn4&VUp|t@sZ(TOQ{V4gP?2~h z(W_frq?wmCEo9eOdwO{gym8Iu_y_f{Y#>484}4+4QG%>@=D2B!=a6B=d<*XK$eE5`L(dUa07R9Nxn2lC%RMU&Cva+_5i>4(9l`21%#a||QFA=dx z>+cg-0C&Bt|4Qxg#3gxF=hF}|!S^y&p>G-Og0r_Bh1Ksb8!=K|=R7vc4c)rRY2D|% zmhP$XFY7bL?Wvlbl%U>4A-A1mct&iUrRP@2i@)m-kN zfAzwWvV5=B3|};9&Ar%_Di61=Q^Vu6ZmcL(8sf}xq$Vc^kv2R2Q0#F$5fN*p*Q|Wd zX@ly?qYvwneVumePxhKuKVTaA>;Ha)*-en&vWvG+A2q_@_%xk>*Ut{hB?S74(&f__ zr|yoI=}U0Y;I3&IcxP&(T)~L7i+mS`%u%ZYQvP?P(aO> z7sg(PHyqXKCmZ#IdTiQtJTz!qZk~*+f5|Q)5%q`8ND#kLu{sBemirfv&*Zm`uH#%B zUiF81W86z0ae-$W4@2^fET8evZyi+O8A$_nP`fUt z?87@CULXv8<@GY9PRB&8k(#X&Wo*n)-kXMGkIDF}q02s_YcjTP^Fnst_rB%Ug)-H) zYfTr2Z}UlVDJt;$2v*JWq&7+wHRdIn_cq&xsxm#EZ+g6V9YR&cwj5xlZ?N4}>b+VJ zYPNs7CHa9tvLDy@igax@R)WR9?9Aw>Z#1bY`Vc3>mwAeR|4kOH{e#8&lyHN@n?K^> zkJuag+WH;XxZayK6&)iyLZ5^iq+4N*IQU#vQ9s-#Uz3b+zj<&Wcn4rF%m{VCu$b{4m^>vfSaHPwM&PIwHx9CO@zI zyHm8yv+LHZS~np5313&;v5gWub9dNO4 zN8dNpV8Uy|8|}k~k)fE)nOOoapO)ksbYyc@8etrQbJ{82qKj3#Q*I(n}GMPE#Z9+P$0XG~*(p9;z8Z9Sswl65ICEO)XoG z&_}VgD}48s{{)3{d=D`_lI$}M+nYVy7|3rp%PTYOnEGXvhi!s>{ehb<#k4h?4DBN= z8ySmmU2Itc1xY&;@g2@sG(>Fh= zGHU$c{ne#mnMVNr6d$GFw74*Bc{%;d!A$k1FOqRLp5*2VPA!d{*mSjC%c@lK8aOd~ zB=zT3E=b!~zOYI8_?ZC&d=AJMd<@?4QgZA%n1$8429mzb_x+7|f55AqS1dZ!aox&Y<6*dW_Y)bRgwm7^Di zYwvjxd$=gKM#lB)$*yUAX$gY;iu=(W(0d1vaQ@-A!8rWTGwA){qOybg;Hj2La6yb$ zELW{p3@CJ!Dph$s|C-&O@Y4sHE=_@jB`ClSg5E(T5}nYhkE=CKh~C)|sDcALhn( zxp0|n*(;kHsh|WWcXDfJh;GH7YA(FoAjx0Fjr)MtL3#L8zqR?oWgXu|pf4|vbdWbL zS(sAeTSxmw0SlSHd{l)ddr@2!^n;Ix{iz?KwBl;DN&+5b5Wn)pQ&jCC|_cy;`rYI5+~_oUIW?78X;dt9h67-ymS<2TuU4W{|80 zRa%8Xiu5p6WWd$xG|{_Ewl9@?jH7;$USEw@$l{w8Jks?2%sTrl66kCn1ZI;DpMGDj z)Z3D<{nl4SmR0d7Zmt!Lg#asLzfVcz4*8BY;@8*ErPc#_L+iNhmuRC^T&LEEEY4Z+ zjl`}GxdxF|&?>lIa2V!`q@mb@WNdglBNyKsPWqO?{WgbRNbzvY;3UM86M^JzlWKK|hsQgbqfJD^%!?saqcafsrl_2n;D-g#<0 zxlar3do?3T;w4AM<73q8{#=t(6|NlU0Hp#7+u8X;qUxX5hAF8MZ;)?=lsO!+pEFGr zFwi)Kqe^L_-bCn~V@;QZ3_gE{-7_}U#+jIPpiat~$Er6)MH8}XqH?(Fs5L023@d4{ zJ8vXV&6n36rpYKSETXaHoF}@{Ohs2PlG+g@cB{pfb#vkDJ^BRxl_?ve-KR_Cyl4Vx zfA6=ZRI`@!huLyR-}DPSI$idsVY22bTD8e*l4f@@FfQH8g2G%4J6mjfhl{YD`kj)J zckfB`|TRBzTLXj}8qcFiRJ~U7{g2il$>9eKGU0d6ojD(1M zuUQI;LP?Zv!(YNT;>poH3hp)6ae7@)v7USpru7bEe4*XohshiIEUuIQtXRR8m+mLf zJAlqqNI`a1p;H(gv;fdAUZyoqv$55ti$%dtuo}JrdVM`Mj=CjTp-L4srcyp5k`P97iu?ly6aB z$RUm1(RujygNSkT{k)7EQr=YA5S%KFh*OT3)`Y_N#{|Kb`b=b0H(#V~oj7`1aLWvh zFMnEPuPqpk$5IaO&F!IYp9t{(;TNjMN%DEkul+Tnjhk9Zc zBV~IbSKf~Dj9_Lf*SOyrfvQJ-^WoO#gtX@yx$({d5y=lKbtjAhTR1A*Dqc2fd17!p^f!Uq}{Hg(=p zCuyGukkdaPc@Tb-S9G#jvh&4;TG{G_Qag+?uQ=?qiq?2+t!ub3ju$0ssT;0IPeSQ~LZ%>4x3>>)u2uB@7?kb}rIS@PmU}5FuuCAk? zd%v@)EH4Z9LMq+k|H#?Q-+RxKoJv}7_Mmk_>{yQepD`%(+3&1Y@nWrf7iNbKzA z?S7wsh{QyePWKpm&y^tZL^_DXWcS$aZ~WjdoxicvJ+^jnwMOdP`|NJ*VttQ$kvPuR z#|DWZ$bESr*4M$t4~eIcn9bl*#K_t0iF(a_TF$-D>gWfh=?#;$;Qvw#vA$O*uu)m!qXa# zeB!!WxCQ{g-}ii93m~}fTR5_l1$jgS1vz=Sklp`}{7(!2(fXf*``G@iajgAU%s?bx z{*(8gy8p>@L+(%upCbDv`9FDmju zKHS5<$2AfV7XJZ=o^SzpUx@(7{ucmBhzUR*=OIf#|HMrVT_3ogc?Pswe~)`4Mwb7T z{tpQ_33&4Zr}f0-Q*Gix40NNCEPI z3ZMz-0!DxtUw-7NQ9;hS)+pA)%0XNG7BZ zQVV$p8GuYeRv~+kODGDI5DJHKLdBp;P(7#>)B_p{eF4pemP1>hz0gVM8uSqQ2Zjx! zf^on^VahN=m>tXy77NRSmBN}~eXwcR57-$B3JM7d3yKhm5{eOuBT5j;3zS@xI+Twn z<0u;_r>Ll?q47A+d{iW$3tgA7e&`Zw?+>@PeLz7e~11R{RjFr20jK0#v=?}3`dLzj8_=77=0K^ z7{{2HnDm$;nA(^QnBkbOFyCT+#$3a^#3I0A$CAZ*jOBxsh*gI55o;dn7#ka#8Cwe5 z7~2~=5xWAr2YUtk0*4TX3r88p8Yc|rHBJl81kM32IxZ8gG_DzLAZ{jZBkot+Jv?+g zW;|Iu3%pRg*LdxCvv{ZYg!nx8n)ojGFYqhz2l0Orpb{_>$P-u-L=zMd^bl+iLI@cM zWeKeaqX>%$`v`v!p%AeUDHAyoJtwLm8YMa;CLrb~)+hESeofp-yh;KgVJ1-~aVAM3 zX&{*)xgw<|l_s?zeMVYKIzf6)MoA_`W+mnU~3Pa$t5U#5Ukuv2JL z_)+9h^ik|l5>bj#T2aPRHc&25fvMQ35L7`_MO0s?PN`|A6{+2+v#5Kh_h?9Hq-Y#z z(rLPAwrL4zC1@RJ(`i4@?!bxR(r{<^D|j#bkdBH@iOz?vfNqrTnx2JTk3N#Vj((W| zgF%?VmLZ*?o8gd=mQkHCn6Zj+feD>Sn8}{$CDQ=YIWr5h0rOMlR_329WGu=ofh<)l zORU(elB^!Ag{)I-C~U%PPHeesW9(pd0d{-#*X&<8z#M`c4jj20;}2jDL>{<4D10!> ziNz_+>C0KgxyD7prN$M>)yj47kny4M!<2^u5C3ora65Asb1(7`@Tl-a^1S2u&CAYf z#rv9fiVvGlfiH}&jqiw`gWrZfkAF^pP(WSasX({Dt)P&gr(mt%wh*I`xloSKtT2(V zmhcPV&mu4p8IdrN4v|YyK~Znf2GL()oMKL5m0~}|S;TF`i^Vq{(Lb_yRPbn30xn@L z@kU}*l1|b>vQTneib2X+s#I!AnoZhKx?1``hFiu{rdj4(R#Y}b_M;p`PEjsiZd9H? zUQa$-eno*^!A_w{;ZRXPF-Y;F5===|DMe{k8M$^;u24Qy5mE_J=~cy2)ltn>T~}jQ z^Hh7M4pvuDPg7sgVA62aXw?KXl{M2em$g{5Jha|xqiAbszt-MF@F0Q_13H8{Pjo7E z&U9sTlXMsLSoM7Ly7h7OAM01>pBu;-q#CRmJ~Rw595$jbaxiK$Mm5$qE;T+ikvGXO z`SDobaqQz6Qx;Qy(?K%|GiS5TC%8{6o-~@n%ni&d&2KC;Eeb78EtM^EEDx<@tzKH~ zT1#1{TW{MuvPresvVCNmYWvgfkzJbIw!Nf%rv09StV6cLk)x7hzT>%*rc;^IowI>+ zoeP?axl6k%fvb~iuN#eJ#I$ z<}2a*+V{dw->=ah-`~~$O8|Sovw*EYg}{;^XpmJge$3jTpt4s#u&@&)C_gVo&qqpm7dyqtE!B zWj*^7Zyi7Mocnp^^P3k|FNP9$5?&?TCE6yACJ83xC8H#}CeNfurj)1Rrv|2Oq^YO1 zq{GwW(@!#uQ@(+jzT5d-prBcg^p)-j{XIb-eB*?o8^!=!)*T`w;ly^rQR7y-#+Z zHoBj5FZLMrO!aE_j`peceePH2?-`ID`0)AB=Z-Z)R@x@$BlH_1w>S=lP=r--YYN z@Fmz%{4(Bh<_gtH;WxH#b*qA_oojMyU)FWj7dNancE5XlzxffpiM^S*MY~n;llN!G zw!-$*oCUH9GVz1V&H{hR~VgQj0nzrGwA9{xD;Ji7b+;+Xun?1cZM`&8?6<;>;m z`aJ%E{G$9)_;TRN;A-pI?*{ee)h*lYyFaRbmhN1TJk&)%_Wv`V^4`e*cTVL!Uk|hg zf&Uj@uNS!_L6Vj4sg(CCmA~abOv<}nKp77JLBOzkZXybj)CqyW?um&2l81?8Q=&=} z(ra6w5qU)LrWBwP-_t4i5SHVNo@<9BvO1ARr2MH&UWEcyQEA;sQ&dQ1;9soGe>a3& zPW_9~i7b^sQXubXn;;nK-^A1VQhW%Mjt7QhK%x-RTX@`aHtRnf5;2Su%dGJsjx0S3 z8Tn-!BD*L4N8;gSaao)ilEuzC`@qES3 z%Lqk%%cSt3*mnRszi+G0DT3VWgP|YR5?#E=?O~^+~jaGHBuwi*H?MNGb8;iEtB*^`r?m z-HLb_THZjX#K_LXN>;pqvs6asPG#ySNh>t{3s^PzUJs)D2cayD^OsD;_)MemP5gwX_NEW13Tulr?r=#=tRH z60)TMRGJ` zR|@L!{AGk_>Z=oVduI>H@Ck41@XDTn^0c0^A@Q+UUOthfAHuwgj1=TDsQe%|5`H2!O zoZ77RN4N9`Jwuo=fS6D$o*~$0bcinP!-?5>dDZ`YiO< zN@hkXL$lyV7?W(uh|n67SX3uK26NyJ+02Yge>3=PB6kjiQ=AG#=;FMUj#q|YJL(2# zoG7s)3KSgyLm11Pjt~cu3v`W8f;CL~!Qfuon!!bC0nZ@22-S#WH#c%RDL`|g(v*fS zIZRXy?Vz~W)xm{dNdRCmu283rt!!=WMI?hKFDEs^-@0s?YQo9Ng$5C4O8F(q5$Ghl z-#+{CH!&%5>k!jOWx2U8m%Yl}e%;}rK_+!m>6i*`Ho)|eD^Cr9;k9^d&{68Ly@=z~ z<&sf~bX+|59Geq05B1iH+mU%Kj^{Ar_Sk-}g671XSEin*3-Bg8FD4=L4j?Y3$WJDC z4P`iD1t~sQj6{_vO`S(`@Z)0LQ=&QfXfyC3Lm?l;K%bBg|GU!fpNC!CBR1GM1Jq781$BmcmBaFA3e}73sT_{?5 zs+O6Uy*zMH_S4bi5if`0k=|y>x7Cm)RYkS^u~)gb4ksrImodaZ7h~*;8)I4SNU1_fu)c}C`)GOi56DH7U@N1(J6oK*RYvz0)=%4{*U^oTPC=a`2*7>3H)`=+Kj$t_=A7vpQ?^+=1Qg7k|# zs(!LA4py^xwh{&H>lxw}aW3!;V;G$mU8>risoE>t{;Z!jN@yW=E!XY8_AsJMXjv%E zMT|Dw;oarGG>`_uGOu9yJsrDPfW`4wuYU=a?778M4HM7VMm z)UPnW+*PEMuIbG&AAboxo;v9B$`7gB7@9)dkZoXHNNj*=B11G9Pa<7Fihk`j(l^Q2 zzP;?(VzXdRa^_@Wk?Vlzx%7Y9b3HHL*m0z2ijZFNt&nN(Tp+^(jfbO9NqGAUNZ zluxBIL+O@kx+oM(#VLFWY1P}1yi+bIW0y$WPQtheL0} z9Dl}Y#-fyDoMz5lQZYfVtFGMIo!1VRj*lZH$#Mm&L_FH*6ZVZJDoB%PW}E;=Zh*Qx zZ`iOn)Mg52!5t46Ni=%e$}8Xn7=x__?7UOBhQ&D9W}?!lZYqdu#=?1##PlW6B+>O^ zfeD+aP46TRz4O$)%hcD~2vCe@q1e>sJ3GrIN22!w3(pd)u|!Z0HD^j2Q{T>7EBIss&!)jltOnG=7>) zzJvhjk8+lQBVrgMImQh+$9mmgn>^E=nd2qg*UAT!5mMrHzlmZPp@dsW2+ImELvs5B zh+$e!FTj6Tg%y!j?Ms<$#mXag(pJKa*RZBh3s-Em&hRcHS=EZnkT*<@!^PI@PGNoY z>6cuUZ!bYOWjOX`l#!>Veot6;) z9ENiStzds18uar*G@#6DcTx=9)nA9fskG7Xu=Yn7^slkEmy!Qu%M!r2mF+n%?vHO7 zE%`{9-Q3iDV@_nZO-u=%&k+}lQ?(6PFUGXqRm0KZa=pICia#yV)hX zZ>5S~pI246zOqv<5`w%jOY}EV zN7i_Rmt!s{xE@LnILi@+ix%{2GlU=+J=K0{TPZ?K90P~!(WlMVXc%JI*1`)FS4bZ@U|Yq@%C#oZ|G`B!M^xyqR_H;0LonzkPi*qG!8rpcLb zXQd8&YU7H6|I!VT&aTI^zz}As7ofwy64v-EcCGX6{Q*1-UB)*}9%F#2`-yc=IQ)vj zgUr}>=1PYp%#l^!@SBad@!M8>&zC3CqCrtB**$OdYxlnyJvkx=1xkJq>w_V3NzPs| z6TK&rWY>nqfWvCEt$bVd+Uhd&TN1ZfQufs=2LCqY{(3U=nXx{*)IT&R*^T-;E+-7ln1OQgZf}haJOG7FeaW68Yvqm&RUr8!t>YppS4%5DvT8A zaZA`N5olSDVwih-V`rrBtY+AH4XZDs9IqzaJ`N;OdXxT=W;)SeVMcjcaxAf)RlboOrmZJ>_`~bx^5KCT;qii3TmKougj^5u@X_u z+j(?-_GDid{-Ju}lqSYN47GLA%3c_92M-_i3MMJv1L%d1Jt!XTlR19D8FD_6?MWa)3s z3eV`m;*{2t4);gso?~DrFW@$_$&oE6IzoBZS3mw~vX6v5>@>^K^pw+Lk9PFkH+Bz>PS$ zytVB1&b7YZ-{1+C*FOFla5Wv{%Ue~B8kpemELNK(te~)!FjVFJjkM6n&%>`XRn_k4 z%a03EJ4Ih8R}?*HprE~BolaHJP2L$@Jx0`by!VJ^UQ~alLai3Vs1~IDcp6>3=`&d) zuFz_Y;2$!$5&$^1pDwjY8OLk+qdG>h(4ZU;G}mDI42q-kXK=qZ<*HH4E%Gm^=TZ&U zk!npwGldt!aoAEQk#3607&&}UOovtJ z&=YNz9-gT=Q)KTgI%?c`V}{R%h}G%}k+P3FD_MFfmy%qE23Ap=$hRtMMPJIVQS3;4 zCeW2b3a>Dk8aB&)o77*k^XON~S?Z`%lQJ~rSF?&6%N#QkA2H1it^H2J8P$}m1HP(! zEKRa_9KOn)>r<6I3Q9W4ARVW^8sm91I&b+f8fWCAC0|AQOD~$z8_txRfxM-t zJ3z(ai^FLoQCqgRK-*w14g7L72qEDi&$z>w9|*!GRf${r;~n#;%;9=m#_hB8QQI%& zqo=OwqSSGEy?Ncw{Gg?vZ!@{hGW|UhetZg536vTGE4kn~@D9p=qv}hzTRAgo4Urg` z-ZAGNAp(Y#qKDMY_O8F}5)zc<5?)jZE(pO{%Y!f+jJBJ=crj_GWeX%oZcsUC2XA-R zZwD5MjRD`W;#)j5?S+`78?5%+MvnL?vk*qNAJXwl-$#qhR+3)!QXq0PG1;CK^l44{ zx)^=Q+)XV)eJj9IZS+)$&OE6`NB#rd9gyWRfuVN0eHN*YMaEx_DgaB6NPi=RCnpcT z#84SWoyg*95epA_#42-S2~vJVs9?!k zlwwQN7qXptN)&>U@RrrRfXdzPr8^_dEpM8!M~~Dq6&?=4ZdH{c)uf}8y8>Mz^17>j z8^*oJ@K-rz7MW;NXH=p`SRW8Br10#@EZ`LsS0J!xu${Ccb5v0-tIRVEm3Sit>9h6q zQpQsd1rvD=V+a~$x42&mv4gcRv*@QK^dJIx17RD5;#m4TRBh#7lzmbbZRya_Qz2-7 zt-I5SsZn*yy6;tziW+{ifnFXW9NnyTW2M>1af{dXh42$26WC%vfrx+nQ3M$RjSbK@vVV?$Z4j7C;pvpp%%8!k(R7Y zms4aR)`C`HKkUoN7zPs{r7Py_;F{+UB~!z7^j>@$Bjq5OAv4d?)g5Uhy~HS0n$y{8 zcbP`aNQEWx!US~DMoeya%}UQ&V7PG1>I#;+n&jFfC{E3-NXm^H`hruzs77m?SZ#WH zGvx`KCacFZGL$`A;0#`^<#^#%Jfn>_73pu4K!)jcI=Qh!>h3vs_He`*cely@hv^aY*5S zk+w$O?2+Sq>Tj#Xz*ITsxax7oNb`y((%LyApP}2%X$OwFB=TlX?r9}&C7Q_t^0wuq zRTSTr$+XbDzR|cHd4OuFy~>{@S>nK5n`K88is_5n5_R*H8gg2ioZw4&xb|Fvpjwu| zb|pa7%BV&lsizj*4Q1zSb2U*aIzC&@xvTMKKcX?|0+;Nnt-*0;lFp`zJ6N1%O3`zU zU&}PJ+FV!_?(gqYsn}?)+wyivoE?^n{Hx@RW%k^I^cN3twc+#Jie<5EXNQmZ^Z#@& z(cS^h2utul7@3PGWJ{luUEi1rl2 zL9N6Q&$6=6C9&WwmgXj_e_w?%WOrK$!eTa#ny}4P%@_gCMyF4rX~DFv6h0vy^#X@Q zJI?)P`4kx-dZ3FA_A5d028wfc9al%kmb){{XY6*>IptyOiR>-q)-fgT%e4(0w9YxbQ*E?#N?|c+qKx20 z_13F|55txQ*hd&}d6pr>D`iYnAB>9MrZjk`bJMQ#lZ?)~V$&uS6O}C-772MLrRg%y zDD~V@VviV*7l1|kAREW;b;`PmIrQ%5wTS)&bZwAq?FZ%L{+}=0Go){q%2Uh%;3g^((#POW>D6ZAD|LSseG zHzZHJ5p)5um!Pt8fR+5%ByKFfn~=}a#1_5LRmex`~6vb8Ic ze>zD%)W87F(Y;?_SrZ@3iwVQ;C|1 z=y*57-dDl`RdCz5gM+*3g#JRMUZiZ<*x)!$2+(fI!HaYOwuAvvS91afo{lY=~rfP!ks@XEgkmh1#(mPwSWPqypUNp!)) z-)sK>+_h8>%C9VXxs$I54Q2~esPG(=AJkIpPlh}B8r(k?w8WVYT3*}SAn>N$1XY7& zM}e!{8LHeyJ{*mV)2*+KsRJKL0x8t#R?0{RX4pp!!G2ug)*c5 zT7!a@B$J|w^QIRKnYFpp2MJKBJM5v0SfgP&g@qU8SoYP7+dZS*KC0%N^w zS4Ml>H>{cq?EB}3nuhVFr>DF#7_p{?0W$u+W}#HLzAW*5eFmV%4&MxYYw`s7l9|i(+0Q$Ov18WC#S*6h~z7DOe+l zzryhplm^wev82f&gBr5%aR+1YsOlA7EsB*O@mD8kgBIez1tal#4)qDus5>LR+tUJK z!BGvTzb2CM14+^*BAo%y`f!andXK8BW2RO9^_E z3JK&-(tz*{VFPW=7*QcRPu_rgG0zoBFgtewkd&1upXz9!vBaRjo#{#hq7O69jzpaptYxwvR@-m|RTY##Kdo3x!4=oJJktTv5Bt@G0AG{oOkCcg)uOi* zr9S=W4hokuV@aJTQoZUk*||z5OHucyL~M?%*K$lHDM+Z!W(&tQ*B?r01+j%sTCfuDMGF)SGv%ahHek+ap3J{$+n*R(4Xka5V3O0gZe}<2O2ygyGhBVmJ;s zlJlRL+w`m^Gt_L&kI&CzcaEU)+Fd9|{{V_$Qh6(A>`6z|&M9hHB}AzACweNYcgZkC z4_W{b>q~A@pnd2Ax%9Emn85UvK}n8la<}enThz_NiB$gpD#)zTZ97G&S|nR$Y;B0q zeBqDfa0OM9Jx9f@NDtdHatHZ*hOLfASMES0<&wTZ={GPHIRX?dmE*4*>S3!4c%2YJDgKZUOc*0Mpogy~1I}P`|2b zix|mRJaG0dhe1dG_xV}%ro4jx#y&xXdoyM}2k}RE45JG^SD2yZAizO#V zDZ8*^$51HT7&2-jNJ|$Gh)6qEcTs{7#j-gVvr1Vv686epb5u9VP+GPd*PUA(VR&W# z0L#J^8cCsbe8_QH5G41Cor}p8=Mu7D4aW4scpy{;IuZ!}lu@+;6Qs=unV6sg)ByWY z6;LpOyz{`RkEYQjy(&|ql_+iYq`-_+gt_EN)97ktoz9lsP>^B>q3|(mIiZD-An{S$ z9jfemsv^kCOcS=kq}ySaHz*52Mvqcrn^q*noF3zorlXrTh*>H89MYkYw`_w3J?hD( z6qZqRf(iiKd(|@Jkr`Nvr9^@NJ))&1-@>tKNMdbh%#$hfxTpxCCShnASZgO#qSqx(D3(|-k>xkyS^)!4)!L%dA0pD|O1Tm3P6dKC+v!E@MzN$ny^6yn3|x>Zj~(wKZnwq zAoeII9z7~z02DYdXaF6Ltt;^#N-PAbKJ*CViU1QM?Le45#*=mdew6LCtJjYurW#w$ zD8NH$B%iRUAUbAH_<7A4mqWKKrwO%I<#!*BJ(FFhDttQSthu4v#@CA7CvvCuMEfLB zTajl-wzRgxm%T`Z$QBlLN@iJ0MoYgakVfN zrattd2nIKx4!hCYqUF2Ijz?n!$r7RP{+0+k?9y4qBD+>MPvGDwKKR4eg` z`qg{*Ghu!rL2XkZNHA(?imh%~VY!1aU}_&Lh%MHE{{Ri|Fs+sm)+bsayjH}fIdz@K zN~loEY~07z#DyLvQRIiYoLd4hiXk>6Zc^;X`&Cjf>n%il+MM=7fA3I+XysQ2Xq>UQeWK$5 z%9eQ2F7!I;S8l?d(x?GJJc^`z+Q>ztF1E0pD+*q)qdbkasVO%u(lnB>l{D~Z%SuXT zc^gtnYg`o-v85(eSBVDW3}sBe;i-Hi!Y zxHGq|%Y>(bdsR*;h`DcSy$T^@M2^)spero%P0f{&32>Jbc|EH^Z=apCv~6lpTZF*h zij!6(%?-AGZMK_s;XoB^6Iu&w-)LJ(l(3Mf?^X7W?7z0XYUQA$C_&?Ta4SdzR0%W! zwJgW=qSmCqiJ%#p%%BGcd92gv6U@a;2R2teBVsnFYE&Auh=q{@v{rW>bHsQ8HXBn! zSx{nxZBtx`9jLq0-~;xf{$443z%GC3KX0v+3`Ar1+kX! z$vc60ekbk_Ke?_snRC`Vo8B(s*pv4|vt?RaPthY`P0F^3B^TtO2YN2mNnj&YA0G4o z2hxr>rT_wHeW(EAYCn2l4oQkQBzB>J(z-DEe|fmkR7z{KJEQ-+K>kN}sm4ukMo~<;w)lqmCj)o(3MabJT00)T<*USx5#=zW*})Z|O+HE-S{cWB zsg^MtRU_umxf>a-Q;cT}B3z54=`#>&o~bm=+eNWrfSB(uFBd2&zlfq^o62R}J&A(OV)CJj#v%{VK&6TelJ6X({ZYU{$ck zERVJ-*fH^!mfE4`+d=f){{TviE$mReDt*Oz=|q28q1trER7|t9!(DMLls>sU>H@Y_ z*((k<$#hvb;XA={f4yVRl32Je#|17)mKkw}6qGZCHLtN)@9$b0Y`p!ZomN&&z}zW9 zxp_4bZmib~X?QdkVwA%Yr?B=CJCtixU0|7p*3%Jay^5_mRVr1xF(cY*mpDpy!qRl1=rg%pr?6J1`E+Q#73 zQIl0orfxDTOK%qz?>=plblTW2qm=4N0D3_%4P#WNY%Y}m6{l_Y2D>rZc4K?QZR}p* z#FVIwCu0eyh4mBtt50!N1YA%X^G9ys4kRf=B%SxDHrg6RlAE?mfCUpGJJPQjL9+#t zN>HuG_o6(EYYt0qrN*2(XK-p8O)U;Q6Ttkb$q_=*r__}H02Tyxpi=X!>m^%vsIo}4 z!B?u>r1mvnVkWDXBSTIj#B8MP+N+yENrHWDhTC1CzfuRxYJpHIif!{J$ z!tMuxcyHrQs~5Q&_XiV~4!fj# z9^#M@&ZU@0Gg!Rm)oitr5~N?^34ZJk{?63+j(rbg{pw0KBZOx!i9B~23u6UoI4z;u zT28mrKj!WB{Ogk5-&|rB3V!MLE?!ZUIO>X&e&(YoUdw`NHM<$wJ*Y=|fiMnzC`Qx( z06w%}Pyhmsm;;kSB-B+P3<;oiJXC-HN%WdHK zKr1Oi!g}R=`qr6(lFQU3G5TX)06!&0?{;;Pa)n{{RR+wRBgKrd5Q`yi?4q zAwor3h|ufTE;xu$l#VHcs1p!r3`=Uz=rKOkpupb?w^~A0d&38I1;|*Hw`ITh* zCw9T|edaTfaNGAVdkc>h3QI~$r79#6Jlkw*&zY|Zy1=sy)uq*{?4LsC!d~P9xZk+0 z2BG%q@qvh|K%FPGD@_LI zw!*Cx(iBuTF|n!TAv+)GRmtvHgphSWoxQoJPcWw6f|wldM0o}+IDute5M$bekE{gJ8-WMCCS|LR-!HLMkJ|ILvm?|Jw)x=kHjVb?LZEE z!PE~i-j3nl8DP)_=1j~kU|6GPSq&)eCcE98^LT};PPCy45^AZUXspNEmJZ)~$vOZ| z+sArHY_7PC%+v>0yz%W*6Ld64JnvMP*z-sosz`xQc#aJg#Qy+lnnDKPdr%u1e2h{O zw^k5@sY+JCDH2c8x^_nRdd&I2w)^b<>9JP+Ey#rt?4Ex*X;_=1(77Yw?B?$>g5CTL2S0zPl*c4)#S=jfYh>R^ngTCGCoM(=>Wqg;d zrQLq>zfRvPWI~|-0I6IG67u*TC!aIF#1>}Fz9qf0!v(|DBfzvIDMS5B~^J zk8S6$rU8K|-)b;6CV(ySeb35f8&wk?Xs<>fml;Bmpg|tBPDD;DG$}xUNc1sF))csz z`qdFc*rmBKumlPoDttI5D#{`gWdoIg_oS)T+a&7;+G&MQm0vQDJm7k7NLDRw0;NEn zDNx&F8?OTw1p#T8ip%1ddBb%n$O!)cF{vS(<1=Ofa-!2Jgo6ZwS#v5Rn!O^X0w@}6 zKnf#ippBI@fFmP%?*9M|HyCp8oMo%@+XS}aRjK&c5$b-FDLA`afz%l4)>g}QR~S3D zR;XnwE;XQqBu^p-xUMDfC)AcYtDfxfdqvy0hAbJiD`mYBQ6f&;nD1CzCp_Kkw$x)r zcMs1N_e|awE$wxIRNUi?>#(0*p zq&S3_jgwIBa}FbTe~War4{fT&f(hLac_hfLUtBo>Z>>?-sM7^TK_;%GxGHV1$&u+q zbphUed8PrSCwU*86cBeK?nMF!lm!x~Q1D!=aKlJl1J)ShzEI zx9JzTdGTNPWMiPVqN&5=xnG4~w zFy@aA=M#(;#YTUMCDjjP_WRV-TN8A8DY_o% zr3zpiZ8Rfk?LY&0G!N@Q2L^`pzyKJKD8!X=0NI9sfQj~#EjBJp~^DC>|8f{sL z;!m5sOSF73wc~dVDgwx+6@2@LcMs=Dpl-zc?rJKpa0Y;p zzW)GvPNdGL20KkY(4k6ne=2m(=}oBW*(yJCOXL6z$>ja%3qTtW){qH8M3AkAwKyAO z?Ly18-0`w%o@90s&y)0nx!q}z$gH+4|+?W77pA+X(=BrA-BMdXWEYF2mlSaH6|o=tiF6a652r05D7J3ini6- zRP$<;^YyH}vhGZ^)xlDsMyT;jK{l<48>q!th}oNe%W0WPLJX! zdnf(saaJbi^p;2I4qV7=q}bV|+qmBC@u|b~J-*eq1t@_PrAD?zE!zQCe@YW1_MxUB z4!njMQ?9s{T1b^GWF!x{u1TK0C34PH@h$Mx9Cr{-+HK4-lkUF%0BNbDlDTj`c1NA_ z-&?azep=hQy*5?~;?B^NB0bM4`_=+$Eav6GY-2$0M^#ZE<9ZQH0|_v8qbZ&?rU69) zJ9eZ18~sHYNbN-cXJIi0kGEiHfICnoVmr_PiZRUq3Ioz9&?@FvJrOf!6t?hg^%qd=-s}M<1l4P2;5g{OqK%@~7PD+TNsP?D~X=i#*6%mq2 zl!G+bK4|So1s4d2flETvNb^N82wI3#YLI>C+XS7rpkuyP#Gf+1r3JoKw9IN&fVJFzPiYRFNI2=h{LVO7tlyJ?3cz5Xlf@aWt8r zU?z%a0@p3xn@mj`z*y32dX`;you}zk%xGD{UIS1`icP)}~oba@&@TwZht0C{a)4M3n?2%5?%a6{o@~Xj`BmQX_sS-__ux$vckp2<&)GwyXh` z^+8i(arCUlEpGN2wIq|E?I6`078%>8B<=XCGmbuo*Wssir_!xNSyJPrO{98LVC_<| z1NmqH-?ab%BYFV$rUH)eX>kM^U}0y&SR zA(VND>$BgrWTLH)1VLL|h0;uSKR%Oc!MC!XJ=?+%2e++QlWY%9^!K7UeQ()+NDY= z`$s={tc*=#oZOjeibBE<(t&U3RnZ|q1L}P!^p3)q0028p6d9y2!HJ>1)6aSU1Q?$5 zAkYB-Ng^bA(v0!mfCp{p6Spxy1s|;e&olshn4vTPb3|r#sUZeN-t-3NnqmWqgm#fy zT)T5N#XQAHp{`3{?*ewEA;MMd^{AvwbHysy7^Cr^^Tj#<7yP`<5V!>T3Vom-idDEU zeW?#Vq#;X4k_6Of3}z>G_1ouIB0Ewou-mJolG6@2JyMyjrjtjTRWEmfE>GlDDJbs7 zTxD$%7LtVy$7rU=_o{PYmMOSRQ$U((&_H(LlBDlgni!ojCWxSIwL*p{DgYaO=qSn} z06x^1#Dw}9btuvSQGrPScLA*^D05Q#q^2T*72vlZ?yu=h0Fk-pY8&ba^;DfAaonREZ$Q+@ zheSmHId0))=G^}PDuJ%^gxj+HgBMLCC^*BN+>(oj83P~K+T zO7e9+K=c(g1Vy_bD-*j{Hx7UKP-_*uWkE=|aVq}+nx#mH<*n1#S46n7wX1nO%~>i^ zl}9mB0ZjlBb;&WXG>}S)0WboD15f57x8QU8w%&Une@Ym}8k_b=DH@|=6`$0!=D5}# zy9d;QHubC}6Z?NtqMO}4XB?UkqykyVeZH0p%yK+3#i_?D~MD?5i_w>Y)ic9v`| z;^Afzgb60Di4)L0HTZRA-@?Q*DGxiclVp?SPyENf(!1S_vlce!X5F+h(gY<9hyYgD zN3|5m-pH7j2Hoj?C#_mUYWotk!mS*;yt!)9*#cDS$_YsOn&O%B;+GA=yjx7OZTrsP zZS!w}mQsC(D*XjZXseL7dn3dWr;6pbLs4^yZMk+Kwl-)BsW>iX8T!0qAJsY4xB2 z21N5l4%7ez0-!t7KqRbh6g88^)h}1lzbue3hxF*?V2#Fr&N-mXx;KWSsZ`~0H0wb*9*knRW)?>xgAJPUg9-+5o6pMA-grxwfQ@|CZ%S@An;?{1W7o;o#H>z^&8z&A* z_HvFO{{WdS0F$^r)jf=dau9|ix zh%d8jgDtpJJ56e^UZlT+;SJd(kmrXWDEd=s)dFy3OC>F5))@=gy}O z^HNcuZphk!pbqsR1HB%ZpaLV>iajX~hb>lGeG2RiXap7SxK&6)i&9Bk0mn4bPy>x7 zKb#tNMD5sObYbj+z(}WFylJ$6r2+J;-b+e6Ue?nUX+v)i&h^PNRuJWt;UyCPvem!XvS7PIHLSn`4G>TA8^ZkyoQ z63r>HWG>}H&vf9GsQr6Z%u(`HC*aojoEmWs&lRkwbx)y|RO72lZKO(+vj7iLYm;>Y z;ztO}el4a1gyR^1@|S1$2tQxu`&6w(TMl?U>zi}#JD#qK_`Um=0%a_NrL=t#Hmvwa z1B%NjIc{8)Y$yqzLEeY7R48E6KEiQKYB1g5h8#FutyX%NZBTU3KT~IhLvt>q%yP43E zK;-rxT9^Bo%|R&A^3MoFl75?SSFCNT0uqoCV5dnNL7}kZZB0Z1NjyvnIe{I`TYCs7 zgGV0R)RGY55=n@!cmB_gi;U38#=HXPUBa7nG67N(rU0LF`d7I2a!}LHHl|o2cnQq?~>of1(D7MRX#VH^eT8fk9A8Gn?UuxJzt&R|enzryz+IC6oE3?*I)|*L< zY`bsk@iWfqyCa>-aleOek>Zcq0i7+adKs8lVF3?aDVB7$OavEFPv;f!srW7`J!^Kl z4zWDIZ!Y@sdZW5~1(yNcvW0fE+7|2XQ^B43OG=6W0qZN3+q#vY!jfe*smgBt`M$fjeQHbELP$w~Q}0ye+6|M3+8WGjxWb)M z7`a*-M#)Uh)tp``J-vL)ID@uK;E%--AO{A7ziR_CTOt>FZHD_~k?vxm-i(Z*x*W`FO zEAV@)fl^qqwQU+QOG}U8MWv@evpwkrIB0Ah%5Vz5xA<$#ia_x`UfnD*M)Bf$ad7hB~9m{LePi2Bs5 z0wNR+{Lm&9Ob26BM>7?v!L7}+0Fk=4G%zhxqo;mqBHk%fihv7Yw=SJaZJ|y$qq0&Y zn(J8?qowfO?l=k)u}!e#{c3SmCg|)ImaJJYhArDeO($TK2m+igz}uSD9g0EXK&-}e z>Rt_y?F*OB2QG*uyGG2de{RFxu2P{MZqMCf$1~fDX~#{T8z)Vp1b|2SkMn;@!s;jg z0Gg(Ab7iSeV}UfdJbsi#3?aM^N-@dy_o>wgF8$~O0-~1V3>}8wdN~ol=~L~n3(`TN zkvtfvxU>Ooc8H=OL>i^47$ExXLqYYWKn)NgfItF}!cZNPL=Nyap@5;xa!+AfjIWZF zh_;vfGV5pq#?+mVeI};}*aI~`lvh?@&u{X5%5)CCjU1Txw0F!IdZp5)Q=IMaHm;U){;XEuCqHn0vu&CDNOcV3e#6 zK@mGaBE3E>B9<8KyJ&}X9N($AIAq*n!Ifex;ujaT4BtK)3JSMdl1odFJmLW{KZ>#n zObwv+u2yV*?H1-p;@xQeVmHE|3VSqTL1j+7WwObXqhfs~j*1oiU&5TmVEadDn z1H{yuYn!Di=GNiW!d%x9gz_Xr5%l}}4xOi-Z4Rm9c^zBhi-%+-hHjPZm1>9{v`Ha4raE}&ed!>1pzmC1uZ;Al_kZm0!5PHM>^8Sr zynj=c*LJG@HLb&5X$hUdLESyVPo;enZ{lYAEjGp%ieP`fFFZ9R7g&1Eht`qCk~UH1 zKDF<9pG?Qpqo>oU(~Kh1^tHNwdbRhQOxbc{%@rD^yz%_>JSp*in{!@n%NWhZX8DUB zoqWA-hLBrBZMU?PkR}O81c;O0n)%e0S95Y2K-S{br70YfS9?dK#fM3x!=|Sl(tfXH zX00?a;{O1rRM#uZ-v0nI*8L;+4Y|y=R#zFT5`PJL@d0VFVUSkRPX)rFBWW-s`o&|q z_wbK#($<~3!LbK%i&jRbkmErMLVwI5L@7S=Bh#9(dp)AdgZf-)`|7^y+WjiHemD92 zjBlu~>OI_D`kru7Ay9UTN#4Fik`6L)XLSjV1rgp&XJmp)MaPnmVtGE5zOlkaD}Y>D zy!w^kDL?=_q-=jG$DUoWvg~T*M?Q5P6N*ovic)JtcPe6)&i??d7=m`%rqwVUN<2ss z6ZNYLYil;zD!92M0U@@#pL$PaU_rTfJmK)r5Rt$X--iht)E}sXhz3Wm-v;qA9n}vugtw`JGpF;;Mv=-2X(4{+MZ8XovqakrB(hKnXFh?MZ+gc&PLCr||4P;}v)zlzDro@F}HWbX=`vZi*__N`ds z-LeCFfpjN4W-J_HmRWx3b|eKM<)k1l{#`_B`&L60!0)h2$1QKI+_t!A=~Hed2sP?; ze$MN3dR42)mv5SO*VT9^SyPv31f%aoro6vy<>ZSyMPA&sZrC0piU>@Q1d|+^_cua6 zXYHmq%NLoh;mko#G?x=^VDeDHbqN5x0<|6ZNF)7K?7AM4Pbkk}MJWRyE_vVZD(U*gs)dolcY)0j5P22zwzoSWcA#po2!R~Xq`)MB z9PLCv8;U?k!y8-pjk9P@rK!|_J$J6%gs%|G_Slu94u-7nG>e85iBW?h4{htCrHmyR zMnZRXZL(R*h|HKaJ&*jQz88e)eBq5YU0x#Vd!#8UBzepQ69Ok{^EP9={o$A~E2D1R zr_5Zq?|{lQA-zi{NJ>Cu}6|ep!$E5td0kRD-yd- z4{LCRmam*abq;AhZz?51363jYm~HT!lx{_iCx>QRTXGd|idrE-qO}dSS^<&V5y-Ej zbo|R4Bi##08KkY82dI|nxV=^+?ca@X^2$^ePPKoljw>Y7N_oJ9B&|n)1$kWf-c3V{ z7d{K4vfQz}%J{8?x*xd1?igr^3tMCZ_o~2?Jds*;y)RSKb&DJdZO z``1kAPeF4hRqhk}xsL+Ot4GZ`l@t|v2piV!k<(vM)O)+At=sfOa!;~0bWH8=SDZ49 zg6{29j9m>Rt!=Q{(zK)rCKLqi*h%)USNtC4TnjMd3w##h-Rwr?r6*0B4V5`)_YyS1 z)2P7dE1%P|Y4K@wKJOAx?RO;CEmC`UzBlv7CS5e*{s<>~Z@;h4$2%TfQ3Q?mqyrn8 z`CO&(9)p9gbOWsSy&lYHzF`Txvs!_E&1xx2kai(Mbf|I^Hx=%CZ`v`Cu-vg~iwvQR z98THanh1LnhKt?TB`Pzy^9VKd4IYypR?%UEvn*~qJCAj*m(TLx;Po9mv)6BryZQT` zMfjKaxW~HpcW{U8o5QRY=wE_|7UIYsgek=mq6X$R5@suy^dix#?yzM>-)uU^?*^2# z9tuK%KcKE=e7JITEiRKzz6@<8es|s13jGb3F-sN-lirWIICp@`7*lrWy|gPzi;btv zxbB|jN#3}pTyjNeAeUz2BaEVEtKJn>amkq!ki*>6Cz+yy=$Z-C`Y-Z*1{{)jmY#g?USD^ zim>1_3Q5|kd;&K4v7a9a3lMbe&2y5ICbH@HW%)Tw8c(GbgB7TxFoJ!k!VLfo6!I;$ zl^r61UxLpI!_w=4MKC9CdY6h_v0~tD3lF$CNFG%E`z>+$ZoQ z2=)S-RyBw@uymwLbp0zUPkF>)6LUC&Y+ZE8rf(ntB%$LUl!)@!`R#+Mc0wf_L7f@AMd zcD4&CV0vvvkN_iUNmn8S{i#HfM)Olh18hmIpYZpRZL`l&>}@X7uF-&Q9Yg{Y6WIGt zHR*Z|6_;O%GUD&>+=SglpI5qnmaxR(4qFT~JloABq_g3IrR^YX&i%KqHGEz40lZTs zW7&w{$-!>0v^L{1*-D&7pp_+4>~#;PX|Jhc&+l~^bopntO{>+tukJjSJxBilS2)UB zc>1H~d##ix&eYPAxjvq?@tn}?n~$OEmg>js6qfGUQlNmelOB^_X!;e6-D9~&47IaT zTT&Ti4Wy_Y2+||+_OE5p@x|yfN?b+7{->SmnEUkKL#}lXq{wp!vUd`_@zTQ5;cb*^ z)SzcdXV$(Vd_>`?!}`&jf)JE6<|%OM0t6%lET{qPy;JYrzoumERTwn?02XHHG5(%! z44QBL5zQ2#q9AJZrqo2t16~&=J07(O)IcN^l9X?rm-_ZBkuRD}s`j1QY4ZR=f#I z;ckexxj~wGe~H-KIf-H|e(k~7DNENL89FDCBVo_hyyKdlW&C#W#u1@~ER+Mzp40Y< zzfh8m3OnvpPX}X5jfUXX81hK&{XgnT=f^wr~{&)wylP)d50y zGa^pax<$rNz%rft*wQXMb+(tRP}9vNCBq^XB>7`~x0?1k9czw0*G;QQzfYggrNr}Y zX~va}VvaaUbcK0Rozjum3iS`d_d=}kT(@JHZ*2Z;+sD+F3`lJ#_8rOZ?Ouo3pLdg} zPg9fqiM8o|0#CJD;U3BA2T3e3tb=GQuzQP#8)x|GxCLleum-+qd_i=ybkjGXgfgZX zykuOq%7hldBx&E!gZ7H_TI`VOJu578NjbsVudn#z;%IemQrw%}I{UnSXEC;HDdy66 zBm-Ys`XAE_9?L7_+q^BeZLFQKWx&*h61@Y&Ac)+ksKFJ$=y@KOOP3-`dS8=&v1e4u z@nW=k7d~|2&otoSSarcw=F(NLNCR`Ro-5?fSu+M9(cg$H*5*{dcL`elO2}q?xSONwmq2>Elrem)(lLxdyb~B? z_)fQW{**X>%#B@-G243MUm5w6E-M4Q!1A@v%v{{txT~9%o||@(q>xl#9s9}rt5%1m z>#%j_2}ApK-*s%)EARc!DJ>oa+t}ZFcl_A+*@!pcUOd{gsHH?m@4Z7LPTx~r2dFC4 zUgAx%P+l^fIft8pcDE~Rr1crLPy$vtv3=2 z8nG2lAc$s#TiFbR@Qv&+{oWPhmVy&~%L>b3W9o zDK~9_{$W$_K-H;bDHF{ST_pLr6#{$;@l4G`xWrgt%`P|+Vq$0yJCT=;+9Uq}F-ktd zm~$~(q!>cg`c%|xS7Q!lLHw+rxuzV?k@cxih82w55=bde&{dWhXMczUkQCui zl%yB~+?uu#?sNpaLoVH0y3-D!#$R#*N|z}ns4-kR^9aOlEN@wI-sy#uINO30lj&MA zVQ^O@M)#r_KJ=ej%t+B?D`u4Yk6bcdX*)!1J*#(Rf!yXC4--whcHi(#3xy%aP}+)h z1i}FztjdR!N%q*+dqt zh82q{Ra<|-7`s7`B1!vE12xU7CKx`u(T&YcC%R-Q>-Zm8vijI)K3{j`%PQO~ zC`3hieue)4-(pwGuf(o@Wc!)XT(HylWu`90xYknvP7r)DJfsi$)(hjn+qu#^j0NST zSe`dFw#}z?p5(`%+O+9%OFy(2qMfxb$vw{@i%px|N^gfR-j9V@hYeN}i(J~dI-6Nc zkp$IGBYMHru)RLBE+^r&`JTHQ?t){C#0n z-ejWM(YYxEh}7b^N=D?(d~5i($}U>tLl{$m=hUFx)2)bUPLNbWJ%Eq2de)wY(z4>| zn#k%EPD<<1M}N)!hCFh_^C@CmD)8^;$>!k7);39wCWDsFvL#3<2fuI5zHO5mJr#`7 zNZ8gUF(e=UDD;AM8%0EAjvt1H?bQ19goSBLCP6*q_N%-XEWe2@VXGBgp|P!KOoCE5 z+;Ljrg}A2titAz~YRgaMJL^#5OJ?De+_r@uGhmW5t6{$1sIB)+`ss0%5XH76FYmDS z0nuvB`r2(OJ;44`zi0=zs5S27;>F6bJw^C}#&gCVaK94m7&=_>nX`WFYi+f}73iHM zTXPl3oN-P#r7V>w_cUb5-U)Vy8*YDEUju5YBNWrBZCa9|lk92t?i{!vtwmL?4v>VP zYEbWAOuhh-d5B~@I}L9Se)R;n;!8=?rc`DL2b7ox^RIc(5?FOJZjz1P-i&&ro*5_T zduuh}7{*<|pMASG5X+1u4>q=ZRG(7=iuoz=(TX{Xbtc)zHgTIovb5^d8zD;a&(MnK zbfu3zk5iW$x7)wsk1^7q@kzpIrmLSu&p2TgrtcEAWOBC>nfuq<&x7nf&lABdu-rrz z-?U-2`~sHL$hEg1JjC@~vsjY5{(nDX=S}nG=H4Muk2qr`jH=dE^6f2hfo`E8!6 z3$`jgfoub~$I9Y1PfP&d2l`c0R*5420H`*lPFq|7I*?LG_N-zK zg>PA~KY+I<+9an!(oY7P*Ej`0GK8Y5#fP-|fX>a{`k z-jaoBAn&mTpfjdm4vWk(0hE-Kn&Cz`*Sh4Mqm&x1_2fZx_TZhV$YiXUj zCo_aNunLqCDq3u9tpvCL)j%r0_!CvR7$=%fXrZ%nV1pnR49vx8ay|~;YQ(%SK3dhV zRO_R%M>L}sE=Z_&N*S;rm>L`{0A+WgvPT>0=vMkKre3t-|>%TK66zhuF+P zz13`mRP<)#JE5fE>?KMuuTJ#`iu{_R)e>94sZaz6<|*qBE#q58^{Dfvl}1efAW!IO z1lW?P+*W5C{{Z@e$=hL4T#41WfgVG$b`d@1 zvA-3Wft>x;40kr!*tdt-;%h>aYS071(tv;n9?1vqT}@V=OBZyV)&AeHQkAofMDO|< zC>xIT=S$6(Oc!$YGUbi6x^C3_XZR|JBz<@?A0Cc1i#8(e?#m4TP zVJR*tDk<^_ntf9qO;%+%t8ZaKqJ%wY>mnA~(fk52}hitD_hg@k#@qQ%*1rI_ETy>)u#2UAA8pkeeu^h~+ zB{stRe-T#UQ?gq~(9nbCQ8EXv!2JhPrqF+@`^`KW%O_H#>y6){O?g-HefDw8L>*mN2`}5Yvy|IlNy~nY0n=qU4e#>qYST_D3`khGMPPj@+ww*=<4|@5@ z@h{f$&6S!MDR;)=*Cal!xvMh3%R5&+m&esR_4aAeP|_*~+n7`Cs3 zo2cxSUpuz`N0{mH&ph833;E}N$$j>7tjlP$;w7dnQEzI5fYD_IDN+E9Tkc8Zlib%u zzD%7PQ{{V)#-X&X1gCN(9)b`6*{oHnYB)us0YWsIML+qBF zakI))MK(YOYVnz4+czIWLgK>-n3_Qys+a0Bv2-Pz3jY9ArejyjVUE5KZi{--g+%To zeula>OUJNYn&X&*ws$rcR<4vOLDVI}P?bqaOcE!99D^0D@l#tbB~s^OkaeRJ zxXhTVIK%84bUs!aL=Y00lz}~?isqoe_BF`X$G0=C3nRd=cK4ztunaC@M)bV^0tWRc zfLeb2>BK?iO=*A*qnNL!zX93n2g?~Y%ND%HF7o}&y{l*qH*Owc>7=;5ML?(-l|j-$ z;E-$R9SaooI&Dr2a8hn7XSMFXPD*DU?T`|9?KO077)`>I&D)Ko3b{M@ix4M3BqT{Z7~;KWN$5Z6T{BSU z%#&@j*9&Bm=gaii#Ji<=C+e2pCVA&8VvS(gix0hdkozn?hZfP{X#`07iLa?$G0hl_ z=S;AxysG+fybyxh@8I_ZyXJx2DRm(#T3kqxAZZ{>?_BZJk1Wq$g63VP85r>6z^FM^Ldl z>noFX+lok2`gEnm1b|9Y{Hc+!JH%IWsI5Mir)BqkX(~xa*J^D&xvo6&WYfkG$fF9| zeU5Uq&w61*o_p8FwHX|l-b-P>K?l~3KK0FG6r}P5cF z9`^^dPYwWWX-XDgx&7ITs>fE0R!k&JWONcJ_6DnH#SBc!H$*-ZyQLWFT{+1GL zKL#$yDfdYfuC}I>LefF>BAZYfcdwdf$1HMjnx<}B@FoEFnj#=^Ca^RxqIZqGXp%}$ z2<0mLs+LIJ=0tw-%M4r%%0N{8MRVnWv=6;w!?J7UUz5WU2^&(=AC+v2re|T5g!8=` zE{kSDQ$F+*RQDJ>KvD#3J*bd10u4p(BX5xI!LwRU z@7Y_r7-r!*T!1wwdQYd)ozbQdz1Y?s zz`TFKw?~NJ6X+?dM89hJWzQmqDIKX6%QbBh0g_~sKJ;DbnXbh5p)?3OQ)&otD)b=G z1n{jY*i3e*7Ah;fY{c(Rz>Orx_oR|zf6|~$i6Hadvv}&ibDp7FrwYNG!?6o} zc$3L5t#1OAwZ6sy@5CQ^^m#PdR+?EdJC8q!Q<8Gqla6}FGz1N!?_M~(wab`^!?6^v zVucL~2ZA={yOvkVjAKl*d55JzOGpnOA;1tPbg4vX;BpOj`es<;mCbBdC1U!ptQRaG z*uK$e?GQ7VHVsK&x;)PDtE4jF#x(#sLXu*PojYv$8%w=S6r zOGsYn2@2S424Z)OyZg?YIYJq=sZ)a6ebatd&W>KUEU@Y4IP#Ix`ls-lma%)w{4(Jz zHp`l%Fvt#T6Qj&WmzjWI`d7;?rR0b54syjXN5R!-`kD$nDm#y;sr9W#`o~RLnaAUW zZ}NLP`|7^)H%-;N>38$P`LjDkNcdY)*&)n!WSt7nKhP{08^Ew*blEsEog5HJa-i6?}mR-bAi8vm# z@YJsf!vKgNEfcXI@KeFBmbsG+7zSd!vTa5!-BJR$CJl7@?su)wM^hzIgpyx+clsi| zE>C))HmS*OcAlC1WOWaw_;Xe`b|Ay3X}<*y-diE{r61*$gSA$56XJKMeL}J}Sf*ip zRxnfY%pokd2a%-!3NUq?QpfMs74NI1|p;|q96*6nr<^xHmtO6<-ox~S%cfPS3Z2&iSO9gtJdd~@Wn~+XN-3} z4Uw{*Bbx1St1E0W-xgi_XidAyzi!E_mOJ&v^6Cz z4)O58h1g@*%JAFE>pVO@(vlZ`poW+JVX6!eAdQawtEP272}Vl!EE5UDGWImXt{bHb zCN0+EKgt5$LS&x$4%|qZ*@?oV8K&3E!3Ta0G1VLNJ%HR=xZ+>9OQ=?$U;qgmedF`4 zJOKh@?NxOtLRqgL6gXO2hcrXmisX|Io#KvmGrdi602_&=1!>rhYWT1mZ1Y}&_<8t< z$NFhud4Yu4;<^kg$dNwyl(d>QY5}4u`2&GPNz!+h9EdIa=UU#Qf}!bx7G6gNag8pP7b9jN#CE{vnYjm zg=+HtXT-2{{{X;Vzi8nsL7|z--=YuhFB>^nzD9c&iRKjAb#`3Z?OW9 z5)02Ma0df=#J)&TDw(d2Ue#yRMn3WExZ0QD!Bz-H4bZ~ikvvmefWbY`Oc2^ZQlRg=1KXPV zCDZAOT3r&$8&iIkoi7%?XA@hf z$EJ&vx$t?1;-8@SZXbg$G2u38vAJnlZWw3;wy~-;r7`8@I}Nw?HRJUsNg(WN%zIy_ zPbMv7SKC|s+Vl8V*OPXZX{uav_=t~MOcFh-=CVfdJRT?jbgV?}HA5O^{{R3#yz+Y5 zK4O%V`|Vg2pd(UF#1bO0;`?$%^WG_psT|TlF#~$kwkV*2NjuYtYj`};uOK>$LZTrg z`aq@pvyAQ#Qb(wy_5qiaqN1}Jk01(ZDuYl0-!J2%22-jiQ-MQZ3~x!tvA^Fd3h=xr z{{U3YQ1RURiT8Xxr9vbbsW$0^Da8pu^6%?ckRtXbi@ih%Yyi>;BXtdl?MMwRV5k`$ z^vStxL)dlVtS>^-x!~{XSD3aC{mvfFCR__j&V_FzdQC=7s3Qj}uLUz!T9*XvT70LM zY;g5h1vVE(}*x6dK7qz3qR??c4P?NF* zK<0>Z=~76OH(e#^wZ~HPLl}Bo`D;XwtBZn}4W@lNpFv*x%-;Zc6E9^}K3zBWj^8jt zSI(^KOM(xTw5B&ZK|B-QzOT@9xO944S+y9H{qt#GguORh@4thGuhqO0gjW)Dc%!dh z54gWYF?)9If}gOvM~iOxOiFzeJ1BP*&T{T9a9l};;Hd~$Q5=H@xIB+)^1X9GkEiQD zv;P22TgU1D01na9!#?=)Z61=g__46c47{wXX6=KDYy>D{1#2hE)$%L=%C zs~km}aKnX3g5pqgh*9dBJ?mveq z{3(TByqQuRwL)7;_*4u>@n*lsq7`&VnGC92VC z^s)PDJb9$kJpTYjbv@SJ9c=tF%*?o0eYXLHAwfgzYwI_|27Iv39X-QSae`u)h9h-m z0$sw8mkQK2m5uc2AokvQ70>7`%T1`o38=MFx5X>F{ZD0?uHE=Lr&796nDJhm-aPvV z!EJ5ZQpMgP09#2v%8&_BC)0vY74nPXE2sB)Qy;a(jiF->#X`-x)Z$iFTOkW3I5WQf zwcN?7!L8`o@nZO#WS#iFcKfdWryD_%P4><$Q@#Bj-^)2OOM*8b)BY$4^^aQc+I-!y zX`R-$BfPyw)|e)Fu12C=(kwt6O)V?ZMN^ITy8=MEAVkG7>$=GAT|By;=p;o(ou0eP zH>keo9uDp11%|ZUxbR!WntQ=hpq^cGQB0)mq=0^+xs}D$o*2!;Huq@1bgDci9r=Oz zgZ*}{o|{=H*K2R?;HkxVIo5y7j^ifM$r3)LR!Ta%BYQ~B$M0~hV>CX_45pQBORx~>zaI{o@RX1?qPVvyLPPV)uFyreN=fS zsCgBSH2dXaN`bKYQ6_)uR1ypV49y(!2d8?H5MyZm^kDDY)`)gjHIjX}1!<#N$T{sYt1nKoB*a<&s@clLoYa@zVZ%pdse-Cl=Potj+*;dyD zy2CLX4#yw4SxHs>!rj#%NlH?Zog;t#Vz?j0cf#HqlrYC}%(Z5#510P{?yPmGX$dNT zv=vE#uppDn&3ywlSZn8#K>o{L3Taw(wLW?0dgo)wLtR?81kW6;JCJ*9X&QGPg1#@7 zJ+g6Uv`=7^00JnCj((}6liV_G8}#Cnt92GL`yX7|Gm z2AC;INZmxhAbqC3wOeHe1%btrW|ystUK&~-jHi9b`uatCJ#Iy((dk=t-4?(3JhzZ0C4Qf~88N*U-M-cHd7bcx5P37}K_m`#1QA)JHL-n`GecM{o6J1g))q+t zG3gaUbog<_DI-jhVAfc|rse8dYjgEArn@vO4#69K=h!O!c4^dYI0&ly|yYF zVP0m^N;K)wzvoqs;uj9;Ds@JA6Sw71kPMdz8}Af?f)Er&$GuiC)5R$9>p%%IK?9Cy zNDi&FAsUK*5`gp_=>Xepsnuyn-U;-gL~0YoARl$`t&`tsG`Xr0KGh)za2DMMv90z2 zXJqD6yZOgmOY2EnDMS&lo$3-zt%jtd$(sXt;;*vh-^t=u&Vn{v5$txRac3%Nonz$? zS`!4QOb*pwh-F+m9ZHb>x=H^4GDIKFvt1q7?qx9^kyQ8)t6X zZkt`r!Td_q0&2xJ9llObfJ&xz6|cyMw?+4iw1qm8u|2CwD?0U~58{qC+MH8Xr~-5e zDmB+K+7>JuY)fbf1N}$q=~u-Sx8SAfgf*550(6aV1p6BD258$FxcZKMl@>}RREhPY z363}RsX=Z@o~`&IZx6(-@q9d#qZ2PO>Jn8N+Y$);jREr(dpB?|{s zf%X1^zNM(tynQo7 ziQDO4E??1N6vMW$aNC|`EcWz@$=7iI08!I)+PFJQx-aFuuhpBnMs=4J{{Sxk0Pr{a zz#;dXO}juiogoBB1JqPqi9M_5bzGh1>_HpzwIrlXMuZrEXyT^10mKRK2EE1mKl2`A zx54q7Ofma6ki((Y?5@(1rN|nJ0=%RRqOK=z*=%269x>rHP(|eXIj$ZrCRV4Ur`nN|qFnHrqY0}!2QeMB2^QqM6 zSssSHhu~tA56;}DM5BUljYYh(SOIPGD8$GtBU2X z=I5Cv4J%*fEA#JlaCF2eQbi=pkMCLJ`<;LiVEc2uDMdZ0CrAW^Z_OAwqLqx)pM09EkRP7!fTi;BA`A`d&) z(9hYujWLU0x7m8}MYJ1|rX2tf+l3?X4@0KCKeO|cUZT0|Z}4gU#tnb{2~(|)r1v>a z@ys2ghTW%2Xdws^pq=M$tXIrW+HQ-h+{K1oU$C27v<0*nLPA1NbdY1Tokq8GN#fK` zH*%>cPxD8S(64uuE>otT?06MYKD6t0u0OZ~ZM@2g@G_0IkA8(*SU+x!ZZ@EUuvpxF zbr+ANQ;?+_SW?t8J~kQF&-7A>$d5SM5w3xS5){KeY;M+VOI{JDrvS})}#EOpr(G>t6pd+ zb&2*W?zi}>J>05VW}^HbU3ybzh1gqNq+4qa1Ehhd6ZY*~r{gmQ!LY87W{c!03Auj7 z=8(gng`|}FpVQm{S#)`GuCX2Oxux?w9u*am<@S?4F5H3REA0nezgc7CD>ul;x`Cl*`++{ z&XlDBNj2AO{uDZqeS)tPZ!BJxQk`W9NAV-qN8tXnEp9iPB-A6qZ_ECE23*;r ziCa4#!afqaJ8PUhwo!*>dpt?Cv3BD8H6-YB$U)f29BgC?`iqi&C$I%zHn!Q5Rkk)7 zg`uX3((=Z~NdhNsJ6ChsE{mI2ro)FC{^mcqcGmm-RsH5Z=Klb>825aS1^i~`wRHev zm+troWFcs^uw=%RfMvzUBu_r70&C|J{{V=I?^yk%(!C!}(c!KW`}nq5qk_fo)oe7N zJqJ9}1cSAFx=87QHZdZbbV6pc$qYkcPZRW|tMWBfcp4d3GzP$*wMT#m2|H4QGI!>L zuW%$aZ?9yelTrp8;TxnRbGf0QBRIisK@<0=>W~PTA6l$IB9}5Yq=pv?k=#WnrNpbq zR0KrvwEz&daPT*!rpbNC6i|aUdPJ#Tl@eM?MyVi!MF4Ls+&UDX3Zt-!=$S_karZ57 zmu*%qTp?xM8wSb=AfHGzCATG6I7VIOjkE4Ft<>6zPuSFpHED?0%~sA zT09dv+fN;jdX%Lhh+ImmJdV~E-4y;pgQ-{qc~pB+G?MCdDt)M4rN1N20Z?l1E8Tp) zBNMWswkA|}T&;IL8J&o(x0c@VSy!;F5h{_I>h<#$xqJs+Z3M0WQil5)@-||5591dL zLV}V=-|bQHM4_@PV|j_C4%6DKha`@n@Z*?na`#s77wv#>xbKFh)U7(f5fdU0ru@Zy ztmrpf^2y7HYa6?F4O=^{+sD#b1o{&S6YeYM(9mb<9R)la$}(v$J~;XAa~g!;$YFic$1!?Z2vAh8U>HNk+S$A9ws5 zrX&+U7(SxDRW44i%pzoa(~K~?r$cRxN16FlefA0cj+jE4}!6 zIi#F-FSnR*XPipbggmBh8Bo}%w-f3P=`s}pYtr;w?*^rOeX2>T^tH`-UaQFoak1@; zx$#%<=v>6Hd+fQ2-rc^k>vs3d+i5_JkexdwJwTfBf5fN6!n&Lt!LsfVYnC#gd&U+P zMMY06aJO7Ltw46*dUvm_M@_8K!dk6nsbq>tLNRWxzSF(cbMtlRdAVcDlQqg)dRwac zQeUa&N7Lpco$GhfzOdu{E_&rSW34@7bTq$Xc+h!=Jqbd#k?UVD(rRa-)_d5ViK~qp zRQyO{=&-qEj6TVip4dDal{P=nPvQGlB+NLy-aUHd-Q(+h<*2DkS&~hA&bilRuhJ}V zk7|7HcmDteXuFf+H2$!TeE1BAdgBM?K@Q<6hV%5phWFR0TJ4bAnn?c z82z=Xu2-f)M|Bv%8gWNqxjRqZybJNOcX8Al8!}?oo&xV)eJ(dM0%OxdBqkMV!{Ewd)J&JK0ZqCtUggp8i zBys^zAKtY%&IsxsbfVoh>>+wmkT;ITyjCm_mK>6=i8}fnruRo(z&;^0 z!3G}gAoDD~7M8*g2vJBoA29uE%`YUOYEN)txf;BSCMYHT-HFF$CL$<+o_MZ7F#gnF z#2)^YCCCaSk?BVOM*G$A7_)s@cnUwA^1ucf2 zP|(qWU0Tk-Bym3HiswfhmskFor+wA={)d#y)8!m3#-9HGy&ncT(`j*Q)GS}-ysx_Y zomliLGJjg>Uj}$-xzA<5TuZAdWsM|4+&hFQa%CZ8Z_0bbSJRYYy8PdTf1%uIEEU1^ z_op33$~iYKS+SWN!?5f@#2D~V3Lq1*f@B4KE6;x#8P3b8St}Q@!+Z;D6{}@B9!hk$ z;^2fpJE~P4-&n36O6j_%)&Bsio%_4^U#|NecP1Q5whJEjZePzQ$jdx2{7Vx}t0*gV z#pwwfl4ib$d^r3Z<>}q9%GPPaowaDXwnEgTxB!v>GY8Yn_OG3{ma4V5 zTPqNx7_41)x2S0`bqe_Y%&ArRPjB$JDCv5KpB=yB{!q?|JJX0nn2*Z5J}BIhJCB3t zH|*N@VYBKzjxn3>+Doglbr$x>ba_IEB}$%T2#=|+bK{>5HkcL$rKN5r^<D`7DhaAheqj-WF3v52}9|&J%B$SWMTF({q zd>W|g^tip=UdvnF>XU0`w_9!HQe1LhgEaLRuNKK3cI!7?5uF=%55cSk8DQZB_Z(k| zad4r$t$RXeaD;@U9pY<vi{>V3qC-nhdPvyR08?jrQFn0_WzrC0;lZ$4gnAl5 zQiuz8&5IoP64$b0?f<2trDfet-(p^#1?} z#Ujq9$HCOeGPaaJ-?88Q>ixtOCQ5)GrBN-J($c%d5!MI^N@Nv)c%VR05%{K~X39sL z3q-49%}&A-;onHyfm>F^2UoJp2QFc(EylcCm831U&dCF@KkZZ)uTgRQL1iZpdfl)6 zD|6we^#1jFbSA8$UGuk!)bopVU*>T|NA;}MExr4@dVfkpk|FcYG`=FNgWOD=f?`X; zF*{q<#I1)CunCES#eE3LyZRPQpR2 zta~G@nv2sy3R1Mvy86|$pN*}4&mN+09DCBSIn%7&GsyW>A1jF5XB zTc_d4sLu>o)yc9lbdITa(9H9LVD4gf*?#StM!@kLT0ac>jzRkRRtEn7_;Qtkl@8VR z9Y&IRO)tdLTx{=uLz&%qE6G6jn3%4y(r<^1cc|}MJ`{@_HSr?t$y!geCQR+e(}}Ma z(z4`e?eIH^;21jZFq}bG>TMd7+st@HN6{W-N&3ZkcO1iR zFpJl%E}By>G@_LuVhAId73ey~i%%UV^%`HYoiyFor=gDqRXJ?!GM!N;nm|tb@$FwJ zn%wAtLw%_leRlfRW&xC#+hImMO+;WKPa9FCF)__F2IB(3uU^Um`pVr7G>d|loCyk2 z2_9J7gL1sg`)_ZwHQP?iiBvc+uI@421tCW@ZA zShHoAERdD>*NC=DcW;FS2VEShM?8V{tN#Fo&bzhI{KO6?g{K+8o?f-E7F%_d!5$+^ z{#8NT83b%=Mw?W$-AzhO#Yt0smc2aJpu2mq(d#yTBzifEu=VaF{xf%Q(>hpV5N#!C z-eDyNN9KY(tIz)c5Z@E_x&HtMUS7(%eT=t(sXSvioRHJ+U06(8Y%~*R&dlO*|t4oS>08e8) z*P}AlQO2`aw!-YNFW%QTX$iJ*yN1y-#OqK4a7N@;$n=>WIAqH=vFVz+K|1C=fT8?0 z>e0+1*^;JSX>SeSkfg$Pj3~EvdyG$rDO`#rsnaGPck9ffeRETUJ^!6C?@)ZNQ>{Sln(8)~xd8UbxJ- znr$uC+7+csDsf>c00}#o6YX2{m|mkaaYvTu8>MCamQ_ef{7WZp5;<|FfRE6M(cpLi z>GosGSntm?<*SzoSGss?$u+Gv;yXP9JZ1im_^jtddsa*LQ6T zJAJkc_< zjb}^eZ5~zA2_Xr&Udnm^1!vPylOFXiqFqWyPIF2hytFum6!}lg+XoA4@|jA|vAR~1 zxIbT7;cGR^2VRy~{50#dL)QNQi5wpkv$|^wLa#A5k>RD}e-6^r5v2HOiCW;07GMrSWX*esGFqr?WNtjU*wZx}_x}fC<=A(&qlBqGgw)@CfUZ49t#~fsH+P6_u`54?Aah?=)8U-77&}!r7XJVlI{b_p z3Wg;bu0H<&nXj?q#^CvFHxAXEUNR#bIJ8fSxk~W5)`!q}6-m}YL zk<+n0)aer)s-Qw0NlwwtAs}s4j0HWo6a#X3rndp)G?B@v32xmW6>3+g6gom1am#Z$ zP^9`zGPo&(oxLgzfXaEPxO!T7@Y|{gLFHbQAS`nWHY}|Pv09u)k4_ly#YJZbxVTdxB1^=j9kmhIQ=+eU zn%J3Rm7cp{E-B{O3R!I-)j?8+B0l1)-LUz4hgxtDw$xBTJQ2+zJ?xo|Eiu zZ&_UEC@!$Fg+UNRk5RQS#nZO#_^i6No!`!d5UKCDq}d5J#G`IzeQEZU2mPuI8D@>g zPp|wt*I9`UBfqt7(&2b{#7HJ8iSlmIKke7dHj<)Ak^+wDO-M>mnewPl2h)CP2Z zYRefPou-vFYRZ(0jX6BKQoV%gNA*GaEw(E5I_RX+VR8|~(bGR_cR z8yzLWoeoGNv8t=&1h4O2hpMSOKOZQk9dd}wS-W_(hLNnKY9JWeqY>Y4wS3lVc5EL_ zx>stqOUVmKfZuaW&i$&SFrqyuz=*37+(CgGn)esLpGvK-eoGj3&*pA#oN*~pRB3G@ z2nVqw{{YN)>B0@KuLdn#-aJy0@T~TJdgx-4Y{RxT=);kvI<#@=DgwTE zd~EcZ-=_KI+3Y=}HEVrt9a39N0N~kMcAbyh*RR9W-oHhY2ikPq{{ZdZ^uNUOeLq<| z(Td8xE9CPq^C$yfPd*NMX6?pY%eU5LE3sX&T=5E_AyeiCI69pQjch4og=rAh@L^;x{oI`+xCYD*pgzPC;iYb&>1)CfiM(D8ep+ zn*1ej5Wl>pe)UIB)lXNa&xx&^U46|z(KE>OsXSR!B`f~`lgcVd{{ZHZ5zjug;iVnV ze1al9y{RhSZ)(co>|sPvjrZ?Rt>_7C;dfUEDs6`rk;zI)rd?%i7*HWYkVIEcFHY3q z!yNO2QG7Zf-xm9CbG>{q;rN~|F*ISeM*VDpr|ruH=G4@0ts`&;I=fd;y~1#8zinXU zj$yY}Cw_;8_8!fXsdC(db46V+tnF#}*b_pSocyxi%oPgRGz)W+FnH)~?*#VUMm>OlfwUHz&Z z`m~Y?q}Nwa*YqlFm9Mo#D`&;M<4%%5O2VXaAlI$3_GPhirR6HZZJ)gW7Ox(?4W&(v zOMDfpaVU^PO?iDbX0gr*)wEpF*|VE|{I&rpX=%K4Od+Lss*~#^f%P@YGoA3oarG@O zCDp=Er6kH^b_cw1_N{u|Q_H80HmZdcPSLW!vO&j?mhEkgvlfUSF!rgHcU4eVL*=H)@WjcvZY&X`V((slH&Ml_#P{FV{+P=xwdglIE4rxg9f4| zJO2Pm;ms(`r1mC(Aot$4oi4$f#U8sag(BP(Ay1@8K{EsI71QaCwJ~HR#T|zNz-`+3 zggU1V9N1D%%OyS`Fm#Xz-*~K_QLy*0Oq%*`*a7RihL+bFkdPHBjzCnv;=X~3Ibfxg zdRO`UjPs_cm3=z-l27`GiRiK`kpHF(umvulqCC* zkS4v3kE*q#_mWqUDo@HYWre=g!N~3uRI;TRC)R@mf;(5q@=4E7+@AJsRHI1JVfJ@7 z&4Aj1fPeM&cFL3hBmV$)k@t@E_FJL((M(|Ju*_u*U9@2ry1#<(`u_ka z{{TsYUTdys%BGlQBJ2ODE4H@#gtzby-dR}zMoxS_;(bkC-1D*m82RZEWwa?XEFb)?Q0ZE?fMKXfg-aX1YIh_x|N#oJM2{g<*Y4_6{eI#Ez)5!4Rq3ti!~Q>tl@nA`*qHUsSy;xCJ?npr=W z@my8=C9#OwJe@A0G!!XcgoD2)Z@qK+POdu4xpeYrrmDWbzwU9mZl-y%A)^3^C-S0^8-1!EHUU<{ znpjGwywHHq;8{-p02^gbrImcL2?b&#pFlg)wii!fHwA43>Ip5BtuhEZ5mMuGE=eb{ z7k7$W+_1JBN)Xzd@pL5sL5SP!S2<(mF6;|--V*K@d@Lo@{uCZaG3o^g+cR%Pwp_VQ zo-v796_*%8y3m(UNh(nSJ*39;V=&Sji!$a$?QIhzZUH}*^mofVX!;?aaLo3leRYKzp%@= zQcb0!h`3sATl1;5K`1-_05RjWXPX#O8+|OeQWBy9ZUELqb0hjw)J6%V60C09?m=aH z&yvP1ou43Z4gC()*aIn$L?nnO?_BwoXx{Qe#RzQ#6SBQ24Xr3w;vjYvS~{nj%1D3* z9My&rkRD$@hP9c=%Mh+9rJcKvr3eV?RQKGPsJs6F9ba0UMkTgX>4YS#j&zBl19&y2 z9FaTs!f#A$v!-tO{8G#3tZfvL^6Dfd#hw9;UUC%8>99oOFHNVw5{Pu6^ zbUI#NeTv^Dcv{gVDk63;X?E_i%3Th#;;5z)bw-oxUo@WV?x76YxcE_RB|#!gcBaHn zr9p1MP)wNSmKy}Xl6b4(8)76oV(qHHd9^gCoht+w`d7dI0A{{+w7RgxveoD=yK3OL zw+)}-q$^@lJHZ2QdiC8OyC1%S*~&koPxd+5=scJtm!b5Xo}OYEhYCS;#rR1F!b^uj zmY#gv#dss){{W;oj&r@mFgtX!i(ldGo0N-J1fa+Pw38Z@<{Nj7x30glTHG0RSv2xg zsoPv{v;9voq0;8VF6O=&ExmT*W9G&whFoCyrPYPgD!06~b!6&DN;!6K?GOO z4}cD&la|}TaSO$@XwA?{REE@|(pBGR+Ck%gYJDpjl(iTmzRtd>o}*Kb-{5d-lzmOK z!7wIr$hvyr4%!BFs^x2mOianImfsp|;N3&ZnWG!GV(EtP*O_k%a2U050m7G1nG&S{ zq$)?L-+@>?lvv7_egXNq}`(?1_kR?a*2DJ2@G<6!>c=COl-{`j#-)vhxs$|cGOg}B; z;caJcX<(9ofEi^9b?F?bY6P0|C&f>~)wUa!FLBH|#k+g!5MH=j2>}i_ASjTXfk{2R z=e2!f4^qX{o=px#@XKX?m&sG$@;JJja^`U2xc+?4KKw29FB|D@elOq|fZ#Zd$V&-R zkCs_{PvCKU0Wf^hlN%7tGL7*050m$Hq16-yrEit`&ZAjky!FL zL413wJw%#n*~WT}ni7L`WSf-T-K|9nTW%KvNbZuk^C-ZQHUL1bWDFYQbv;MC$ra`+ zf2nRYNRW$_Av;q}yjFKL&7OBCcG)zy8ask!KDBLv=8QuHW!7!3+-;`^nXs=azM`45*K4 z?>v!mwMt2TA2JCvk2Cc}`^-Z-;+UQK!`B##>%3EdMxwP6cC5D_O5$oUdz_91iP{8D z9M^OBf6NVFcx~7?eZC^foJ*H>*CJBtL4=r*_;=vXnAbz4WB0n4!4aOw>bajZVK}AY zoy&Q7%)4%zP+qqAgK!*h11oHiDF^(dsyE)S`2FLSSx*+Y#ci1_UNl)lPY|aRvL!1_ z@uZ}2*pc2V>YX{y93Q@Rm&nOFYh#%7!zAD5+{(roVQyb>W=~|LBXUo$742LD;GZhu z_$tN4{vwO`g*k6(3oV}eDO!|0}b!Jf<+eQn|{2igsI zMWv=?J)}etUHxufcZUpne!^Avq}%-e07J?3jLr>srg)#Oc|PCa?>J#O%K>35S>3qh zrR9pjlgQFOTQ*>Q?FlYFlam*UoXvC|m96Erg%U*Vi;zx@KH()arEV zd0`q&@Yjo6I{BP@`gN7l;PYlbnD4U%;_h#*S8(dpsY`K1M4wW7*SJ4t#u;mY-!QwG zFXGA7rO~CbfTEBBy=3#i+PU~MW$IbAS>*RnfB0WdLh0h{!6;*1ALxBuvdb@Fxqrg9 zLPMb&Y2cWzo8PoEFdH0~cZMy6F^Mkm4nEpY1U3PME6@@|3i4jd=*l7azJQ?RDJ3g-Jwb+#m& zr(~N&>Q&NKtx0KMDKZAfZ(;h@Qts(j7?ZbXN?X?HbT$UblQB)d21d6e;~1Nm*-tC2k=pQ))z~NQl_| z2K4C8*t2ZiFxAh3)yrX*QrbY212M+KdTrR%#gOc=yQ?d20kxyT3oZbp1wx2}6Z91= zjB^*n9xXL`q!ooI!3Yopo<5W*G)A`)znZvF4q}?s93^U3^rr3b%XcmVKRBT3i~w37 zPhlp8?Tx|Jh_qQk#0Vn0ZV_;s+%nPfwG!iFQoGN8?^*IKh-n>VXqi55GJywRMIq*r zr$H`2jnfrXot3fY2MOns-lyQ?_>LHXrnVFlRzd#&dS%Io+9+HA%9AJ9RYl+b0C2jT zZpIb6t}vooSwTB&V9*19Q(CdD$ezaio_O_>nYQ}?xl?UiyQb#VZg5nNQ{Rw(O8W_w zQ1(B7H*V?~FeAiB2Y>lT74G`3PVEMpBYZF2s{D^5)gvkDA&x7Q(ZD`8dQO~6q<0pN zEz9R_UTqe(`*@0bRD}cjN4rJihd+s2p^J8u>x(-jB4)iq zkUj}BE$#zrm@ymcY$jHfGQ-I(IHGuzjy|0GSG?#wFHfn9)N0#Mw31x6{{S9LnvBZ| zO}eu+@e$EnTWxwoZyw_@Rf@G=jy`%y>`M}WnoLR z65>)fCrI5uM36fJUYGg^Xu6IpxMkgrc9s4OGKgi4WYTMIL+WM)*UZ_1<#l0}SgSap zN`p+^e2vA!r37rGhQUg^@}b3WjNb9EV;ROTO~tMj7A`L_yiEnQDM=+tZM5njxUw{a zCv=WTt=%(0r|J5PnQ_OqQ+!&xwA51F?)_-zTEmz7k7dWx(SJN2HFK6GG0f44;vpt( z?iTu_&gxMo^)=`pgDmHV;TewO47q;Mo12lPwr`43hv$HY6|-(6?vkPcq=H7qxY|7U z_S9b_i+VLEA?Zr0bsX|iKigl!tNc>JHAsY>l0TNF2?mB#N;P{~wyLWEV zyT1$8yLYF((xVjG#TiE&SH;8izn94NU%}T!TFbpC!Of6qD#WbYytr|{#Nk-fH7mA} z015u}=xjTp?A=-^ySK}YI8LUVNL-E}&3vn^bpYK!BENNqS(QObCq3kUz8op>`b<>xLnR;Vt-BUE@f;wr~FcO)J=>dj$nYwRvS}iP|cjwKb`DwVrZD zE&Xbr=V!9%({jVw{5HP$1ZVcAMb$xSivRkyzj)N!!|!8l!sh*= zow7j?OcSuFHWm(FJEaNK2IP|f53LxW@=ZZ<$i25^wT4Z;#FSHJ%g?(K5|)XP+|)5= zbC+?pQFy^&_FPJohey3?o|7ghEUj&PiAgs{v9h)=bC_+K$8x4SYnIBI4qjT=Vkxw8 z&BX$hB?(fs=vOkC1SoIKMa1$GIDTDDWyGDxZyt_O~`7Y{m z!4`_}9ZZ4}Mz6!P6v!e@^~yT6)g*NX8*=j5gj%7*f#9;wgwsR15S>afJ;@~dSFM*( zbC1I(>0h~5Y3V=N%a?6)20xClvXotxkQ!M6V^okoAzw){)d{nGs-`<-r&DSNt?h5NJU=j{5svv;OLrqqZKWm6`-wvSng8fil!-@%qqcW9|n^{-+gz4!2Sop9@J zommWhhp({fA04}OwBnF0-BC)QsUVb`tp+AT?1v)h(` z7mhs(CmMZNvfRH8hal?0$nZ^TSj&o7HS(9Sc0-rb`4+(maU>3;d(0CjQ| zp|Kn%eOsU9-fOqe`Vaa;)Mk{Fn~S!*Y~3yWey+8@> zE8{wcb8P7$B=70;q9bjqois?d%eq~8*0(a5Ak@37bhofh{=%}$k(JIO4ylOss7e}F zBeCX{rbb(#Zh#a`Hxthulo-~;SCiqnJ&h>`wA9xI$cRt`kwytp0%8f?YNA8#Ep6Kn zsaJ^#3Z6w>Gd#ZM7<7=>+|1;~C2MhF?oY@wU($0ZG#8S0IT8W9df)Q;(9hrd0mOJ0ucGF~us~ zbh{70=_VeUD3YM0$@BJC>$E_Q+HJ!XxT z=CrL*8s<}c>C>PoML|A*n(6rt?KfBuV4pinDctru{{VV~mezBzuXm_O(rA>JPSeTP31a4+JY?{{ZE^eLqFhf7UuO!xizVZ1?h)q0H4{oTVA!OS&&>{LGJ3 z`s&|Yuk8aY-do}LYyK_0rHLiy-U3l70zVKNefv#t!_d1--PD|O8pUjFF|2zKcs#W~ zsN33*kQE|EwGunX`q#ASnk;<}2e`|;qMrMCX}zD^m*QrUSksnfukCI4ejI&E-lu#j zVA4C0f#rkC|g(wMTU%+&kt9 zI**w=8u?mO&qQ~hg1iF`%sqR{_IQ~{VMf~EqUti|>Dgs2apa3%{{STK z^hS*i6{pGD8Cq!cMiuefozT)9zOukEi_(CHFK;lLbzC?{bvdU|KJ#3wtetwz{bIlQ zjDHh#_L2S#qEj7zFxL+7tfjx z;_phed3Npx8(B)yc8d9&@=G3}N-uQI@=2pxhUct#wp7D7mD&)Yq@@oi0zD#Xy6M+k zd@aJQV96@v*U|p~)OA|DGWW7=Dlp0mzR$2 zXR#k@_Qk#)wo|DtXe3w4eWw23QOW-RtAE8=&eQ1|)J?_JZ}^`rziJLxb2sL%-d3qg zpS#&M#d~T{LUpXqpr6crYvyyQDOm?<^*uueZ%EN({{Yipo&M&op1V7u-4^ zt8>x3#O_q;E(?k<>z40ZJ{(KUDi(q_l#$=kxV;upTKrwg*K#_OR~Kj4PKI^w6Up}% z4Q9(`@9_7U`Ltrz?WHa$1ZoOW023h3l&X7HkFOnC!t?%IvP%ektPLRF6+VL6E1AWV-@74#=8{1WtQ49h0j7%k3Vd9)O{eQ|WQbr3m9 zTiHIq&3c}%uF29f%6c@E@;j88PL~NJ_TAn64qsB&PXr?jZ+-s&o=+A0TKpo}bmtB^ zpDC*4+!apvZ`#}dr!7=ZlGc?e~_XmmSNR z`lg+Dx;vdCQ!PdhkCYblMH~CqglBvN2>$@R>t&X$u8vQ=ddaZj%gIZnDU}3)x7(WE z)1lvjlWb%Ns=hZVVM&l34uMTT|Tvg?XU?g=0k(HyD_!Ht2Zy7!VVa%LZv zk&6;>Ylas4#E_yAqBMd>(ET^Aj$G3BGt*DT*BzI+ZtM*?IQ>It%c0pb^{&Bv;BCfCI`N_1x6soH{m>-Yxfk zjegWeMT$68M~C`bquqZ7c)7x|)tjdG<(LG#hmrz(=p$QN&cyjykywva(VV(kJ=Kb&@%NCN{4Nru9vgB|Ll7I@DK9#iz%O z?vr0d;ImJUw&BjmVdu+)6TL=R_ph32^1PC^bW);b6L)IM;9oFq*n$EzsUZaS+n=R3 zacqL)s^DWPNaV-(5Xs?)K{nInZ3?_=B+)N^TG-VhvGPgPtFRwtCxk) zKjZ%IK|%NM{{RI2zSZOYru9!8>Q*3|j9%=#meZl8P?Vvjlm1j8ASEN%0ba|fJts=h z&mNLel(KJfZT6?(eEc`f9IP5uk0Vfj58cU$zPfJVmXg~EWk?XBllZC{wg$d6o0GOD zu{?I7kUeV*hE2fT@bM;~#;Hwc?piQ^tz@3mNpMu$Fab4M`eRUviWA^|($QFhi9!^F zsZkotNvEwaE1RbpZ2%Rxrx29)DnODxwIr;>_7j+L<;D?fZ2Q{>hvALWurPl=(y7pQ znv&s~VY)%N+L|ZL2Z6;_(P=&Vmz8YOx>^WF@WIlV_2c`|w{Y#!S}!;j8ib@1xE|FG z&~IYL6lJky(~Y(ft78&RsQ&=5RRHRWVnFZfKtUYS00X3gIUCmNFkPz^%hqp^J{kf9 zdJmxY^`Vh`6xnI)J-k(;irc$&WKykcvb_pc#y9pbe$`oWkQV4lq)CHI=x19Hn^{xf zNjn(&)|Ugg*JO}Pl#-KBdzxdwtNkikS3B@)UDIpOo9C^UI$cJg9;5#Nnp~p>Uxz$d z(1KC|ikIQ<1Q9b$DI`e*$8D;UteNLhvXsWvVS=Maj;~m)Y^0dslOwVd0(1z%zBtk zP-+gDd7r*KZ?O!#Fr1%*+ht@Fme+M|O71)}%22g#fP3kQuR{DabvnZ{WjrF~ZMLUW z&~D*i01C$2q(mL7=^C9Dni@I7O*c8+xj#QD;Uxb6HvLaD^paR|M(w@-0H4Ns&n)G8 ze8SO6t(Wqs2Trudi985Cp0(gl+L6$!OfMY6b48n89o@yCO~PAF%PC%vNbRu$?O!_S zdF7v9EdzF^885!C^+?0hamyR`i;wVp;%VjCT&2VTttW*FX=^UJR;|>sNs97$AmNdx z;P;8zvw6`>&vBFbnV0cfXT`IuUABBvBmp91dRN~riRU~AJ7Gv;55;Y-S8jxrCA~>p zC<7!Y1Kzz3vkda|XywNn?31_XomcK~b=ZCGY;CQsoBIC%$~HYmcGnBZShI9<-N z6C|jD2H$%4Y4H`)HwJbt;Y}_70Gqm74WTF{OHfN>k?SRY+Pgl)X=km|YOufeC0|v) z`6nfh7G|+76kp=#hR?!Ic54Y2w-)VNEPzF`&O@d~(f~2{isqTWDPkExOJ@^cS=}JP zWpk*HPc5*9caEi0j5`f?5Ok%zAs|YWqX1XR zmN{xQOB^|D=y4l1*alKwCdgwCv%Yr|1j>>?M0$Y}$GueMtOpXyS8ca`*iNyn3kFiL zFkt;eeXHmhFiQ@T`*%_1%yyi&J+bf;iyU(THWmvHVipb;mu|sOylZ(&tpU2x%2bdH zc}WmteGbBUpP1iDSiHZpv$FYeznXOfyc9N4RD^;-;x?{7T*ao>`?<+B)Kw+VAEw`p zoIPGy;>&pD+u^$WKcA80uZ`@@fn_e6UcY;G&F*Bz**3Uy4WHsSY_+9NTsWDOl>~$U zck?Lw50w`y3UN?2ny0BwYo%a}<6FwV_Uym?l#LxF$*D!VOJ(|u9lJ-cr|hnrvwgSP zQA3TWDI^`i72@>y9xSn%tUzhXL&;HM>Zr2d&P9bl8;7!gUWa~{ju64>)`h=SL zpOo_L)w2W>t%x!bC-3QAW7-{Oz3s_A_bdMZlOYEw?X(*jg{c< z#R3Yq=DaMEJ%SyyQ!TkKv|U6UfsO06d^k95FJ8K4&746^EGXGspt#GjU?D&dc=zTj zUWH5FF4sbpcJ6MRvu6Ozg6unIg*JrFpO*oJF6N`cNgX4kePhS^VRG_t z$JV*T(!zdsY1_ zsA*mp$5NVc@{)I7Cv^U6@4bU0UD`NrRJzBGbusq8c({hGSWcE~?T{K_q2Edq0#79J zdy`z{M}77lwd1<)Q2w(zaa9E!VQMS4 zxM%q5N{8WS?f3mFHH~st@wFrfGwIreCt?Y}Hr%(2FMM)`l?eBQ?9#gI@=mEu!!URlq=Bbc&k4h1KJ}7YRfMa@ZK~bJS=AhYeGU<}rEjQjZs(Id= zLw*8Kjuum_(i1Kegg=B%+M3_6pVn%GCrKl?F%;OA=q)lLj1B1wA~yA{t_HuJ%8xWr zsZ6WToxeCAl>*?+AxdS!qacX@Cu(esWU3%~3W=4n5e27#9gNk^3cU_K&@sNDNYxjy zWpvqFMDZL{%&UF!7`>~8U@QalJ5ojsUd}Q*Cx{jk0D&AUy*9HTaRZp!f2B}$W4Y%2 zQzRLyJR}g849O8%-vvaKDon=|g-+4OdJr+Yg_dpB;oPK1swFsFB}9^y-Hm|XCeAwPt;G6qfGX#_6A4UEd z{wwf1Wd7sDFuSHN2@!G@9WJYYkc5c_u>SxW{Yt}gt{;w~^3lvW`zD%d-rDV=m(-Bp zamA7RsfZi*DIM#PhuPfvA88|~?oC>fOJ`P-+4xJ7n-x4U_i>NIZQs|&*MGqIBaAH$ zVoxm~1gS)U+Mr1EubuT-MeDM-@!bCaQ@e#fcN_F3VfQ~RaMPo5g#||)>*<%mu71KX ztRmABV>{bmYPMiD@m<3$-8PUQAfeSGPzQx2N|DF}Z|wR8WjzjkH@oj{nvU-Lc(>(n zpVEqTEhtLW+WvVx4S%1qb67)cW`3bt-M)t+>hk9nXoVw?5W_`FQ6dMWdHX428F#Fm zY{zb}D`4&ef?KA~3vS`Gm8niRr8#m$Y^5r9>)Aa&lkGK6#I5@-O{CW z-A3*3d3;h)l%)u`q?`4(Ua!-~KR!|FJ5H88is8cE#@V}7DIhGTZaqCK$R8RV6lTw- z7cPW&xV9a4;`pD5L4|BVKau-Z9+T94{-x;?w=J7~k7EZ-)#a0tnzb%IsQJF~3u_?q z3|9XDr>nSUE??bQS+jQiyXaDio7S`f3?4rY$L|&AdQ5vdl{IyLqdnZ+!pmF|=KlaP zW0#A*yt-oOwpN1D3cN*#@|Yt?j{Tyqy2E7Jvc?sMVWC$kuu7eA)gT2Dt<@ipuHH>< zqf?hAH^Wc#Dsfb(Y;2rb-dMQ?5`dkE{{XqJAG8|Gy3D=#UH<@r{21c}NPo#7wwtO(>%xOxLts+zi z0G~rK_pi9UBkCRre}f^MRYwWLP(O%=m*iRXO1L7b>R4y2>2S$~T%#td)ouD&$Jb)T z-5lASMm)0z@jcW$HxkOJ!?4nYVasz>-TTS@5kfr02_$*A+zR-+*L*!Ve^N0<(9mU4 z*>RwM0?TPD2j5XURroZL!R+oumHb`F*X3V#pQyAG#gbn057}>Tr5Hn)ZSN@ zyC*Do(n^sbhrBr7@~gZ90K_vz>vni;tJjwfY?j$UQjgFI)zfiLRV9WTu}!3nUTFAz z&ly(_`P@qYzP7fFUL%YsBz;V6T+Zg*cJ8STB&9>KsCCYblS2iaNlp*ScCXW77;{G> z?Oc)6b{tX^cdrQj4S*u0;kO93c}j6k1eB5dB|)kNh^m64q!^y`1V-j5h&1!RH7S#+ zKzjDBwv9gYg!n$I{>~nYSPqw5=2Y5+V)u`D3A!i>EVh`Ko(VG~b^^VBb<);sES9Th zT~m-sh$Iqg()E6&ELz8h#CuoKB)@xS&N`+U=hR87q?LZ>%@5ik(+eyf?#nP+2E&(H zntMt>Dq3UAW0M9a*jIy=m@!Y zEuGim3v3CF<6~H|5{XlG0*pbbd$zgTYN-JQd>y^%w3(@yrnfaX zK3clEwQbgJn?mkdBSaG^CrJeH%xzf3Ahzm~p#%~Lj`bnp@;INvPhr;1T->D%Bg9ua zK$(hzN;H$-O_HFK60rag}%pnR35fjRGs?|!Mfe8kpWRl#EbkNoH6(bLLGkD92 zAt_jbXJJUu2eG$nF5)+q4&60k^6eW=rM{FO4I|xLR&v;u-Si;TV)vwG)_sJ|*M!}! z=MA;E(jje){pg*2P7e%fNlD!O>Zx*X!!GD1dEd$s2oYAeQHESG-nBjmqDp`}cRi?p z6U>k$KSuOWaw_Q;wLP3C^d9Alk zum^EVmlUga-m+k&Pdw9QNoGt1FKvX^s>I=o4mrbVd1W`fGS97eP8n|HweA?xO)P&3 z;a2hx;-EsJHayK?a)xSmD`R%|?Y15bs1-J)6v*}<$UVUo>#}Qqqt)Tm!FW!;Q!#xLPy-T>fXAZD$3&Y)W zTC}=dbz`twhjIs`0bavNJuZ?tHJEevIbBAYX}?z6fPm(k3}7o4h@eWim1|VP!6tjHL~a#G*dq z@~@QpJDy9cMiGtf{=05+VbkZ1II^edvGOCYojV;n&i6KLKE=(m%5lbBw@QKv66)LG zLPVCygV>6f@ZWICbHTNJPL}SG;rL96E98L$8RLjG=(W-JJz7$S!`;6AEpf5v@jmQI z(cf{brGm8XCwq5iiCZqx)jkuLWwKV-dvEbcR>1GT276ToUA@9Ed|{_C>tw3Qp)Y*P zVc_8B@J`_I_pO*T`SHqG=F^RA)86PDqUj`gM)ggm`Tqb2j|*C~K-wp2e$w$R>_qy_ zd3`RaVa(h0E^+umyuR_2U;*?IRqiZ$R$ig1_xT)`1fZ!8vxi(h+7^b%Le7+{)YDfs z>$G)EI-M&Ukz6v`5{C@O6z7Un-@R_dk;PIXT;&XLS!*%j*rHlP=Go-C;W{NNgTWq# zzKL}2;_EA-%H8X1!-?P*VWg$YOVi@$5yBoy(;#-#g0E6*=-mgiTc&y`_P2LWYr5g@ z$ETlDo2$p)8eBe1-&%e!a^K1mg!uWR93Ez|97$^|TdHX8vZ5AZGWW zHkys9d9Md1&Y(FHxulL_sC$Sm{ix??iKwlZ6L5zLF96i&3I#CE>OR#T;W}Sfg-B7^ zW6k&XsVDIg@HR%?l%&Xx-)hwdPRNoPRH$vedUN5E;pFuVO=5TK7wuG{8n)C@T#iXR z$J4!iGued+WR`57W(xlR!ILvlR`^G)dV}y~l+%^17jJ^wvh~YagO*oITZkvsCO|&b z^XslXBE0EFYkLm4LXzM3jV)<{<7b6N{^OoOuSKlXW9xbhlbw6WTU#XQI%=0brw>D{ zj#u3lx#Q*F=L~t)l!3W1UjF!M=ym>I$#`Bm#gpD8`UB2gr4ykurL+pTt@z|o&KV}ZoD@Xex<*f0u?(E+At6TH;~t`5)*1bhOOhSiNeM7u@lgD07)kl9q|h}xJzm1*Qu ziX^uzZSm{7J4IVEq@gMis3d9vWQpb~uJyIEbfD@=Tqa07?^5}W3WT7awLN0$t?tlL zuMD3quSul&EG@AccWlkO<;0H}5S2BzmPq5b(wM)tOK4iZjG;Tsq zW>l&5JmS`~Dq4z_8*Y86wI~^YDLzb_gtV6eMv_S}6{5?TM&}VKYUQ7nLIGM`c!Y21 zyid}kT?UcUnZk136_Rc2k(l01+plW6W!Lnxr?emwBv&cBwpE58^D9tUO1~0#P&h=8??uiCSwD@Hkv-t)TwpKjt)<_N!3C@9jxg=eVhe=p80@+YrBZ2fViz z349f_BXFQMkF|GK@Eie*FAo_x7_aZASW+#h7h+<>9$xNA`GQKfJf+ScBQ#s z$Ch8pAimWiy3snyVNt)VRkMt?i(N{6D%A!3nkZjb*D*3`GLL`j zUME#6$mrC#4Jtmuq}e>uZW=G8N^4h{Ai*QOSEtF_A(Os!wr*CdV5GE6q$`jr_b6r~ zhi1Gk`Naf=t{YmEp|k}9zqNb*o7CPp!X7OdXO8ziz;y58OB2W$cEyKn)NO8AO6^;5 zNpXS**-byGC@4IEszmMw6^QC?W53TCnC6UeR@N3Qx8W}oee^qTZit^El62~i!<{h;(*u{DN0m!kSm4{qkN%Kc=qs4N} z#h)#aU|0?}cW^<0ZK*A#U6iFOb&=bFRb|)1`glBF3a!_x^)Bt-bD1f^qbHwQ0eVKn z2(KKaZL;bCUaCRdf4x^ZSjiS{tiIDnQ;ll}!`A?scNu86ezD;OXMG`BzgnrW_#l&~ zdQdam&u!}Hu@A7K6bx_mtJ@b|yV8c+D<}NB*Qx0p^352-lAMWFfNnxGPI!W zBpT0LBx^fYq3c*O;c7XRKbfBsPlMa%@mn>wlcDLP{{Zfn=@X&RAmFDT=Pa9Vg1k_CM&0ob2}*xcRtF;DH#Se* z+qAbEVH(^@geVX1US1j*?F zTeue5iWWF2JBkZ%xT2+blzY=d3z&gR22b~`F%b2rmlHG1ePH-D$n9U`T(^I2OD?p* zOp~Khiirn*t$i1wW&WQ*sLAwSjhvpNCk;H>^gVrdlnOA{TY02~CA~m}Km-}DmA|x6 zVCU-=)w-Lq2~iwQwHO|Qek$IJpWl1`07VIYhm7esWeoQJ0Gp%7mMAN{X(^d2AJ)Ff z{2kjh?kQXFde+A% zi%TaMdfXJP04XRW1rh6C8h>c!EN=SUd1@dxX38znl$invBuM(#Goa@8&sRIyLH=zc zk)qN|PnHpyr~d#b@;Vt^!n7eJNn=h)wr5@_umdgd# z5|n~Ui~uR%#_~-;c^hY~z8?My@ALK?)-#MZa^4)Y>u568r8p<_9`(}m*TBVt%_(_e z;pVSe8k1*;X->G`%I3m-0Uvt%hL8O}rKO^r6szsO_b2jSFHa|%)$6gtFT1_}08i(W zr2H^-LjM4#_Lxo0$-Gi6NAC9&-|R;~DQC zX3f@|{qKmnr`xo+R6d|&mlg@~PhewY`-<{*GnSsg?i9N0Ul!D2mM8HpPLgSe+#WwV z=shKQF5O?)um1owu(ZdhpZBh8_lqWpIK8jST)Kjim{!wS`_TZH`ukM~l!{A&k`9;z zcBuAmA&ao51gE~$G*tO57V-%BTRTwmiy~bpm3;+5%nsc>a+fZf4Z0E=DTw?cDtow* z;zfINv{IKKp2ncd3rEex^_m@1h1S?eK-x6=3W8o)DkW2|neS2h35iNn;($mhK7do| z!|s`PLYQ$b2r;D1E&#H_FicMU#Rfq_+uZ9qOcOuWubau(v%x{zq#&8$MDk?Qw1c&> z6ZsnT7b!q=J`@UyplnspM)+$}3|WHhrwb zV)l*LVlS}6sc|i z#?+n~OHvo@w|aq$wzT|{>q46@H>8D#GM&GqR1#@!Q=Ul9ePP5Y?-R0wR#@#s%_OaK7ffkFd1?)MIu zo&9Kmk<8Vrfq+OJ)Rl8T)}(;5%XpKRMm1}6($t3=SSeCfq=WUZQ?T8w-dw!IF&sVS z6>z{dNxNH39aH8~hm@>(6o{`=(A4u~SRo{@)Tbiy%m}{2+P612UD6YOY(jilSCenX zR%IeRCQi{@do*I}#_`*$#~)MbTEE0sDuEOFRCRe&V&Ua5irlPA#UJfUUCB_~)(Gll z7`UcRhRcM+kwlL(i4mws*mtTWF5o5NjHQdc31r*s4w9`^6H)aBgvKqm4%_WdwzD9E zT|60FSr(45)9$=yE}mfG*8-uc><{hB)zN*3WL$OXU4b`6`^H!d7=~wDb!D%s5+)KVxHr5XeYQA8wY? z7wUKBzHs$ZAzk$MHeTU3A`2_>sBol^3P}2b4R!U|A5!UVa&5~V_T9Fxd;C$y&}aA1 zSr@Bcx;<6Q;M^txYRwP@6|Ex{?T zo_kM*Q-+%+HNRp{_GYvumpcw*Ci=t51&M-9&dGC`!EC zb6+Mh`xeU1mMvW&F54TF1))mP6g3Tr?e(utuq<68MI4UmTd%D$8a~9X3ukZhF7sve z`#8hM)uAMWq#y_h9Bw(TtCV_V>-IJ{+j#qH!yUCNeNTee4uEBy`9Az_UU#bMecrxV zBDTLDk-iGyO!Iy!--C%K{SLI$KP^%=D%+k0XxVlZlY@jlR$^;c8elM^6 z_o(K37_78O?#0@M%gy-3ULK*VPch!4UmJBgpOy*&4D%fA6YWpXdr=xr@F~RZIO4TK zawMA({{Rr)t<$JX*VtcyTw>1+Zw<43wLOB}+cc|po?f8K-Wp1iw*Z}7*U@@jKY7u0 ziG8iB`SUR9p&XELmmlEvhfuRlU&@(c>h}F@EFrQ`z#yr^*a2S|el>AaW+&H(zLX~s zUDl-~3e+2IK$N0J(g05sy^zx8dTmyDaoX4UIlk`$&hlaKl7D+&r|x-IFS^rM-ICv* z1urD7Inz7W)?bD`q${QDSY2MYw^((JAu5oE+5l*MwE$!g1o|C~b-HE<>v~S3O1YC? zr}OT!p`BX&KE4jiojx$y#xlM0xC#awhW`MD<<;EENeA$NJptUB`AhL@j5UsCt9yW@ zmsZ&@@IE00QWUx1sFGvQir3RR3h5m`RPt{oslURP=lU39?BtcCD96 z@DrG`&Jkb}tHyl@1L~kZy>dDhC6lOOi{rT+T$kGD`|s0EjNy5AD_JJpF575n1U3wK zdjS=k>ULIP=G;oiZ2@|Ql<70;G-2v_H9bOECC#5c)!=ZgRNnG-e6;G;e#Uw?*Box+ zEn=5AYpvZ9S8U-*rE zaWLCgm@R}X-n5Yfo(Md}dC^m~eEX_u!UIl)-8TRGIasQn9Hj<~bE%7HIAB z0~Yq+H)hMOm?ynI5%f!d)W zQ70`ixZBi$O%i=O)Cq|u355OqDX80n9`uKHX7Oy#is83D1-;LL+IC4w6RJM3HJ`;X zC$TlD>xUe5<(*1#Yt%`rQ`qL@l})0(0I6D13Hl12-XnQsY!KP-k*Jcd3`sv&ntnkh z(1qg{&Yv~g#Ciporo2_SpjNdkj_NXL8Kr(r23Nf{Sf#6?2n!QFoL6Q`VCjPcnF6by zg549RBzd5Kc;2Mj;tkt1p;M}7Z%VnH5#-{`nbc3#D1P^2R02TyQbQ_SP;uuJ0D@+d zxZG6Jp$9NGq?7a?TA0H#TZMI_H@%av{HuA5-C`I8g3Fe8ed7FPt(18!rBkQvR^y*! zl)VSyy-dC#m~XKWq1%Ni2Y(GF6Zs9Q2Vf0ZJd&Ha5a0nqcHi2UApPnoj4$s>Y!c#R zYLmzIs}r;cn~S&M-GSiv9$C|?RQuEkfmKzyd+&DkwoH6;s<-o$!W*)?4oO^-(En zrGNy=yZcmDExu;tG=&98ja|OA@!ZeeWKlY6WM8p@TC;GLRFiO}f94WW0rshRmm#@? z*{bPgXA~qQVrT1LWPToU?jN0U-dV-0 zt=Pj~P9D=vrLaecq>sj_BuV>lE8l1{O9x5GIJZh$uT<0L@Hm}S`GcPz0%d)$&{8%LsDEsxG>w62cr|wIC!!q$fx}rB9*i=c&``am$X^ zUy6UR!|5@WD}#QI^F}w}d#pHLOS4Od8nu1wKIkPS>nB5Z3@9Hfji`boZXoPIHSYWm zuQ?Xm4!L?_Lkr7^xxc%-mY>FP1xoxg${B7>fT0peQlo8!c@GS6FJp{2 z>PnJVI!Av`*0Fm-C5>Ux%1N~C*9(NAy=(PszecCLrN@MNR>!1P7`7p9yl)tH1;NW& z&HHvLxl2mWNJ$AZ8lX?1tOD^PXJ9OjBIVV%aF)=@NKY|7zhPb*QE}EvGLFgfeomBr z&78MB*<0CWYqVQBmzhxu3P#`(Hy>j)S!;zmc7mW1gmzNQ1734g1(Q)e&I=>59J#>X zwrIElT}b4%WAEMH63*(PS1D7XMaEpT#c+GPLfHwnytaicgnj~!l36lZq^oaMlYT!QOn6~W-Ni0#{yQAy z3L$bi`qymf&%}Oa$@zEp34IsXEbA6`XbvF?{{S)x-30oiitwJ#YoVsh=lFS%e zc#AqpLEC8+@;JMhg*ljm3MRCN}4PcGT4>UYOeg;5&>1dq@ASIYMy zPkQh52A@mO{M4W3Xz1A9JWYQ*i351#*JSu&z#YZ9kB2^olWdE3+bVs}!h=3ieTe{l z>H9N}-gO**D}REsy)F;FohrqVkL27v+lA`74FozhZK!Sc`qm@jD>Y!5BL}vA;bF_? zSEZX|Zl#FapFllLd5tcgEV{q+_?I$k?*9P6z|DsiZ8E35rT5wKBd=M37`Ia~tJSQz z92JqhjfAKJN1?b23GnFG?kv)6Sn!zY8xQeT2d--8=Z?`LNCdbhT@yJ1%>IJR1F z7X`5ibwORiy+>hN-nC`iqhp_0Zz^IgVs?scF1T@4yeFD-`I5fJe@glOvry$cP=$82 zzpDA22qnFo=c+m15yUdZ-WtW;n<1n)%LJvh07PxxxGJ~jc&-;ySfe!zTrWPP;@ew= zupCpiw+>po+s!Dp>t|9_IR?07#b4q#Sc|30hunQ$t5GpfSL;x!0W(TUw3z~;1MMh! z(%l-GBa_VrcB)8V=6uCs${FL z9|}rNm1Ev;O? zbTY^VYTy+CKS}RaE)I5BzWYQMOP21s(i~7qPZLp8>Xr_t6n%-Bl^T+yTH)AZml!+u zqf(I5p|ubR0)0(4$sUx9Iipf1*|<=kMD5;dw_vy5JA_*}l_fgR0*U5o6X2^#>nlf{ z4$9kM6&2wN-_or*qjY5NK*b>QO9y@^5J#Fp*;Od%4PwQG-Jc+%ywh%(ZAFsap~pD|2#sC~HGK8@fxF^oql zCk^lx?b1>dm6U*y>!|jxJbY60?%MOF*SJZvN6*_i<1ps}M&&8>kt6Oa-t^s5%dB{0 z_HOIs&ljW5Ddouz`Q04?NYDI_VIn#)R&>4w6MDU`oP2)c(NP;-wb(zXMHoY#dU1OgWyq?k041V}SA<7WpMxcVAA4=(l9 z+NRj5T1k)qsKiOCnxTO{Qa0mwsn~_%7eOJ5V9XL{Zap>vh^t^r%b9BXGG8}oVQ#nH zaavN8B$7|iS8QY8v#C$v=(pI&-{GM zIrTBa%U^!SBF1vP{!+#jX^2~`huL#Vkg!2Yf!q*yKGpS?;3GcT+GU$3@nu__HB7dI zIHh^*mIjlkc1bDZ`qxu0PRXU|`ppyGUkgon^!u9qN~I|3F*@CUhIT=H3&3(x`{(Oqy@noFxVp}AY{{THUJa!!@RHioI)$NWab$F(l3)MRUOjbUV zo>0{G!S2o3672>zX1gU6I^qTeh9`)i#*`HViRL{`b*uclZni81y9h&QXbnewN7kpK%MRSG zOLn&WMJ2&--bcQ{ZLMzZ7-@EQ&8Q_nO!gp-#<-Sf!$uX3-P(B-fdOaNF3||Rb~>bl)YH?0%0bpmVD>b1Ca6UMPB z;G!^U?E5M3I_2h4$hP>aPK%rmX6|&XLQ00DD^IKuzx!9OaUP}R+gv?Q8>Zh@lclDH zrKraM3gvrGrJk>s{56%@O+^Cq+LUIHe&1{=3KWaKvJ4= zMvzaC0qmc?_4ED03cYKm*YK?_lShGghwjU|bX;K5{$Bq8xRK9l?!O6rNy9pS)Rq^H zTPE)Wy-&;CwJ@N9LDrMmNgybFE1m50+Sf)Al{qGp^legqiP6ZLj?RyR87?XugL=3>V&3?br$OIPloxZ;NiVWGN- z;#6Qv?_Iu=q|c+*LN6Nkw@xnmuj|EezoF(QmRNGEvW>g`KbFVIKB8t8vHZ<@b#9#u zEoVYzbf>VM^^Qac?Iy8j*X40`tn_+y@Fv$g{wDtbr#aOaF=>T9t5*`S{8Sj! z+{qK!LwGf)b2s3awl=q4`KKjhc+UV%Fp_i) zdWrWwpGxQRv522~!LG>+nJx;pB@`DU>qb56l*tGudTnN_0UxC(ZYcnyFG{4$9%=NQ z=b8}-Ey%-VdQ;7vj@0}T@DzZeIixJa`_xzo9M?hV&B=3HGwaU$fAdMJLtL9R`Ai-C z`%o$5nK9a{CM8XYF|Y!fpI~?Or1k=@F3|`7hnst%NXA zwXOjG6B~N(&!t%&44LoiqJut_#s?m$5WkH+yd4 z%29CC2>$>u;*GUP8;@P+GiHs^A*Z}F7YbG3r0%#dE30(t5c$j;p(;v}+Tb0#)MU0Z zVT7TTOVr|O0Iquqiu@JxAJ(jANI{Y~njFwEXn{M@yTAu}1RvU)R>z&{ND(f|$;*-y zl$8nQCM#KCZrYgA^~#i>U^E8Rw-0n0k_L!b*DR+7QxCO18^{VNkHSr5#{B-ZJyaAj zd^|BnaDKB-t(MbjhZ68pgznsNSvVv|+zEU;ez>TVf{CgE20t5|9BleUwwpKkT(dLE%**W+^gFK6_7 zGOV#vgG~Ev(5CR*`Gl$Qd1|wy5|$i=5Ju#ukSiDQgMwvzy_2nNZNq06xp*NCY9(k9 zyaDvDMW)ND$Je2z#+s=s`hSDO$3q-b_pV#1QcLUp50rltIS&fU7}cfL5??L7sV=VI zjY?Qb6iFSUSsw9Rj|j(|Mdg!jgqB-UQ?PyJqd(3T-Lz9STq?0X?EWD)bIX_#DG= z3=J-0IO^HISb)u?zl@Y0b!s1_bow_-)AmnUtH<4Llx~;J-7<{%WeDxy;~jGNYsR`q zbX{5%afYo>-ONBca7SYutBS1=v9C4l7fZ*Y%^ccq`g2ykUaRgc(`NV4-;puLXr-WP zAVqmRak(UGK7@P#^p48^00O$qi?>6!ZL7m=#UJqY+>diL^cO62^7*zAcZZ|FTtb`* zf}vkY>pHk;VGTR`F^pH@ll@uXy1cSy)GQeHX&w>%qx~Rn2xiMQ8y}Utb@OQZhyW$i z8j`dAt%#pMJu8uXJA6-I`8y}w<;=r{zi^~BQ)!6VJW%r@WTiF*xlUnui{{TzSWP_5F zr*+!fNk1*O_a)(dOFCm?ZR#>(|lM{inYXFODaZ$l@NlhjKN-K7n*r_dC%Aw-#gK|X|nE3&&@f=$PsKOz75rgJT=lh!$xlM=8p-tP}E=o}ROJP8EQ3XHytI%2dIo{xTcJnD- z<(xCba^<%MCKIaVy(38pSNTt;t#>d&IaFgOURUB(Z8MZ-XRa{(2j(uGec)1*G^f(9 zO_G`94{f5n@pSavx}?Dxj754brKy6)j~+f3>Q@NUZH=zrsBgV8rAUw~&F9oSn-?S` zDkHF^1woNnVJ98NEIT05n^^=I+*ZtapK>Edsy-WjE7jACDOd(Li>L6H3P+1(_lEKk z43zKXQg=HjYMOo!9E);%n33{Cv__*Nh}nV;F}ZTY_K+%7tExiMq$q+8#CESeq{!iwNpfgv(Y3&{ z);EPDEsMv{p~8a5Kcz*?+3y+0(tdXF$7De&StR}I>-qhl*F!_wd$m{QzNQa#8OoWC zal%gDS*DbEfxUcZK3?fIbP@w@7R-&llz%X?OelbT>kE^;hBmdSM9C!gG@d`TQ77E& zk`KIgp&LNjs{t$A4#t~S;-L8f27-C0zCZ+T#VHCSZ`OeXOq1Se)}Z@S4*+yRs5XG> zp&ZR16j}h3l!Tr{n$cuSvu}xn%t`+MrA6>Gbnu{k{*;MPRP9ynSi(|?;E1M_l0=Y4 z_oqT5-K3jk6qr!lA3`fBb&lNTJVN%>yQi$}ULjWug@|!tJkS6fiK#`=T%wyzmCxCy z2)t=G4gT?AV1$Jd6rX*$s92B5_{uG_x1bOOO1z1*ofYJ#lq4ZMQJakj-_1NyAuZXw z$vD-m&KkRQuv;yi$Qpuy{c7JMp*A_5`G&!6+0m#YuvgNFMefTRNh6h$DF=c*YBR=M zGxVtdkR*CgAPAshk+~w4k*Crq5M!D`fc4&_1^!rN+(j?OwVd@ z-y6ehxvxZdHE|x)3_(#@^C+v*YVQuqu3cMr?l>DkFcZp;+PCR2Jw&@v2|C=lz3G-J z-Wo5MX;%zH$V?x~vWzI(+@(3x=9!*KjU z$rfz3%CQUyNm5DJLee-hu?0V!Z|=HRpD`RJ_c7z9+SMUC{{VSnkExSv*pf_`=6Bff z74_Vj-k+z*@8=~cN|LSRy*}2w^Iv}_pVdnqo__Xm-^Z`d(IlM&7lax#~-()B}l1PTn27jYGK9 zcLV8MNOd*tBL%Zh!KuS@tb89}t>BW32%y@aju{YRKNGUv5n*OqVQ=-mU7Wn4B`6vGX`5#TkJvL{8ZuTmG)9QVx zOn?vGyp}Jvk4k+h{hJP5V)=ghz&e1^E)Y-(fKrJNU{2#<`PbDfzh=8UISrHn2>@52 z_PZi^F~|P^Oke*16nX4e+`5aJTqDN6w4W{9W}cnfVV3MT>#Q&56kA9!5|BRnqP{X* zt;-9?5)PFDLEn1q=+a#W21VjhzrL&VG-<75ns531V%oh6N%34D9%Fiidi!fWO~&k7~}wJ!Nt7 zw@tVrP@t{r+17ne$$eMK*+UPt%Gd8_My<`2+t!JczDCWd0Um8pGa@#v`fQmLTE{B& z`VnbevbPJf>D7h-nwiYFmM@0p8#a_M#y(UQmhcBs9#WvBOmXjCP{*+qVmHn>rwfKp zo7T5#wG*B$)|YP8`-v|lVDJ4X06DG&mJ@KCP248!53;Q)PrO%twd+Prz3I?y`P^;1 z;M1U?#fIOuD4+8fT>k*fO?0&Ru$K2!*S^wZPfX=zStn&Z!oisDOcS{O0BZ3%nW;|ADFS!fo@r=a zgERH2G0(N8GGjQ3nnVRaG|TrTWcRN2ZlO8hSli&OMJHrspK2|(^sh51TPzY{cHV@K zNUE&>MnD@;PSSX)*uo@6-<1G%-0W%%(84Bmq$o{AfP+SZ29f}X-iI`(0p6C<^!B8H zHxv)njkilnO4G=uA=lq&#i40Q1PC+Uq+oYG4kXfvi9FCVuQ2*tZ7WIGiGfa)g>XOy zt0oah)gmXDjp{noK#*kn&;nH}Nd$I?u4i{>;~9xfpp+FkEe8or9cZ#aSQDDv=X#2LVg}f9zst8Pj9l<88lJqjSa!9Sju%{ahxZR?dWyESh zE7c>psz(*ALvA>#OKWpqm3&+}*)Fz9O3tE2+g0`(ex`E`rP9=VH%K~xSwaU1c?woqg<66>$xHXpl z02Z0vJ8@m>7i;8k5s2ZJcS^Bvc*(kCpt^+-ASj_wlRp0dYUpW~d+bWv33`;S=4(qu z3$|2Ii?j;R_*#^-xihS)e57+V&K^VAn;W~uFJ5x=xZx^!r^$ zM*_IzfVCi8H>^n1Bp&tG9J0Q?uw&(ITeY_-f#C?BsjpAb^$QZ7H5-(;euX(A-5R@m zi*aP$6y?SyyQ@dg7PK~_4ez>5b1tuCi);@zUAu;~;KCkUu;P+HCI+GT&1lP$E~gZr zmDca&TM$V_*w0V;t(rP-dkv{(tJ5M#CM*= zW><3RlqS8GK;Qc_89dGM7rDKa4MG(h=; z{#EjA<0g)Q+I|#s3bOwIR&d8f!+b z-wUzFGTM#x+nxh&w)zr*M8fT<<`owlO~b58dF(ycxD*w7o00IMS^0oL3p6l%CC5O@36OCF`h6=G;pb>gPiq0cd9M*R&S*P= zL`_3eNjCti!WH z8)HMNC{lI=Ns(3!=F45C;Evyf)LLV**AK>+ztU53+Ed@eS`dH!N)F_*7dQthmtbuqG?x*wrKHn-Nu5Ynz#LfmiY zxS0FY;@n-LPjyV9yv#S(mg3n@6k7v63u8(r=qpo_0~gi~GVZStvnc@WT46USi)3}o zg@-Y4%giZ+7e5$Uj1lZACs%E-+-}*tJ%(1%U@2gvg&kmb_N|T%S$i25vb1^O=F3hg z3fQE?Qhxh-*EUL>6F>t>fg4wQ%Q&IKuuD5zyN2JjQWCvrUdT}Z#Mf`6*S}V*u6rY* zF>hsefZKlV#Zicah#Pv=pCsc6Yag;^=oQ*Ju$K^?;MWgFs-6b>A3GN`pC_a8 zU&CX4OwQK0CRfEdPHfmQg13f>eh^75ZheTNj%(8|0`ZUYJ= zgU7vYhN0!iu}xHxvbLIy_&7gOaWzrflTRMt#tKVt+);t}>akK4} zubE_bTbCJY6;=(4+g+rncxwcav5NZL@WXv?nesb%t1sgCjva7@3s;{Y>u&|T6CkOX z3rIfT{cGr*A5@n}&55NXq^&!qp4_fCt=`8gs9MKqU-Rz$O{RFyxC>bt;r!i=URz=; zTdTyq#GC;ubFvs<09Jh`ZYFrIk{xKxZ06kKb#ZKu3e76fZh~Z`1C3s!@_os!yp~-b zN7SiBEOKc^xO?8-wdMN1k%L65C%cNJ&#&flb0Cr2QG*BASIMrVdP8B;uAyR`ILubq zwi5c8xMe|GaDJnM^gCCx(fdQKvlbZ0$Fh}!_={po_O7ngD^x_O3ET3D`kzD1rPkqw z9acwPez<&1WBpr8Hg^j}t`}`0+Q!%vGRQr^?tRU9 z{^?|_l^Hchw7RS^gf!Z3`f&B-x66MvPf3g2rr#`zRCoh=3Lg7U&iZ;20f@R8+3XwMxXycB2GsJo-_7q(w518PuXclM-u0w{0+syL&Ni z+v^KYinWQE>?+(@ecaEQLJcl7y@c3EN1X1zu(VDa^AsDEhz#|8yaov1tkvwxNO0o1lwB|EnHX|CzD5EXl_|_fIPG? z9>T4Xr&d;(N(_*D(aR5BJVJal%!HFMKo{1yQf}F7sjGGpNBEAuluzbqZ{QYeMBgx? zM8hPx{S#KL*1{{UFvO!~)LtIG3X@TnhN>j9w|FFfTB~7;wnfE?6sDH_x>g{NB_^Y_ zX5dzcratYE;=S40+kloAn7tB3zY@&vg4wJZ4AAPFbtl4Cw-l5iAKQ^MJlAtu1 zpDxua*rIT~(6wV$_bjy1(*4VAeiXTJDIZ`c&LS=ruNu{-S|(D3Orz*QnoZe*B&8ll zRdH;9l{aVS8>G7FT1U`rQP!s}UM@PKwW#iDCMizL!B(Ni8%0B2>fWD&(S=dJ55r)R4~Ul5woVmK(gc zMhkB9cZ}%ytA@3yBb`W-vG=6)7b4>MF9Wm1u`6dR)rg=uY%T~&ok{*=j&%FiYB7c> zImz!LnLDI;%NBJP7tbxQ0!i2>iiroG(zv-Ab8NK=%iJAC z9=B~t3nD+1s1Pe|hfysyWs(k>6r!Z5o{7u3(=T+_8?wx8VAx(Wf?Tra{1x5OP@Tbz zVWsMk>0V~)u5oKNW_#<~X4++!oYWg(I$J>Ol#fAO9Zs$1ypwzJOMvOF+J3Ya4FC3Mp%VilL?`ClPcNcRQyYU=Ur2|S&c>e&c zR>YCCSC`E`{EkKGQlUY7Rgh5w%pn1MwOWJ?bQ=DEIuRa5ty`H0&hM8$<&@1}0*F+G2nQ zJ*w{0EurizUcGXb!Bi!vl^WBhgmO(rZjhOKj`Ys+3d>F7ielxQJ>^3$KFLZQJ;GHG zNcOBkK~X-!YFdb6gsT*-e&Sn$zZ*~|?^y{13=c{Ingds9kgivOHHtp13_JJ|2bhmv zde7fs>auWyI(P(%txnw%@I{I56q6iPqyq zA1Kr3N3dqHMhkmsm=TKOS4GCI?9|$|+9f6v<~tBXf7q^U$BxR9^Fd)rG8B6#a$RLT(yf=~>>8Ax7!DduLi`Y_5H31(nLJgM}sm8_)yo zVk%O^5|})Sj^qCT@lH6hR7shj3rwqny_xZbtkU^pEbgyL?>I+AZ7r=^ZR@w+2|A}? zTCnP6r|#`vX*KwRR%k8yQ-n1dt<>-Q$|kHD>CO_++YM;_Q#Fdo4=*WU_Mib|!Uv#0 ztS3`?e`|4uBIeG`w7!)>v?2NET`AIopjj^siPO?*Xa@T(VB{{RnqyGK9t?-Qs00OmIQ;*D0go)iMyU|cc( z0H~ij5B}uTks0HR_GR7)jo_CBD856s%b3(W$^AF2{e~BVEtETMznN`j5>lxjc&g>x zwfu)M>F;#h_sY}bU%t7||?2i+!q^@q-#O1sR!Foi$z z&5aG0+}5y;$sK_96{<5)UkIAL%t7DMibNh}sN`Y#Oi&6S?IN0VF~a-0H0wHjDJRSc zH8&>6iRbCX0CyCuWu3k^ac^R6lJe5oGo&8%0e1^@lC`Nuc_yt>X;6fdBWf*Mj`L7$ zy~Hj=e`;~3bdkLKR=hbJC15}Eswo3fqtFVD;^sC#opiN2sb-2zkx4ED6EQ=LyH_6f zCIGlS=9C?d^?WBn2Z=uBlBIBey%Wpb$OWs~DJoy!TOB1`h1j3QudK!me z1J^%ZdQ}c(%uM38&9cj2X)~%Kt5Bvp zGrSHrp*zJ}bRdr&!iTLp8%BpOW48EpqxSa+SWAXN+Aw~Gs&PxiUf(+M6QL?QCabTC z$=dCrB*gy!dIw^6=B8EvV~y!eyr!H=$0LAfv6eVRqH!zLYciCAvITTJxR$PP_ijjW z7VW3Zkd)~IwCz*H*({Zlfu~DigQ!_X;|FIC#lA^4*nTF0<+_ltq^u5mm_Ej_1WBti z(U<@q(y_1;vG$`X+K>W7nA_f-ZQ_*eKnnS#9j1*h>JU#RfC9)p z_om8(iU1@$5`9EdC4Y#|CV&a04Z+@Migb!Y2AJSQB$7ZB0jJ29f4j3Ci-5!|175?z zl$Tg-ai|av)`!9ZTek{ARRBQjDjpwkb#&U+xrs0%wM1l0V^C=>0%ZyZnk&0h-dMPW z4T@%y;0#ji&>dF#fb|ho_qbyZZsHQKJ1A{b5;C~XM`83SZ0V9GK^s;z>=NS(be2~2 zn$P(R1OD|m$S8wz{6cjp}{v zhy;Ti(ItCFb5QeO0}^{s2AW_RR6C8RwM_cZ*a9SadeA%rP$Y!&$NvBneAGY#nC5^! z)BrVa2855dy)D37V5wjMzXB?K?h}1$Y?oeX#57L|9DPS>*M}BNv6o`HBHBf18*#M* zu-{==_+)`Qli1ac6NWvCI=0zbQ>1D-j0&;}Q{7?sSJv}G@raMsPO#l}F$UM-~B7h~~x9h`h((*jS zc03=gZk3N<7nphy6z!9QLyaf!lk9yfHctCefjG6pGdY7E7mPDyZndh-iO>{#pXpQ* zNcTRKYP#Hu1Rng+=p``*eW>J!v2L|)5=_&G!`@#FkxO747)#{-3Tf6-z#7O`(9i>A z#2{>fN4caMh&v!q0t@OrfS^fG+|V(jG_sH3rCzlV2^$)DNz{;JQxKG_Ct^0BVt1fq z%su}Am%3rW{Hh1_uVZAJ)ZXBBj)NqiQ1}sbb#T)z1gT*qTmw;?aH8>ON{C9)BTYn* z!xk!j+TkuNmp71APGRunsz-RzX#tnLwQZ}1P*vtikC%#oQWT{SkVzf4HJR*Kh~m;o zUzqnPD%zpm;SFChu*8J3LR3cNRT%NCaYe3O&6LNr z0Ilm{DF&nKLTR835`ChGo#}vjj0zw~KJ);n{LL9jL`p~pi4+ViM2M9@<`A?~! zHxvLs#L>(T_Miii1}QsG1C2PQmX)PYp%7xaZQoh#uevyLTiIs8c%i@f&-_GB{82`j zEgiQ^@6OdY&T2iXR7x!^+BtbM0CPl4)oh4qF+5b8OV=#i4mPbOe#V8f1EXQz5!veo z%b&R{afLBtmX^YFpleHO5Tpa>eJhzQ#Wu>DF)F9Ms#OO3NI-knSn49xl1;dq7cv9wB5qWX|jHWD@* z)J#_`S>f5-SfHiLU2qJ*Q1#xemN|F0t^}Ikk(}^bJTChPalZ*c-c&HTOBTuh0hJooxg0OZ7P z??N})fB_OXq@Df#)Skc`PuhVSPaf495Cj3l(U^`XvDgBCDmb7(BYom1w&2i!Ipb;| zJMFbTKu|#@cQk)4wZtJr{V2Ly0P1k(*TYIQ>Tr95${>51Er93lXGh{vQ|rAS?wC&Q zq|}mZ1pJ#I#r5gA>W-CXFouWbiu*VpJ%l2~N^y)YD)joy8%hEChuE8+WREfexs9 z)@Rqm&12 zaS3^Xli${>uC)eyH3CXZf;-d(Sn3`U0zgVY;0UUB0c#XdPYX=N05zFgF50xPCJa_{ zQ6XCt?;9s-qFk0P29^{OcN>l(m{UP&(xsHAx;GAhaL^qhlVGb$5-w zgkVit+7j9>6D|?KsmXW6CPjQLv{vP?`}mBNpAShZCy4i|=l=l4To6X15mQv9NQ>ZW zam{YrmxW?(*ydF_(zK06cZn5WjAO6jSfZ}fLR1V0sl1Jefw=zwYL4OpXIIjW3Hwq2 zK@%I$(ntfp)`#i<2s?8|8ebYo`%(eK+B&Wfu01KihdiM=3`I50z!<}xjl=^=`2`MC zkx#X-6l@X>>xx&(G@0`msjP2+v>$-VNZM&hLt})Aj`d=~#b|L40r*gz{i)BIakBsc zx20OJrMVjcymd!qkOA#TQ|>w-tcdrkJ=!AV0jqB|{p8Rvt%>5SQAk$U($Ac3L zCdDNLNtpd8B}q=jd;1zzkm|=$oj`C!5}DE>Ha_&zOieIoDV?{Zf!OS6vEIO1PJ{hL z0FYaV+-*o)1RE!h%Aw;JWAneqF z6HEm@H>mWO58DI9b$*26KP#A&$>G7ZFg-HLrN3H(iQE<~{G(FIf$dO39kve^P#lFQ z4algNfYEfry@84VcM@mCuy6?^2@oqDwjoN;l09aq$XgMQ4M|^~U~?SO9$POY6qQ8x z+Mt1rr71|*A2Hl2lH+MYNeJVQN{}y^=10%)_cKvzV<-pOkBUPLB1xk&Knfc~@$W>f zj>c#ZnV(uPcNa{IKNvRgtlC9hD)`Yy@I#bR2zgpw0> z37w;wvBXGb&efEi!gVX^YF>tXm)#UMhNyvXcb^Q@dv*AC2q%C+rnwW{$h1OqUtBr< zg&)qU43(b3qY@Z*Yyd!^yg{pWHU|(nG$V>&9Ejp*6SvZU2ITB09jTyT{X0@fli%-1 z0nGmZN)h*<0UQ{k0M7=aVPOO;aFaB!%9MEeQDPO~D2d~Ga9S+={U}MvYypciJF1)( zND-+==@n{&6`|DI+k*rtRP$(IKlveDw=~ulVcd}FZV?_^bOY~6Rwx-BWT8IE6(@;D zkzJA1j<5MqKTWBH<1Z`u0Q=Q;i3BkcsMeDnpwsBMZOPJf`x?FyO^|3&ZA2vUKcyo{ zo#*XZNP)zVeW-#|Be%R$p)NKQmdGc1T3V7dDr8egO@YFe)8-%witXm1Si@P0YyG_7#`jGRi{I%gK30bpsOgzPmWr9cSZy#=?V2?Kg49fqQo+mq!2qnq~@bhem2wN^=} zA;nm1SlwSP5QiNnvPE25WE@`U8k1IY+PV;$lGv%oU-)dV% z6et1b)8z&}^hj+wC%rKS+=az#I&XSxGgYF-z^)AokUec?@KY&YGAcdQ!%j*H7O$dB zS44-J#5^|OTP;eCObUl^-NovX3IkvnB${A}`Zczs^CBx9aumbMLX3H!B{R3)shK#4 zb;g@;2HR0l-cI!v<4T-K*(c}?S7YEMrc)wydXu#DMxb$Z)#!;_S@c)Odnc6gZ}-fw)@i+3*)JjTP)f!~S%FrGHw z`cMFax!lkKkdPLc5GQ(*iJ7`HF#;$md(8{OMyDK4`H)3JR0SR4DDp*pwu_ek0F7v; z#`4ya^{QfEk?%@8m0*7qkO|t3K-<==HUnrqsBskNVMvYW1rKUq4Pa3h1t#bL;%!O` zZUmkEDKP*#(CkT|Uuo>7+20R0xuJ?^cK; zfJuQBqYAb~@C2;H1xTf-dW3f!t7TCDmY@_yp|ox(K+0xzsc=QBBHUgX($?PMm4{&0 zc&o`n45{Ul*iB){J9Ju+zQOuGaQI5^9q@#1fF#z1eI&!InbhZqq^pGy6ZEW7l@p?( z@26OC1h%E5j?*=s#Igg{s4HQ5SQXtHHZXrL&PG3R+6PD$MdbqDaj?##qE9 zrX00e)xb)C-m}=gK(lleFmxUGGc`2Y24is?0^54 zHOkF9ZJHvFL*!nG{LPb>R@UrWS+ECFQMC=-WVp)&-OjwzP$>>n_B0ZLswq15SBSxo|Hrp7Xx z3YQr2p7F(G@9>4%>Xhy~R*YFYSr)9U^9|!_Nmv3%gXvvF?OBGU<{+(yCtHtpMMgcjauMJh?` zYn6@oFPEth(H`|{AR1&JN;I7+pb3P9HMa3dWP*YxiWrbd5a5r>t?+A;X^GpqCPKm5 zk05&cE!_O(4{Yc^i39poq(^Fiz(*d`BA5=eiBOu!W&(z#5#CV_CBrln?}f{E`ylkZNz6Gi=~umGLOp}f)n_n;9z-&!mM2FI+>(un4m z1>_y*YD{`XD-dBx9M!HBh+0{t(&GtzYDr2$xE}QE3cH03QVj3Nt0u;#leBHxwP7P6 z#H1wdBifY-R6wniQrM_SA|eNRiG1K6!$A^xiiStpiLKdVm9o3|_2OGXPKom>E6^EF zDdAaq**`UM#f7>=yLS12ksqn{u0~1HFI$syKVGmbCdpWCM9YodJEu#S<~EH=CO0iN z!bhPy*B8a{Ji(bA@i7cu;nE2q0Z^3BFb2Y*2v@~D+x&?-TOzGCIE}K3n8Y4R$EuA@ zv&~odX$|5{ms*$(q;4wK(;;P*^LDt^zO?C3P}xbWrREUji=`kEk~SioCECHFAk+^A zc%=ie5DwMYi?n8YFgV~7{JT|B)T@`EOmkWDN|hEx9RsJiB;t1nxVTU7Q@nduU3WKN z*(bq6t$fmx3Pqb|b^8<8S0YZ`BJ_r{mtS*^cEi7Q+Pcb3qQAGoe$ za0_<{E+fQI+^J-eX~q%8w&nRG-qeWilLnh@Se{%ZOt`DdQOizlK=!LU zyfGJc_tu#GrnJJuK}xv?(z95`UHNq>O^+eq`WhoH*(NHqXWa@y%19v05NLwJc7rw9 zi?wEHDtn58Ku{GD?5XF2Ak=cc*oqd}wa6J$_l4tXQY8uOMRlxCHCbf5H7IQX$H)P; zNAnuuO}6ONm6@DxHshJhBx09~O|n4KWYH*TBe#@tYOyxxZ7>p%_Ms&eNSkf!DQ%?k zk?U30_$9UCH5BMr;c3{4R?`}$MzhB5u$R$ke4^tD^0x6C{S8>+47YNbOi3G4eyCAq zD;lvj%PRsBu0Y~ysY7UukF9ku%Hn5|rVlTm`o(YhSl~BzErBGU5ft+;?Xod@olP%n zt=6S;x;FY&52=|T-DFh%}U-tARDI zlA+d`(svSRrR=jw0V#v21Vs}YI8t~$g*U*3I0{V9dY00PRF#dRd89MZ9UIQ+#O#w` z>HaH12K}q700^2*ZU6}r{iwj8V$gJ%+OhbW&&|443Pkri8meTMC3txXBXt4T7y_Ab z)To^)l6fH2Hdr*0HKY{kGwNyGazX=XKdng!@}1B4ssn&&gU`KdDFElzjF3*-dr$&- zG_VZ-9)mjrN8qUTpaTr6*nMcramt71KnN;NX__Fgds7fKfOZr`WRte^3^-Z-SfdD8 z5kLpw6C2cvB?J{Tz0k4Sv82kfD~Oe_ZEjQE41-VO4Ud=$jg|t1MZM8VmC7u01OPhf zzsi}WaZ7O3!B*N=xTSv;5bmt>Lf9GrfNH~VV~*g^Q<(&|fDhKS>E7fdwiZ*koy9Cbu7wpQlc1bBTT+SOaZxbq zHQqg_0!dT~#i(?svK#Jp+?$58m#~FC;L-wRYBiC>@q3)(h$+{Uplp{F}xI?1NX! zwoT#+6}jY4-;hRM7O^&tOh8v4`qgnM1AUEkuu9-(n%rXXdRZh0?Y&ORm{_@6WkPkT ze$_^zMB=>;&1-nZS-{r*$T zeo-FvD*%cSJQ`)zr(!n#l$h6{oV{q^IFc_II#_V&bsfI7pgJy^g9=K7gH64Ga%8dm zING`#3E1pvo=^V(71z_s;AhCUpo+HO4_a>tXXb94Sp>m~j-~u0V5sc5MYLhKezH4H z+Or1bc-}Q}c+5}hP z_6^?JEea4~N3p8>2K8@R7ThxHD$t^Rs6h7Mk&RfU=GkfjNfWoNVM<{{5fNK7&g~Us zTZmVX`CuPz^|0xCSp^ zITup$D@PSg`w0xT?(U@nZC=%Zy|YEI(t!YXtr3-?57e$!$BK^df(=ZF^{Tfbf%05^ zcBu$?xgC7!H9H4;*bs13`n> z)>|EEV(q{Okjax(WZ<$qm5NG8jZ%FgDVOx2un6*>Xo{h3Sj3}bM#%$%r<#ttg_Rfp z5O><9B+o6rbt~VwG|3ZM$^s%NaoQ*VPnw=L3IG5A_lf{VinILGN?M8CMt}&N_ay!3 zj7O~iI?DmX$=aP3=pCk*2c-%AQA3@8npPkZeGL%`pTkT7@RneHv_*xU`_KgDn)$|j zHK=&0{3`XQuWdYQ7L=n3Z0S`}_GTGA$)pw!Y!mYWW?D31q~6$+A2W?^K9oPSDeXHe z{3getpis~!VOJw^+!D}{B4~K6iUt7s3F43D0NN-3jld&{FC39T06jEHaZ3aPy%qvI zHxzf1^)wB#&!qq*O%O;Xl2Zfm&;n$7njo-~-}9hgD=Q*u?SuR@>`v9MPvnI79wcdq z-_x2>R#J{5?^~B8UI_QaNwp+{C%tHLg`n|Rk+2eL2Bq#>4h^Przc%@FvV#THCB3~n z)pj3jn|pTBl)wNA=fi^bJhVrB=_-;8Zek?V!~~`YJ-sM6INE^~xaFw0!`&S1Ap43| z3gVx%w^@*)ku;v;t;J@m5B~s8FA)$yn#7b6uyqJEze?^jRX#}ghOY!qKGm?wj0E@{ zpbCbgW;hy5;`lgAP0q`4ApI!q5|przIF8kUdX|rBfCk2iQyYly?LydZjevp*PWz4p z0AO*?dI!%1W;<>l!=6bRq<&Q!19Z7(YEPgCerijBG^~@GEkFG%xCDSfk=n5uV`Bgx zdg$plizv&;g`^^21N5h|(q~^2;#9RCWKc&?YTzdba3uM>GyN+&msAyIB4$k2Dm=3G zTr7ejcNEx3gS^w>6000Z*uaxYNR9sh?9zJ$47~+A2ob$ztrA(q?$QJWLE5B*(WkU$ z$F@;B?Oe+J1*^xAxB)~~oj2NKCiWwQ?m;HBnFV3I0aY%l(aUHIfU^cGe7?&mT%F}e z43Gj&!|VD{_$q7#2IGFly!oe+t1w}r{{Rnp1D!gc9`(cVyHMKJ2F7A4$Z`*ZGV)HM z4MublD&nv(VM3m`5J43(B$A&Il&DVQxTYFbhljq^0hf7t=-OiT&T*w+^IpBnw<)>8 zZQSNiIHvdl(81n;GB~6G07;NHstnNCNlLU#`c-q_n&hAjskD_ZdF)RV+RupDNe53b zO=sYOW&RXN-twZDO_kjl>_;t z(oMQYy-c()*h%B>MGz9#g$KuqC3=`iXsP9kMtUGFj10aE1`0!|aju5CcNd!#98krF*0X#(_3E$K8pa}QG3wKEygqn|o zGNjwvpn?@1l@KnomA`?O3YD=@NUm$R?0vSa`cJaTa&E}ii7qs)r)m0Dw<^917U~8L zkPR(L@;EZ{H3eK@3M2713K8v2VHYCi&9%rOKvz9*%ZY{*Wb7h}bwG%wfI!>Z`_ZHw zQA}z0A>$7CHZK{EEL1!ZvWBhN=WYcg4VT%;foqlZtMMua(z$t5q}NAD_E|*Qy~Of} zlk}%@`<@ls%@fH4Rk_u~QP}8~E(O?u*rup(XAO=0&6=cnwI|$HC4Hkq;J=c098rTa zKa^AXf?|Q^c!~;H8&r5DcfiwC^JR13U?>oG?N&K`{{RCQwOKm{2W~g6i{YY^&{nP&ke4-rojaal zr1+@~z#%3{CTq^KS{e z(M4|TCLkYvYKttPFC^$BqfGZ33XX>LC=xat8jvTk<(GC>YD5$5TNy|rYBAq>KrM?W z?uiXFw+Q4VB-4HqiI7sE8xcSU;Vgl*0K(5;C;?wAuH+ADF>GcvP$12)AI(T9I*5++ z3^Ir&cA=n06F`LkCy1lcBZ>epfICvsnH+v%m#NvMgd zR9~XOMFl~nq1B`LlNDHuuZuk7BGE^91i+f25=vW~tt{&#p)N~XJgbVdg*9-%Ef8dd zgQxPSHyK9#rK%ID9f$!IHc&7MXCmuphV<+P3o`)%~AN8M-ntG?aR!t}tNT>s zWef?lr6|MNQ6rx+kLqc6$aFr=UcwsGzmT_ps0d3*{-&jyJ6mW=R?M_#vH*|LqU6Sv zlA2{IQBH)U@gNDLKWdi{pb)1C+Ein2ts$KEI9Q>(@IewrX4YkltA!4T0_*_g?HV1UOWh%|{3qkVF^9trimW$i6@EHX6 zG?nwj)WjEt0%vMTNl}U8iU3A6W~*kKWn)W@!junW)ZDR!FA~3L4WyAVu&VFK#r2lu zyB4hQ)P6t4vFJNjF4h4XiHhmzRb#(WiSEL2Aw=rn)s|Jd@SJkpMii5&KH{gSR~r-_ z=IL5)tiF3T03@UcAp6sPA+)<{xj5x%W&Tie-QMpE40l^a!wtKBIyA;A>p!+c@AJUv-+{b$l=IplqOSTMOj}H-We}Ycw9`%^O@P~05)|hEJ z%8zQTG~UDI9UDHf#!JaQ8oaj;BS=qquR4_iNmP^Gw&@nmMHBETAtf^#Q?@G!yl9@v z2YTogo{YlMT*Fv#w51@nA`Et^e=XuAGOfp^!o2MM(={#xhJrk$-Eek})tSzCIK9K% zQbf4k`6fJ<+f!R8nCv&G%DYNarZ(-gRLJ=}=Z4_P#&LAo>n$XXNZeMybe)2bP5Xmy z@(=f|GL;pm*pbr9FcYfz-*`aYo@b@@A<_Q;66=H+f=BDML*5RJGBDII$Z52VBV(XI zto}2T*}D!ckKwpR`)o}`Ivp5m%o6U=(uK0K+CpSgNy0A{B{r`V`sg)kYmx)#%b1Gv z#j3>b3fubBrm}7(wCeCe1jm^`e|mk%FsmgqkTDlbOF(hDzt~e384nX}dvLPa=7$ zTHNK!8d;rkI)kK*Xh)=-;)!7?Skk0|Q~?Q?qrrQ9%eC?uv~KA~#cc#|2@y>>mF-o# zWyVxHppm^wGB3qGI6n{FNmT_kiA;uyRj3%;eJa$1 z_$pt5PTSOFCv!Dw;DC)gRf{Op(ob<(aB?TW@>4U|QIr_~{o=Qkq$k2mPV!9#9XNgB zT@#^OED!5dWRG-57rDB^?vnE<1w%rIl+$>o8}kYaNhx_hg<`nvQ#7s6!#J~+#3Jbh zB!4*E8lKJjZ>Lfn1Rc4lh|=Ypp?8`uk#5VZ+ofmB^X>$tBi6fiJ(N08(oBZc;LJld zXSFL&$uK6}k3~-#dztpC=aI+Yg0}wvB5{v#=XXWsXT_XzL2>7oFrMDRyG~ij%w#;c z?k|cIv{2bm3feuswF&$xh@NN8IgNRvFkRm{I##GceG}TL6q)1ouI4EAK}5?v*x*Pa zBk4^Nt6PTOYw@G7@9k5XQjH2X$-TfaR`0EXkY;vLJA+bh@YGy3Ler@;wQ*#-S*bfJ zz`es3182u*aFuc@b*3!S>H*NEPaa`OI~{mBE<(%sM-sVd?8BJ_g{Gmc4I)<`_w8Lf zs~uJ8E(4Tpa88-vFDn);>AJ=*Cv)7UcQf=z`qW&qOW=;n%O;|^lRWo=W$WC-eh|xR zdB+thG0gX_;>KID>4sHy{{RtML!rG=c_ug%OJ&-;kn(wBG-I!3Tw><=(tnDnN=e{$ zs+1^bleYZVZV~K?iJiM)l>koLdeRn&1RcTTRLDByu)r}8`!qc&)t)IQNI(4Pwf2(6uCQYMNmoZ!^my)bf(Qlv` zC`#ZO@A+rr9?zxOcIOVsnMT6W;r7ZGb#joiG0xkcxsPg2FDJuviA68>91`H;-A~NV z-&~h(Z*G^VYa`dvHUrpKZpoc4w#e90u}oB@D+$y}wu)0~3Xr7xp2wUz!=Dax%q|8M zHY^f^4#(cP@J!C}^{&Pkc0nUF`JmxY2Wnew!ja}X9z|#?d+d4-Dk#5z**cJ=D@cMk zt7I%Kz?d>OG6|2hdEA>#n->65RJS~&kOYVj1u|^ZQlRM6gCrBhKy|UkGtLe2H`fUQ zQ!)ZaYUlR@LX|sKh`U8{L{}3E2Bg{<5jA2WNyC-kVl5euFa*|*7PbT^5xA(!k;Kfp z7S^B?Ks<_j54?GYKZbnggFrK-WgM$>j_G$0x>#uMq^c{rDnm^o0UBJ4FI}jXuH>*o2jy$q9fy^%=lc5|oWG zxe*isRu7ljM#Oz7XtdVc0tlE=h@=6FbhJT`pZU9raVt%*QJG2nDIMvDBMSs>q^JU9 zBnYJji-e^pSRBs-^`R2*1hPwnC?o{#Qa9V)pIb|5C^8Zx5ht2NdlLv55BONOVpN!p4Lkk|MIVERqPCvM*vSq=-iexqL`y={?AS`I@hNfZB?6f=1gJsVOJHm1czG z;}>lVDIgKvr!+r?2XHH94ohDH$dZsZfk3H5i3T{XfdOC3w3wu=1!4%?_NP_^%p((C z7O;mUOcVD_ZgBUT#90~?m8AFdu3l_(?7A#n)(W%uQ>i|c1mLSezrf$vR#aHYwzzHk zgF`Jl{{Sckwpm}Jxb9`RNBlC{Xr0!v6)WxCh1SgU7FFo(3Dc|@c%~@xO{t_6t=EVE zN2J%7y6@IOpK%po*h^u^9KI_ z=87RCL7-1+6=`(-6!?1GTh8e`8t6H5G+5%vOKvPO_~i>VgFZd`k$hi+NOI54jckdN z+i_8y$at2b6K;&h(%xyyeI*5zqc z^}ta704Um`^2Q_iBd4~`Na+3)Zm(`FZ9+uup{Ymy{`KW+@c20@Kq zg--pu3bO_|W}kexLi;M&#Pvvy)Dp0x71~B|Xi`EQv_*PxR-%YjdW5=(NVTW71r0PpW<(YBPAoy)1Yk~<(5NnB% zd~DF3#jYdKOm^P^#Bsb68p|2)48s~P;w#EHz`c6Kq06q@tqr^z9o$M3l=mXAfG6?n zu%RQ;t7?XstI2;1Jx%M|4P9h>nTcZ?t!5o4s48Mk+ zroWo=re3wl*p==hlal+G=(cPvt0c4vmZdp545cKb11led8k!R_ho%{{^z`Si{5gpX zoG%53@3U^9YF{9o0elnXBW;0zcOX_}1`SAvrEF%m>FJJRf2Hcr>%&VqQ8&oK+r%y% zLw_@JQl%EzN{CasLP=3TAu=W@F{23bbg0#fnQIuZ!7MS?@T=A^Ti2Xo*Aa5vX}7p> zy*?rk;Tlw=>P&!SY7TT_;teI2KKH`ie2tq+plurN( z^u_`EK7Ju_D<4q=hs7zeqSbejf{{XGql&F2cpbmSQx_^pv&oJI#S)T~Mz%lzh zK0S@{bhv<_DNrDksU&cul9Rk0jb?5NRN|DCc}Dx1u0+r-@XSKVoHfggGWyvVn@N8U zQ?`zvUpA$ww5^Fx@j+TtkWn&3QZWoS5W%rKtUnR6y2CH+9a|SRmyD^GnQgaE+7zfPXtpLLy$(SePo>^q|dhX)!I=C2}I8X`&6gN1UgDn zDG8D4O(bc6OnrHpsI@8qbuJhuZZ;HF^4h4cxG;_rgTyQB#A^_q$QXdR7x2k1C5G2ZW{OH_D50x5~*g)ce{Dc;Yo(<|E zc9Y(oQ$<@Oogl#nY7jOlDT1@%CesyOz%>T*3QOzp0=y^Z@sr8-rhs9rP24;9H)+&A^%5i>tvbWH zp9yJTwodS7N2Nkb$wpPfA9mCrl7X!!@d*7Y66~0FQkzokT#gaJq@QV2ZydMbj<$?O z-8xD|&>M)@(F{h>Kq2;(X5@0NDsC!Bx_IL>KDL;1NVjp${+h9yyCq^Ql-xMeXgg_$HHgNnUBcfeWi6KbEwqAaQQwwASml#^^QGvv zGdO{{R0oTOck|6vID@G9Vzow+*w=|;QLJfD%8|6pe_EYtsX&3i6}JZ^%yJ;lZ+bbM z_aeGQO85d)V2A)vDk34hOfnM~I*cqG2Tb>8OF59_uM5190)YgD4hZI=)uG)o z_XE!u<^ZIIZdB`O{zn9g=y)H*UG;%a&0%f59nxzCO)8fKs$QnP%i_IOjju)lsbG0d zumwTIzAv+F(+WlzYioy3{$}e?`f*i9K%2R}iFc%N{LP#3tmS-e@tj5L_qWsHE6R!V zPXp~##U^9Dbt4GEJ+NC9N?p#_U=S%PK}iBO^{LSZu#|27^fVYGnoTf>Q6S0QjZFeK zQR1RI8q=VKHlmX|5NhuU&Y0E@0^1OEK7g63rH(V%qG{2ovFp}vvI9lxR7Y}(P9fJ^ z>xv^n@pZDF{{XZisajk~-4pL-GZn_KvA4Wi`?v2M<5TVxk@TJ_05cV)l2o`LK<@LSq&VtjCT-D z5?Uam54B2ypd^q&7#@#rDiw%Y>u?HDS zd>azdVBI|Gv?+SZzZ@q)aWUx38wJI&94V|5F^4eh)z!D(yk{UT>1?jk22zXH7dV@U zf|Wi}6>#D6lp!|ErLakANKEnn09yKmoBlRBuar7pk{A28rPzJrm`-0)mg%v>R#QkAXN8A?b|4mrN0fKOlem+5vT)-3(foQ;&PZ2U{M4j+Kz%LY~ZuPx!q3R_P< zdK6OS!^pRN=L!<7X=_pxw0LWAFgaz9!oESyeN*YiNy=HP7RHx}VlOe7F~WvTg{`|y zspToPH>nM}rdYUiG^borQW390wV^m4iq5X1sW{dLhTs;j*!1%PZT7PBIvho^lBFdM zuG}mF8y*Wy0|86$d`AFv#|1Dl{{RlxS;elfWvgtBk6C4$)rnkw?6Jl11vcAut9%yq zc#A^(B@m*Jv<-e}PUgMQ)&Bs7-20ZYrW1i;oo2v=yH`KFvo>|jd9_GY_0%a0w!rZm zeN8ZxIFQ*&3f*yPGBjxb=D6kwg7wEXuI=pYi6f`IKg;-L2Y;P0dq*yDELp|fT$X$b zb+1>6aP!Zhq`0VUrczh1iZ}ilusogdS(&mQ#rUB>KGo=<;w*Vbe>h@{7!0?RKieIkSSa>PKu}hRXRe17Sa47!( zj=u>lA*HQLR^hhNT%}e8{{TR69-s8nrz`45Q@U-9=X_QC$S}OGfw^#6`KPVYRQO$z zQgw!ulj0XO4Mhk_Hd2qBZ?7G{zrDM4gj+v#a_!35X(cFaPB>OlkaqwTK%T;)#)>YV zr6U-7VhBtM>8UU$Q4z?elaa*;1#8qn(w=sw(y~wi{5)kLfb0GW~q?ni%W2|{;K zT7>uH)9@UzXl_X$AF7WummY1k07%sl%>w0&0-}W#C=gED#0o>GNJNT#L>IhI!5D6O@sEuwsw7IC6iP{rHrGx=96S*gv0CW|pBq|9`;1d*T zM&y!{9Ld_55onMBok#s6YDMG4_e)Z2Hh@gFK& z0YkSRoma{!iuaJG$l+V9l_yAA2E>@&jmH>uASfk3c3#4gb+aJ}ynhUc%fhW(Qr3n` z3g%lRQMYS;(g0%ZMLdw^{{XF6jh2`V<|x1=R_$EGA1MIS0~#cM62a!wPdY)0J6D3Y z1j%W|FyaVxw*egML4oT{-QD2VD%KJkoq#DL@5M*3s(Nf$6;3ub+xR+4ldoala1ZH9 za{C5AOciSMOzlZPsc7*o5YxD>5P>Oe)u?ctB+W&87DMQUFt=6?`=ST^Xi)VZ^q9P> z`jmILUFGus0EdMoJD)SFnt;5Udh(K&6w4BLZ4yOZnnsAiFjW!MWQ;!9QuE4jUBNv4 zhV`1gWwvi!ZIr`dL?n6&*`}9t+9N40JdG#I8%+|RKpR(8kf4VLXpSh#hM#&6ZXq!- z`U*;tQ{D&ClR&mYN3wSI6lEJmkOb6ddxlUHAV=1eBk2?jSX>wal`{i@Q}eN1`hbN* z14&ROMAHsN%C_HQ?@k4flLvnF5!D2cNsdpo63lHeN5~$?A_nwL$I_731c0Le5;ymx zDM!6XFT)0{Kpxa(V{c(XBEm|E=bB21DiR~m&^GqmB`AoU{**WUb`+TYp?@(Hmq|KA z{&WdH17cFBfj|&aVxUYgB0%rnXb2!|H}60Pq!2(RX)rXN)Gz=^)6F>91dW7KLIRLV zk0f(X+F{OKI)H?7i9shC$%ueyr7Yxkx*du*&W z?c7Sqn~O*7)Cc@Bm{L3-*wT_42>=v=0E)DMUjG1Ix{ZnE48xccnehg(EL#d*4}SHS zODGs})`_-C5CU0eP(TPkN=E~o^w>YeUsZ4O?o7-V8P4$HnMs6OU}X(5hAf*yUJy!H zN&{z8enk}|l_zBrwE$bQ2a!gHORVyo^k%9W^0^#GU6-5@kfGEr%PyQ2uKi=A+#kZZ3D7UkdfF_QzX%8 z(eA0<^n*ND=8P{6wZFye8hluM+Dg-Ja^ov)yMUe)wu<$n9knGVwNA^-yJ2y1o6I)p ztJ_2uZnassU1=~BR_B&Lf(cT#-fBcnt&=*3nfh|=_1;y+oxz^JWwvfgE!cf7r3x!- z>3OxKD?*7WaUd-um{6Lk$h}|9c>_A)S)VRuXa4~4CC#JQb^Yz(AN-?XAVlkBW6Xn|qRv8HBA~WoTMV_W+P$ zne$ur96?Ww4*YK-gKEr2^f=cZjF@a z5!h4RhXrR&jN*@xB_TXlQcBVX;Sxu!6XbDw3W!K5l>&F#h$SULNra9Fs1Ak1Cum8e zm4y3>1;*l3=+qKWkU;KeD4~CeDIKTU{d=j8fuQb~Q$lwJYVv=rAurk zPchz+Djh0XP^|<&lP8)sb-I~xv?WJ)nIf40i^y#U_+iD95_?e8vbjVMJDNZ`gsK5i zDm$2te)QQ#inOE&6TsqtBi&hrlC+T8hwD(>ZHLmNTrvxX`NqV0R2%Kw%P;N9`~=J3-COrPAt;?X@AgK2E8Jm-zLq_n2pLW-SAN{-Y209tDzEQX>I*}7zw!%AvG(<<5x zDB9aXiP1B{;tfl=8WiK|BSo+(0SH>XfQn+}t7gJUQ(DgC4h0>^Qk-MU5*@d3K$EM` z=`loZl;eIHTT+boFbzS?crwdZ4k7VBkWRC9rqb8&+S*KRY9qK`@~zdZPW`E?WLLh* z{y&9&WM>g$hH6sQ+5zKP0xOzhjx_Esa;8=m+Lfp&JR04k+Gd3a<5Y-3RoZ>%frBP1 zv?k~Z5@Z&z^pHt|MGJv* z0QWxBpg}M=sjZO?Ucdy*6EG+%N=(PtQysbqNC%Nk0uv*jdW%A_densl4o7-Q>?Y13lB*c%;wFg3qhm^pn*s8^7Iz%Mz%@}2K_)n(PY$*UR zun8zLK9sdty9OCjkEj$jhw}+Ib;{CzfV1reoETl_}!N4-Vlid>B*KmP!N@ijpVA8=`7BjS6X3t`%-_t5nvPr$K}aRnI(f_>^! z9Xq~xtzk(9V9hUo1Rbn(JvY2Cb*J*DTIq$`hs@wl)Kp%k0out(>08I~yd&6DhB{gZ z1UoUmrB?N6aE74yC)#wj*nnJ8)UQHgYQMuWm5vmDgxFC7lj~Gu)XGYcB?O&}XO$@! zLkN%nd~65$RamvYQrG|uUiFB&i@WSI3u~nf-CkN@Eeos;>G67pll#ec;}m(e)1zLp z*<~6@Dbb}XGpRdiaokfY=67?pD`?hL{{X~j#&IU_yL-E~TDHAp+}f!Rx#GB%+*gLH zqLrw^rBNj*0`jt#8N~3bEVI;n9|RaV!(7H$ys%ZvjE7fhhOe7ZwsGYJI#5>6hoq@+ z;VB1IM9r*a=CZ5mvrZDP4H#;yUbDJGm+u2;wO@SF60)#Epnr;#!k{C{VvrcDyM(sg z&U3)dC50mD^9f5f&o2;Z7SA}FyI0Bs>LC-Mwem*dIi}pgync-()j5JUa?T=`kc46u zsl0K5g@qNg9Pt$kDF7769Bon&)YFM{(PuWhe%>30;V8s!Fx1*$j-)+xV4Lhc%XI;+ zTpm|Wq`^``;Ef|s3C%%xer?4AZei*vxLHG(I)Sw*CQ@30e6U0VxZv+J0pEI?iD4Li zQpGU#Tu1JuA(de*x?V{_h2lITZrql9HCcI!qt3M{%|>M@$aIqd!|t&BTJHM}!0!;& zF@-ex@yF28Te5Ino1YA+X_Z50K0;OkNl4g`sD1*!!g7cI08gJz9-JliKXom}Ze6%+ zV#gBs@)DBPuM3b$L2rczjA5 zw^(tfSY5-)ZEGzlQ0kIpL2$k#4XYgeikeAMml3^KfE_gd0Pmh2wbKH&I}X)E`6Rdr zPN)OF8v#PuX5fIn2JkAPcd)gOI2=tSTPz7MMN5GWJgp!=0!H+avULrO0K#cyO{kD2 zd7z{RLW;X=DGJ4=*$H(Vnchj7TNdapEkqJ@&oqgRJsufQ02J{Q8!>E0APL@rA)xEg zJL(+MZOSf`kWQ451M5Ki5BP*F)NDkKY4nIA+iGly74fC-U8jBKq@iRXBp52+VMq{_ zI;|p1ow=vb!cdqS4LZK`2tr7>w??!kJpiWe8bYnpDF@FKxkO}>TaZ?zS?TbWMxzFI zr6TEWekeOlRGk=MCmB*7d89g!7KEq}c>~g`oxv?q(^?Q)Dm#=IHDYH%JMuuiF5&Kg z)x)Gu^N@eFM{gXtanzOQQ8BqqOSL{qr-vN=(k?Bp*7IsALO#Iy{c3Vhf;DLz9i+un zpp3H9WBL9g?J(JASx720%gRe`IFQ1uw&Dxu2s3io%?kb&mmhDU^ zs5YqFNI&mQMH^!n!8H_A-DiwZE7FCu+=wM8r!6jTF|w6h-`tt(g@ljLRgEaCM;~3P z$$>7y^9#xtYt8tswzrq6CBnim}AyEIa=IOZjNPYha|2H8GQBVkeZ`74q3q10tuFlj$5 zndgB{oVSN05BOvg9Fb93ru>I$9kt82a*@5OW<98`a^@VBCM{bMM{0}9JLGhPe&(`5 zfEMWdsM^7-!;TLDCrL3w$v;uj1K54CT9IzwK9v2ng}RWF;G=?gsJY3mMv^2khg+#A zmXc&|w>#9QY;DluKxG?yRekdH9U+(4YyiIvAc6+MoV2!W*L=gY?e(PF0G(+e!2k*W z0D5_=cEL(?h&2l&gF`K$5)cXZ6yp}{xV_RSy{tUY!iJa9kL5G9Nzel`8-+zA_8VJ` zEJ4x?1L;b$M~I?@D3pRkO$?c0#kvccNRh=6wQL6nPX;20kbIdQpg-YZtN?_^j5#0a zRdd_RwI)bPK?BmKLBk@kh&uq$x^JZ93GwDFmG(Qr4&tB}DhBNW>pr#d}Ak zT%xMTH$)6t_Td(#NqK1_(AHD;#p2yMpHcdn5v(4(E98YjuWUOx&a6ZRt#j|JmXlKKcLv literal 0 HcmV?d00001 diff --git a/examples/parts/hc595.c b/examples/parts/hc595.c new file mode 100644 index 0000000..7d9e5e0 --- /dev/null +++ b/examples/parts/hc595.c @@ -0,0 +1,74 @@ +/* + hc595.c + + This defines a sample for a very simple "peripheral" + that can talk to an AVR core. + It is in fact a bit more involved than strictly necessary, + but is made to demonstrante a few useful features that are + easy to use. + + Copyright 2008, 2009 Michel Pollet + + This file is part of simavr. + + simavr is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simavr is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simavr. If not, see . + */ + +#include +#include +#include "hc595.h" + +/* + * called when a SPI byte is sent + */ +static void hc595_spi_in_hook(struct avr_irq_t * irq, uint32_t value, void * param) +{ + hc595_t * p = (hc595_t*)param; + // send "old value" to any chained one.. + avr_raise_irq(p->irq + IRQ_HC595_SPI_BYTE_OUT, p->value); + p->value = (p->value << 8) | (value & 0xff); +} + +/* + * called when a LATCH signal is sent + */ +static void hc595_latch_hook(struct avr_irq_t * irq, uint32_t value, void * param) +{ + hc595_t * p = (hc595_t*)param; + if (irq->value && !value) { // falling edge + p->latch = p->value; + avr_raise_irq(p->irq + IRQ_HC595_OUT, p->latch); + } +} + +/* + * called when a RESET signal is sent + */ +static void hc595_reset_hook(struct avr_irq_t * irq, uint32_t value, void * param) +{ + hc595_t * p = (hc595_t*)param; + if (irq->value && !value) // falling edge + p->latch = p->value = 0; +} + +void hc595_init(hc595_t *p) +{ + p->irq = avr_alloc_irq(0, IRQ_HC595_COUNT); + avr_irq_register_notify(p->irq + IRQ_HC595_SPI_BYTE_IN, hc595_spi_in_hook, p); + avr_irq_register_notify(p->irq + IRQ_HC595_IN_LATCH, hc595_latch_hook, p); + avr_irq_register_notify(p->irq + IRQ_HC595_IN_RESET, hc595_reset_hook, p); + + p->latch = p->value = 0; +} + diff --git a/examples/parts/hc595.h b/examples/parts/hc595.h new file mode 100644 index 0000000..22d5844 --- /dev/null +++ b/examples/parts/hc595.h @@ -0,0 +1,57 @@ +/* + hc595.h + + This defines a sample for a very simple "peripheral" + that can talk to an AVR core. + It is in fact a bit more involved than strictly necessary, + but is made to demonstrante a few useful features that are + easy to use. + + Copyright 2008, 2009 Michel Pollet + + This file is part of simavr. + + simavr is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simavr is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simavr. If not, see . + */ + +#ifndef __HC595_H__ +#define __HC595_H__ + +#include "sim_irq.h" + +/* + * this one is quite fun, it simulated a 74HC595 shift register + * driven by an SPI signal. + * For the interest of the simulation, they can be chained, but + * for practicality sake the shift register is kept 32 bits + * wide so it acts as 4 of them "daisy chained" already. + */ +enum { + IRQ_HC595_SPI_BYTE_IN = 0, // if hooked to a byte based SPI IRQ + IRQ_HC595_SPI_BYTE_OUT, // to chain them !! + IRQ_HC595_IN_LATCH, + IRQ_HC595_IN_RESET, + IRQ_HC595_OUT, // when latched, output on this IRQ + IRQ_HC595_COUNT +}; + +typedef struct hc595_t { + avr_irq_t * irq; // irq list + uint32_t latch; // value "on the pins" + uint32_t value; // value shifted in +} hc595_t; + +void hc595_init(hc595_t *p); + +#endif -- 2.39.5