From 05b599f914411101c602f09c50841ee1a05fe19c Mon Sep 17 00:00:00 2001 From: TheRealOrange Date: Fri, 25 Feb 2022 12:18:28 +0800 Subject: [PATCH] ported opencv code to pure libav --- README.md | 4 +- inc/video.h | 58 ++++++++++++++ src/main.cpp | 207 +++++++++++++++++++++++++++----------------------- src/video.cpp | 151 ++++++++++++++++++++++++++++++++++++ tvp | Bin 42848 -> 43552 bytes 5 files changed, 321 insertions(+), 99 deletions(-) create mode 100644 inc/video.h create mode 100644 src/video.cpp diff --git a/README.md b/README.md index e9e333a..b97550c 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,12 @@ Mileage may vary depending on how fast your terminal is. In my testing, I've fou .\tvp filename [threshold] ``` -The threshold has to be an integer from 0 to 255, and defaults to 10. The threshold affects how much the colour of a certain pixel has to change before it will be redrawn. A lower threshold results in more redraws in most cases, and leads to choppy video. Unfortunately I can't be bothered to rewrite this to decode video using FFmpeg so you'll have to build it with OpenCV. +The threshold has to be an integer from 0 to 255, and defaults to 10. The threshold affects how much the colour of a certain pixel has to change before it will be redrawn. A lower threshold results in more redraws in most cases, and leads to choppy video. It relies on [ffmpeg](https://www.ffmpeg.org/) in order to decode the video input. Built on Manjaro with this command: ```sh -g++ src/main.cpp -std=c++17 -O3 -o tvp `pkg-config --cflags --libs opencv4` +g++ src/main.cpp src/video.cpp -Iinc/ -std=c++17 -O3 -o tvp -lavformat -lavcodec -lavutil -lswscale ``` Below is a preview of how it looks: diff --git a/inc/video.h b/inc/video.h new file mode 100644 index 0000000..707c911 --- /dev/null +++ b/inc/video.h @@ -0,0 +1,58 @@ +// +// Created by orange on 24/2/22. +// + +#ifndef VIDPLAYER_VIDEO_H +#define VIDPLAYER_VIDEO_H + +#include + +extern "C" { + #include + #include + #include + #include +} + +class video { +public: + video(char filename[], int w, int h); + explicit video(char filename[]) : video(filename, -1, -1) {}; + ~video(); + + void setResize(int w, int h); + [[nodiscard]] bool isOpened() const; + double get_fps(); + [[nodiscard]] int get_width() const; + [[nodiscard]] int get_height() const; + [[nodiscard]] int get_dst_buf_size() const; + int get_frame(int dst_w, int dst_h, const char* dst_frame); + +private: + AVFormatContext* inctx = nullptr; + AVCodecContext* codec; + AVCodec* vcodec = nullptr; + AVStream* vstrm = nullptr; + AVFrame* frame = nullptr; + SwsContext* swsctx = nullptr; + bool opened = false; + + int vstrm_idx; + + int src_width; + int src_height; + int dst_width; + int dst_height; + + AVFrame* decframe = nullptr; + bool end_of_stream_pkt = false, end_of_stream_enc = false; + AVPacket* pkt = nullptr; + + bool alloc = false; + + const AVPixelFormat dst_pix_fmt = AV_PIX_FMT_BGR24; + char errbuf[200]{}; +}; + + +#endif //VIDPLAYER_VIDEO_H diff --git a/src/main.cpp b/src/main.cpp index 8168cb1..d65dfca 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -8,6 +7,8 @@ #include #include +#include "video.h" + #define CHANGE_THRESHOLD 3 #define CHAR_Y 4 @@ -22,54 +23,54 @@ const char characters[DIFF_CASES][4] = {"\u2584", // bottom half block "\u2597", // bottom right quarter "\u259e", // diagonal "\u2582", // lower quarter block - "\u2586", + "\u2586", // lower 3 quarters block "\u258e", - "\u258a"};// lower 3 quarters block + "\u258a"}; -const int pixelmap[DIFF_CASES][CHAR_Y*CHAR_X] = {{0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, 1, 1}, - {0, 0, 1, 1, - 0, 0, 1, 1, - 0, 0, 1, 1, - 0, 0, 1, 1}, - {1, 1, 0, 0, - 1, 1, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0}, - {0, 0, 1, 1, - 0, 0, 1, 1, - 0, 0, 0, 0, - 0, 0, 0, 0}, - {0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 0, 0, - 1, 1, 0, 0}, - {0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 0, 1, 1}, - {0, 0, 1, 1, - 0, 0, 1, 1, - 1, 1, 0, 0, - 1, 1, 0, 0}, - {0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1}, - {0, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, 1, 1, - 1, 1, 1, 1}, - {1, 0, 0, 0, - 1, 0, 0, 0, - 1, 0, 0, 0, - 1, 0, 0, 0}, - {1, 1, 1, 0, - 1, 1, 1, 0, - 1, 1, 1, 0, - 1, 1, 1, 0}}; +const int pixelmap[DIFF_CASES][CHAR_Y * CHAR_X] = {{0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 1, 1, 1, 1}, + {0, 0, 1, 1, + 0, 0, 1, 1, + 0, 0, 1, 1, + 0, 0, 1, 1}, + {1, 1, 0, 0, + 1, 1, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0}, + {0, 0, 1, 1, + 0, 0, 1, 1, + 0, 0, 0, 0, + 0, 0, 0, 0}, + {0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 0, 0, + 1, 1, 0, 0}, + {0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 0, 1, 1}, + {0, 0, 1, 1, + 0, 0, 1, 1, + 1, 1, 0, 0, + 1, 1, 0, 0}, + {0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1}, + {0, 0, 0, 0, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1}, + {1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0}, + {1, 1, 1, 0, + 1, 1, 1, 0, + 1, 1, 1, 0, + 1, 1, 1, 0}}; #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN @@ -83,10 +84,9 @@ const int pixelmap[DIFF_CASES][CHAR_Y*CHAR_X] = {{0, 0, 0, 0, #endif // Windows/Linux -using namespace cv; - void get_terminal_size(int &width, int &height) { - width = -1; height = -1; + width = -1; + height = -1; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); @@ -121,9 +121,9 @@ int im_w, im_h; double scale_factor = 0.0; int small_dims[2]; -Mat frame; -Mat resized; -Mat old; +char *frame; +char *old; +bool alloc = false; int diff = 0; int pixel[CHAR_Y][CHAR_X][3]; @@ -132,7 +132,7 @@ bool begin = true; int r, c; -char printbuf[100000000]; +char printbuf[50000000]; const char *shapechar; int count = 0, curr_frame = 0;; double fps; @@ -165,7 +165,7 @@ int pixelbg[3], pixelchar[3]; int prevpixel[3] = {1000, 1000, 1000}; int sx = 4, sy = 8; -int skipy = sy/CHAR_Y, skipx = sx/CHAR_X; +int skipy = sy / CHAR_Y, skipx = sx / CHAR_X; void terminateProgram([[maybe_unused]] int sig_num) { videostop = std::chrono::steady_clock::now(); @@ -196,7 +196,7 @@ int main(int argc, char *argv[]) { #endif if (argc > 2) diffthreshold = std::stoi(argv[2], nullptr, 10); diffthreshold = std::max(std::min(255, diffthreshold), 0); - VideoCapture cap(argv[1]); + video cap(argv[1]); // Check if camera opened successfully if (!cap.isOpened()) { printf("\u001b[0mError opening video stream or file\n"); @@ -204,14 +204,12 @@ int main(int argc, char *argv[]) { return -1; } - fps = cap.get(CAP_PROP_FPS); + fps = cap.get_fps(); period = (int) (1000000.0 / fps); start = std::chrono::steady_clock::now(); while (true) { count++; curr_frame++; - // Capture frame-by-frame - cap >> frame; get_terminal_size(curr_w, curr_h); if (curr_w != orig_w || curr_h != orig_h) { @@ -223,8 +221,8 @@ int main(int argc, char *argv[]) { msg_y = h; h *= sy; w *= sx; - im_w = frame.cols; - im_h = frame.rows; + im_w = cap.get_width(); + im_h = cap.get_height(); scale_factor = std::min((double) w / (double) im_w, (double) h / (double) im_h); small_dims[0] = int((double) im_w * scale_factor); small_dims[1] = int((double) im_h * scale_factor); @@ -240,7 +238,7 @@ int main(int argc, char *argv[]) { printf("\u001b[?25l"); printf("terminal dimensions: (w %4d, h %4d)\n", curr_w, curr_h); printf("frame dimensions: (w %4d, h %4d)\n", im_w, im_h); - printf("display dimensions: (w %4d, h %4d)\n", small_dims[0], small_dims[1] / (sy/sx)); + printf("display dimensions: (w %4d, h %4d)\n", small_dims[0], small_dims[1] / (sy / sx)); printf("scaling: %f\n", scale_factor); printf("frames per second: %f\n", fps); fflush(stdout); @@ -248,14 +246,26 @@ int main(int argc, char *argv[]) { start = std::chrono::steady_clock::now(); videostart = std::chrono::steady_clock::now(); } + if (alloc) { + std::free(frame); + std::free(old); + } + cap.setResize(small_dims[0], small_dims[1]); + frame = (char *) std::malloc(cap.get_dst_buf_size()); + old = (char *) std::malloc(cap.get_dst_buf_size()); + alloc = true; + + memset(old, 0, sizeof(*old)); + printf("\u001b[0;0H\u001b[48;2;0;0;0m"); for (int i = 0; i < curr_w * curr_h; i++) printf(" "); } + int ret = cap.get_frame(small_dims[0], small_dims[1], frame); + stop = std::chrono::steady_clock::now(); - elapsed = (int)std::chrono::duration_cast(stop - videostart).count(); - int frame_time = (int)std::chrono::duration_cast( - stop - start).count(); + elapsed = (int) std::chrono::duration_cast(stop - videostart).count(); + int frame_time = (int) std::chrono::duration_cast(stop - start).count(); start = std::chrono::steady_clock::now(); total_time = elapsed; @@ -268,13 +278,16 @@ int main(int argc, char *argv[]) { } if (curr_frame * period - elapsed > 0) - std::this_thread::sleep_until(std::chrono::microseconds(curr_frame * period - elapsed - frame10_time/frametimes.size())+stop); + std::this_thread::sleep_until( + std::chrono::microseconds(curr_frame * period - elapsed - frame10_time / frametimes.size()) + + stop); else { skip = (double) elapsed / (double) period - (double) curr_frame; - for (int i = 0; i < std::floor(skip); i++) cap >> frame; + for (int i = 0; i < std::floor(skip); i++) ret = cap.get_frame(small_dims[0], small_dims[1], frame); dropped += std::floor(skip); curr_frame += std::floor(skip); - std::this_thread::sleep_until(std::chrono::microseconds(curr_frame * period - frame10_time/frametimes.size()) + videostart); + std::this_thread::sleep_until( + std::chrono::microseconds(curr_frame * period - frame10_time / frametimes.size()) + videostart); } printf("\u001b[%d;%dH\u001b[48;2;0;0;0;38;2;255;255;255m fps: %5.2f | avg_fps: %5.2f | print: %6.2fms | dropped: %5d | curr_frame: %5d ", @@ -288,29 +301,25 @@ int main(int argc, char *argv[]) { prevpixel[2] = 1000; // If the frame is empty, break immediately - if (frame.empty()) { + if (ret < 0) { printf("\u001b[0mError reading video stream or file\n"); break; } - resize(frame, resized, Size(small_dims[0], small_dims[1]), INTER_LINEAR); - - if (refresh) old = resized.clone(); - r = -1; c = -1; - Vec3b *row[CHAR_Y]; - Vec3b *oldrow[CHAR_Y]; - for (int ay = 0; ay < resized.rows / sy; ay++) { - for (int x = 0; x < resized.cols / sx; x++) { + char *row[CHAR_Y]; + char *oldrow[CHAR_Y]; + for (int ay = 0; ay < cap.get_height() / sy; ay++) { + for (int x = 0; x < cap.get_width() / sx; x++) { for (int i = 0; i < CHAR_Y; i++) { - row[i] = resized.ptr(ay * sy + i*skipy); - oldrow[i] = old.ptr(ay * sy + i*skipy); + row[i] = frame + (ay * sy + i * skipy) * 3 * cap.get_width(); + oldrow[i] = old + (ay * sy + i * skipy) * 3 * cap.get_width(); } for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) for (int k = 0; k < 3; k++) - pixel[i][j][k] = row[i][x * sx + j*skipx][k]; + pixel[i][j][k] = (unsigned char) (*(row[i] + (x * sx + j * skipx) * 3 + k)); diff = 0; if (refresh) { @@ -319,15 +328,20 @@ int main(int argc, char *argv[]) { for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) for (int k = 0; k < 3; k++) - diff = std::max(diff, std::abs(oldrow[i][x * sx + j*skipx][k] - pixel[i][j][k])); + diff = std::max(diff, std::abs( + (unsigned char) (*(oldrow[i] + (x * sx + j * skipx) * 3 + k)) - + pixel[i][j][k])); } if (diff >= diffthreshold) { - for (int & case_it : cases) case_it = 0; + for (int &case_it: cases) case_it = 0; - for (int k = 0; k < 3;k++) { - for (int case_it = 0;case_it < sizeof(cases)/sizeof(cases[0]);case_it++) { - min_fg = 256; min_bg = 256; max_fg = 0; max_bg = 0; + for (int k = 0; k < 3; k++) { + for (int case_it = 0; case_it < sizeof(cases) / sizeof(cases[0]); case_it++) { + min_fg = 256; + min_bg = 256; + max_fg = 0; + max_bg = 0; for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) { if (pixelmap[case_it][i * CHAR_X + j]) { @@ -344,7 +358,7 @@ int main(int argc, char *argv[]) { mindiff = 256; case_min = 0; - for (int case_it = 0;case_it < sizeof(cases)/sizeof(cases[0]);case_it++) { + for (int case_it = 0; case_it < sizeof(cases) / sizeof(cases[0]); case_it++) { if (cases[case_it] < mindiff) { case_min = case_it; mindiff = cases[case_it]; @@ -359,7 +373,8 @@ int main(int argc, char *argv[]) { for (int k = 0; k < 3; k++) { int bg_count = 0, fg_count = 0; - pixelchar[k] = 0; pixelbg[k] = 0; + pixelchar[k] = 0; + pixelbg[k] = 0; for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) { if (pixelmap[case_min][i * CHAR_X + j]) { @@ -377,23 +392,23 @@ int main(int argc, char *argv[]) { } if (diffbg < CHANGE_THRESHOLD) { - for (int k = 0;k < 3;k++) pixelbg[k] = prevpixelbg[k]; + for (int k = 0; k < 3; k++) pixelbg[k] = prevpixelbg[k]; bgsame = true; } else - for (int k = 0;k < 3;k++) prevpixelbg[k] = pixelbg[k]; + for (int k = 0; k < 3; k++) prevpixelbg[k] = pixelbg[k]; if (diffpixel < CHANGE_THRESHOLD) { - for (int k = 0;k < 3;k++) pixelchar[k] = prevpixel[k]; + for (int k = 0; k < 3; k++) pixelchar[k] = prevpixel[k]; pixelsame = true; } else - for (int k = 0;k < 3;k++) prevpixel[k] = pixelchar[k]; + for (int k = 0; k < 3; k++) prevpixel[k] = pixelchar[k]; for (int k = 0; k < 3; k++) for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) { if (pixelmap[case_min][i * CHAR_X + j]) - oldrow[i][x * sx + j*skipx][k] = pixelchar[k]; + *(oldrow[i] + (x * sx + j * skipx) * 3 + k) = (char) pixelchar[k]; else - oldrow[i][x * sx + j*skipx][k] = pixelbg[k]; + *(oldrow[i] + (x * sx + j * skipx) * 3 + k) = (char) pixelbg[k]; } if (r != ay || c != x) { @@ -424,12 +439,10 @@ int main(int argc, char *argv[]) { printtime = std::chrono::steady_clock::now(); fflush(stdout); - printing_time = (int) std::chrono::duration_cast(std::chrono::steady_clock::now() - printtime).count(); + printing_time = (int) std::chrono::duration_cast( + std::chrono::steady_clock::now() - printtime).count(); total_printing_time += printing_time; } - - // When everything done, release the video capture object - cap.release(); } else { printf("\u001b[0mfile not found\n"); fflush(stdout); diff --git a/src/video.cpp b/src/video.cpp new file mode 100644 index 0000000..9a6981a --- /dev/null +++ b/src/video.cpp @@ -0,0 +1,151 @@ +// +// Created by orange on 24/2/22. +// + +#include "video.h" + +video::video(char filename[], int w, int h) { + int ret; + errbuf[0] = '\0'; + ret = avformat_open_input(&inctx, filename, nullptr, nullptr); + if (ret < 0) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to avformat_open_input(%s): %s\n", filename, errbuf); + return; + } + + ret = avformat_find_stream_info(inctx, nullptr); + if (ret < 0) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to avformat_find_stream_info: %s\n", errbuf); + return; + } + ret = av_find_best_stream(inctx, AVMEDIA_TYPE_VIDEO, -1, -1, &vcodec, 0); + if (ret < 0) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to av_find_best_stream: %s\n", errbuf); + return; + } + vstrm_idx = ret; + vstrm = inctx->streams[vstrm_idx]; + + codec = avcodec_alloc_context3(vcodec); + ret = avcodec_parameters_to_context(codec, vstrm->codecpar); + if (ret < 0) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to avcodec_parameters_to_context: %s\n", errbuf); + return; + } + + ret = avcodec_open2(codec, vcodec, nullptr); + if (ret < 0) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to avcodec_open2: %s\n", errbuf); + return; + } + + src_width = codec->width; + src_height = codec->height; + + if (w == -1 || h == -1) { + dst_width = src_width; + dst_height = src_height; + } else { + dst_width = w; + dst_height = h; + } + + frame = av_frame_alloc(); + decframe = av_frame_alloc(); + pkt = av_packet_alloc(); + + setResize(dst_width, dst_height); + + opened = true; +} + +double video::get_fps() { + return av_q2d(vstrm->r_frame_rate); +} + +int video::get_width() const { + return dst_width; +} + +int video::get_height() const { + return dst_height; +} + +int video::get_frame(int dst_w, int dst_h, const char* dst_frame) { + int ret; + // read packet from input file + if (dst_w != dst_width || dst_h != dst_height) return 1; + do { + if (!end_of_stream_pkt) { + ret = av_read_frame(inctx, pkt); + end_of_stream_pkt = (AVERROR_EOF == ret); + if (end_of_stream_pkt) avcodec_send_packet(codec, nullptr); + if (ret < 0 && ret != AVERROR_EOF) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to av_read_frame: %s\n", errbuf); + av_packet_unref(pkt); + return -1; + } + } + + if (!end_of_stream_pkt && pkt->stream_index == vstrm_idx) { + ret = avcodec_send_packet(codec, pkt); + if (ret < 0) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to av_send_packet: %s\n", errbuf); + } + } + + ret = avcodec_receive_frame(codec, decframe); + if (ret < 0 && ret != AVERROR_EOF && ret != AVERROR(EAGAIN)) { + av_make_error_string(errbuf, sizeof(errbuf), ret); + fprintf(stderr, "fail to av_receive_frame: %s\n", errbuf); + } + end_of_stream_enc = (AVERROR_EOF == ret); + + av_packet_unref(pkt); + } while(ret == AVERROR(EAGAIN) && !end_of_stream_enc); + if (end_of_stream_enc) return -1; + + sws_scale(swsctx, decframe->data, decframe->linesize, 0, decframe->height, frame->data, frame->linesize); + //char *it = (char *)dst_frame; + av_image_copy_to_buffer((uint8_t *) dst_frame, get_dst_buf_size(), frame->data, frame->linesize, dst_pix_fmt, dst_width, dst_height, 1); + //printf("copy %p\n", dst_frame); + return 0; +} + +bool video::isOpened() const { + return opened; +} + +void video::setResize(int w, int h) { + dst_width = w; + dst_height = h; + swsctx = sws_getCachedContext(swsctx, codec->width, codec->height, codec->pix_fmt, + dst_width, dst_height, dst_pix_fmt, SWS_BICUBIC, nullptr, nullptr, nullptr); + if (!swsctx) { + fprintf(stderr, "fail to sws_getCachedContext\n"); + return; + } + + if (alloc) av_freep(&frame->data[0]); + av_image_alloc(frame->data, frame->linesize, dst_width, dst_height, dst_pix_fmt, 16); + printf("after av alloc %p\n", frame->data); + alloc = true; +} + +video::~video() { + av_freep(&frame->data); + av_freep(&decframe->data); + av_frame_free(&frame); + av_frame_free(&decframe); +} + +int video::get_dst_buf_size() const { + return dst_height*dst_width*3+50; +} diff --git a/tvp b/tvp index c2e6743c04201cb24be95e7957f5d35698506274..c802a40c83d098a3ff27fdd0a635973e3c012068 100755 GIT binary patch literal 43552 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 byo3%Y%ay#OekA$nKjj?sO$6hSfGYnJlZhEs literal 42848 zcmeHw4R{pQ_4jO&fe0iUDydXJw+c!`V>S>ZVk8T@Fe?kB1Qb7qWp|UTCc81a2?4cI zlUT=L6~9`w+VbyPt^I_yN|Arn1e74!Hln3etx{@nSFMexfS-AP=gz&G*Qx3kmPb*Te*OMQi;Jyaxx_y z^o7g8zSFR3hJg!cmSg3uu7^6pjnQ5Q?k~`FS#`nCPy0h;5#2OvxFSEi{z$q zxv5-Ez>NmCB%tso*+`#R+@Drhi#)n&*|#KF8|4+)R<8pP4 zh8`>IHpr5IqP(v`j{NekUcA|*rM$dc?J&swDImoOUFSB3SIwMpZgcRQ=5VCF^PJ9E zGtZehqdXQZuVndTR|P&KzF_fkDQ}(BOEe*GlWYt>0W`YuI4<&ucN{+Cc9OsAJ5vXT zicV;L<j`z>opY(n@#_TIp|kFK{o!$ zIs9-ahdrOot;M-KXvIrP7kgWjEkzBY&c1v&Wtp2MHBa`1mA2fv)7 z+;?;MryK3%ur@mI#W~7-ItP714*HEb%H5oU|HnD_$L64;x>@bNA%}lnM7gJBsqcXt z_MD%i+`Dq{kIq4VJ%>HM9Q1p0=;_MA|6SB6TfaLpipK5Z!RH-g$kEdy1s;URS>J585 z!C;uIq%xhA7l(tP=sbUGyuB?nD;!(W8j6I1>566MpVt;@4*6ruKIVqZY@@zeGTLIE zrLcgU=E+|2^u|!!!>l^SD7cv_89z@|1D%~tr?YaEKNb$aqix|xqc>0=cRB-2{x&t< z<`2hX-hijxk1r2XS0AseP}O)-TXePB9Evo?o77NSTePiiVE~2%o9jAS0KqjwaD^is z{^oE{^|v*)w}c{bgA?UDD;mPhq1YNkM2oOxMyo&GRHgb5CL$W@<8bD0I0e*EAqB5ce{P92&^JS*u3|)q0 z&grVRrL`FW-5f$R2bw)~i|Z@ZDn@1PQ6HZffQus0>FULm&PvqKA6%m%6a&{xk3?5f zG^mZ8ooZ{SEf$TyJ@GYaM}^_ISs8{>0IHFYa5n27UtpkfhPp_NwL+m9Kxc@txQnc& zHi5@89Xae^QOAEZ5~@*1pe^K&qr0>~H*;fKi22v3L^?*I?Qu2QptkuVjUm?Zj5ibs zrX7yjREsJ%M;j4{!vVECvN{abrJ)!?M`~zjZjUud5q~5aYYv54rC7KT&Xdq7V=w{{ z5V%GSG+m=M_`{4!Q7j>>{ApY9uN(w4#&58@Qf^Fg4!VkQ58WJ65$fkYr1=19-fR)dGB2%TwQ?(W=EC zj!3|x7!v{=YNNk3OpE#%6;&o`EFMNAq9-1k(RG_-|6@ind4a@yCfU30ANreH%BVnY@y!Yz$zlRwsUEIUFV6p2x<#TXfh zHALI8*o%9&5XOjDpe@`QkG37Fr6mwJmUwMD8xD@mXhXDQX%tLpS$G>)Wnqm$GXgJ* zPiRsOWr-hzaeII!vLM2^u_;SCA|PWSwLP*L=Cx)G+T5)iZH+fHM^_(feyqKX8XNs3 zS5JW31J`6Nt_gNFwrA;AL4O>k#W9DWN_<~OR1zBupn4ZN} zlutuYAdBC>sEQaLj6DP; zn(I}a<MhbHN_LIZdQp=a3 z93K}B7m-J=^=w3@) z11388NnHC(^e+n{;C>T*iiw^y(a$l_2Tk;IP4uHCy3<4-H)qEp%8sx{Hc*Wyx4biReo zvg%B9(Posf!bBH)u|!{Kq9feWSCfg(LyG0Kn&@NF+>+F3q9YK~*E$ouI8DX=tch+n z(KndrV@>pXP4p8@^o=Gu?IVlp5fi;s5CJ!v=qH)zTTS%wCVH=l{uL8_mx+F|i9TSW zV|OEc?K9EEvmDCYZ=%y)v$&Eb`YD14IB24uYN8)C(H$nb#N(f0r8aoqZii- z6TMsz0au#n6()LkFP4rF^Jw3r8f1Qb5W#YfZM4xG*Z!po%Gtuug(Px?H z$CJlBaNGm`xd-02pYpNN^-iIp%Y9KvQhIvhc|!wA*VBbNnDU{j10WAgc>~|}Q)`hT zyovHs`-gB%d6{rp8l(mozK3vH5~O+=zMF7b3ZynOd^_Q^1W0XU_%_06>Q8N8_%8{k zDL=K2;XfvvhVfJ@!@o~BP4TIf48Nann%Yx!48N0bn$lCX48N6dn#xlZ48MtRn!-~K zhOZ@@rtVY;!`ld_DLW-G{A$AOgb#iW!jx5nmk_?6;g=CUmhb_FFD0CoT&Z4$Uqm=f z-KotCpG!DR*{O{TKc8@#s#6;nUP(AD6;taNeiq?0Wv5yhej4F4Ri{=m{A9vuicZxr z{7Zz>)SRki_$b0@N={WUJdbdiic=1Te;ff$Q*f$;;fDyPsW&At{4K(1%1sS^M)f~H zxP$Qh41bw$nqpG}4BtaIO|7Y3hVLevrqtAChHodFrqa|#hHoQ$3gH_V{!7AXN=>a} z_>T#vsWjEf@b42&Q)p@>!|x}Yrp{Cy!|x=Vrp#0=!*3;=rpi;cbMM6D~3QYQoPYeDG7&{)E$%ncC0ro0=u5fv-X&DLDa7OMVNCiuO$M>kR%Q zIRZrVuwTRVieB>wfy9hwphHT2f`#4A(`OGB*imnnZ>nG`zrbq`>2F&qUld; zrgSH%&|Xhc`-=R#QA3~hW^y8EU9+Y3e780odDLZm)o;d26uqaFR3ut$Ox~vrB?n25 z-o8%hIUFzaX-AS#Lt$2-dA!j7W>7AOd)KEO0K*?3ksSPl>iLgkCxh=Q`Z*)OLku9k z2%-=0at4_guqOyhoU^y?uuPd3vdjZM?OhVt2&}>WkKU(hVHg}g1}#e$k|!WZV~o8_ z9)%>pi3XTxfGGgUR#x@Wzn~IN;T9Cu%D+WgNsPOPB17pqa8yZ5EJ-TN4fzdko~G%hwNwfX>t)Y`exFj z$=AYIE{eE$d(mOJOO}vt>ykf2mMyvK2=mL=U}(R5B1ov}P`@nml+xdmgefRgO5Q*! z6Za7Q%?2gb=!Z{sqMWWRKPe71nmFD0LC z$L9r2K8H#wordq8J@)RGFwOSB`OgEct0{ppX{Y?&MTcdZz57!j2&_AB5X{-TQ+~gZ z-1F{X8aD>Os8{_C-(dJ(xZ8q{USc_~`3}o^)vNeM&M%CdZImN-Ltd}?xsme}a_&1) z69-M})8z+1z3<3J+IHw!4{kKOyx!pa3X0!KBSJF9GbW(&P(GY-88Q&{F(^weMoTx? zqf;J6cd(Z|L^1vLsALnh->ic6aflL%Sq1&D8=Pp<_<`ir6djs84b@3rWu)y!)qaN? zMws-`hg5-Apx?ep-Urar`*nx&m8TqJ*7GcLyOH^8fUX_3>U}pJNS;Wlp8Wlh`oBK( zou?fbGnHvIl#imeGSH`JN0q*zIm)!6O++|?Ib}fUJ33M+JF3Z($pmee()ZCE%IW)f zq@um3ls%_C_y%g=(q2ve67}Yx^sJ&+?J#r)0d)Bwz7Zkv#|&O7H_T@EE=}$wHeG&* zKv%NBh?ueR&j_#HY41LYm78{o(zUZd(W;`L`t+i849J%P=tb8Nr(WYG8tl_c&!SXW zuiN$)7@zO$`pBjgT}(_}14GKRs_B&M`#ewS+dopV4Z`~-7S-sufy%L^Py0*iD(%&{vbh3PQmsvXJd_hGy)-voZ-J*OO& z`{l7g#4b4cOk)UCiSzq1p{%OPkU%Qh{&TM*vKO(J29Yr$v$_GP3>uQ?k zetQ+h zfZOP4iJl;CLs^$0Njj@{*>4*~CNL8G<$)!bMoFJLu>t~Qs!tzf-^A>Qvw5C`=$@`$O5kX|{0yTN{TMVb4Ji4g zb0}N8ht?53ZTBMkrlc?boU;rWsQwu(H^A0uNE}u2Yl@h}6SP2qPDIHSAo%Q?`tkWa zy7}KdKyCes_CzOGyn&B>wq5T0()m<$;({A}iGm9~_AP~OZ8U&l!(8-xH|k^GQk#d_ zs~_n_f$d8Y1+|M4V@6>4^c8K=77&rT)CN7D`_V3w9x+6`5GmToM0O+Z0P>b3#&{P6 z_FR;hSiB@LZmHY8<#eBIuUngP1K5BCP~wz!r0rWS&(kJFS?UyR($y?+l}(!zWT}ok zt?DYIaMx6A-vWl^X@(_f1}{<j zSmIinRyCHTym?yDXrz?HnDgyhz>t?__;emsfEW%Vbx~qW9%J}BBa?hs$$4|1<(mbtnD^j?@m}TDrhD~XPAEg=o7g84`#z~Cf z{xrkgX@=VjhC-ihU|r4AbE%(_uItjQ?P=C1OO5fuD%K^ zp?4uy>Dp1K$xl+M`aOG348s=2zbi5R-7e8RMM6GMYb<4Pw|m!B)R35N6H~@uXQN-f zl@q*Lug}yd9*&0=YS1B0q|+;b_WyG?sG{|(di(joZxG)pNjiT zmtOKXJwSBpmlRa*wlCi8Jd72rve(nI=SiY_^tv(jo+|LWt6y;IHx|0=OLn`f_rO#YA3YRXi;6Nz_EP4>-iwB*1 zkgsevoHxecbXV_%-4ryUc82rDr?X92P?ruGR*oS}L6a$6kwZEiG$v^ZnoMaWhjcn< zOwtrInbIqBNT-9wBuzn+DczYv+8i_{1r#(H3XGuXp+-P|M6T$ImY@+FJZJ=$DQE;o zrVew^WZ_8dq%E^V&1;uRlDDh30OQG=3$T(g#v*;rA}rK;G>l_>*wN%Sz=?5@zDr-C z@1niMg~TdLAR(q9M5|XMG88?ZrjbhG)8)e} zU`zkk=i(lcsq;98wv8b<`BCKLGYz?P8HSQB;?w1yr*-W^O6w2gC_*ZQLNZ}K8180y#aNsP3s!ZbPZf$yvJts z*RWl~bsWKT?S%xj-F7%hlLvtr^~7x@Y+DC>B&B+`!YhXCZ_=q;euMxd$d4qe%N@Lo z-;bs;)~CyG5T85|IJLGeFGVVMNyDBoQjetV_-Q(o=`GSqb?ap1j$`HO^5DgoPg#)l z%NvnC0bJWAlPRo{NFa4DR2r#l)qNnHOAR$_jv=uzotw?DAEa~1K~y-ISPTVRP4|`G);Sh8ujthIgm=$hSr= zRl!J6706&Lh+Zh8g-dBAUbJ*R>pZO3wuATsY$Ez_O9r+@+JINXzNxXpoT&N=7_r51 z8EUsv9uGuXq`ikh%MX#A@(3beZS^`Zy87im^Aw0Lr-}P`3Om*-Q3lpnbpTpoAHLn% zgK+?__6hF&Rv_ilKE%js?>UO7)TcXpozJ?Sq-wAYdA9NH(wtpSum-aCYzJ3<469#d%Rj5fZj-v+Wf?EesVD5KZj*pAo!^X zh`*4LF|Bj`>jeK_&{^|i%LG3)Bk})+kyobqsiB$vdss%Z;HOX^{#HirO!HH)F#h?J z@vCk)Lx}u_i%eiS^nflcMPbLJ-oO7Y7NID0;>J(C=Sl*-QJnVhC zH0)_ zZ$|+Z@CDv#?BI+-u|~{c`;&sht-bBmQre`?!0Famh~WNyA98#;3sg-$h%BGZBFd+; z(CIpwXTR+YxB^A2M6QyU^z7FFbcAreE-wd3lb-^m>mxAUZZMu{Fm5n0PGpQXGs+XR zQGxv<+I{div1gZ{O$H^v22Oq}sFyA#-oE`KTzWx)%f9JFC9nrKuuFZmw`iFcz~thw zZ^`op`rNk^Wq2-2@b}Oa(+2=8Wr!-nS(~9iFP#YiY+vm_IYx~aSv6c=Fi}`=tx1Dk8ifMXcp|qz z)Yy@(@gY{@=@~-j8$xda7&U$jDN~In8#RU~YD}*T3ybyAp~bAm-CUH{_(7nS8c$Vh zM$r#v$UkMsySe;uBVT4!aecwrOa)B1EJMZhP=P9!aTTJ<73nJPW>ub;A+*2{`T)SF z@^+-sRdyH5FsjT%d-h>$L6t`saXAK@XsSE7D6jI5fo4?s`hr=C4f2>EZqJZ^ei4)Z z8kZlga-&s+yWj$*qPKmaM<3zp>a&prUOY{p(aF{IQNF$V9#jh(_0u4mIt6<^`CV)z z?8AsJrQXA1%ls}jY#M~8LGb8#Z~ux~Fx5;W1tm^55+hQt)1Zo)rv6JLmW#v~k=TWs z0mgHyNX!w5!!Uql{Zb_2A~97YUdMd`k4@nL=!n?(%5 zV?>zO$+LBaHFK0foY(@7;L|jt$0$d$qtZG%aDtCs}SNa>JEUN^27MXgBWA_I(!kS zTnADr1kZ!_9Z``QS*5Xcwec80>!H<(-eU;T$_Vo)7d*rSX)&R(g|G3XLF=LQip~nrdT4EAl&@Z2E)L zF83XIf|hT1oVGr45GNkw8_!0wB@g_G76Uau@uC<_z8hL)6n^az+ zW+FXlqEYfX;B{cm2lI-{QmcsF*p>Ea2kDg5?mvQ}y#|?H*qxls(ASgG5yq*yzYRZ= zb-scpa=)X8_jo3MRUbVR0|C$CuK+$)-hp!7K4tja!t`^X>=Y=Yr)>`-6AzN zC4e)&&bQYo7UOd8GNhv%$J!D_Oj$iPq z6x|EDCg(AJBS(|Ff#ETE3yIK^PCRSHL#{IjomP4#0eYZ`C$5TZFETz;Knd(Z-d|Zt zo+wysd+}t}`W*I2=IrhCDE7AY1Jn-t9+!6CKU*mqQ0`NXe8dhx(broz`}B;xj6HdL zyExf^#>5E#drvJ14W9z|I`q*gfY(xIQbyvjHxQU;+4(Rg`3o#!-TFg}q*nz%O8sL$ zmASoZzYRXgeuXKbe9Zd2>ofGQ!Z6qI?di)isUxPt$PwVLv*8CeaQYz+AipM)_hV>lOOk> z-0C;&-H(ukrZa=?KcKtZ1tLG!=dPA}z-#Y$`c-5+`5H?91?sEMf^Eq+VF#WB=`}wG z3m#CMIgV`ZLodC7a*F27XA6{B0I5#MBXSZocY+BVv%vw$Wsppsi$ZZIYCIH!vi&4dwPzX^n!KY@qYo z&cA!L7p_upsIcpe!8)9)l<96558-|pPZGHmh& zoUi;0CtKgg$=30vBbDySm~Z<>q8_ARH5BxZU`T(#WRxl;AB8%!=;S7 zyC>&q9voyVn5^Y1I#l7zq;XcWeKyW{j=vlZ6cLh~27`=V=!XW@3#XzuH0XbokT0kg z9vQ%KiN}()0Ip?T?bGG;iatl_8H#(oP_KCPD<)4>5>16l^`AQ&M*AxIY}WVaIb-rX z@b)8F2Z{L}A%VSGaHhQ?W>OB~9yOG@}DBp>#Zx_@Ltv+I`>QX}YdeA<4TSHt+h4u6&P z(fO~A%h++|Ax?J{(kQx{zIxMVnS1SH=T$HgM%O+d zwZq4b>HO}Fh7G>NwRsB@1vBZO*f*b|X6o6)4hSlC&vswp`aB#m!m+v}9>~6j+=~(y zdk_OFjvl9*iX(_&M7T0r4dKy9$j!l~=A^TvD8V8n;UG|p-xb00Ey zAahpgWlRASkG`@)-ma$$v6S#7X5fs@0kWa`aK}l$>Vxrn$eN2#^4q%Tk09H-*P?yB zi5m)We9dP&lAH>TR0C*e|3%gP9dh#K-(o^~fvSwRUPv6J+tLQ3iTEI)p#^A$c`vSZBey0tf5L*rgY=e42V zw!dXebw+ylowaNGmOJ#gFu$31Y|1IImZ+ylow@c*9&Z0vNJ zBu%)yqGiJ6Q-ZUn1eJz1e@iHKzGF&N@N7r0E!x@|3UbU5kH-DYj(E5wM3nN%hS=E- z2m3)r{1jXU-SHn>6E2@qS=B_|To8)KndYXDgMJ*=K|d@R3Oc4v36{Zv80~}7MfSI{ zA995?QTkyuM;s#TCnHfChd;*gwpiQ|rXQAdh+jiZ%X{coR2}rokW?c3aW)72ilo2A z0XnIoatt5g*ZNxMmnR)TxB|aJ7>&dnVU!V#I$|yOZPTxkg=afp<$vIYwCE@)OL^xz zrml8OnSoN82$V5bu(mT9bw26H!WRtVCrbTmGC8yGiTX~se8#NVm9s0@-*ie=R#k~l z3(9C{MZ_2(0qlBw{2h(zu~Zf-#5ohe(-Pyn=_sS1Vzf z_(ko;>}QRK7@y6mAh4DxF%|^)GXDqC0{A&R zkc^*VMYIIZKR+0{wmsx%MtFtV5On^Cqs8B;Qt(bK!>^J?!w4dTH+~N_fM0`*G_od2 z*KA6|D9Px64*WEyBNl=I=zVY)G7#mnD-?5Ew4@^viHs^zr6yc{Og*WiP$;vSG(_9+ z`*{D!h0P>(JT?~;x<&rKi~ln@q3@r;|0zAza{j0E{xdzf@^jIxcK)ll&?lf(PSF1y zXx2e;=IdX#(n9W^;Rn9eEgksQ27KM#SJ64>k@9mOT{i^pGNAHBM8oiyj<*=J3kd>W`s{tCcC)TxjN{30cBe5ek0 z6U|**Li%pO=clO8l|-9cT(UmTT|EBgd{?oft02!cs(8GsxMXf|;iAzlku>b<1^Y{o zt0Xz_bmcXSDlYVbtx%c@(tdn?fU-6NQvS`Pw<~`^aYbH}p%t7LjmCc}!mmf7-n*dd zMdF1GiM+YRxQeHC$?oFXJpZWTsjv!WfCCmS94#qeS0LLA|4%^sNWS8d z+e!Ae{JF)BM8VwRsq1A|amCFe+{LrHMv|7Tql#yN07&b3_I*&n>o#UYN!Q4m^VW|@$hQ^TPN6j(ABv3` zu;FpQf=}_qFE=0^Q5=sL$8t-O=9ACigWIUR5(OUextn~hkk1zs*G95=oc&g50Sc>y z9y|q2Uqjz1wT(XQ=cwHKHn}U`hQtk&IrN>c*v826sQiU;opd=QLgZ#(EW08b%dBS(0m1IImZ+ylowaNGmOJ#gFu$31Y| z1IImZ+ylowaNGm`_dFo}UxxVq7~=n7h#S-*elsob(=GUg7JP*Tk6Q3sEciwX{)7ep zg9U%ff}ens&vXg<&a~hcSn#D5yxD?xS@3%;_|GhOzXgBCf)|api9_Y#~sPdOqc)3kWnAOisQemeuLaFJPTmBuxpUx z5uX1M$GLf|%>Ng@#Q&AI+A`B&Q08-ZF^3Htc5rwzhu`AxVGg%&xRb-Z93JHGFoz?) zDzWR!9G=19Ob+LBcrk|!9CmPcGl$>e@L>+OaJZAhy&N9o@GyrX*i#Kj`Z9-Sa5$60 z`5a!%VFQO99Nx^~w>W&5!z~={ zfZO5VnbfVa@lVP@KLhkUJT(*R4tfSc*Ajee_diM$jNRIjOb8Wd5l4;lT-k{DM7KmC{hv(ut~D(E(hj$)h^{JHF3!1zy; z-nm+E4#RBq-8PcSMJqdo`6#uV>A@_)$6t|q4WpkVS;v()=roF3>(#^QR{QT|^e;(u zjY6{le**fK;7^GH1{Xc6qH8ng^nbOJJWj-T{sgBtaX*XkcPFR+#zG(9^vxFfA3^_; zQB=nF!5s9XT#s~@!7l9i4D{1re@UG|XU|2EbRbT%>7Sj0ei7(Y-={5hE@kwSrAPUA zA?mxF^FM0gUk7`#{hxCBzx7Oi+~{{g&lQ|*{r}}r(5YUVdA%s^>3R(GZ1sAb>-nk0 zo`ame(c-tk9D2rL+#x#$xE|r>DV)B~LO&PuZ1&XUpa*i$ug^ihHwXQvpp%{Jc)f%_ ze~*QR1FNZxyuA#sA+Cu(@8tBjFX$(6J>3>PeL2eg1Lxmr@$;*kUTD$t2B$kXoj0d+ zAq>vuw|{W{xJA#$pl9Qs2|eV8=PmZs@#L1qQCo z29SP{L(g_z?q*9nKEw4ZT)*%?y?RacdcYD_w11J!&O3O+|lqfS%27=jEW^nuGo$u74NzvxxuAj34u0z2UJCcU&*$ zzt`fQ=QzFAqKEcr$o@{wFYNyl(=S?M7}CCtV;D`R&IFzGB)NW}rxJ;5exUuGvG|i# z8Y)D+F3G`vHRC^7+RFQdi2vQ_XjJZgKF;)Vi{d%-JeY&No#~$-^>RPZe;OiH&*k9% za}Ih1>qp!O6KG=duZh5u-JsL_YaMSlFg;l3^L-L#3}iOu(Em%&Pdiq<^jpwrJh#sK zFN02g3-R_6U?;y3zvQ(ABAv(QUH&*q=X9Q2EG(Eq^u`vyyYe*pa1*3}0%oqn5< zE_OZ<5Y;vOV_CO<86EShi046Wzla~nzbbqVPOyi{1Ng`3K-9RuQ3^-GaS&Sk;YfL) zwN+9V_?FCd`BXL5zDo6~>SfOJ8bfhayp+HWw=WIXtCD(IecU%oRl`wI@h{7j2cpeE z2>WKWhC4&eEq)Yvna^1fX!5uD11KiOZ6UTmTRawT$B%3Tq+qBm)EJI|L5;Vlf#zr= z6hk$FQMIu-y2{_I2IJATnCfrulmbzDKO`OsVyh!7huQ#>RexKXe+~X?e7tRqaSUG# zwzssbfe1U4Z(u4_E`wE7=Pz|F@~EE0ZWUhO?piW`e!XXzy394#=K0;L+?>y+r zkVnPMgjn3)2G6P3n^8Rq*Q>afG7qqK2105BoDyx50{&P?#cL>1Fx=3=@OkIX!#}y7VN&X*GGGUpA;mf=sjh0oyAHusSzcw7c%G^T zIy;?CXQlaV3vZx4?sQU%tMN8}I3Du`Jg_9-@yv62>!+(8Pu;@6(uGJtOMSeuLRI5U zZPC?gb12dnZ&E|__6}H#@>Z-+r^7~a2U*hOZw--ZZnU%VV!R;~o#$_jx3?j>JWChX ztK=<@#9nYx#T!j3z3C(|jHTeQg>Y=9{H$ps}D-w?mdx_NacKZ1b2RAa<3 znIGe|6IFr3E9hO2*cx=9mYHbjcsqQt5Y7;7G^5oYZ}OOZT3$I*Vz1_`mKvC28ZydO z)m5<=1r36jf{b?~XNBR)Shx{yO<5!wTcQy|ggOs3E`|`JaaZ|+yrV@zqNzJF&8cSL z5B5;3i47xaV`ry|muF&86cvuIQ9CMX=dD=bn(I}a<HBdpsdQ2d&en4-GQ7C5AG2EiAhA6!R6qJB8N$mA9ybaVUt-=r%L8CT@R|U8i zXyDC|XPrBS7ul%2V;NboH4@8Z;T^yWJv4Yw#4){Uz>oOItbVY$uA{|7Dz7%2K0`P? z9AU3G!SRjlc)Klb?Nv1H#H4UE5YKGMmQYJev?G*Z9@-%s4N5JsMs*GK4)oTH{A_;2 zm_F^Vz9sq#u^)_^*%EyUhwMBK41hp;okBoJ$7 zbA~}?QxofLof3cR&aiN103&21I$gcE(piZv{I*z_#@F+b12lB=_l_J#4cXIQ`>2XV((o>GdNn?LLJ5&MLpbE zErP8%+87RGAH5kPylff@nqhs0-NxX&s=Yx%^aWbiq|0=&8ERqX7$=&H4Qo}Z4{HbK zbk&Qcff|IXv5*Kfd+HX~SE^Nvdd$ej8s0o=X3MlnA4u4-iC1$!G+#apT|DcTlp#K;p1#XI1yw4>7V za?WZQD*+1mS>b3*#jG8g;l&b&#yfLGxosizmt%(=HYT-&SX-I~AJot}lP@IWp}Mwc zBi=p^vmqT5_ZPd{IRiZk@3CSr7QjFr%e00jsxOvj<8?YNQ5^HoYE%QmKqRUn*8Fk2 z+Iy_4GW}p}a4Hs)!%SnqHzri4Q}xno$1Yl6a#E$bq&=RdVb-mxN0X|w`U(cw8sOg_ zWad>Kvsj`zEn{itoC&|RVw^-%Vr_@zvG<~-3u(>Q;ci{BOqJZ1lw+PNSF_Bdl2jgB z(-QZu0>oN}!6uOkN6?b3QaQV!XpFR%<6Ue_0P!^@(yI1wbMTySkdrVgpF_7C<;33P z$IMzDToXYN28_2EIUShJ(GnSmiaZREeiGoR*5Wx-rpL6l?lBjI+Y zh2~AVG5ZfMI(I>P0N55|*Ld7_(jx{Y!*gZ+>Z;g*CH>T6AS1Nj2v3!F9H29&Q6H>i}NG`UclwB4ahF5{eDn! ztDLTX+CW}Vl5gOUkI2tLo*xsD!k|%=Mfu|Vih$z03Ru`B_G<)wEfRD#M97QtAOe1! zGYb0!pMaE4XH5hy&YK9hpUac|WT&v7lcfX_R8=7_&btUG&bx^6g}kW$x4HaWu27tx z5m21BA$dA8WR?Ff(8wo3zvKWymxFy{rzrEXw*LdjHp@F427emzcobSnctXG*0yoRo zo^CJ*DC`yT0vC{;3z+4_c>@9eP$47@D9RPoEf#sPpDv&{cP03(_5Tf*7wsplv#rXpVmlu47w&C~{^bs(gVpo(e z&NWQs^5VRzXa*rC?D`30ss2KK*X>40yKXe#ECZy!g}i`v2%F{8=PlM5A{!~wbO|{D z$6MsZe)Gm}7(y#dvXm5Zf_w_(i6-n9&;5^bdFgM)e!Sp!hy;hH^YSg-L=y7Wy;HEW z%M3;A@+<~QZZfbzYFu2W;4={)VZRu^u$?<>JJRWk?;lr+2Npa-lq>kgB9X4UAOco? N*Fes;2v|_*e*=M^+5-Rp