From 3db8cd2e2e3937aba87757cc35d40e4ac800fecd Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Fri, 16 Sep 2022 14:29:46 -0400 Subject: [PATCH 01/14] naive scan --- INSTRUCTION.md | 64 ++++++++++++++++++---------------- stream_compaction/cpu.cu | 47 +++++++++++++++++-------- stream_compaction/cpu.h | 6 ++-- stream_compaction/naive.cu | 68 ++++++++++++++++++++++++++++++++++--- stream_compaction/naive.h | 2 +- stream_compaction/thrust.cu | 13 +++++-- stream_compaction/thrust.h | 2 +- 7 files changed, 147 insertions(+), 55 deletions(-) diff --git a/INSTRUCTION.md b/INSTRUCTION.md index 779f144..69d427c 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -29,8 +29,8 @@ on the implementation of scan and stream compaction. * The [slides on Parallel Algorithms](https://docs.google.com/presentation/d/1ETVONA7QDM-WqsEj4qVOGD6Kura5I6E9yqH-7krnwZ0/edit#slide=id.p126) for Scan, Stream Compaction, and Work-Efficient Parallel Scan. * GPU Gems 3, Chapter 39 - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html). - - This online version contains a few small errors (in superscripting, missing braces, bad indentation, etc.) - - We maintain a fix for this at [GPU Gem 3 Ch 39 Patch](https://github.com/CIS565-Fall-2017/Project2-Stream-Compaction/blob/master/INSTRUCTION.md#gpu-gem-3-ch-39-patch). If you find more errors in the chapter, welcome to open new pull requests to contribute. + - This online version contains a few small errors (in superscripting, missing braces, bad indentation, etc.) + - We maintain a fix for this at [GPU Gem 3 Ch 39 Patch](https://github.com/CIS565-Fall-2017/Project2-Stream-Compaction/blob/master/INSTRUCTION.md#gpu-gem-3-ch-39-patch). If you find more errors in the chapter, welcome to open new pull requests to contribute. * If you are still unclear after reading the steps, take a look at the last chapter - [Algorithm Examples](https://github.com/CIS565-Fall-2017/Project2-Stream-Compaction/blob/master/INSTRUCTION.md#algorithm-examples). * [Recitation slides](https://docs.google.com/presentation/d/1daOnWHOjMp1sIqMdVsNnvEU1UYynKcEMARc_W6bGnqE/edit?usp=sharing) @@ -116,8 +116,9 @@ Most of the text in Part 2 applies. Since the work-efficient scan operates on a binary tree structure, it works best with arrays with power-of-two length. Make sure your implementation works on non-power-of-two sized arrays (see `ilog2ceil`). This requires extra memory + - your intermediate array sizes will need to be rounded to the next power of -two. + two. ### 3.2. Stream Compaction @@ -159,6 +160,7 @@ Though it is totally acceptable for this assignment, In addition to explain the reason of this phenomena, you are encouraged to try to upgrade your work-efficient gpu scan. Thinking about these may lead you to an aha moment: + - What is the occupancy at a deeper level in the upper/down sweep? Are most threads actually working? - Are you always launching the same number of blocks throughout each level of the upper/down sweep? - If some threads are being lazy, can we do an early termination on them? @@ -199,11 +201,13 @@ Always profile with Release mode builds and run without debugging. * Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU. + * (You shouldn't compare unoptimized implementations to each other!) * Compare all of these GPU Scan implementations (Naive, Work-Efficient, and Thrust) to the serial CPU version of Scan. Plot a graph of the comparison (with array size on the independent axis). + * We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. * We use `std::chrono` to provide CPU high-precision timing and CUDA event to measure the CUDA performance. * For CPU, put your CPU code between `timer().startCpuTimer()` and `timer().endCpuTimer()`. @@ -215,11 +219,13 @@ Always profile with Release mode builds and run without debugging. even looking at the code for the implementation. * Write a brief explanation of the phenomena you see here. + * Can you find the performance bottlenecks? Is it memory I/O? Computation? Is it different for each implementation? * Paste the output of the test program into a triple-backtick block in your README. + * If you add your own tests (e.g. for radix sort or to test additional corner cases), be sure to mention it explicitly. @@ -238,24 +244,24 @@ The template of the comment section of your pull request is attached below, you * [Repo Link](https://link-to-your-repo) * (Briefly) Mentions features that you've completed. Especially those bells and whistles you want to highlight - * Feature 0 - * Feature 1 - * ... + * Feature 0 + * Feature 1 + * ... * Feedback on the project itself, if any. ## GPU Gem 3 Ch 39 Patch * Example 1 -![](img/example-1.png) + ![](img/example-1.png) * Example 2 -![](img/example-2.jpg) + ![](img/example-2.jpg) * Figure-39-4 -![](img/figure-39-4.jpg) + ![](img/figure-39-4.jpg) * Figure-39-2. This image shows an naive inclusive scan. We should convert this to an exclusive one for compaction. -![](img/figure-39-2.jpg) + ![](img/figure-39-2.jpg) ## Algorithm Examples @@ -284,24 +290,24 @@ The template of the comment section of your pull request is attached below, you + output - [1 1 0 1 1 0 1] - scan - + take the output of last step as input - + input + + take the output of last step as input + + input + - [1 1 0 1 1 0 1] + + output + - [0 1 2 2 3 4 4] + - scatter + + preserve non-zero elements and compact them into a new array + + input: + + original array + - [1 5 0 1 2 0 3] + + mapped array - [1 1 0 1 1 0 1] - + output + + scanned array - [0 1 2 2 3 4 4] - - scatter - + preserve non-zero elements and compact them into a new array - + input: - + original array - - [1 5 0 1 2 0 3] - + mapped array - - [1 1 0 1 1 0 1] - + scanned array - - [0 1 2 2 3 4 4] - + output: - - [1 5 1 2 3] - + This can be done in parallel on GPU - + You can try multi-threading on CPU if you want (not required and not our focus) - + for each element input[i] in original array - - if it's non-zero (given by mapped array) - - then put it at output[index], where index = scanned[i] + + output: + - [1 5 1 2 3] + + This can be done in parallel on GPU + + You can try multi-threading on CPU if you want (not required and not our focus) + + for each element input[i] in original array + - if it's non-zero (given by mapped array) + - then put it at output[index], where index = scanned[i] diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..d8b3ce7 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -1,4 +1,6 @@ +#include #include +#include #include "cpu.h" #include "common.h" @@ -17,10 +19,14 @@ namespace StreamCompaction { * For performance analysis, this is supposed to be a simple for loop. * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ - void scan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); + void scan(int n, int* odata, const int* idata, bool enableTimer) { + if(enableTimer) timer().startCpuTimer(); + int sum = 0; + for (int i = 0; i < n; i++) { + odata[i] = sum; + sum += idata[i]; + } + if (enableTimer) timer().endCpuTimer(); } /** @@ -28,11 +34,15 @@ namespace StreamCompaction { * * @returns the number of elements remaining after compaction. */ - int compactWithoutScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; + int compactWithoutScan(int n, int *odata, const int *idata, bool enableTimer) { + if (enableTimer) timer().startCpuTimer(); + int count = 0; + for (int i = 0; i < n; i++) { + if (idata[i] != 0) + odata[count++] = idata[i]; + } + if (enableTimer) timer().endCpuTimer(); + return count; } /** @@ -40,11 +50,20 @@ namespace StreamCompaction { * * @returns the number of elements remaining after compaction. */ - int compactWithScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; + int compactWithScan(int n, int *odata, const int *idata, bool enableTimer) { + if (enableTimer) timer().startCpuTimer(); + std::unique_ptr booleans{ new int[n] }; + std::unique_ptr scanResult{ new int[n] }; + for (int i = 0; i < n; i++) { + booleans[i] = idata[i] != 0 ? 1 : 0; + } + scan(n, scanResult.get(), booleans.get(), false); + for (int i = 0; i < n; i++) { + if (booleans[i] == 1) + odata[scanResult[i]] = idata[i]; + } + if (enableTimer) timer().endCpuTimer(); + return booleans[n - 1] > 0 ? scanResult[n - 1] + 1 : scanResult[n - 1]; } } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c047..a4b7fb2 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,10 +6,10 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, bool enableTimer = true); - int compactWithoutScan(int n, int *odata, const int *idata); + int compactWithoutScan(int n, int *odata, const int *idata, bool enableTimer = true); - int compactWithScan(int n, int *odata, const int *idata); + int compactWithScan(int n, int *odata, const int *idata, bool enableTimer = true); } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..552a099 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -1,8 +1,12 @@ +#include #include +#include #include #include "common.h" #include "naive.h" +#define BLOCK_SIZE 128 + namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -16,10 +20,66 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); + + __global__ void kernScanStep(int n, int offset, int* inp, int* out) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + if (idx < (offset + 1)) out[idx] = inp[idx]; + else { + int outValue = inp[idx - offset] + inp[idx]; + out[idx] = outValue; + } + } + + __global__ void kernScanFirstStep(int n, int* inp, int* out) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + else if (idx == 0) out[0] = 0; + else if (idx == 1) out[1] = inp[0]; + else out[idx] = inp[idx - 2] + inp[idx - 1]; + } + + void scan(int n, int *odata, const int *idata, bool enableTimer) { + int* devInp; + int* devOut; + cudaMalloc((void**)&devInp, n * sizeof(int)); + checkCUDAError("cudaMalloc devInp failed!"); + cudaMalloc((void**)&devOut, n * sizeof(int)); + checkCUDAError("cudaMalloc devOut failed!"); + cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy idata failed!"); + + if (enableTimer) timer().startGpuTimer(); + dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernScanFirstStep <<>>(n, devInp, devOut); + //cudaMemcpy(odata, devOut, n * sizeof(int), cudaMemcpyDeviceToHost); + //std::cout << "d0: "; + //for (int i = 0; i < 32; i++) { + // std::cout << odata[i] << " "; + //} + //std::cout << std::endl; + std::swap(devInp, devOut); + for (int d = 1; d < ilog2ceil(n); d++) { + //launch n-1-2^d threads; offset = 2^d; idxOffset = 2^d+1; + int pow2d = pow(2, d); + //fullBlocksPerGrid = dim3((n-1-pow2d + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernScanStep<<>>(n, pow2d, devInp, devOut); + //cudaMemcpy(odata, devOut, n * sizeof(int), cudaMemcpyDeviceToHost); + //std::cout << "d" << d << ": "; + //for (int i = 0; i < 32; i++) { + // std::cout << odata[i] << " "; + //} + //std::cout << std::endl; + std::swap(devInp, devOut); + } + if (enableTimer) timer().endGpuTimer(); + + cudaMemcpy(odata, devInp, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy odata failed!"); + cudaFree(devInp); + checkCUDAError("cudaFree devInp failed!"); + cudaFree(devOut); + checkCUDAError("cudaFree devOut failed!"); } } } diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 37dcb06..a2f1eb5 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -6,6 +6,6 @@ namespace StreamCompaction { namespace Naive { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, bool enableTimer = true); } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..d6abead 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -17,12 +17,19 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + void scan(int n, int *odata, const int *idata, bool enableTimer) { + if (enableTimer) timer().startGpuTimer(); // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - timer().endGpuTimer(); + + //int data[6] = { 1, 0, 2, 2, 1, 3 }; + //thrust::exclusive_scan(thrust::host, data, data + 6, data, 4); // in-place scan + //// data is now {4, 5, 5, 7, 9, 10} + + thrust::exclusive_scan(idata, idata + n, odata, 0); + + if (enableTimer) timer().endGpuTimer(); } } } diff --git a/stream_compaction/thrust.h b/stream_compaction/thrust.h index fe98206..a27ace2 100644 --- a/stream_compaction/thrust.h +++ b/stream_compaction/thrust.h @@ -6,6 +6,6 @@ namespace StreamCompaction { namespace Thrust { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, bool enableTimer = true); } } From 68d59337604f0c8b534152053f2eab6d712e3924 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sat, 17 Sep 2022 18:05:19 -0400 Subject: [PATCH 02/14] Efficient Scan when size <= block_size, the result is correct. --- src/main.cpp | 43 ++++++++++--- src/testing_helpers.hpp | 8 +++ stream_compaction/common.cu | 13 ++-- stream_compaction/common.h | 6 +- stream_compaction/efficient.cu | 107 +++++++++++++++++++++++++++++---- stream_compaction/efficient.h | 4 +- stream_compaction/naive.cu | 2 - 7 files changed, 152 insertions(+), 31 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..7dae4ee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 9; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -27,7 +27,7 @@ int main(int argc, char* argv[]) { printf("** SCAN TESTS **\n"); printf("****************\n"); - genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case + genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -67,19 +67,42 @@ int main(int argc, char* argv[]) { //printArray(SIZE, c, true); printCmpResult(NPOT, b, c); - zeroArray(SIZE, c); + //zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //int tmp[64] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 }; + //StreamCompaction::Efficient::scan(64, c, tmp); + + for (int i = 0; i < 512; i++) { + std::cout << a[i] << " "; + } + std::cout << std::endl; + std::cout << std::endl; + + for (int i = 0; i < 512; i++) { + std::cout << c[i] << " "; + } + std::cout << std::endl; + std::cout << std::endl; + //for (int i = 511-64; i < 512; i++) { + // std::cout << c[i] << " "; + //} + //std::cout << std::endl; + //StreamCompaction::CPU::scan(64, c, tmp); + //for (int i = 0; i < 64; i++) { + // std::cout << c[i] << " "; + //} + //std::cout << std::endl; //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - zeroArray(SIZE, c); - printDesc("work-efficient scan, non-power-of-two"); - StreamCompaction::Efficient::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + //zeroArray(SIZE, c); + //printDesc("work-efficient scan, non-power-of-two"); + //StreamCompaction::Efficient::scan(NPOT, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(NPOT, c, true); + //printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); @@ -137,7 +160,7 @@ int main(int argc, char* argv[]) { printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); diff --git a/src/testing_helpers.hpp b/src/testing_helpers.hpp index 025e94a..0f5440e 100644 --- a/src/testing_helpers.hpp +++ b/src/testing_helpers.hpp @@ -57,6 +57,14 @@ void genArray(int n, int *a, int maxval) { } } +void genArray(int n, int *a, int maxval, int seed) { + srand(seed); + + for (int i = 0; i < n; i++) { + a[i] = rand() % maxval; + } +} + void printArray(int n, int *a, bool abridged = false) { printf(" [ "); for (int i = 0; i < n; i++) { diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..71ca973 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -1,4 +1,5 @@ #include "common.h" +#include void checkCUDAErrorFn(const char *msg, const char *file, int line) { cudaError_t err = cudaGetLastError(); @@ -23,16 +24,20 @@ namespace StreamCompaction { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + bools[idx] = idata[idx] > 0 ? 1 : 0; } /** * Performs scatter on an array. That is, for each element in idata, * if bools[idx] == 1, it copies idata[idx] to odata[indices[idx]]. */ - __global__ void kernScatter(int n, int *odata, - const int *idata, const int *bools, const int *indices) { - // TODO + __global__ void kernScatter( + int n, int *odata, const int *idata, /*const int *bools, */const int *indices) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n || idata[idx] == 0) return; + odata[indices[idx]] = idata[idx]; } } diff --git a/stream_compaction/common.h b/stream_compaction/common.h index d2c1fed..367fbad 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -13,6 +13,8 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) +#define BLOCK_SIZE 128 + /** * Check for CUDA errors; print and exit if there was a problem. */ @@ -34,8 +36,8 @@ namespace StreamCompaction { namespace Common { __global__ void kernMapToBoolean(int n, int *bools, const int *idata); - __global__ void kernScatter(int n, int *odata, - const int *idata, const int *bools, const int *indices); + __global__ void kernScatter( + int n, int *odata, const int *idata, /*const int *bools, */const int *indices); /** * This class is used for timing the performance diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..7acfef1 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -1,4 +1,8 @@ +#include +#include #include +#include +#include #include #include "common.h" #include "efficient.h" @@ -6,19 +10,64 @@ namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { + PerformanceTimer& timer() { static PerformanceTimer timer; return timer; } - /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); + __global__ void kernUpSweep(int n, int log2n, int* inp) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + int num = n / 2; + for (int d = 0; d < log2n; d++) { + __syncthreads(); + if (idx >= num) continue; + int offset = 1 << d; // 1 << d is pow(2, d) + int idxWrite = offset * 2 * (idx + 1) - 1; + inp[idxWrite] = inp[idxWrite] + inp[idxWrite - offset]; + num /= 2; + } + //__syncthreads(); + //if (idx == n - 1) inp[n - 1] = 0; + //¡ü doesn't work when n is large ¡ü + } + + __global__ void kernDownSweep(int n, int log2n, int* inp) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + int offset = n / 2; + for (int d = 0; d < log2n; d++) { + __syncthreads(); + if (idx < 1 << d) { + int idxWrite = n - 1 - idx * offset * 2; + int tmp = inp[idxWrite]; + inp[idxWrite] += inp[idxWrite - offset]; + inp[idxWrite - offset] = tmp; + } + offset /= 2; + } + } + + void scan(int n, int *odata, const int *idata, bool enableTimer) { + int* devInp; + cudaMalloc((void**)&devInp, n * sizeof(int)); + checkCUDAError("cudaMalloc devInp failed!"); + cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy idata failed!"); + + if (enableTimer) timer().startGpuTimer(); + dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernUpSweep<<>>(n, ilog2ceil(n), devInp); + cudaMemset(devInp+n-1, 0, sizeof(int)); + kernDownSweep<<>>(n, ilog2ceil(n), devInp); + if (enableTimer) timer().endGpuTimer(); + + cudaMemcpy(odata, devInp, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy odata failed!"); + cudaFree(devInp); + checkCUDAError("cudaFree devInp failed!"); } /** @@ -30,10 +79,46 @@ namespace StreamCompaction { * @param idata The array of elements to compact. * @returns The number of elements remaining after compaction. */ - int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); + + + int compact(int n, int *odata, const int *idata, bool enableTimer) { + //int* devInp; + //int* devBools; + //int* devOut; + //cudaMalloc((void**)&devInp, n * sizeof(int)); + //checkCUDAError("cudaMalloc devInp failed!"); + //cudaMalloc((void**)&devOut, n * sizeof(int)); + //checkCUDAError("cudaMalloc devOut failed!"); + //cudaMalloc((void**)&devBools, n * sizeof(int)); + //checkCUDAError("cudaMalloc devBools failed!"); + //cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); + //checkCUDAError("cudaMemcpy idata failed!"); + + //if (enableTimer) timer().startGpuTimer(); + //dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); + //Common::kernMapToBoolean<<>> (n, devBools, devInp); + //kernUpSweep<<>>(n, ilog2ceil(n), devBools); + //cudaMemset(devBools +n-1, 0, sizeof(int)); + //kernDownSweep<<>>(n, ilog2ceil(n), devBools); + //Common::kernScatter<<>>(n, devOut, devInp, devBools); + //if (enableTimer) timer().endGpuTimer(); + + //cudaMemcpy(odata, devOut, n * sizeof(int), cudaMemcpyDeviceToHost); + //checkCUDAError("cudaMemcpy odata failed!"); + //std::unique_ptr indices{ new int[n] }; + //cudaMemcpy(indices.get(), devBools, n * sizeof(int), cudaMemcpyDeviceToHost); + //checkCUDAError("cudaMemcpy devBools failed!"); + //cudaFree(devInp); + //checkCUDAError("cudaFree devInp failed!"); + //cudaFree(devOut); + //checkCUDAError("cudaFree devInp failed!"); + //cudaFree(devBools); + //checkCUDAError("cudaFree devBools failed!"); + ////for (int i = 0; i < 32; i++) { + //// std::cout << indices[i] << " "; + ////} + ////std::cout << std::endl; + //return idata[n - 1] != 0 ? indices[n - 1] + 1 : indices[n - 1]; return -1; } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..6539d52 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,8 +6,8 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, bool enableTimer = true); - int compact(int n, int *odata, const int *idata); + int compact(int n, int *odata, const int *idata, bool enableTimer = true); } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 552a099..4ea8435 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -5,8 +5,6 @@ #include "common.h" #include "naive.h" -#define BLOCK_SIZE 128 - namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; From 7fecfebbefb439365f7692b511d968a312ccf9a4 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sat, 17 Sep 2022 18:22:52 -0400 Subject: [PATCH 03/14] work-efficient scan, power-of-two --- src/main.cpp | 38 +++------ stream_compaction/efficient.cu | 150 ++++++++++++++++++--------------- 2 files changed, 97 insertions(+), 91 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7dae4ee..c3809b0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,38 +71,28 @@ int main(int argc, char* argv[]) { printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //int tmp[64] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 }; - //StreamCompaction::Efficient::scan(64, c, tmp); - - for (int i = 0; i < 512; i++) { - std::cout << a[i] << " "; - } - std::cout << std::endl; - std::cout << std::endl; - - for (int i = 0; i < 512; i++) { - std::cout << c[i] << " "; - } - std::cout << std::endl; - std::cout << std::endl; - //for (int i = 511-64; i < 512; i++) { - // std::cout << c[i] << " "; + + //for (int i = 0; i < 512; i++) { + // std::cout << a[i] << " "; //} //std::cout << std::endl; - //StreamCompaction::CPU::scan(64, c, tmp); - //for (int i = 0; i < 64; i++) { + //std::cout << std::endl; + // + //for (int i = 0; i < 512; i++) { // std::cout << c[i] << " "; //} + //std::cout << std::endl; //std::cout << std::endl; + // //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - //zeroArray(SIZE, c); - //printDesc("work-efficient scan, non-power-of-two"); - //StreamCompaction::Efficient::scan(NPOT, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(NPOT, c, true); - //printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); + printDesc("work-efficient scan, non-power-of-two"); + StreamCompaction::Efficient::scan(NPOT, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 7acfef1..6accf8f 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -17,37 +17,20 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - __global__ void kernUpSweep(int n, int log2n, int* inp) { + __global__ void kernUpSweep(int n, int num, int offset, int* inp) { int idx = (blockIdx.x * blockDim.x) + threadIdx.x; - if (idx >= n) return; - int num = n / 2; - for (int d = 0; d < log2n; d++) { - __syncthreads(); - if (idx >= num) continue; - int offset = 1 << d; // 1 << d is pow(2, d) - int idxWrite = offset * 2 * (idx + 1) - 1; - inp[idxWrite] = inp[idxWrite] + inp[idxWrite - offset]; - num /= 2; - } - //__syncthreads(); - //if (idx == n - 1) inp[n - 1] = 0; - //¡ü doesn't work when n is large ¡ü + if (idx >= num) return; + int idxWrite = offset * 2 * (idx + 1) - 1; + inp[idxWrite] = inp[idxWrite] + inp[idxWrite - offset]; } - __global__ void kernDownSweep(int n, int log2n, int* inp) { + __global__ void kernDownSweep(int n, int num, int offset, int* inp) { int idx = (blockIdx.x * blockDim.x) + threadIdx.x; - if (idx >= n) return; - int offset = n / 2; - for (int d = 0; d < log2n; d++) { - __syncthreads(); - if (idx < 1 << d) { - int idxWrite = n - 1 - idx * offset * 2; - int tmp = inp[idxWrite]; - inp[idxWrite] += inp[idxWrite - offset]; - inp[idxWrite - offset] = tmp; - } - offset /= 2; - } + if (idx >= num) return; + int idxWrite = n - 1 - idx * offset * 2; + int tmp = inp[idxWrite]; + inp[idxWrite] += inp[idxWrite - offset]; + inp[idxWrite - offset] = tmp; } void scan(int n, int *odata, const int *idata, bool enableTimer) { @@ -58,10 +41,26 @@ namespace StreamCompaction { checkCUDAError("cudaMemcpy idata failed!"); if (enableTimer) timer().startGpuTimer(); - dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); - kernUpSweep<<>>(n, ilog2ceil(n), devInp); + + // up sweep + int num = n / 2; + for (int d = 0; d < ilog2ceil(n); d++) { + int offset = 1 << d; + dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernUpSweep<<>>(n, num, offset, devInp); + num /= 2; + } cudaMemset(devInp+n-1, 0, sizeof(int)); - kernDownSweep<<>>(n, ilog2ceil(n), devInp); + + // down sweep + int offset = n / 2; + for (int d = 0; d < ilog2ceil(n); d++) { + int num = 1 << d; + dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernDownSweep<<>> (n, num, offset, devInp); + offset /= 2; + } + if (enableTimer) timer().endGpuTimer(); cudaMemcpy(odata, devInp, n * sizeof(int), cudaMemcpyDeviceToHost); @@ -82,43 +81,60 @@ namespace StreamCompaction { int compact(int n, int *odata, const int *idata, bool enableTimer) { - //int* devInp; - //int* devBools; - //int* devOut; - //cudaMalloc((void**)&devInp, n * sizeof(int)); - //checkCUDAError("cudaMalloc devInp failed!"); - //cudaMalloc((void**)&devOut, n * sizeof(int)); - //checkCUDAError("cudaMalloc devOut failed!"); - //cudaMalloc((void**)&devBools, n * sizeof(int)); - //checkCUDAError("cudaMalloc devBools failed!"); - //cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); - //checkCUDAError("cudaMemcpy idata failed!"); - - //if (enableTimer) timer().startGpuTimer(); - //dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); - //Common::kernMapToBoolean<<>> (n, devBools, devInp); - //kernUpSweep<<>>(n, ilog2ceil(n), devBools); - //cudaMemset(devBools +n-1, 0, sizeof(int)); - //kernDownSweep<<>>(n, ilog2ceil(n), devBools); - //Common::kernScatter<<>>(n, devOut, devInp, devBools); - //if (enableTimer) timer().endGpuTimer(); - - //cudaMemcpy(odata, devOut, n * sizeof(int), cudaMemcpyDeviceToHost); - //checkCUDAError("cudaMemcpy odata failed!"); - //std::unique_ptr indices{ new int[n] }; - //cudaMemcpy(indices.get(), devBools, n * sizeof(int), cudaMemcpyDeviceToHost); - //checkCUDAError("cudaMemcpy devBools failed!"); - //cudaFree(devInp); - //checkCUDAError("cudaFree devInp failed!"); - //cudaFree(devOut); - //checkCUDAError("cudaFree devInp failed!"); - //cudaFree(devBools); - //checkCUDAError("cudaFree devBools failed!"); - ////for (int i = 0; i < 32; i++) { - //// std::cout << indices[i] << " "; - ////} - ////std::cout << std::endl; - //return idata[n - 1] != 0 ? indices[n - 1] + 1 : indices[n - 1]; + int* devInp; + int* devBools; + int* devOut; + cudaMalloc((void**)&devInp, n * sizeof(int)); + checkCUDAError("cudaMalloc devInp failed!"); + cudaMalloc((void**)&devOut, n * sizeof(int)); + checkCUDAError("cudaMalloc devOut failed!"); + cudaMalloc((void**)&devBools, n * sizeof(int)); + checkCUDAError("cudaMalloc devBools failed!"); + cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy idata failed!"); + + if (enableTimer) timer().startGpuTimer(); + dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); + Common::kernMapToBoolean<<>> (n, devBools, devInp); + + // up sweep + int num = n / 2; + for (int d = 0; d < ilog2ceil(n); d++) { + int offset = 1 << d; + dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernUpSweep << > > (n, num, offset, devBools); + num /= 2; + } + cudaMemset(devBools + n - 1, 0, sizeof(int)); + + // down sweep + int offset = n / 2; + for (int d = 0; d < ilog2ceil(n); d++) { + int num = 1 << d; + dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernDownSweep << > > (n, num, offset, devBools); + offset /= 2; + } + + Common::kernScatter<<>>(n, devOut, devInp, devBools); + if (enableTimer) timer().endGpuTimer(); + + cudaMemcpy(odata, devOut, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy odata failed!"); + std::unique_ptr indices{ new int[n] }; + cudaMemcpy(indices.get(), devBools, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy devBools failed!"); + cudaFree(devInp); + checkCUDAError("cudaFree devInp failed!"); + cudaFree(devOut); + checkCUDAError("cudaFree devInp failed!"); + cudaFree(devBools); + checkCUDAError("cudaFree devBools failed!"); + //for (int i = 0; i < 32; i++) { + // std::cout << indices[i] << " "; + //} + //std::cout << std::endl; + return idata[n - 1] != 0 ? indices[n - 1] + 1 : indices[n - 1]; return -1; } } From 13d45906d91a968ccc168176e474711178f4c5a9 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 16:37:42 -0400 Subject: [PATCH 04/14] Radix Sort Something wrong with 0 values --- src/main.cpp | 26 ++++++- stream_compaction/efficient.cu | 128 ++++++++++++++++++++++++++++++--- stream_compaction/efficient.h | 2 + 3 files changed, 142 insertions(+), 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c3809b0..d763165 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 9; // feel free to change the size of array +const int SIZE = 64; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -115,7 +115,7 @@ int main(int argc, char* argv[]) { // Compaction tests - genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case + genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -150,7 +150,7 @@ int main(int argc, char* argv[]) { printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(count, c, true); + //printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); @@ -160,6 +160,26 @@ int main(int argc, char* argv[]) { //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + + printf("\n"); + printf("**********************\n"); + printf("** RADIX SORT TESTS **\n"); + printf("**********************\n"); + + genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; + printArray(SIZE, a, true); + + zeroArray(SIZE, c); + printDesc("radix sort, power-of-two"); + StreamCompaction::Efficient::radixSort(SIZE, c, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + for (int i = 0; i < 64; i++) { + std::cout << c[i] << " "; + } + std::cout << std::endl; + system("pause"); // stop Win32 console from closing on exit delete[] a; delete[] b; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 6accf8f..7ed33f4 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -33,8 +33,11 @@ namespace StreamCompaction { inp[idxWrite - offset] = tmp; } - void scan(int n, int *odata, const int *idata, bool enableTimer) { + void scan(int origN, int *odata, const int *idata, bool enableTimer) { int* devInp; + int log2n = ilog2ceil(origN); + + int n = pow(2, log2n); cudaMalloc((void**)&devInp, n * sizeof(int)); checkCUDAError("cudaMalloc devInp failed!"); cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); @@ -44,7 +47,7 @@ namespace StreamCompaction { // up sweep int num = n / 2; - for (int d = 0; d < ilog2ceil(n); d++) { + for (int d = 0; d < log2n; d++) { int offset = 1 << d; dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); kernUpSweep<<>>(n, num, offset, devInp); @@ -54,7 +57,7 @@ namespace StreamCompaction { // down sweep int offset = n / 2; - for (int d = 0; d < ilog2ceil(n); d++) { + for (int d = 0; d < log2n; d++) { int num = 1 << d; dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); kernDownSweep<<>> (n, num, offset, devInp); @@ -63,7 +66,7 @@ namespace StreamCompaction { if (enableTimer) timer().endGpuTimer(); - cudaMemcpy(odata, devInp, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(odata, devInp, origN * sizeof(int), cudaMemcpyDeviceToHost); checkCUDAError("cudaMemcpy odata failed!"); cudaFree(devInp); checkCUDAError("cudaFree devInp failed!"); @@ -80,17 +83,21 @@ namespace StreamCompaction { */ - int compact(int n, int *odata, const int *idata, bool enableTimer) { + int compact(int origN, int *odata, const int *idata, bool enableTimer) { int* devInp; int* devBools; int* devOut; + + int log2n = ilog2ceil(origN); + int n = pow(2, log2n); + cudaMalloc((void**)&devInp, n * sizeof(int)); checkCUDAError("cudaMalloc devInp failed!"); cudaMalloc((void**)&devOut, n * sizeof(int)); checkCUDAError("cudaMalloc devOut failed!"); cudaMalloc((void**)&devBools, n * sizeof(int)); checkCUDAError("cudaMalloc devBools failed!"); - cudaMemcpy(devInp, idata, n * sizeof(int), cudaMemcpyHostToDevice); + cudaMemcpy(devInp, idata, origN * sizeof(int), cudaMemcpyHostToDevice); checkCUDAError("cudaMemcpy idata failed!"); if (enableTimer) timer().startGpuTimer(); @@ -99,7 +106,7 @@ namespace StreamCompaction { // up sweep int num = n / 2; - for (int d = 0; d < ilog2ceil(n); d++) { + for (int d = 0; d < log2n; d++) { int offset = 1 << d; dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); kernUpSweep << > > (n, num, offset, devBools); @@ -109,7 +116,7 @@ namespace StreamCompaction { // down sweep int offset = n / 2; - for (int d = 0; d < ilog2ceil(n); d++) { + for (int d = 0; d < log2n; d++) { int num = 1 << d; dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); kernDownSweep << > > (n, num, offset, devBools); @@ -117,12 +124,13 @@ namespace StreamCompaction { } Common::kernScatter<<>>(n, devOut, devInp, devBools); + if (enableTimer) timer().endGpuTimer(); cudaMemcpy(odata, devOut, n * sizeof(int), cudaMemcpyDeviceToHost); checkCUDAError("cudaMemcpy odata failed!"); std::unique_ptr indices{ new int[n] }; - cudaMemcpy(indices.get(), devBools, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(indices.get(), devBools, origN * sizeof(int), cudaMemcpyDeviceToHost); checkCUDAError("cudaMemcpy devBools failed!"); cudaFree(devInp); checkCUDAError("cudaFree devInp failed!"); @@ -134,8 +142,106 @@ namespace StreamCompaction { // std::cout << indices[i] << " "; //} //std::cout << std::endl; - return idata[n - 1] != 0 ? indices[n - 1] + 1 : indices[n - 1]; - return -1; + return idata[origN - 1] != 0 ? indices[origN - 1] + 1 : indices[origN - 1]; + } + + // radix sort + + __global__ void kernCheckBit(int n, int bit, int* inp, int* booleans, int* invertBooleans) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + int boolean = (inp[idx] & (1 << bit)) == 0 ? 0 : 1; + booleans[idx] = boolean; + invertBooleans[idx] = boolean == 0 ? 1 : 0; + } + + __global__ void kernComputeIndices(int n, int totalFalse, int* scannedFalse, int* booleans, int* out) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + if (booleans[idx] == 1) + out[idx] = idx - scannedFalse[idx] + totalFalse; + else + out[idx] = scannedFalse[idx]; + } + + __global__ void kernRadixSortScatter(int n, int* indices, int* inp, int* out) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) return; + out[indices[idx]] = inp[idx]; + } + + void radixSort(int n, int* out, const int* inp, bool enableTimer) { + int* devInp; + int* devTrue; + int* devFalse; + int* devIndices; + int log2n = ilog2ceil(n); + int nForScan = pow(2, log2n); + + cudaMalloc((void**)&devInp, n * sizeof(int)); + checkCUDAError("cudaMalloc devInp failed!"); + cudaMemcpy(devInp, inp, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy idata failed!"); + cudaMalloc((void**)&devTrue, n * sizeof(int)); + checkCUDAError("cudaMalloc devTrue failed!"); + cudaMalloc((void**)&devIndices, n * sizeof(int)); + checkCUDAError("cudaMalloc devIndices failed!"); + cudaMalloc((void**)&devFalse, nForScan * sizeof(int)); // devFalse will be scanned + checkCUDAError("cudaMalloc devFalse failed!"); + + if (enableTimer) timer().startGpuTimer(); + + for (int bit = 0; bit < 32; bit++) { + dim3 fullBlocksPerGrid((n + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernCheckBit <<>> (n, bit, devInp, devTrue, devFalse); + + {// scan devFalse + int num = nForScan / 2; + for (int d = 0; d < log2n; d++) { + int offset = 1 << d; + dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernUpSweep <<>> (nForScan, num, offset, devFalse); + num /= 2; + } + cudaMemset(devFalse + nForScan - 1, 0, sizeof(int)); + + // down sweep + int offset = nForScan / 2; + for (int d = 0; d < log2n; d++) { + int num = 1 << d; + dim3 fullBlocksPerGrid((num + BLOCK_SIZE - 1) / BLOCK_SIZE); + kernDownSweep <<>> (nForScan, num, offset, devFalse); + offset /= 2; + } + } + + int totalFalse; + cudaMemcpy(&totalFalse, devFalse + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + //std::cout << totalFalse << std::endl; + if ((inp[n - 1] & (1 << bit)) != 0) totalFalse += 1; + kernComputeIndices <<>> (n, totalFalse, devFalse, devTrue, devIndices); + + kernRadixSortScatter <<>> (n, devIndices, devInp, devTrue); //temporarily store output into devTrue buffer + //cudaMemcpy(out, devTrue, n * sizeof(int), cudaMemcpyDeviceToHost); + //for (int i = 0; i < 64; i++) { + // std::cout << out[i] << " "; + //} + //std::cout << std::endl; + std::swap(devInp, devTrue); + } + + if (enableTimer) timer().endGpuTimer(); + + cudaMemcpy(out, devInp, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy devInp failed!"); + cudaFree(devInp); + checkCUDAError("cudaFree devInp failed!"); + cudaFree(devTrue); + checkCUDAError("cudaFree devTrue failed!"); + cudaFree(devFalse); + checkCUDAError("cudaFree devFalse failed!"); + cudaFree(devIndices); + checkCUDAError("cudaFree devIndices failed!"); } } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 6539d52..7012903 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -9,5 +9,7 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata, bool enableTimer = true); int compact(int n, int *odata, const int *idata, bool enableTimer = true); + + void radixSort(int n, int* out, const int* inp, bool enableTimer = true); } } From 995edd8e56e44496c52ff4c2895098cce6fcaa85 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 18:01:42 -0400 Subject: [PATCH 05/14] Finish Radix Sort --- src/main.cpp | 15 +++++++++------ stream_compaction/efficient.cu | 17 ++++++++--------- stream_compaction/thrust.cu | 28 ++++++++++++++++++++++++++-- stream_compaction/thrust.h | 1 + 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index d763165..6aa07cd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 64; // feel free to change the size of array +const int SIZE = 1 << 16; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -170,15 +170,18 @@ int main(int argc, char* argv[]) { a[SIZE - 1] = 0; printArray(SIZE, a, true); + zeroArray(SIZE, b); + printDesc("thrust sort, power-of-two"); + StreamCompaction::Thrust::sort(SIZE, b, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + printArray(SIZE, b, true); + zeroArray(SIZE, c); printDesc("radix sort, power-of-two"); StreamCompaction::Efficient::radixSort(SIZE, c, a); - printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(SIZE, c, true); - for (int i = 0; i < 64; i++) { - std::cout << c[i] << " "; - } - std::cout << std::endl; + printCmpResult(SIZE, b, c); system("pause"); // stop Win32 console from closing on exit delete[] a; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 7ed33f4..da86c9d 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -150,7 +150,9 @@ namespace StreamCompaction { __global__ void kernCheckBit(int n, int bit, int* inp, int* booleans, int* invertBooleans) { int idx = (blockIdx.x * blockDim.x) + threadIdx.x; if (idx >= n) return; - int boolean = (inp[idx] & (1 << bit)) == 0 ? 0 : 1; + int boolean; + //if (inp[idx] == 0) boolean = 0; // +0 and -0 + /*else*/ boolean = (inp[idx] & (1 << bit)) == 0 ? 0 : 1; booleans[idx] = boolean; invertBooleans[idx] = boolean == 0 ? 1 : 0; } @@ -214,19 +216,16 @@ namespace StreamCompaction { offset /= 2; } } - + int totalFalse; + int lastNum; cudaMemcpy(&totalFalse, devFalse + n - 1, sizeof(int), cudaMemcpyDeviceToHost); - //std::cout << totalFalse << std::endl; - if ((inp[n - 1] & (1 << bit)) != 0) totalFalse += 1; + cudaMemcpy(&lastNum, devInp + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + if ((lastNum & (1 << bit)) == 0) totalFalse += 1; + kernComputeIndices <<>> (n, totalFalse, devFalse, devTrue, devIndices); kernRadixSortScatter <<>> (n, devIndices, devInp, devTrue); //temporarily store output into devTrue buffer - //cudaMemcpy(out, devTrue, n * sizeof(int), cudaMemcpyDeviceToHost); - //for (int i = 0; i < 64; i++) { - // std::cout << out[i] << " "; - //} - //std::cout << std::endl; std::swap(devInp, devTrue); } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index d6abead..bb1d01e 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -3,6 +3,7 @@ #include #include #include +#include #include "common.h" #include "thrust.h" @@ -18,7 +19,6 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata, bool enableTimer) { - if (enableTimer) timer().startGpuTimer(); // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); @@ -27,9 +27,33 @@ namespace StreamCompaction { //thrust::exclusive_scan(thrust::host, data, data + 6, data, 4); // in-place scan //// data is now {4, 5, 5, 7, 9, 10} - thrust::exclusive_scan(idata, idata + n, odata, 0); + thrust::device_vector dInpVec(idata, idata + n); + thrust::device_vector dOutVec(n); + thrust::host_vector hOutVec(n); + + if (enableTimer) timer().startGpuTimer(); + + thrust::exclusive_scan(dInpVec.begin(), dInpVec.end(), dOutVec.begin(), 0); + + if (enableTimer) timer().endGpuTimer(); + + thrust::copy(dOutVec.begin(), dOutVec.end(), hOutVec.begin()); + std::memcpy(odata, hOutVec.data(), n * sizeof(int)); + } + + + void sort(int n, int* odata, const int* idata, bool enableTimer) { + thrust::device_vector dInpVec(idata, idata + n); + thrust::host_vector hOutVec(n); + + if (enableTimer) timer().startGpuTimer(); + + thrust::sort(dInpVec.begin(), dInpVec.end()); if (enableTimer) timer().endGpuTimer(); + + thrust::copy(dInpVec.begin(), dInpVec.end(), hOutVec.begin()); + std::memcpy(odata, hOutVec.data(), n * sizeof(int)); } } } diff --git a/stream_compaction/thrust.h b/stream_compaction/thrust.h index a27ace2..37c37f7 100644 --- a/stream_compaction/thrust.h +++ b/stream_compaction/thrust.h @@ -7,5 +7,6 @@ namespace StreamCompaction { StreamCompaction::Common::PerformanceTimer& timer(); void scan(int n, int *odata, const int *idata, bool enableTimer = true); + void sort(int n, int *odata, const int *idata, bool enableTimer = true); } } From 62e2bead247a51a66d779deaf89277ab7c5105c1 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 19:19:19 -0400 Subject: [PATCH 06/14] Update --- README.md | 128 +++++- ...acted by Array Size (Non Power of Two).png | Bin 0 -> 59948 bytes ... Impacted by Array Size (Power of Two).png | Bin 0 -> 59674 bytes ...acted by Array Size (Non Power of Two).png | Bin 0 -> 62199 bytes ... Impacted by Array Size (Power of Two).png | Bin 0 -> 60721 bytes ...acted by Array Size (Non Power of Two).png | Bin 0 -> 37379 bytes ... Impacted by Array Size (Power of Two).png | Bin 0 -> 39967 bytes img/performance_analysis.xlsx | Bin 0 -> 44012 bytes src/main.cpp | 374 +++++++++++------- 9 files changed, 363 insertions(+), 139 deletions(-) create mode 100644 img/Compaction Time Impacted by Array Size (Non Power of Two).png create mode 100644 img/Compaction Time Impacted by Array Size (Power of Two).png create mode 100644 img/Scan Time Impacted by Array Size (Non Power of Two).png create mode 100644 img/Scan Time Impacted by Array Size (Power of Two).png create mode 100644 img/Sort Time Impacted by Array Size (Non Power of Two).png create mode 100644 img/Sort Time Impacted by Array Size (Power of Two).png create mode 100644 img/performance_analysis.xlsx diff --git a/README.md b/README.md index 0e38ddb..475dc4e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,128 @@ +**University of Pennsylvania, CIS 565: GPU Programming and Architecture** + +- Alex Fu + - [LinkedIn](https://www.linkedin.com/in/alex-fu-b47b67238/) + - [Twitter](https://twitter.com/AlexFu8304) + - [Personal Website](https://thecger.com/) +- Tested on: Windows 10, i7-10750H @ 2.60GHz, 16GB, GTX 3060 6GB + CUDA Stream Compaction ====================== -**University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** +## Features Implemented + +* CPU Scan and Compaction + +* Naive GPU Scan + +* Work-efficient GPU Scan + +* GPU Steam Compaction + +* Radix Sort (Extra Credit) + +### Example Output + +`SIZE` is $2^{20}$. The test size for non-power-of-two case is `SIZE - 3`. CUDA block size is 128. + +``` +**************** +** SCAN TESTS ** +**************** + [ 41 17 34 0 19 24 28 8 12 14 5 45 31 ... 20 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.5527ms (std::chrono Measured) + [ 0 41 58 92 92 111 135 163 171 183 197 202 247 ... 25683436 25683456 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.5991ms (std::chrono Measured) + [ 0 41 58 92 92 111 135 163 171 183 197 202 247 ... 25683337 25683375 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.607232ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.884736ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.359712ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.351232ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.16576ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.390144ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 1 3 2 0 1 0 2 2 2 0 1 1 1 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 2.5172ms (std::chrono Measured) + [ 1 3 2 1 2 2 2 1 1 1 3 1 3 ... 2 3 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 2.2528ms (std::chrono Measured) + [ 1 3 2 1 2 2 2 1 1 1 3 1 3 ... 2 2 ] + passed +==== cpu compact with scan, power-of-two ==== + elapsed time: 4.2481ms (std::chrono Measured) + passed +==== cpu compact with scan, non-power-of-two ==== + elapsed time: 4.5622ms (std::chrono Measured) + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.42496ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.42096ms (CUDA Measured) + passed + +********************** +** RADIX SORT TESTS ** +********************** + [ 41 17 34 0 19 24 28 8 12 14 5 45 31 ... 20 0 ] +==== thrust sort, power-of-two ==== + elapsed time: 0.421664ms (CUDA Measured) + [ 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 49 49 ] +==== thrust sort, non-power-of-two ==== + elapsed time: 0.342016ms (CUDA Measured) + [ 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 49 49 ] +==== radix sort, power-of-two ==== + elapsed time: 20.2885ms (CUDA Measured) + passed +==== radix sort, non-power-of-two ==== + elapsed time: 23.1066ms (CUDA Measured) + passed +``` + +## Performance Analysis + +### Performance Impacted by Array Size + +CUDA block size is 128. + +#### Scan + +![Scan Time Impacted by Array Size (Power of Two)](img/Scan Time Impacted by Array Size (Power of Two).png) + +![Scan Time Impacted by Array Size (Non Power of Two)](img/Scan Time Impacted by Array Size (Non Power of Two).png) + +#### Compaction + +![Compaction Time Impacted by Array Size (Power of Two)](img/Compaction Time Impacted by Array Size (Power of Two).png) + +![Compaction Time Impacted by Array Size (Non Power of Two)](img/Compaction Time Impacted by Array Size (Non Power of Two).png) + +#### Radix Sort -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +![Sort Time Impacted by Array Size (Power of Two)](img/Sort Time Impacted by Array Size (Power of Two).png) -### (TODO: Your README) +![Sort Time Impacted by Array Size (Non Power of Two)](img/Sort Time Impacted by Array Size (Non Power of Two).png) -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +## Answers to the Questions +## Some Thoughts diff --git a/img/Compaction Time Impacted by Array Size (Non Power of Two).png b/img/Compaction Time Impacted by Array Size (Non Power of Two).png new file mode 100644 index 0000000000000000000000000000000000000000..29e5b0c6e367396e3f79270803d0108fcc4f734d GIT binary patch literal 59948 zcmdSBiC>aw8$aqy)AY`?IPWx*rKv5ZHI|eM=7P4H3tC$4Xr;JEmO@*sU<2R zE|rR7DyAqT3f5FA;*z2u;!@#;h^B}nxSYqOdC&O+&iVY#{rQ9;&;8ujeJ$VXdtJ{h ze_n93+4`gUk18rETW!yuaaK|JE>}fmL*#$H2YzE^dh7u3_r=r;hjz6DVH+{)81-t-^i0`k(rK{F(k-O z7r!gNO6uHW@K=7!9<7*tX!!RXFgMu5^5}M}AJUsmMYCo(lRW8kjCE(RB3?hec~N9H zybTcP|39PjHzF9B_D8ZUZ=rlkk5E$8P7v`#B9Xhw@gXS0gR;(NWzvEOPw_AYQLAn0+~L$kZF z!fV6sA3JIF{%08{tCbN7MeBhw)0QU1_nJ;qk!#@!Ju0mQqPf5RreZ_I(_R^Rn( z3*XDj&tf`e2od0srh&#Znbkg9Qx8RgHco55$FXv3)FP1=ngR`DwV+5-%7QNPU%b~7 zGW6N0I4ZTQ1UZYICoIvuU~(QAaY{HwCykj+qm?=Hd6`rvHyXfGX*CnGj*&W?f2}_w6#XjVoKZkI?@38n+j07k4 za`XlDyMjy3hM4=PMS97U2~Oj|mXYmd;N2U}=YcwDMOFqwmzHC%(-*Lh#na!ZTyL^^ zI!8!e&bT_yId@_lJTZUIGnDvW{c-E4@I2r54Y;tp*||zqiDQ&T*$A@Y5?Z5(I$x=L zlNa=u0{W+KBC^DH}hv7<*ZdYAKW(j zrAe?rI+4_4Z+Dv> z95o({VGVi;6`m@~uXi2A5DUZVf1S?jt9h?_s8tzl9zNKfu%}P>oKyO{s?O#k6iG}3 z^*etHkhl>Y(jR2Gt7e<19O0j$=1etgxs9MvRqv%f2YVx;^5^$)I#bdc;&RZfcInIk z2AN_-&WhyEO1%vtOCnQ>l1E|K#629rBx(oK(c)%h%2whQl`%YX{*fMMA~9eN9p~~4 zWjPDAr~CMNBf;O_9AFj;P~G5MdWSM5M7d>QQ(s}mK$N<=(*q}}v@*e=h>P?|DFPg5 zNw=I}6F`12d83cMb$CJM`jd1zG1 zPg!aku7Ob}-1OC*q_{OL^sfOfMw25rH-!S1+(F{F;57fiDOn#IHo}Q%ek94kCX<4X-Rw-+ z8g^PG^UlQfVkYZ_2gJ5)DcV)_=zw%95&H+vl+Q2!d5mbaI9&JG2X*@rCc9voWYah{ zNY5UzRC-01p#&T3L8ns_j0!jX%J`eN=~^+Hc`?-6Ni*Lsa#w5Y3{4sit2!4VtM}zg zI^6YaeV1b;71<*iA}TV3;}zMT+OI2$rEeil6yOh;7%iq=XjeYyHfgM0@;ky2gq=>x z<}G`Iz8Hw3@}RzszS`FdsS+z8J+W}qK4XZP9l&dq#USEeH4UIf_A$JZLi;;;CsUa@ zveS;C{X=z9g(x839W#+}slhaHqsd|>4_=jf-V{c+##0) z%F2e%2Uxm3?edqqXY#ZR=?TTdCdu>91izV-nK0CfSxiThFe8|?*M0>l!pH< ztZD8g5>*^UXrFsA-`Yz~(In(yy`y0A7W3m%7IQI~9OaKZ^H4@MZ$p&nBrV*$9P-vb zURtBSc>MjCVjL6Aux`qvDxFe3J9(>Q+Rm|Daz85-FOF@8Io3P%I2VBsu)HsDAMrZ} zd@+a)Ci!`&=MX^=A~Jb3-5QH)0&?QtKe| zeDkG|8au?3tV%jg=1<5;T7*H=J+mOXa4u`JW~5}6*(m`Z+b&7qKEi5 zcP0)tWn3&Nnywm>59<~O3#epcQ2V_W+b9Bzdb&|^xCjfgp0`kv%rr(9UmNU)MbjbV zK>A=5BT+;h_p2j`dHD1rdP>sE{jJC+LsMoDQo2D=p3KqLC&MStiu?2igTp~TJaUa& z$reQ@qx%vJNss#r$(qj^oa8Y4^;9G>7?1FzCADVla!#H=I4|w(OPH@6)Dsj4)~bQ+z~iKoN~h%tlS}-&5OKD_X~}&u*O5 zbrHu;<73+-*`8!^QkwM6ONVwQfmqCX|A!d5=nY3H!*~|$09#(1dnq8^DT%$!Ju4%P%!+pldHiA=HR-J;v}7 zFUY7Nf;-TBHuWkJ?ZvL6HvW;zQ%s%!_!tqye z8naec*^;c;80efCE8{V?PkbEfT|3t{hS8Rs&A=hg&Gv1hZcFl*3t(P}ohc#1pmqz-AzQ1|-^)xB6P5VEcXfx5U z-R!#x$wnLBSN@o}v+ViT{0hsm?&Ue-jN&50*7a!lat)sV|tTQ3CgV zt45;D;`_|SE8Wwie=>@+(HbD1RI1t`#(+7QXLyN3LSoUoFuPjkT{%(xyLly3%bl!B z^GR(O6&DdVt_TRRFz_mZho}oqIeO8aE*)VdxM%V1zpk2y42PlAijiLOStO@`ZO04p z?|n9auQq_~7xlPCFxm`6!$IDHlcearw$z65P2=%#mgxRB7e<4VxV`j1YZZ&=RwrIT zh=59fB%5=~V>L|p$nJQT=kktZ$#Zc>=q|g)!q7@_{-}{uK=zuW;${^pUDGB;3?{ht zWaxy#IAmxlc@$3IcGNWwv{AFEVpR3!sKLrAY_j0A~~38iJJ05tsvZq~Nk zCqK>G%Q#%)%@dk1d?2*Tb5x$9OLW8BI<6L7%u{{1zZKJe&y_4ox>t}r?pG>Y+9$1) zw^Mmw$Y5v!&cM{gR9wy*GxYZkRl@g6XDgn!Yig#vDV;b@>{DYroQ?TYT(eiXGql#1 z9~m6C;E!S_6yTrYgK@Q~SybLZV&9%o3iNGq<8232+ys9JjDd8TsMqw}!VK>5qu}|n zSkqeQ0VMS8-9D`-22pBG&f^x1(5UwxietQ+t7fr9lIg!?t+5$q0D6d!f{UROQw=-^ z6SC3+G}prlE28?oycF(}mqM8W5-Hb3%>4uUy~=EUp4wf0_+iRu`IDxFiA}gD)h;OA(a!~!*Nnb) zKwYOZJ)A|Juv}hZ8aqBKYDBQC=I)7@!(d0}Vv*RTq&*TCnSqm%p_~HewxkCN9FdT#l$K78fYQN;eH`IF~KreUXd4Stz=4h_p}_46Eo6A!it+<8VYJPc(v zI2S)kPa^s!45B6iQ+<*Pd6AM>C2M{{S|*)`U|}*8(NeGSVQ%}hox%QE{7GKpQz4ai zeCjkb88hmmLwW4sBN!G}4x3k7eb+qLb}!W-Z(3HSO=tKc1kzG{Pop=B)H1Gad(#bw zc|-Fom2nLHur(x~cL1g*iWShuhD{sg5s*%qI$&%uuHTC!)b}(jlURk}1pc7YZK{3B z?{^JG5ikP*CS$|ws^kECnb#bn|29&Uz{Lziz^n!M6A9DSP`SCwf3RvC_q;XB$iq>viAeA{F?;qP z3?z!#kHc0@%{|*Atpr_ZGYwXp!jU6js79)2e$b7Ox2PJ}elPh!vMp$T90cw;w=tfp zy`z$6Z#de3^RsCCqU$(bsr|h`9UX2JrxCUIq8yJWSF@yGUgO=axw^$PgHV$C0qKq* z=0xV8Ea9+JsW@tkn>92hiw|-ry!KdYbl(ofzy~VhHI0Srl)^pA${)XMqOzH<^JG%L zsKo@G!MA6dU;o?aD)+Glj92 zNY#*Ndn|Qt2Y67IHa2&@eQMO)w!boNEnHE(Tptm z@J6IDakdVH#=(+9EygMXpI=NCJQHj5B~X#TEU%gZu?e^)iTMK_F4Ev}-GV7XXHjh8 z)abk+`-Vm|qu($RtH&tYjpxZu=XOePa?>N9Tfgv4rS|Y4^t)4KVGou zC(sr{+B@?w7Kun8B| zId{uAJz201G8matIa{G0DT16apF;$90wmm;*t1WOvCCQ*fr;uzgliPrnqCl)iyT7Z z94V|L5jE}2@WZw8t%g*IVc=grWUFn681^Yt%7mY7C^92i-1ElP(JST8Sw$h}^io({ z?)6eBqEkxcL{@o3WOxibY`=kF82M$VMCatLnP-f6cNX`zWpSIb{$WJywcKEbdUjeY zwtoIRPc(xJx1YOP&8xgbwW@W9GkQO_H-O|1GGb_Yi~CY0Fm@Q`f1$hpPz06jY?Ra? z70vUJk1__d)QOfTe&j^7m%Zencwow$UAM6YWI>f9422R=DqxuYNWM|`!A3^hDdQ{05C!=Cgv+?IemF0G&-Q>v zrQ(Ni2W9pdkNfSff^UF}Gd@w@v(KaM6FQLuLs0*0u)yB2p-OV&(UMBt`&n!X*-tSu ztKd&$v@GNbSU!WCINe|)k~p%-X9;ob!I)RT!b5q=1Rcm-d?gH{Y?{w)4+iwzW_+%_ zXf%}3I{v<0Ccgg=S?k~tCP*zA4=B zPWGcJliQkrMO)^nVmC}I27(B8T71Yt;LHZ2RjzcW>UC08p$bwcJ<{tb+4hO#zEsNkswCnP|0|6Lav%7df@Tub_Mwld&X51T+vXa#C> zBRB|h-*`&Mj~t^q5OR?Q)dQhpGW%BXe0S^JeRw|Cfg@-NFew1`>Iik_Q1#M%+=#;k zYr=Uz5D1^ch;com$3QN=9XYR$1Ns!PX6s(;r91YLQ34WOC)Xu{YyPpn< zO}Fn7tfr&Z=4%L5#*wTQGg+s}rbcE*79rA|D9D^M$DA5CH-jWnC-WKmsv-3uJn^cn z=waZRqJ)MX8KRr-uX3V(=uhLgEx$8;EDIe6gL3jgp5WrW%C~*(!~!(XRH4l({XtSi z!Z-H38Xy1Npi)@ezYpuGYWD5f|^1jqb$ray4$t> zgXCQVc*wnpg$eL^dz5MtG}p8d$)D1||KCjJjgOU7ccjb?2YZVRI7<4O(dy?`jHcx8 zASkGf*}%TpR%*`)TwlOlYcr1F_=tQoY)&!Dz7e}&`f_a;&uyeS><&698-;z5E2f5| zPLp+qOFv;+Gh2~^Y2>_Mjpl_3YlrNu=?+N|1p1O8XfZRmjs(zUh;OLcU*4|mqfch* z!g#i<1#03>8D)uHH=9{wIjKx%?q;or&bFvHlKel2_+iJTFagrGkgP)e+v>qe56w zk@#zCYR>n(*`Vy@cYs&O>c7lH&(&XnEKBj&TU~ll#O`ODP5{>Lw1|}(55q?3EqvyS z<^>-?LAmKcK7B$VHZK@$M_bhRm*WdYiG?f57ipxmEbQ|AK;i9;(}a5t(w>r?=m7a4 z3aL|yr~9EHf!^{2p2x_M9;}&BVuK)v*@-W@QC90PC04*un{9c@P-_7g;yWG(-j0Eo z!g=iK{%!{`NZ6ZeImqiWA%CZ9gz9fA!ay=40-*=B1r0SewprbUc!6}@yHFfRKhjwZ5U#y2PAI|9y1yW} z4^?1QtJjsCoL|U(Y@D2PutRZLPT23%gk1F_rgoegkHV`g_Y}+F) zzJZ?NlF_o#y$s8FFYOeO=V;vENPGza$osnnK_Nky&*|~#tOebqtHJ=u=(%oshEf(90jHl59FDfg<|wPxaL3{ z#8@OIka$kzfizFEL7qn1gkhx^Boz!iu{Y1i7eAAtJur-+DFTx?C~bA7yW#_JUK56$ zCa`5ei9p9iF#Y->NsiSB010&4y`nT~$g~GtZ7(Mm$&?na7s~KC!`dV4Nejh2XnotU zBGts-us}&aEP}UO%12}9j-9fl-gYXqo!68}mb(#nvYJD+J{UgG+-M0^Ue^!yO60fk zg%gopZCV7H(`aC503`|SQ(ql!hFL73CxeU6j>zK4b^xU--z$^Fgxi7|GfavEAbpn- zUX7%txq7Q29hTvf(K^n$F*x?+x+zh>JOl%=Ct|${LRT2c;rywFXQ8#@bLXMrk{iNj zelBcL&0&~oO&=Aq1L-2U;)^ z?g1He8=D<5G>%~86~Xa`#Jw^zH=gZCGRgV6@wrE*k5p+ihC>~7j#$~)VXFBi01deh>!vl%xlhrYI7KmqAzP{g;78DNZ#SwV&&F*wZJPI(DIW43# z%r}Y<1?lC2YAwyIg&LO#0~JV3eEQ<^Qv$_UJYj&kyEr&*gYcyfjQH?3nAmg5Ku|1% z;v6{3=V&H}VUdPd*5HW%csb4|xpmz3{}!YkB%0<4j}UX_jsSTMchmPJ1Q%&>&BK7N zfGIfDS#r@(2$&dkuA#bL73t+K2L}tZW}+Kajr?hN2R8UG6HRd*Y-&O=Hs7*9HSI`7 zcFB&FiH`^=DQ}WhcNj7xu{v?erYfqy2~Q}iU^gcm?Cxc1IT`Tb{22vfkq%BNAjx)i zc$z_d>ti(|&Nl?+;gkclXMsLIp7(ufqXeO)4HaQL650i)M&yX2ArE+LmS z8GJNP7*sRR7?e+qY%vk|U=Z)9kr`;?;!Y`r$GYJG@wI`W9RhY~iud4&*lmQ!h|_q% zZV+1>h|2O{kjG_Fi1u8erd-f~eH}m>leHTNF6(iW35>L9pvpSgK!uTVX&w~nd%_Pi$b95A{cd2ZuWFQI)_vY!Qw|G5L zZc{16%=|vCcx3F7jcTHRz^zSi<3w4$q_wnF9Mcifc}(O<>^nIkTl_YI%o!F8?P%1v zMHOOu%xlQ`(syn}f#Yb6F+*9sy{6!_&@-`E@-hcqSAf*u&nBzIn&mBe+RiDe7_rS= zX4V&)(4$xzF|tNes?)Z7jy-!IaRVWpA*qE;{g3bib@u_OxjK<*fO*lLEI3bUoiEYm z!)v%Ol00&;l6JR1OjNE?%rn|?WsQZ&(a6n2UInDGntHguP4RLvChP^ewBE|Mr^huX zmp2?(6j~_=p{4{ACNXs(ISG4s<-fr}6d}+J(Kqa$Uns)s+gcaFi6^j-T<=cy<0_M% zCca3$gRkDa1p_&<5SgP304cUCZ_M1^SMM^3Brz}K37*C2fF~0f*WPH*EhlAGf4A=? z%QsTO!VY;jdPSf}@G%TYj0|^j=5c>N-)LvvG`wXN$h1T(qUB4E7`~TwzjAbp+1P~U zg}SzrYFqN;${)+1yji*=;En7{rLlHNTP#CMn=kgqeWMcb)alF2+i}G03&o8di4(}_1HsM~Lb|-R%@Fl^k_|Pi zA6=yF@@S~D3JS!JdPWllcry0Dj#RQdXVrcM)0-^_!I~l}WOn+1G=Sb7NUMohRC>Ge zA|JwI%!-=kbpV$bItH4{uNd8(O7PMXg-j7NAZByUhg2aGcF(BHdpAjv3+7b%h|Lg@q6 zXdgP2Cm!}L_sw|NI?z6XU55QF=}2RccZ~YnHSCwEceYDebt`>SCaRWS+34n*7hEv; zjG*Pmmjna$kv;|eq|nL6{zKJ+Egq<4rbJ&wJ(S%&q#U{2E}q>LT{iXqFcc7WiU!Ph zaTsyd(yM+~%7c7%S4HZq#^(NQNyscli;uWm=FF*pMZ$E33EZ-04BISGfm-T5Ah( z6RsJKB7=g;#Tp;iEZ6bfBXOyAOYdAls&Q^!K(ChhU;|0pUJ+d#o0G*k0^|8+6l%}F zmJfwNY}|`+U9+;xu*yiDss^%sZxpk7$>=frJ?{ZEk}Eaux2w`+_yECI>5rxOqCyaC zAKGgN!Qs{noDY)}DlF5+z&LD<_zFd#E9|xUsoBs=5D896A)&F>w7aDd!h}P?{Z9Vg zLhS>sksZSYBdsqTip5`Em=gsdx=~(WE&J4oP4mpjLD4b3IBnI+U^*5)pTuiLmu2%H z1TR61722a1F0XS6{?B!N|5bf^_@664CB9Wmd!=Fa+Msn(w7EH?*EYD=v~ ze(LjAQYF(m0?a_1>`Cne*6SbTE)|uV!#5kYznCe|<{0NbBFXQ!EZzxd+IM|Ia^?=| zhbC$m7VbiwuS_H_#OQY5iX8&p(Y)UV6pY4v+YjOV-AIj2GG&W_PU{Wq3oKK5Q8kG-t&kHd2W ziPGKMqEuHFIkUcq)hs!zU){+t2XcMKg_H(P?(Dz?cXfhtQ44rzu5xqn*1vMQn%1aR zZM%L%zH#wK=gaj`fs~39=yG)dv$b(RD=SW!GSFy5+cbsz|MHZ|i-TZfZ}lzNO;l<~37VeJ+zZ+5FYVHXX(sb)Gi5(=Tj zvjn;j;rhUbsX+L0ZB!&N^FPqj>IaEjZ`Bb?>e` zqt3c`)k&n8q@!WZeikD|A}xDDFBUr?>w1o#MO^x3b?%jnk)D`wg^3Ar&bY{w zXf2Yuavvdgu;#hb&pL(1hE(yb7Gi-x+zDy2@N6M#0ez3~3Tm#qT=!3(z$Mp0I+2pu$BIAB`u^F_o=;A?V4k;37Ic-SNTU+59Q(l7$iO}`sM;PsUTr;?!6JH`N zEq&Ke1pE}Qpt2aPz0WA^G(YtYP@B~i`w1e zMRWn4su>AizvJMac8CKg*#-CRJXmwU!x{6&xdm2>`r(%~1(xM;)*c>rT7YJ34Bd6q z!-I%U>aI4SbQ;Ea1tS}ME_sMBtcSkCYg1nxZlO%0y+aU~si(;d+-mHUxaP;1dU$9w z@+8@l*Ya3Bpl~!dW$SO$>xwEj5^vO~S=YR@5?$MjPF}-l>-p0%Z zOo+EsXK}acZ~eyNp402$CN<7$z>RkZ7rl7pM#TFI{ zL-T>kXLW3bGn4do;T8|ncwi&RgODUNp)w2(t4D9Q10Ww>Y}V2os3R-ekZ&K*cY5W_ zA22dING-gHs=Wb}wf8q`IFN!YsNSMrJy2C5@QZZqIE!`1JBhGctknA7+p%w&h)}&& z#I|$mXYY;&dfE4F4M`g1cvW%S#Kd1+i1TB`(2xodn_g`6AMs1?(tApy)yp=V zw0dHyZb;|hpq`JjcrL3;7fpBF2?Ng1)YpvmEipl5_aI+ZFLs{;yl3Gcgp3<9BvxHB z(a^($;5-rLNkv*iR^c5E`0^yJGLLOg2Zoav>op|=uX+CA!r`ui?uc+mux0BV@3~xp zf$vCOz6tx|l8*RBHu*tcqYdKcwFT^Eo-SaLawJdU9yHyTbE?l-zZGnX?LR%fkN27g zSHL~<69qjX0SLj%FcTvagMxrFojv&nOdRnS)8SeHaHRjhZPQ%L5ts5iKKPN!BfWK^ zza=&iyA(8}>Ef^d%tmqQ+dE>DzJZO+J*H29QOS~?s8)41e{Vl0Ge~4Bid6CB;mF+M zs<6{6Ei>QAD9tKTEMbNQ&QNbXnk2T`UyWfL=WbsW)gEfqXPSsv+D+^_X~ca}ePd5i@0s_c+sWOKtLp5KWbx&E5jVcFw;_CD2A$)X^otj> zptd3~?OX%edlO5Gk?T5;`W%Ju zEyEd;?}*I>mi+;30Xl2?)|vUnhqw`@Vc9yLn%r&jI=)Abq&u!)S(fk z2c+r(N07CJZ=0!lQWT%83#E8)k&M8;bJVbvmaw;tEp5a(-=lzCX?vtq^m9McNb9)w zIC1N9;a6Yyapr1Whw%;U7q`}VM%I5kdVhI;tas-NTg}qoCvjr5u}v1*r#w=8PK@L$ z5zh8f#hQz6u4%+kZWwAunHd?lg=EG3UacuO-)733DWEkzlpahz9fc*byIhD}*EnjG(_IVAc?n0ZpW(t?RGUr<=@B-nshx3PU7I-KjSy zHMnd;keB+Vf4KK@(_8H#%%Z48h%#jPEWKr?MsFt))9XO1ZwU=6XFg+7o^EXwMNvWI z;nnqSo+W8FC>KwJB|VreuN2*ng`9H{_?&H>?^jo~!yEC`kz)nilNx58(b-%RKaM<9 zSZqslsAMXtE4by89+-sgmO?Xb+gw^%wWKrXRZ}rp`mo~Z5kq7HJ5Mx6gNws^6J%sB zw1EHqdjeMu4(i0fKo)E1D&uy-PJD~v_!+8c3ix~VRy|_h6LyyfSoyhGl!1w1S&iCb zN=H7u>`t->%q4+hgoo^Twjmlx$2{7ZDLI7`;fgRz*39TE@EAZ*vp@(-B=G76TgK_8 zGRiiOs957Qn&@uVs(ULZ$7Giv=t+SblT|$Z#D6JU!>MusYu?{x&RT#|8gUQ0zzLsx z$?Vc?F-UyANdDoIW}{7NaD>%|Sm}(UlmjTxkv7~?{0+C=+&_2`K{HuZU#8ytiGiT3 zF)at6S6aVMS6X$8Bh$ays{6(noQuwCXp1^;0-o~{+Ae2EUbI)kE=Onv3bs_R2{*Fa zXml#$uPn|1n1)-ifRW$O&<6Nq!MT*}Bten5f;>AD=^;{Pj0b9VPAIDSSBfKm1^>{r zN!j4UjSl^}X+d0e^8MULUzRb1>zse<3Qm1!;Tqug2~cP#QQQTe0P0e7KO!rlJa=Sg zvA&>y*<(m79!FlGc=}@^uyZ{HI~bagxnbHoDs8@v@$OPYE!}`-3qX6ANJh z;F7!9o&F$pgA8jSszf-nGv2Ps@#f+qfz8W_icwZLathU-)JQJbhj^7_uVV~ed z4|-!dfx5P{XTSY3F*hi4Y(7l9hm!>*oJCq5GAkE%dE1l)7u19SrLU4CM8x~?F&aIw zF!EC873qiJwtLB`SphDkHDUBps_&*Qb$ygywYe{-sG>hIyEQDxz}Jx|Cp1*bnEnU0 zg3DuLF?=K~Ke;{mqPde_V4zNQlHYAsB^}IOlXc%?)h~267oKn_Xv1l%m$b!w#Kp3> zKD6=o{yzD)D%_Lw3i0~*{G^NkX$ikB$oTb8RYzA(UXtDcv2kagR_j5|YfT zNAi(^6P-cftzG_vk6?*HW(p%Gg?f{6?aa6J9+6i47if>!2yI1@{nCI)&8*0%sB=^; zO4!UQ8M?V~k9LcOZ`^qIci(>hc%VqeJR+YqTfD8cDrTl$Kjn=4_~XwJQum9qR!0cZ z@-OStUa*)34L(lphk697>HH@AjC{*u)$!e%H|c*X4_uv|@wiKCUxfK*lNa7ii!UoS z<%w^OtbTCC`mw55!I8J+Rc!kH)jbyfJn1Mly1{g{D<%Ln2* zTc6z}ue0%+y)SS0dE_UefNRn70)9-YNKF(EU}EAnZ=Kn0d_i)u5weos86yJ)J#Hgp)Dq)SLfX8(idOm) z(e=Dg)Eio!qx<_$r~b2d<;BCGBIDgS_0NXwt8Z6cnr=6G?kExHCa+gQH{ZQ4n=Yuj zSOt`_`z446NvtK${@dOElOTmMUC_EG2Nme$uaKqw*P`~rR|&qsnB=0TbO_c*r0l4r zi{Z@Q_?&}BH^bH_?9FcqlXQ_Pk+uRY+b9GHQapbdxf3`=@Ks6wM?1y;slvHGCY|Gz zmf-8`#f5z-IA;TTMf@uWV!f+zG|n_5Z{}4&n$n$-Mhr`dE>2(H2nF|D%_&F|@K8_G z)s#{Obcj~Qm=mLFOKw}JzgCO z!^_Q#8lUDx6qS|c=-ezxUntqS<}51o+C%OU{){wb0Pq>~=b^SGNwHH+`PTKD_JtW} zfB748NG(9aA$g+D%Tsz-V~vuipz+_;Tx69c>vAMNgqw10A{zNWt*!T@wxDX{Z(v8s zl#VpVM;7{rtYtpnb@{Iof7})y?>rNAoaj*O0GyRMFl=(a_vqJ|{tw)uObCYa@Slf# z{7$d^_U7dH>-W~(_BGo6>JFN=b~T*k@P?;}$Tw>rtI!l)+c4pf&sLHU!$Lr54^ReW zW-l%N;*O{I1GnUUHn`#=wvXcE=vWC1v2*Rd zAEI2YUm*L;7=)V;I&JL+?#8ie?)>}V+#8{`)Gcnq6oahmVs85Z=B661fn1;Z9`^GV zhWVjb>u8fK!&u_K%C>jZz=Zr9gFmkBAo-!rN%!RBpa1HmcEu~k4@?c_KuOe?L3_Iz z{Qu;{e9+XddEFmGhuD5dNBn0^!1w)0g-_oAQ}kCwU}@CXWXC=HpXsb*uj)%S4czyJ zlF+HI1b|O4n(iI>GxBcl$ArDix1g?sRM6XxMvmluPQW^Ln3bTW2Og!>z3mPP(fy&$ zdg@4QQSYMz6;H3vV;BAz;?G}0nrk9Yd92lsDjE5J0!MXj(FDNt_8*e^uQ$KnkLXEl zQsw#Nfw-v%j%|LNmB)HxAp@t;ylD~ZJY)3j_8N?^Ed_CXBx;|0%`~7p2+PX&V^$sa*0gsek)xXm#`Qr- zm%g3)5$VW(aiAhBhL;upG^(PcBQ4qYp>@LB&*V+~b!VACDI#kccq86Pq=0XyXbPEy zMx{=&6-LpPa4aFEgayp_8#b&KWzAdnJYazhw+ExHT(`+T^eg1mORbP7GVRE$k+Xg|{X^0~hgy|@dtmIX8U1AFApbUx1k%0~WBr`jJsek(EXO~#o7oh6%k zcV#ZHPR1$ZgRQSaD1dyG=avVmf;plY8f99C1L~ZQqMp?N_&08xw$|=JM@N{+GYf{2 zEQk)sX=b=z@Yqoes?Ij+;<>T-y#tegyL?g$$?Lt49e;c4n-E^fw2qWyiW=yW0xI^i$YEOojZuKxs*qdO_yinT>D7yjFz?*;9dkp;DODL@Yr%4I! zZKGC{b76xEwRvk);r*dQ!#>WS*ue;JR_~`pWzz75$*aJom>1%hzJHWQnPhc(SpQrv z-4>n6%-^~pY^B8*;ZwhsT0cYq_;C#YAyJrNf3D7F16v^0pKta0IW%Q({!x5IR08#N zT9WS{*0iTTsq&9L;e?|sVR4db&ez1>WY-MRUEQjYEO%j6rj{q(U7u;D-0tRNz1)fe zY;RkF4@biJYgMV`QLTYu-6_Z2KAd`Im+BogmIyiJ$;13OPEq0HQb?} zw>WOXX=ILu0=F=qGGEr<@ZzU7wZTg>+}YnQW&*Wa>;!4uQ{2nuG9oq|I52g}4Oa{q zIBU9b(=ZUB?p}4{3G=5U-hgA`KxNi9>xd z6%&F%Im7)Zuy5a>n|uj_im3K5ZwEQ z0(eG2+%eWdFu|89O-YqrX62r{C0g^co9UAyomqEqd!j39S!s43u=J&jJGqEA8E;o0 z&GlR~ z6d>|9!++KSdQ<|~PW|OmxwchZ=$&=sf3=jBmWL_FJhEV~P8w$7(zv_fE28}~i67lO zEo(c6dk1=(*rF!Hea$6vG)2(lOU$F%j#cCjr`erDHluuKMCa6Pun#2l5*Oo7F<&%(EQ$TX+M&pJuL(7rPgp$A2E|+A#H_O}>cw zUCrQuljJMI_U96Bk*Dp^K)U@+@gPdUj{2It*?`R00si&Wrn;1V_k`vRWoQ=QqqYfq zm+}EDwA;%}fL)cdk?WZ|1EC4?Oev<(Intm`{IRCMC@4wPO0oq6` z5f$*gW_%EE`+oo*ls}k80cLdlv08)s>!$;Q8`iolDwIcQ_wK>A>Ol>&l!5wQXt9lM zoU zc8jyGQ8Uki(hhtc2!lWPZ6(Y>+^}$ytT3m#c5Om@{yHam6;6$w{SXK+p%gL+=di4* z?`14@>RYUeub3-r({<6k+glU*z^%XiUl~d^opyS@X<#cX%ki?l*Ds-LizzDkr@W7= zIpS0K@B(BxA#5`ZC^Mgaalp}yD`d- zdfi%I8Sv4d)K~hoL`TK1wI((m{M$`xAzs-4uUWVziJO1?Mf}VBur$0{}(US5frnyz9TKo0w$9-7Wcu_Nv2`B7C^O@%IAX(zAfud;K`Q@xE%K zQ{{R9?z|-He80JGs~(X2iqc!{0XmZw|8y=eFrW2F?Ni>+gId$CRl$}@#ozLW0FV0s z*djd8i=RDzx4&Jsxw-_{KYHQXLT-LaE|c=rc6;n^_iY#7lIz>N2{!+sPT~sIv)M9* zc?8h1$q>Wp!V9%A{h!GuUtRvrWHc&vW<#p;q`Di&HoQ2!)t0$455TTLi&f@VB74_c z@>LJ6w?#AGL_@y?MHy$$W;*&hH9Ilz>1}`c_AS1Q--RT1XJ0MtHg-28}ug~9@B)NE7FTCv)eywfwTelA1S+Y75 zI~cX16Oac#dpD5SasVWoet@(2-|a**y|p?AQ26|hI@9D{H!V6Xy{)%b7;Uvu)J%q% zcmMV8X8-nShP~%sZ-(jtBw{W}YxcZ8aXUa6DoaE<1m5(sb--@{Y7yY8D~k5eP`MPeAjimzj|Fb@1YbWr>&Q2>e+mrwcF)s)2pHaO(;a-w4X6tcM+J@cU2 z)O}Zm`_6m!?G65XHl`P@o-ksRS5wrwRv@_VlpPt+jec{;6mogSvAWWXtrmgAhH07g8a5H_kwD1XeqivLM_ND*VUeaepW3~C$hffc zUU|y1gDh~)Ve5)D>2J>4HlKDX+f*}XMszIfvnfNgakoxcmDzJd^gyk8<&x{Y13#VZ z;2iLUnh?yN`O+xitGm8gQ+w#MmKP}2I>ID}^z9VR6&xtO7hT^4XbW-B(dtd}i>8K# zhDoin9R$9v3;60z$MA=Gt5c7n>VMOYuLt}#qeOHG6zf}2Y33FE&*U8d>*Qn-M{!Nk z?RxL*j(Zl>jz+K4_5k`u(TR>VsHM92SJ+atBR3;@;0TbJIDkLb zv72A~@mqRx*1^9F98K`qKfL)YbXM+JkLsh=F1O^tD+qHamN#fgAL#%DpFdUC-*G+l zt#nDDg&}5UzKr=X-}xx41MXPMR4>aN9?k!ArBTo2LtoDdgb7X3$ht4BhNTmXaW z)$dG0Hl$haVOU<&1o@j{V=_iuh<@K z-3sagjG7xF^|9)Eb`TT#ykf{<=RMweAH+JH+2P1Yi^JMbM00h3<4zEY8WKmo z3RB3Jegn2jaAn!weeZ}H~kD)PXc1Q9FWdx@ast>8b7=fh z1dDKV%b*zqg0)$<-HXp*S}^HY!4PaJ=s47A<3Ldv!e`;}7c&4>_Jb-7TTT}`$DaS? z>}a5d1ONA{Uuq-*8c=wx`RluB>C89sVtn{u3mAxvL$nBb{Cx`#QTDJCdGR#!Ctu*6 zwx4jNTckgoy?AWPn`IUlXiC)#rGwX6zSqEd>+ce}Ncn zdBd)R>e^VSET(d= z?o4>!aV6wI*V|N}a9UGwp$n)iHiz<22OyyXL2&5^Kq^Z_X`qHcj~^7j-1}I6<|6tu z&~#*>fNx!z{;JpDZd!~@t-51YLE7e3hVn%S*i*9E^|sZelJ3*b4$_S|SH}P7!aB@+ zEs|bTrCtP0g&YrFf#>FtBi6g~#)FOrC)6eQ&rFqVfjBrg^qFjVBd^JFAjC7AixDr@ z$&398)Mx25NdV9Sh@8+Bj9Ot!np^ek7aa6YtESuiUsQc}SkvbhFIFqHO0h0b6r?g_ z1`)y%s3Ia;5!nz#hB77WjkSP+tgvJ&Q)Gh#nZY7Ln6e2|A;<>Vgq3@~0e|;io~M7b zPrvIO=RM~$PR7UYo-#~+EL6gItX5V@t%#lWX>?ol)$Pw%VB z>fhboMg@~|Qa84cPBk8rhUl4 zcdTSCZ+(Z;59d zKoo%eH*vF5J+2*7l2inU%9(IV=+d%M5fSzA=G~PWQfd*!q{zkro8N?(%SDsk zf8$urD=oHhe3@o#K|2u-8o!J5D6aSx8K2ZIydumOU%Jhsy<<~-XDhE_N^`8(G;sHq z#N88#sUIU-{4`u%GaNju0C167r<*fAxHaO36HS4{e0&uWtnMcr9O;7uJtW~CYZE`G z=5CPLpmY&tUU5kQDKckZWkby;5xLby6_-Lv6*m_yK+M-Xc zz(QqERIX)|l9}8oc}$zgE6Ef7-?q58xaKWueLub@oKx>L@|Y9ZCxyc5TGXAr+{>%Y zf{UkCnkGdiUX_{8_<2ae)?un1Uz%#FUNf9{)g5V-S7yE$gxO9hhH`pBX1#1GJHNWW z>{!usV2 zaNk;+L$IimCr@@pL`1YMnm#rWILe<^hEC!*zo)2+&O#DoZq5Y-T9`9@WOmeKPElLt z3nXW-L2~(ehON!AHJJU|qCe$9HKVcokrqYJ$8;oM(q^^i)<`6@-JTav_x6nv_zjTDFeK%3(I>vUm#c+g@&Beu z3#LBF3Dtlb^Yuc*F>E=-R5eo?=WuRsshe>^bpjtM{lh!zP#HI@h95yCV~|STnDbw~ zgz-p=%02h+;Y0PKwLg@R+(*M9FJTzUS-#Nu!Y%=lbV3frv8uI`D>6Yco~97<-N`m; zOhi%;j;HGZP&6Im(?3obCI8t92U~=K4(VM1gy;&t2d=jeNU_T^S0igUuUP zWvH4tAiVMmTvjd?G2czLl$?Sy9M20oM2Xne$&g_UM?RZ`z&<|X`|&Qyjk}CRt!yf* zeULB5`s3tcJVXH*Q%=6&wYh-+_`eO1fI@+Y_!DF>elmL$n{SU~mPDzKjb~JOAJKAL0u0A_S7RGGlvo~<>%`aZ~*KA2tpjkk47!LanEThJ7H1B;#|U`1YVVlC%ORE;v;cR4Y%Q?g&&2q!h|Rq z0<&sYvVS%_oB0fx#asH}UIW!kjt13T1XIu|H{Lc8nC@`gd>NH<8CFB+OWQH1Vqu5> zie!5K8y-MjkJ2`c*TQ;cu3H#9)U!})-dbGo_mYM0>Sfb*xz=@%N1Y-j1DIoOx~mQe zCfCn&cmsD)+X$_ z5dtoc`b0F*bdzm8gcS}yeIb@xqtA9swz;*(h(Mv3n;p#8$hvmB2F!?Dt+*1uJy;tNpin5f-1Ol^6ZN7vAEtnm3W!r^{%Wd91>wpx03xi z)sdJ^H@GrjZOL_Z)yT~3Xd|jeX3koYp?*wD_zPrxH<0 z1RpAsr#mxil@@fzM!@@9@c~G((IgS?!OOQ@$(F3=}5GqGtPn&IuokRiQ<;yMNh)# zW)kug|1o$ZR`-vdtT1JrVlr0`DMrf^&v#J_?=J@q$JwAC|0h(byM)>=5!V9J$Ts$( zat$3fS-hR^@qYj;%rC@0;uBkltS#q3fxwi9#SEF6Np@!Y4;(URy?~3X?CU<_RGdl{#Kz$G zTMlh_cIG?YSE_R$50=d_eGO5d-LW_eiUk69=K6k7UT_N6@#P7S+{$=BHHD|E>Km`r zAep*FXVxA4KRtetzx$qZ2v*{;T78bBC|aW6TjzX_^16PiZKdLzY72l3ZJIn21ILdQ z0EI{#atzFGOE%b|hcARpB?=!5*IwGkG5GOW?V@&&`l#ob-@B^F<5C{=ux31{gvm)H zfq(b*_IbDpj`?TV-_oEQUEQCLGo46Msmq8>wg;3nbiK;`am%0RLkDf;?3a#EOe)(* zj^{!!7G?*tHL}h_Rf4k-hh^g#@bh&wA>B5V{;@kSWL~|>uCfYoDlay#vQe#3Y!5Bvz2RVfc<c)(|G|D}04e3Ae`FZ6WSB!~^iV9C@k0PSd6bFU!TZWC zMth7$wsPwXm_e$=DH&AD;nz)b!S6^xq}=8~f>QeNJ5e5wuuZ zA(9Bd^+6aZPduqh1+Gl}d8H;0{Sh@4AKM=(SP#9 z#DshJZ)sVYybDG9V|)j?xcAFT2lFY6=PEFV={^z4{kysQc5!w>rlm9VrZPKsYLT)eOyLRIP!}BEMI;l6k(Ht1EUM9IkpuD8i$-R01^?I}@C?8-IV{6F z8nls4nuF>oZ>Zd9=HUK}C7znLl=^fT*+6nEZwvHOr6^cAZ~g2fAr@5&@Db!96`K z-_CcnB|{5fqTS^E@1=a;`H_S{jeCdLh@@XV?V3C+73cAR;Un)?CMydV8Gy|?ln!f^ z=owBx`DZ#DpR*@2X;wgBRna)TBUqnT=T?V}$8|WN{6Hv!dz6!cP;)b+DWxxMz~3fwyAJ14og#wNY}8g58Jit^Y;8R|Pdi1$b$R#q z?sr}uw*_F0`Gu*}HCy5ZyKx=)B>)A16T#5l^BSBmuqxV2<5XK_-|x+d5YyJJfF#hX zWE&zY7`N`H-$*a}(cd_V$TXG@mw7)}vgSLhgXFcH5V*@BNe;z4rU4MfdDGYD6JghI z$@A6oM#9mFgad%gnzV#rt9b^ceoLd&LhhDqvVTaRrxC5l_4yf^V5bt*`%IL+|9H*~ z??SCv$V(_R^tACXWaar!L=w(rX=N+y2m4pSz*zPmNzV28Q}DELChkx`Iz$2(7xW+; z@f@qIMGoW=y>W4K+JrZ2X-G~!R^$IN<2f1u$vPgDn3ppMtoPq| zy)NnRz?8{C940efHLJ3BFDU#?z-b6R0R+DN9AEuAv=_(;D*o$sY-HkUD@b|z{$YIx zAtYsTCKe*=&%NwDIjmgH6ahTj%lTi^J>*DXW)nZc4cl6otS~@@_(X4C-yNP|vLZxx zvH|_+0{joJBL4(|gOY=J$xU|D2iC$McK3i!+SLo-BvC)tlO$2@*&LfA8ZQ2rSDpde7sv`+3UJnn5x09AC@nKb7w>w1TbkIs zwCDhIjd%YyKi3A}Ob7i(d)YPz$6Q8y5Jd8!joXBw^;LeJGPTsHnPH_j&bibK)KD*N z-q{d5!fZ3tWwvk8cz;V&O`_UGy~A5Uc_a{wdCwx*?9VSn`L>Y^O!Y~NlcwDqyAha| zK70e;K6|oP52L!OQ9c-fPE?HN{qJ5z8D2`?{e*WOdKa#-$L>}GF@%<&o{5!7V9To- zW_y9*Tn-60tDZ!d&mM-}B+gDoUC5BgwV(%bH~iMbNMk^}7nfq3@@j1s)pMkWY~!8+ zbi@N2*(XOUyUE!O8im7Obd)=f_AGF~C&|N)$D7o4|J``t&7M~t$7V`}tO;W#)`l!K zGm`&3UerF;{iQ`<{8=(+olrBi@@ql@OAFQLdPqd0e7C z)!S`bF}s0{^)B&FoWtjr)QL^^4w`Nz7tIvu{WW0upKZ!h5gD1?Nr+p+YcxdClg{zK<-{QtB>aY}%SNTmAc6=>?%{!#VWFdk?;tIZ!w5`P$>yI1Bx`(6+VJnz1_9O8bjTH#}dM z#uyOz%=$~sh8ff6nQ%Ar78cBgb4hark>RV9p78vNX*=ta#}bNLC1>&>!|ee6XiPF# ze~+ws5(|;}4kOm*iDHYFkg#_2SOH15FYc~nvu~L=dl$W0Nr3;}d)y6|V=40|uT}Dap&kU1uashmEaWmi6 zr4pAdzkd29zoCgn{NQ({u_F>YIb>yF>1cx})TfcCW!dO~Z@t)Z?dU~%(swHN1Zv<; zAB9;z_~|M6_RJ!PZp{9RD=RA(_7B9gxeG1Qp1hzqv`eUq)E1zkl%eNXlhNJ}8Z$TI__nG+>{{x((XALdCGH#ME|2k6#w#w5#U7 zQrrCb`DT7!v_}%YA<*FMeg=rvnsDyr9A z@9}If$hx7Z2sB2JaH1U1vHid>;}{N@L*8fIh)&Ru=--dC_loK~?t>WA2_4U`NZe|m zsab3qig2i&Mo>?nVbe+wo{*lR54|dZ!;)X2I1386qx&16OTcb%9>a)z15p_*A&U#k99kn-#7CL*ge`mF3zCg zx(ltS0~QoR0w7B9Yw*rmSLR@^KR*l559%~nFAfxGM;E26e-pBMz??*aeBmmwc5fZ{ zcGHUe+e&4jWl#nl8t&?PG=CaxstX7BJzz%=JS9|GA zfjcLFAyDzVTND$EN+Yv}5#b2Tz_-v(Z4g27;htIBf|%#jZhyL?e*rRbo+0y=<9>Zo zAi0C2+V?@S3xgd8Sz*f-p1ezfS4SiffVQ(e5s4L!&B>AWo{+OL9kRBsRt{P(Sr|?%b$sg6nBQ z%i|6P7x>>n$ph()2!WY}Mc=takM;^@hM=_L=CljVhP)4SJi8f7*F%fhn?9{v*txN7 zL=&2Bzd%l<{=)}?U?Tq6FD9aYP9#U_um@5{?BYO71A$Bj^E|YX$+A}xvkNV8!L`yh9 zSJrfk*`HoXFl;s`<*in(*5jACLfDF=SGH)gqMk-N<8RRW0T5}d{XL?7d}JkCS)3{m zNQMHL>ZMC&*Vm0Ys$Ri5FhA#U{j?==Bq%{`!UVPYxbPtgOieB(K~z5}-~L(UK^N0T>mzOQg>7thT95Gy6EV_VGTQYIj4YDQP^;Y|6W<6KFv z+DRHq(4p?V670I^&q!z{S$C*Zjp=sw`lL^vuaL#Iw_0UT$A>Ub1jR`#brGkQ1^dR% z6AX$RCR#&oeX@3#N{>bX{&>@@70Ox>PHT>UqP3_{c`ubyd05NsUI;JAwVT|MmWu7r(WO30B_SMu&Z}Ph-YWe0?s~LZc=VB1X z5q(L7$>7Pyl{zNOY(lR9lM#$$u2%f+M@H|jmDh@Vutd%nal8CB&+k_|N2t3?)uAVf zn1KaZqp!9E&AD$n`ZQV1UNl}qVnAtKilE~Wi+Q^(un~=LNA1&#lJq|)RTi$6{zGvj`${ee$B5~ckD!iboCCMi|-;Eo}Gh1uW0eB@u z;FqJ;z%8kV+iV9kqwQ|mW}B^MhtX+0RgFihx-=o)dJ+=uecixH^34M0panlkQneiU7z6iVf1)>D;S>h2~I?? z6SSNfo#|!b66+5$Lj|UsyxJ0=1v&0xPfyS5>(}}LJ*hGy$?L9(lA311N0eG4uh7H8 z6pAjmWZnglFTV#wi}m-?CYW-*D`n!Kp6rcKSYB8vtl4uyfggpL*s@n+4vYP}C6gUdd+ zr{xdYUU6+eML8Po`xt>}IoFfWz%=U90yS|HIu<#h^C_1W|Gp4$IWQ&EJdP0%?GFz1 zAs5z5JLFwSlOfjiBS1RW?jKS1rDxN#Lp)(Y4U zz5$AYBQS+%z04kE=J4dPuJ+D&i31>y56v%ljPnv%N^OTEg)lA#)-XC$RB>7`p6V-k?$5!I7tFBZq|*UvB$SYc!%clcI`UW?y@zPa9J z5&ax!kfh1Gjyu-0=_OTMUA5#vq#xgO$G^G{zms7T(BQnW(B-T+A+mp1|4{u^j=O@k zc3twK1j|b5vgcz^J*_iPyMhSZp(p9X@-W)k7_<>Lnf=8q&M{6^epHGn0WF7tZtsic z^7WSn3#i7an(fA~H%JIXH|~y!A3oF4fR-58ONN-O_Y6;sHZABl#J6-rtD3x2*I$U^ z7^0m4+7qCq>kE6T0SxE7rHqbkROKfn`p+918ti~iDp-pJYWrU~_VpUjacU?o@2TcU@~ENo_J*b>g4>PHzkzsBTvwRS&hOtY3d ztd_39Qy#|%DVxtFH+<9|IZ*txV5JjOqiw@C7cEQ5htCv_HmnZxjJx|RS1z|!WbSP~ zp%2sg*m~IABlG?d-X(%AiwjNaZm*+IJOt*L^T1wK7a$&ru%{>e-z-lo3ychdOyOj% zqkPzmV}Zd0HLO!MEpI}ltQ>%HSv1<&MZdWwVrE&eezhy3Qxz+DhrX6(F{;TjYOE3% zc%;OA1iMh$!C8{WoZrSYW+x8x!lx}zNsn1KAh1EDV<&qe5DG;Q>9_Qz0#j8vY`BO{ zRgxY<9%ROz_mX{Qu7;7_30EAdI*9xG;MwB^k3V(?+=*L}*`zeZe+DsYzsf1^20dvL zFLQ45yt2#ak~+1v;paL-D;gPC#1Wh z?u86zZ^NSW&^aZqZ5sba3)G|6`3#*_d`Gc6O}OL=ylTw0#`H)Ay>MwAzdi!B=PWD; z&x|}b2&ma#TPmyVZ+dC@)6>!&|L|wgE8>!rhDqzt*M zB5bzY0}oTJLs90X?Z;x@YGt>T$n*2T?(;$QPHcrZ^$hG>+N&sQjN{I=c-8Cy%&@J% zoYYUm=|f_xIht>K*`S*2VJz@o=vXq7e7gX0Z+O4gq1q)nrWI~QUNXQix_h*Q*)^@5 zj~;9~Q#?Y1zJCv;MU(gSs)yAPHn->5Ad_JW7wm9bHSpKzP{2-htxOQ}R<#@g`X}lb z6BiOkpw!kjk7Ix+xG`Z_;vN~5a#UI{+8QN&dHw#>TrXdd4fS&71Vp{eK9jYhx}nR( zGv<^YtYrv|ITGSqZ69<%q{|?ND=v+UPvB*%G?g8yUQ6Rc+!Uc8BrjF4d`CGs8bB&| z3g?t!h`-z=;RS8%rV5{YGH+BMYCu(@)GB5+a&G5${ZF{?CeMI}h9WNvLJ#gC+`b<* zP~(BLl9gxu3ZLPL-6y$Ws2*>S@PUB^bk_l6K1J*Y;apmW@0jwmg6!X3D^Nn5y1mTC zKTrr5n)=lNyj9xTVWO1TY^u$bpj(0yt9ede;G-CRP6)!cJBr3bZE5A7>)1XXR1wm^ zWTkB$uX2Is6V=<15?9e*@D%2w$GVvPwDhC35nY}$zSeE2oS1^S0Xv!dS(--1K{|IH zFtbj5sJsQqjMdNA509)m2!wzr97^FA*Mks*YDvE2&4-ycl>f-^D=a)<4$8hDQ#3Ze(_*jk+4^PVbu+;(p2LTXtUJn3aF*Xf>LI9>chiyLp z2rcs0vW#)Mjwyl^M9t-5oMzlTOfRicxii^vHF*R2P0Uq4kElm4SFK?0QQq!HEpf;e z^oxTLucZ{&2BI*7UZ$Wc%19+5R)FNWWcP6|o4&vTudTJrf2%@89pj=*Ufk!6nrK*K zYZ_#gzEnDHOU$XdzTAPz<(!YWw`TS60MO)f zNdeTDWLB$nOj_;EDS1Mh$T>aW6-%@NcOD`68`dL%i*k2!ZR&K{ob5ZU?1g9on^n-1 zlBI0Y1v|>x4XydBqR^94)+HLvjyR8L5De<=zj8P090h zWTAd+^30!&GeMAOE70J-hv*}) zQc3Kkz17Wgy`maaF9~Tk2xGzdL5(B%%5CZj(bU1uzwT|l-{ALtLIBCJE9sE8-*{0{ zzg5?dzO>iV5mF@T187EgA`)+_{MAc<$Aeyn@=p_EJr#73 zvVhn0k21L=dn2eZ{sCXB8>FUfAY5)0VTKtkFiF=r;5^%BPgP3Cz8lPwbsQR&#wH2S z2zB3a0iN8m&ggi(#obONra`c#&YmFN*i8w7I0xr~xdq^YOPPOs&s971fc*AL)+~+6*myXl)q=M5e=Z?1e zM~J2xJxZs|D_xVm#u8pUUNst2PxLvCAFr)%1W|c`Udg9j`7&Q$`_j02tj3R;8`}3~1Gxm|A~4F7l#;^kUuQf8 z;Y2i*p4lfdiZ)Sn{1^yA>fnWQNodKqRk_fsP-Ov&Ku5c8Rg-Y1;uFc#QhA%W{X+X% zyMONQ516%tA*2Y(EL1MfKmPgRz17B(-2fd2ReVcZlqp%4rl;mcwGH%(%~vW^GgB)n zh>jk>u1dqGzF^Ql4I;u_H0WE-!vjr+(Ld!a!(g8Cb}7z^`gO-$A20$m?DPh7Y|&zn zJ<&f05v_&7Zj8?ZuxV%Chf?6VQw@|o*tJX)Qjwx>x1t&mqPGofej5s)_-)Xv=-yXY zN5H&t1#R68IGe{U2uckiz{bMX{@;C6qp;pkrGjo(^aQzjH{Q7Asg?|?%~NjM1)+<; zek$PS8k$hu;GfI;fVo;{NdZpNOUp(!KgU2D@iL*~ZQFXLmM+YjjxUcgS=m8VlLo#) zwKr=MpwsB~&yj>{d%CTQwyQO=Dr^2Xc^p4lo#2gPfA?3zcepL8zf6umeXd9Z2ygqw zHT>GA#L$8V*=nccGxy{@8=W8?m#zDGc_vaG2=cfU0$_Oi>(E8F>Zmpn>^MRjlNB2{ z1&W}c%I*OaxA*}fb7Vs-SHcT3pqtOev(r*fy2CfI{a@}vG1CjCK}dC@Xr3Ypc%q0W zVdfCe``K8kES!eV8FWih1{|#T5e>2A&j3YhHI^>}Dk)+{+XJZ||2MXEhIouLXQh|H^rZ{I2fd;OP%DhTbo!%{hpJxHDOr#CyRgUBo4 z7cN`epW6x_WE-VxNFZz#5fuYd~HAy#eZYLni+~Vwq|s^MwtnmP>jVtZ^4bgJVVyy0>Ch+#`F%?HE!Xd zrNYB)lWSmRLsGW<9JXPvR}9aN)IJ%cy@HqXOi!-M|L%|plF&q&3WBUw*rAJT(QXJ7 z?A6!RLQB|%;As_h%>GazC-6_`{+us|v8=Ls#3zNU)36GAyMphx`4-~$FpLqXIh{Cm z*GudM-56O87ejHwee3SZoJwj|6hM{#+h=Wv_9KnV39*v{oHp|;(v#s@!!byJx&mfA z#O}@tam&>3LGL{qW(_DI@nkWG85tT`r+!Wz1r%ZedFJ3$m9b9u0^5?E1N78@U6P#7 zH}77;a2-MfDts``RwNzK-P-=#<4p(>%Jr0~9D=mKFiTD)YUcL{mK_t%L}Z=+NA}nw z-D|`Cly7G#0^k+V(W!+N{2cdmqjQq{N3hybF!O2ToyiPbX-}iY`}s7!KbDRz`n7^l z!mnT6d$A~i;Tfo|^*bQc!Y%Uja*KBM*SrX*j9~m6Jt~j-+?Uz#)*9|a&MBx)DiT#Q z*0%eA%Wn366LdLHCcy@sE(~x0tI5yzSI}7M0VQDRU`xgT?oe5^54!-=Wr3jQ>qH#j zAn>^0aye$fwDybqDS0U*(92xCa>ZWz=YC<$;0~#FkZwqvf+Xn#c~|^2c~eqn)jxd0 z7>2wL?A`Ss{ip(?0}*}9a27#vA2825ip0l3R=R)Oupyiv@FM{Tzw*?juKMfiv!N`G zNRF`omDz&uQbt*!R{=LEcAC8K+k%P^+#Dszj~9c@OS+3|b?dJAPR zg6nUa*wlaH?qRj76?%ribg;eo9x&Vf+<7|-Vu+`6n$xZs(H|h^UBVfg+uCi?yH@Ls zOk>4hen%*_L?^$E%PjsfP_A)l7sDa3*7$gMKUS|1y!5fughOTS`1UT=g_Nw)^V^45 zI=UhGOn~DKL_%@ll+y1(6$&=L(OfBJ@v1Eil~y2A^Uv9HX&O_(Vd#F7*4ja&WN9nw zE;P?b%XX?Qu>g)W5j5QjzuQkT)`u27n7qgAZvi6HbFoa?+1)-r*Wr$prDIDx#GYpe z)%(xjr{SfKjK%C~yII=9y{JzXFosj7EJs#?Dnj4GJ<1HK?}5~=0UaL)M`kAiIS1`` z`I(hfBuQO7f@K0%Yc$7?44lAlw)Jgo%8l)OXw6~=+C38-^+o{ z$Tz{@{JFoZ`Uo`fWpD-<+n4Ql*gR!fM&E;X?Ez?k97N;#HC_#tBc&Mnm^31+e|q;+ zZq#`u|8KEa_d>FIzwtD#bl}e3VX|W}{eF;rRm0X|Pd4bSH8Og^My?z@^$XLFgq*%N zdfNAbijfDw9SmTTM<$&2|K`*9SQU5M0HoSb6E5P#_wNP$4fKIMQE9DyKz>~@a6Hqg z&b12gq^5RLr3n`(agF7)asjpVK%79pp*5vmcCWY@+P-3=m@oZmv*lLBUi%&2oriXh zTZ%#Kq=XE}!j{;tR_?4nwkBUpNkL8=3sNS1ST=R7g9s*-dU?|acdu6H8b&QYY&PPP_RUkFxh{WCbhJKmo(?e*sa( zfd}$?*JNB$aEe8OL4^gPN}@TlkJF<~zpARJY|jB;-wD#_bh05huJqIhd}a4XEe{Jg z?p}==bkTi3(943-H=12N?_d`IHRU`eN6UY@NA&hYTFyH2U@8mbcvJBg| zXm1Oh1|>x?`$02=CG56z@`968CNPCjxtgEi_o@4s-pj$uBu>iPw97M#zvyNv3{3B3 z!TfBH%PN2sE;Ip-(Gz4##1oAE^myn9#@iQ@6Aau{?x|72ZPj*ve*JMQMG$gIb&zjy z0(hgTR?mR}GV_dtljyTEmwFWiaZR#@YN1h`7IQQ@DiE~P65up?sEggnP>s(RcT7$I z=aRYUL#O5`q=T*T*X{S$92a2NUV*4e4f4Tac0{Y1tUS1B|)m<7EI);kuWV>w;{JO4TfpaA6CcKbxiQW!3@w!E#QxAp&L+5)vmEjUG z>0yY3d2!MR^Z|b0Zlqyz%JGd8(sxc}y0y?9A#{u{g0;W_+mRi8A!)7 zFR4|I{z);}R-}31EeY#E6(h!SYe9%J;Uzda#eg*6oB*Kxo|=zmCe5ntL%{7E8o`zYd0D7-)nJ z@lkyIsL$WA1iX3BS!L%VplLw*ouna6Ve;u7N2Z2vl=p_sOP?CLwa(R16==``1HfpV zpS7;EtGk}jQT5LH^Z~jWrOe<|Fpe47Sqwb7s;Gf4mZtHZ&oWqD>j6WPLAV4kUTzG4 zf04mnPpoK*j&>da)qY%^QoERK-SAJx*!ii&kd%QCkFBL|=F^&%Cf6uUQDm!fkIk82riW~V5 z)qL7pwE*gP-Ki3sX}etX=-L68;{q4u`3?85t<(yVqdpENmK4e8`JBPNk+Js==p!O^ zl_3KU`CVHN6H2zEe+1Vl3(@SgUu!OIq0tOB<_M?T zII>rf!mCFMTuiThno9m3CY4{)dwVrsW#q|PHX_`?xm=L(+F@#S2vMIn*qse!h~u#L zaBn7Iu|>LbWc#~VW`6nfyD7f>N^H4Sw(3HEiPa__hSIpgMA)dC3PM%8ZWbr+%&z>( zWFWLdRQJZZ19y{m>r2W_)XaZJQ3=&#obtJuw3+o>JFg};uOr|g!|LalJte(fya`PQ z!=jQfo|`+ZfSV8`2|`{&F4gVmd5@8;;gwRt&fG1z?<^x5pI0oZg(M6&zc6J6jCd@r z@K|`-majZ*QzPuiF{uz1X4O@bR}0nEe8^)bJ14a9>I!#DQrn9OOE1(tO*S2pw+2^Y z2;1XR;vp=m1q+@NQZ~I2NXx^WI=wTmf@9CApP+R&JgfoU)@eKZwUV`&QfZG(i-kUT zp$d%n&dxfk^v+x-=E_d+)zHMzkvp5b+p}XK0N;OM!Z66K{!iez&h$iRte#fET7^tRM zk14jfD3=~S4Fg97^KYexnu^Lb{$q0L*bP|o${=>r!WJd?l#(wkt^XmhgG(^t%q*vG zm3fi>J zny=$@tDNsn_i!O)>~*hTzUDrd3c2D%#jy_x;E=tuq$DBBKS5R9-F=<#u1#4mX8D=x zmsvN3(B-sx4;+EO*X|$AO0N`3?-XqvRCF`+eZv6ln_8KLrAe@6M7Y zuD#C?OBhJhfbXX^F^xX>>F{;jnAXFT-A^GjIwz86iWmd|avm68u_j7!ax3o2FNFe* z&_=5E+WG}mnYnjVhemxo3LqEN=_Lw~Q{{f;jM{fpftyC%Ks zOed;#D;z!goF(L1L;KhIFSpOFYYruCEi?7vmYy;KMfm~BIS?R?4GWZwL4prJMkUDJ zfJROiu3pJ4{!h6sxfc@s5n~aBYga6!7 zbRTN^e&WTvTN-_E4_BidXX~vdrI!ZlJ@%oFQnww|bMCaxBz65Byhg=Cp;zjIdK z2%e1)3>tEuQ1C*~xM{BNqP~dB~JGf8?_Lwh_VQ@Cg zA-Yj0Ks+BTokIFnLc@eb&>k=Bx67>YoJ>MVInRC|cn81J$jWIyC>em*6!|#p0Q|Rm zVJl@D%DS!VrPVsq+nEgI;q6!TV>;}hl>D&J&XT<6pVZq${K zM?Y-N(h-GuNp0zV1eI==OeIYPLCc+eKc;(>PUd?|seiH?soo*>SB70v$EuX*dF3Wd zw-E`dOHVHc;+14LeS8$L>D#%4*K1b91-*DS&OW->$7q3uW8tx^n8fvl9aXHY4X?X44(q^~F&SN*}jnx>) zAPFT$Qe>|$SmMG4QdLE5@}^i7w3XgJUg05XQML}AuxU&*RV{zW(f?jbCEm5axpM${ zi=?#5?_W3?x}oYB7~8pw=o(l$?nCz0MglF%w#;5DOk?{=Rzdtkxc7b4P@9!doKN_q zk;0~ENio>Voh7P70#ovp^CBj%1Zyo{FQ||w;9XL!`F75Y+&{6SH)28FM!)bLT1Z@5 zCG;w<%=juy_a0oe`lr99GoN9)mwqneBd-SH;DpM?0!jo|Re)Ujk8=-sD6X4e#o}y( z_B<8GX* zs~*nuK`~^BLA|U7y>5SF8BP2Dgm5(8+gP;yv)|4s>Va=I_18L{nOa52`S=sg%eU*| zt`Ox<>>Sx$Q1TX7-qlt!Y>Dg+(;weli0Yi-+~l(qmB^?6k2NMiA9N<%nNM$)e#;); zzFXwwMZCum+B=u4DphgBm-DJufYjg>sPtfJ9KoBz3JVe10ss?~4JG{O5YqdNwho1! z&uaI~=c_Uh-@vO3x94kC@dT#e$RnKY1=c%GqB|11c1@KSr4{Z;!{Df>gb}3`i**8D zFUCh=?gYi-1~zHi%Rh~u2Wr~h2E1pM=`&kIB+i|L6s6xU_AzTh^%{~BQ@H>Vn%qNW zeCyFY*P8srZ7v&lv-ybceyC`VRDwvbcY5@Vth{bUz`%TOzjxSyq$@125ksMu5Cg80 zW1;u^^P7xo+ugu?aZ+Npy@Eb<8|xCwA2nmLK? zwrP5rUwCdv2>WFSx)+mxj#t6qO6&X`qu7Rb5Fjfas%c*DH_k+aaoX#CRkM2sK(JH( zZ_v>){Fxr)E_g~|_{{bQ4%0ZYd0%wssPg*fj;bQZg&bUS=h(R^BmK4r8>hGA#d2*X z`j3Y$BrD@Ie{3d3xAP&CB`GT(?gkLi;(v$QeL7J1 zw9ZMH@^uUBtP}(qK)?|=guwAL11Dz?V5iW&@9U2U%TPS+81k(H%Dy(cd%9_SWf1!2 zaNDEp)?7??R+zrqMoywyr%-KEs4w!uhCconpI9}YH)=jvYCeVYq|Kwwo664T&$H+x zA-D~$CcY8GS0LJ`15l^NUwmA>dbAMw?0g|XpWiJ+J&)|U8WWhlyP*8Ik9|jEn2WoKh3o)JiD@jij=48fF`bBu;Gq6RQGf-9bh-gJckaRY%Pcw)Ytf9}I?@fQ z(5n@x5d#o&Y7yiIM;8lV98sO7mO;?mjn-Uk&n(TKb~%t$AISSlnfkRt+u;f2=WZ0Y z$Pm>{-A2MZb$64(?hQShmd3gVCR77dTJ7lRY2Xv*(*oJwr9CE|lP+QNfkjY!t zsaXO~*NI-^Zxs5DXVxBFyo11h0QX-7p2v!C9Dpk1GkyJ#MZ+fFUI_RD=wM`{2!_F_ zy7JM>suI%5(K{Nt^9N^B=w74l*-301Sp`FWal0w_s=Y>{2W1Ds@{m4Nd&k5lHhqs# zwYVYVu0j|XIDo)Hj`}6+=8*W~)J^YFIWwt(O)^Sq3l>bj(iLlgk^-Pbum*Rr+RXyu zh;7Sou0GB-&15ACs7%z2?Nl1RNW)TI#CjFlA3+`LL{{oc;MEK1yh)euBp zS%4QbZe4?(sUW}Qn+G(L@Rq(T7&)s8*VbTdq5U?V(TwVQ1HE$Tm>k&Z&$A6VpHFAW zxhs<2fEA1}t1g8>{abCp3|{Z(Up(W#(7IE9O_Xw48uQqFQUg292@pTky(W7LWJJzI zTPlB}2B3Wz^lx+h32@gn6dGc+r}xtBi>sUPHRDpOG#5o{VR zK>T?4pkI7{EiFxudduo+L4yZi%CFBiPrXQ8u$D{Q9-Y4gtmqc4eKf&a`m*;LN<_)kb)m*0{O2#6KVLm4{eh0|o<>B#TNcv`#67=rimu znaftTGLQHpT|laUG#aL*A>g?MZBu6B)WrD88MvK9Q35r}Q*l=?7}7-x6O)vQ;e&Jq zcWkeTuD^orcHk2A9=8-K6Gk9@h6PKn#idkeTwu`(U;`-@go`G$gxT2X_u3yM8e)YC z-*&;FaF*Fs#mHM>bh5EMgZ92 ze3z~O1D)%tjT-&t7}C!=IGu3i<{Hl&ZaUL>pXQglk_5I(J)W-J0;IJQtxs7^V;bQ% z?JP|+XeQQv;4y&}-Er~`@QbK|Wq};BKJ7s-~P8nb|JG@B(=C@b^rIN!S5vQdl;3cJm6Mgm~h|mV$w^e{B zg9fDvNQ@+#b1j@j2`psC8_{l++jAuO12shj#n5aCn)jfOU?V~@H1Z8z)1NJ^TWLY{ z1j3eL0$}TG)>-I37sF<}H~B&cg$lHYJa*HY*bBe8Ku0lS_8-G;-jb010-Gs1s%m`j zI^40CmAobqr!;?PI3ITZ1+kWQP8JMyKUz|!_ z8G#s!vO3iwCL3YqhjmZjkH_f$Qji0Uu;Ky24r=|ZQTnLrWwCs79OgOnuFaAL7n{r& zG}+i|XUXpaZ+8H~Tskz`fRtP8UQ3FELiF-I-FY-+OGkHYY!0FlsY5!_Q9XTNO$RFy zZO|_L=9dMPp{tE&u390TWf0~V!YTNi7{^!S_Y#}v7^Ia3)G{)vMUc_lCHg2iD|vI- zqeIOjK+(yOsSoL=6?vu5xsa}4cIwJ2L@a$lHJ$bG`5B%cA>9vUNhantLy8rQ(AV&V zbp#Jfmc%jw!S6L4(Q!vm^7CwLK91m#fVgjuTUU}{r}&#Deim3CW-f=o@BgIl>Z+<>=C4V(Rm#G&`v6O=Cw<4YL9OvcjtzxY1Iy>zF*Zyn&p zBF&q-6~89Ff_v;i?)%jVO9*{UZ^}m!*>pw@6T)z1+ zRsZ+t6X5PLrlUbzWEOeCd(NlM3a^|ncC4}{tf5zSHZRQy(jCino~@p&PW~*h9(_W| z$v$HHkh*tZX3Oj;N>&0Bhjt%MMfy(;*&olQ9+sR#o}wuQ8pPx$AAe=4+yHFS^Vy4F z0LnHaUpzip8huixg0H!pI`GLw)pPh0DFeg(%9WHUyE8SB;Ls|;*q(Q==1xSsSCcA1 zN{ou|!BWRQzjXhxo5B3-F!E6*!R9_^&5^6&GH2n z<>*g10doAEa0k5SRi$`c;na^SER`2`lB9{6&o7eZ>8HZ=kRR-f z$)&lAWo~QQEBbN-;ZFRgw)x*EJ&~RsO4afu*Q@WFjnYw~qhQ$X{IzauSwCOrrI;Q! zIXJ_E9p+v4?l6yT?jtw9W#bwt;EMhIn;$Xs)-$re-cy9ax0r}tFUj7wU}W4&kCYL@ z2PY<-RhMR8gl%0T?j(_`)v?q}7i&_{_-|#X$U!!xia+R>|K6=g*p4Z4o*mXy{qzJd}^5mw!<7{)bz(uG8H4h-?Du`m>e8R=BL=Mqx(depeM9 z(_%r>5Om*L2qS+{`)sGO9q>X~HNk51)X98UWI+fTtuPJWRS`Qlt8cqGR7NS4hE>Yc zr24re*6_0wk3`o|Ts{e>QupJ(71^p6WbwTh)v>nRy;^aBD^GMWl&e)_5ig*Re`)C0 zF7G2OE8E6kc)<8%CtgaSKWsg^TJe&}Xh#L5f-2yQ zb^q(Oj~T1J0$bJUQ$0YU>1u?+lPheh7bcvSS~963g)RSbq-Nl)Ny4_He#w+(3)alK z19VL~9;sJ{Lk9EpPAcDLA6J#OF^O?sRos@H*mQB(XR1n1? z$?;0-UJr>logzQalf2m0XuDgFuT~_mah&85R{kf8yYeDs`_YrSqwi_ajgHP)tc?Di zlrw5xnYa7qgpqpqvR2u81iHA15<#4)6xs<9AZi{%spKtkbr^bM_LMqwIt@NC5me#c zkfHcS#q{YX^HmE3QW>hl+&QTI#maG%ieL$R^QE%xWR;P;ZungIE08j~7cvquq*`?( z{psQyKUS?#54Ca7#=KPgTHpUE?!BX$Orv*EW*pm~G9x2cC`z@^5irz2rAbo|q@xge zlh9jGQ4#40Jp@#m^bXQhq=XWr20~Lwh?Ia3NDQIeH-PgyYu$U#TIa8me8(XDhd^w2Wt`RVl)JYZJP=&=A@7_^S7d>*id04wa%j$_Ab;fzS>CSgWtmNy6*P*J(qOFD1)X_;+TK$wke@mB{F@dOfcclr(UmkuUX4-uUE3Q z9dsaZP66vG!PJ)zx+Z{7j{Xve_5*6wRwla59r{gPTgvJ7<~;>p!OF`*0oH;~);ar^DPenLXdEA- zZY4L3U+}BK*tG#GUJAz)j|doEXq2e)_U2Q%`AbHU@F1)*Tk80=)eYZ8D+@g#nFtZz zmIU3p4s6D1k%l9(J4Pk(7+z|WXnN0D3ePn@xGU>_*%kD7J@MsU&m)%25n9#p zZCFv$#f(IB^DHo9=b{Hqtq3(~ZE z3>B&I?~Q_y=+e=Xx58{>eU<%43DVoeGt?bRH`v>sAYiUNA$Wj*4fAIobSPGG8qeCr zpt5>QZQLs1jyqT(2sD5Cv~ zWl55wpGn{3(t~q2XkQ#wC+Kwd{UDJ1@e`lV9!J#rKUn1lxw9O?BT5$=^Zm+I;Jqr>mc${nP9z3_m zoz-bk-L?OV=Mw%ko3|6lV7X84)U)=w&C%dsSMC+5^!hF*mZqCtKC||>2I^d(m4Dqr zIL3jQ*Dw=8kQX}cZo}xg(u(&?v>cZG57obVXJ!jqWOtCo4n5QK56Qs3)+HJ6(Cv}l zyuKZYttZvw2hlFgTTS$qO+q!$DrAb5??P(XLNA+-UpVsQJoC>{UDJQ#{P~VNF`=)7 zxghD87QrK%+@TaRm+Sdr_R|yueOx(Yb(5{ut-3~O(G#mSov|~Whc!X!w2l6#ola}n z>^fKE_7~U<_;XY8s@-pr7av2P1S$UZ{;&G1>Sgwd(Jcya(po00iR-%J|Bi0Fg);Zt zyuV?hq6xpREp@7u6>&wq6{@qB>mJ!!_Ezw&2p5RZ8QQwna1e*wl@=~ViD(+znLA-y zIl5(VDSqgxSOyb9rZX!0Zd74TIk>_$o`GTqc!Xr*`8v!e)NZ(b)Q0#2A%O6%uw@!9 z)2zC)u=ABEflLiJ_1021(7sn!>wO9Cy?nIVB&b2i&82(eD`_)J&Sb`EH(1+Q)i}QmWU2@(j5_q2e*dg-RcjcT;jg-3r;W(}2LsVam)P3Robnw{&T(joX-Q#{xDa+k zk89uuPZ6msEW^G!(Omc#bZnI^t)&Z-ts399*mSBU^j<=YtJnah;t86^wUi z3ej9cKVwS2kZG_iEJY{$+OUs7B(YcU^$-(A9#Z3g?8K`rF&t)O7%pCg;Asp3vDA-* z>*jCfwlzzrt*Ob*r*^M=l(uX4ivf8>MzlLjE#l_anwoIJTgg%Dj00-OK@&dZVLNS#TXqhTTb0aALWn{{xZ2$Rd0Y0NU4 z4oorL%iK%?+$SG?v90un@}JHAoU`Zt zp@bvR<-P=q`@rR&<&%O_a$bVmK?6kQtLGFBJ4;_Q4O$)6|MAhgPzeY_O3Bw?-f>^*U;XYaJZd7z z$`^~k+-n4r3O*+61ad@gj*Vo|0$<4Zi^tJnPzWS2$>-C|6x;u8XIyO0A<>8^jVusrXGHPdG_QHMHrFnl0V-7Sdfq)%Ba zrcW^w7yLgQ?^*M1xV*_fhiTe|ZutHZgd$#))CTO`UBNeWD*0{!$SdS(^CtMK&WL;l zmZVR4LZDEgNOg&j)X)K9U;lpU+dUmK(wS9piS`s6Z4fLL;ek4`4CxI>mwl%8LkJ-k z1Q1we%sW)aY2T8F9vUvaj!ZA_z?QONvhkgKBrC&h_DVzkaA#?gY|c!C@<-M|eKUj( z4cL1juaNkEi{ZG74`hChQP;!RkQ8b@8Teeghi$_u*y{(3@K;@0{6jolxr=px*9@r} z@CU})<=2XZ+z<`$JvC~!fzdS@G@jAFxF&PhN!sN1sZVRBBR36sRAG?;!OuAMZay)A z`&OxEWT@#)fP!NKd8@iyG;(4mblaA(QzH9J@CzE;b^|i3jgz`fD^5F>$w~(Mpdliz zz(*SkC8^+)a|L<32#^(qMDFObL(RtZODwqg2aTqAPQ-kHFk=k?y_G(G3exFN11 zH_omb(Bn$eYux;I-@404ozcz2=hNiTN#k2W$6uldhh|_|o^F3O#BpYq0(ML`sA8^J z!fvV*l#I*|HJvFHO7a7GV@NP~^7OfFnFvQ&&k3$T!}- zhGleXS8200ByRF(-N3F-_%;s$)z)SCd|?O5JTwJ`z2(fEE*C;wZIqz@#LIawetBS7 zP_N!Du1F?8+v0u}l{Jm@mJ$=Jv-VM<9frgs&}!cAfUo4ar}3FbVA=}dAvtzZ_t~h>^z(szH)}T*)eK!oI6feSdo*=wglK z_4guY>6PHS?%J1uVTV#C)bo6pC|!L?gnudmygM&kdfW{lSfj*bqwEAV{J-^j+Odzx zqx9Pxbqc^}yIxEbdzCX_Zil+#c!h+=PwEDM%0}Bm3ZnOGxoBSkmy-=16t*urn;yve z%0lyE6}3$w~(RiP25$LDR)3Cw7ze z&HJ+^DmtOYdRLjr)!;A1Vo}iE8jP@R1E+-W35- zRglsD!bo&waWz%dl<-MtyCV&HS)DMUbgsdpB?Q(I?&5RosEXz`KFP7G6+m6!*R?yp z;svQkuQ84DY;qf*Ls78=8pulYA~y0=%3%mJ96bY5PaA217NlL3Au3oKs+Vcz+F6Ih7XN0f0Sg zzJ%?bBp_f8$hdvCRPH|Pa=80;L6jrWyyJkp zldx-6;e>b$IG;9vUn2veA#8UQA<|OlL@oT@uaKYrGiSe#q>t+Jd_2YZ4!8&CNt z4)~Kg#7-O16+gYY9qmG!PCEOb$6Bj*NxI|Zc1MY(JNq7aRqmX^Iefeqla6PP_ZqfX zY&0l*(8)c#G19szp;Vf3|8h8IE{hS24V=k!%?c_qZvFGi zZZWv|KFO77?k)ZM8tjF}Q}Div7A{&6>o++ROch{4)n|>5sH8v!cO3(f$;`8VC9fas zZE-FdSR9iR0ns1DE|8Em_Kipjb zR*Oe~GxO0r#tjcEsukKCJbipX4pf%WqW!?Ea(CQ#rVI8hWWHCoP9GJCZmASZ=>iU= zGVwQr-|WeGpi%PvN}9?Iu5dSj7GL=*~K!$ccL{GRNwwi{02(!=M8I5XMjH zY{l!u>gu)JF5JsJ?{>?|dtmrT_DmYvK)uVEdBO51l>wL!z=NQve;8U@%rd!cpIt>f za$YSKq*D=qSBb*bzIqdHSatUK1peVT?*{u|=-jip$s~e-H885Seu*=K^Sjru3=^7l zK;l!yq(?!NT4H1agBr;wBV*tx!S7iSJ1*K1>l&+LOun{wFZaH!yG=>oJS@-j+5I?W zbgaBpPj3gn726n6JLw2QcZ$&S*lh1*x3A2C<{#w&{ngfh9p79U0oo}sZu?8Yl`o)# zQ;4@#D0$Iy>U+c>A3YNRK zK}q1U>ntXdF_77mbug`sL!~5}fXOJq1zaibPs3Na>l_2k2{PRtlAd+g-;)wWtfc#6 zCKSMtuS3g&ECHZK8MjI}SHn9{DJM21w(eXihsJ`2+_OuJ-O34;_I>PujX|#91@Hji zX0?-QKA61R^|YixIw=j7+zksDQhQ$^0kFHvhQwfU9y+PKeSlR5p7c8G37KuZ6&l8y zU2D#+6A~ZXiqf>s-_ute=UKOKtpOfxi?r?%8MAqyE5Hc?TAcB2Jv4MC;WU2CF4C>FM|kDw!xHqn} z2RwQE64mV2x~adt(nKM*_&)|c1ooZv_;rd3zGfJIqI`2^L0YaygO`ycQwNRo3;l+t z&lT=W;yHGyGQgI7!amIvF|Ntc6iYmnELwA1I`b2Ix%oF0l^r>XUo-7Cz`E0Z@E@lr zwH6y%F6Tb2#)hVD*V6q$*3P=X0Hh-4HiP-Tcd1xlnps(<)Jk44C zUzuKA0C-&2PQ#UtmspvF6&=OnMh?{cna=&(Qbo=%m`kFYex@ChwS~{@l zYVSY~>87?%>*(Kaom6f6!(cE_xBFBopbpC%0VNb_!U6G+S~(bGlh4OTGpy{VWajkV zf8qZiFp5`T9OMw&KjY;jxfh3>w_^4-yLc;5Ja<7*HM?Bx|}vR%MEd zYfQ`KKB^G$wMK$^92_5H(*;L#Z#QY8KK!);uz~R)&<(iradFM&2Zx@%zL@&7!3AqVkF=gpQI1xN+bTX~QI81JLlT~s8FYanLA z3qVr7DB#C(v3|N$?y>3_g}o16_3CkG2K& z7cTnx>UsB!$aLxDm*@l4kYn-udOufhsJG4;Zb>v%r(1w-U~V!)Sg>?tKN5n%7L@d+ zi|Rrpl>*2^ZK0q=%de2DeqwkQB-VbGR84Um8x@^O81R(bMNo6C4r=W}=>6T&@&CKC zbo#n2QaY966%t>S{GhRzJ{FG_1DtX{Uo1MU?c&lqloGJ9^c+T5uTCP7Od zvDysUyfB-YqBsm9D_|d8c7GuSKKtY0Y}ensopCGm84u1b9HP?AN#3w>VD^7s|WmMZzr1{i_1f9g*=$#|xIniL}^Ra%%N zb`|7Uc|Us|jncZ-2*RxtvzULtesm{#FMFL3N1cTzMoz?{QYr-#ocUobPCWWeg+A}6 z@LbQ+fp%Z<3ZPsuf-Zkx!cQnbw%GU62jd1`McBi=!4rMJ7KhCoGF+Y{JN8nlAw?`% z>~j}D<}s3HaT&C0cW?ElRAV1bUHj%sBcY}ksJYq4MwCcl<0RNyC_0c4q(f^SK+V8T40QBB!N*!GgV z-UkO)KBi`EN;DPi+D5kD#@DqWyq_y0kG}+*!35e6`?EG?e8;a^ zt4P9Db(Mn|qCo=splk9f2e#30&#oU0tAlQ>2qHUPH1+C50WCqyWi2x&q{#!&!w2j9 zd=Tgb;EYvVr^OZ|w0mIo-kDz|44K)A>HFpix->7+o#%v09k z2EP+}T=p{@6H%rP655tbO&2F@^a0sS31N3wycY7Qf41xiw`{y3juq+U#x#eyWL>WP z$o$^!esvj+Okd>*fFv{;lA66D-)xHMDevSC=x`IqvAR$((>^< zZ}v}kYnM14FAs7CE!nZXmMk{)r@yQW?44}5(R+n}hGkIFx?yr&Uh`PYPVi{iP2S4R zPW0nxM@<*E132oE$4}lm@GV(LmJAxKIlT`OPc!@W%rPE;qzyo3TBEKp%8-L9{d?|u zKPT;f*O1XFItdtIEsz~EO9F0qTr+6U%&zSFY0*teaT7d`JG!w1P~?@JTg8H@cX@%= z`!>$LYcOLdtD`<$mf{dvUJD~I_A>R2nf`|xL(J4>A203;g0`%qxr~{4e)j^r1nI&%X{|cg6QaIzUt)b1w)mMF7vSBCu(dbERX}sMgDbOc+sm^E^FH zwC?WT$pP$hSAMOl#l&uunqK!OKQ}O_BjE$b19YGLCKK-HWs;*VT*IU%gSBlifX`id zz%HHjOJo8}qGBRuBD7}LS>o4pa{@vJlny*R*oS@My9jO^=1Tw!n$#)&$aL`( z|3T)+MecA}7yawnJ7%cFmW>-%6)l*T_i~Kz(fXU^? zfd7Hsa9W|{9$@2hAE z=}y=H{sfpFs`38DO)qbye^Gmd8p{&N?cGK>7;bpRDdYy?fcO)F^%iI-?(c?WEpQIJ zjB=70C?3E{Wj-+Los!e&6nOEzSXcrBK2S+P4^}<*lD**m|4C$79$AGylNJY=ARqHT z4UG4*KoG){gU#ofJw(UYb%=2uH!!tts`lzFme1Nt9Rf7F3c=*A{<=QHxZvBMdfanP z@N=uYB>9~HQ11f1K!}VDtr~y0Zo6*~EVr-juz<3q9~{&5Xm0Zn1jvneCO2viyX=*| zEbq5=#rC6h?vje8N3BrGEkIBCHDSQa)m{x$RCQ*O$wrbrH6JU_U)^d<=@i&`y0otQmpKB#ef14K{}0oOo!SB zRu-0~#)ljJ;520b;lXL#;3=-BQH@Jq_l=$9-L&clYIw}^!90*F*zReVVf$cJ?|+UA z=($GT?B$hKZw+f0<|N=fW)5Od|0!gFiB&5f*Ie1b+-AxKKfT?gY)k)_&_BB@W)H1^ zV7~ncp#&Nejee`X*85xoOOv|rzzslkM2RvpeL-oI)fX z0Ot38T}L~IN{7D&lQT)@9*=_(ixTo@0T|14vc6BBa(wuVI_ch zancnt{g}`+$cp?a*dZJ{lDlW)W%wrVZ!cAL#}QOF>KM)CP<=6@PrV?@6)~f!>|USe z(ePr~c|c$ju8M22gBhUvAf=r&iEC6t?OD%zXW6qtwqS&de0VOp25Nx(E>IwZ#5p1N zRxybtz_me+9SGVej0Y91Nt(_;lEF?QI#UqYfHq#2!Ts;K?RIk52OsY;qr)3t_Q7kjTMZ^)TiHcKAAf; zIlICa3Y(3ddS1v|xc6*l@T)7r0|z$GPkw(kX9Rw5<_Ll}rNfKa5x|S=?ai29MKgBo z$r`^9d^Gu{^I6r3NmfKBtAm9b$KDqTd%-~5OvlHyK0xNrADrtej>vu-KjHE%6AU=M zs}^<*s*q(4%YwO*VS5nG0&b0y0MocdP;IeQFJJ zV>te&1p$bF7M~W!7(z3ePg6?ESZm-G;vRnQ@ii>Q=jdao%}rhSAqVCU(CO&SWBTxz zy#E9re=eZ=coVUG3Kr&J&X=#%8Qn(QYmDtrHWv0W6U;G`W(=j3kf}T2qAhS7KxgRE zv$>ISiLFW|fBnCh#KZRWCjx-8YY+wLGMFlU9TEFeH85LtZ*J<*a3=uO`S3XiJZ|$9 zP~BMo2*ks4>Y;o9$@iM;@119uNDefA4nRpK$WyzuvV|VZZ{Zc;ADA;_Emr~x_J#g= z8N7qqR0VJsO%VYROdg{GzO~WhZS6S7A>V6%xalzWtKvP4wEtq-u%lG+XKM z$s8Bg33cY_qX;AKmAbhxl-%}C`zlT7p>Ik`f|J%77?<*h|KqmhYQ9rbj#wV0PlhO# zOk8~%dHc)ZaU4LvTuy;$QQ`Qr8gUjLJkz9bjCPgjo+ZpO2aGV_$=as!V}eIB6^}v( ztER**;t+8pgDFMf6=;;M741j41O(5Dpy*EYGcE7Kn%&eV?=R2psTiV|^SxlgJDpj_ zt}ozti;$LSLv=TW8Gx4=BEIwg6i_gyo3VE7S$B7wk{4)4yf9f zPnj2iRt1@6I1EhY5w&q z?dM407uu&oasZ(iwG-0Svx(ttw%^|DvsMZ1t!;5|3*VhE+MP3cLF7)WIIS0{`}3-0 z%@7fM*C^Frp2&|gLF$&eSVDG|C?)8f4(%4{ou=iGX|v@2<e0-Cper&= zsdOdDGvD_CK92+ij%G5&mcta=nKf(jp%L?Wm|A@l7#CxH-opg6xV64~hbE_nMn-6% z7lC#Rk^$+kcYRqDrZx)PKTE1yP?mzRLgksa%># zz12yTv*rRTS&<4|5yJi1875sYd~9$4WTRPf&!l&k{XhBZKJ6NKjmb!Jhd-6gN z4`5!VgTP~&L@wF#ka}lMP~NrmsF*~)dVVG^3+igO=)EZxFFD+%)KifZvurBQdN5EV zqtN!QB1cfW;VcGb?ihap^1QcE^cj_KTBXo=r|7PI!(kpjvt0iZ*Y0up$V{q0+$w#W zu0)TGEcD9K&@Q63!X$#0<%C@qhE6znDa*4dz17DvIRh8eHHIG_TqP$d<7={BUfPj8 z!=LZKQ`}*jddZeM$f=d1rh>KKJ2NS@VgxRh*gYaK;Gb?$btL@HREH$aQjZO4n}GzmSr_k7Z)xEE zxml8&sG^Z>KBaz%zuT?cpnbH+?*mS$0&bW`^?FKe2;Lf&Yj5-IdacIMTV)x9cFes( zD{a@yypk4W6kjAQZvJ;j$N;%$BD`%q`9`EjT1ilBjAYrxXUK%ce+jL%>&IJrl37nc zR(wzDuD&ID%>DDPpwe%?;zB+>jCQm3yR(?>xN_MK5g)F1ybTtihCKQVtG2z!_?Uo1 z`pHRxTWSzgs8!zQKZR#-gm*}Kg<{K(?vBZueb<0aba4#>oxW-0sXIJu7brTN2Mrt+ z*RET2`Kr8_f9E6S+e5)hUg@^WNL{iz-R)(lE_TaIUVB6o6P`h(R&9noS~J`jUkiKY z8a7nP6`R-*FEU78KF4@g6m$V#m$lcVNPjrvJ_5Hy>meSHvi%xHnL!fKHE-ep*7 z4!JgXvu{25Xh7^d{4be7nBpxtiHdc+};E!V{i^vaNd)w7u>phPtnSC zw5=5mI)i7{!q?LcId06Od=JGKvDYZ4lA@`vlT71nkBOu~Scp)3T}phIsntdF!GnRf zcZd8C2mC*y2AqX$(_%gKtT$`_>A0(RmTq#3dyE%-@H+yT!xO3Gu`N|hX%IFXf0vv} zTz%Xm9*|b5A$+eYw*zfDLNgPO3WCQE`tMw|T)xFOBhY~w8^Nm8W0&H}<0Zvn(U->Q zxi9s)ysa%S%s9;YiGS&>vbasNe32pr!&?71I9kFN67LyL%58~0$u6ayYc<`5%on${ zo0K&THwCY&==YvfGtkI1)7q)ZtY%a>-d5qfHBubnsAvosYlbPIo+X$^*t+85RC?A! z!gR)$>9;KfY%gq;tywC6_U;SU9Z#nAG#+g7aN>3DcrQ|$AzhU@=@nH|eM2}of%=+i zHr$?oEMExnkfaEVP15gQuIlXyNi^@Q_cG`h34eno=dEExT-J^^2B5}0Dn&*QMK?LtFY)DP=@$dT zKeROXMs>^LqMM7VZ6Z>6e$b5dQtio(cU`Zjy)gR2mhWu85vg{ry^ZP&J{%$Ve7CN* zN(!mUU9Nv9yEsR}(IOJ6NSJtww8X2+)tw(aDR1foPA=m#F5-dLr`xw8z`*$0wfS`E zY-_1W)6b8nwI0D$x(nq_v)$oemww&_0-XP6yiBq?x%V{dSi5QnM{ZxVvc|E~GZ|Z> zO#SCAnZ()U_Pi-!w`)luhJ^lW@;29Y_$E>r<7*UcJ6Unrz@aWyvJ6T%$alCz?}WhN z(&qOJvBihH5UmtRvma_Li{Z~Q%8aEUujk80o8HEGmMT2PN%{~=i46qt+HTWfPhm;{ z_IO3l)AcZGY)$A(`{`fq-P7xMM-6uE8iKRh>La%00(!fs z-M-%m|Jnz+bXZ-r^ot+r&olO6+)7IQPM7e=Jxuj_oz2b8s^^|E^Omw*f=o29;2%(UIa~+BD zz!LKnUUl~z)oC6urH>m=bVNCj`0jPoP=W%EQW_cOTv3fNdNwR)^rfwoge|yTAb)pz z;vFZRUBb~Lo-5858D-7CLk3jn2nP*`c4OY5U}4ISibrQAxxAFDDK*iilc)blPSsfG z3+oA{AJQO(|3MB*kLB3(p-kqK?5NqFBlyp6_H-yF2laKjG3bJ$HU2?e7^yrX_R zMT^dlF`}zKggxfxd_S@>=xO!&s7v*Ll=G%JY_gq)iaf=!`@7J$j2ktIm55{wF3|EB0IBL z?G&lW7O1#J&Gz_r{{-u4w950&M!gGygF?<7R+>RI7pWaJja+6`H%4q{k5A;i0gAbW z8+0ss`DceN?ONrqi z(w4Q$hq*ZuLsKk{n8qHR8-Jqgm6*C3y^(DToeY9V5!?R>N4 zTlZ@Umw6N_iiwhi=fYN{l+^94;GTTEs|q_O8vWx9?34U9`0RW}Dx}`-K*oI8LuimV zN>SB?SShrJhr?^B!I7Ejx%$ZL80BijdglhHay(N5TqpXTA!K!qaTVsKjZ`Kg=Mt~A ztJw!B$SKH4{*bXB5igx=rk%-mdE=28Q4i2QM;GmSb3UcUx#M4a5#Gb68|E`!dD*Z2+)n|J-cM49 zqH`6ma%J5=*)4hI?dEgwaWkI2ddWCDp+i;@sT;5lMha8*0U3Xpd|t5ki-QkadJ}aZ z3w_7crk=ZIUK(^mc@h`2eOpZRAR_dC$hKcHE@x zsNYYMvO@-~va*p93(0H|AtA|<6>hXw)WZ4Uc=@pQUFlc!tQE>0txJIqOS;JbWh@Mn zc~XvDDJ}dT@#{lka?*PiL_|zB z7^e?t=Po@esYsD8jIg+v1_G>Bnfn>}j>$I&y*G2CCG8=%t9t_<*f)*U4@ve@q+dQ; z%1o3Wk#e_hsJBind4cuq&N_2=K|eD)Jzd*-;1=ypRwS!a>C!iQeJ8v)WD1ls7@mN0 ztY?BQ46<^wGn16;Emej$kl|Y)+Z<#xxa&i#Hf5bDV!Nc}6-kZ?p2665E#V7WHN|qv zrFyrz-7d3&GHVAFNFX#Cj-e!+!TPuu-8hfQof;QE7<<&e;a(~&iV8%@L zfHfBPtg3Ha?PF{w)-y$zU9$FCtjbZ;(EYIj_Ha^rj{H&9GYV&JpcfHz`^BQ^x02l)!5_^;p%ywrLNaTF3BR6O+|t&~ zQC>M{OTsT^1;$Hn$VF{|(!J91K*B6Y5}}!**PI#(wOZ!I>S4LdBbh;`X79P9qVBZ) z6b&%=w3gMcT%A8px_+u1s%k5^AlL8bo*;R71YmjR+MnDrSjNjDLkAgyVU1LejghU{ z>w{E^B#s$ZooaoL^}t+K2Z{SZU6R+D;>ZYy zX_O-mc+4CboP7`f)380T_YEa^(`=%u?iH@+k~Kux-jvp?06F7j*i2eC$Elyn=YNef z&h536X|IT`*&YRtJVw%Uqp>~(0b;b*c-v|Jlfb$cKBZTgF5*DVdwkb)kqO0TJL>I> zvau3Tl4SzSEb*S|5VG>)vF(QEI#Nx!y4_qZfq+P{6N zz#r;1J6 z$8*W+H)5y_qyyEiVXoTB#Yv+lmVN9mJ&F zLR8E&Gj+zgJd4b0q;(pCf}2WmNSfm=3U6 z&8N@B&ai`hjjz)zOIp4=P?dwTC&L4d8Mi_?P&ycLXS7S9v8@k3W%nST~DoXDP@n$)(KEZe&SRMbTeLGI7@;C82z(Q zye7Fv$^M^Ec>g!QYx0iy`0_2lKsW0B{+{PU-I4c8@9UUnVBO`%0kc`#s>oAR$#TDT z#)3(E-XE6ceJK{-vNlIxz7Y+c7X%(x4*PQ@X z&cyc*zgqlp-_In11gP`ds-aIFM%1yS;NDGr8i%G@{MD%#;LZa$bKlM?i%%pwSX+gi zR12m}&C(iVL;Xqs9#xS6-hE7jrKmw`a+Z~-^#n7j1kATK)(MU5S3 zv#gjJkXIN_DlI&nJ3%za8;#|gEWvwTjD2i6HFk)7WcyTV1=2uIxFOrx9^Pki)Tv=2 zw>Vm8tAx)d$JMIu=5+a;T8or9d`Pvl?Q`_KTDHj2gOtv?&WcIE!JW^#a?#Q2TbIU&dwp7{N7@vKlYsSFX|4|URZQD zZ*I0psYoQ9oh&&R8+NI6ft95U_VdB&Ne@1HHg7JaTlvWv`+zk$aNAyt^8h-MJ=J0A zt@*0DTP~ZJ1y|=Y&BELE2GgG#I0b4VpQZPRTc1xjJ|C&q9Ui@O@M%JK_dnx(44Wh$ zah>er(xRNA=*XVnX2rBQ?tvJc$j0UfJUI#8>HUDa;y608rZMI-y?R`zkKzjpQ1Pzl z9^$@sBEV95=cH*;vNVNYv&fNJ@`fnS=^A&-yi+_* z?n9mCTq9bZGclEzNa9QtD;kt{7djiggNS!5){H4jPF;-!v?pW)eKe{)6(LYOM_#w zAyaF=7xiDe>lT*pSLSAE2Z*ez9JQ*=GN0@Gk+R;t4rnQBVTEjRBQGT1<4yl|rKH_u zhU@$ZuIbAI!iFW4XaxoPAcTO|qE-g+%>Ya@?lZ{0n+oXq4XTYYuSU^)& zZv=={NUl3G9^g%eAnhWRLYH-pO+wU>kQ#x$iep*`CmhArC?+|>)+pDGH`QdwMNGU9 zsdR{}KZtz^={sVW8w708%?BI+7gjz;y3Omim~-2&nukP7=e3p5S9+G~9!XLN-*T4udJ@jPo0J_$ zs>(+msMXa(5hc4AuaVrk9k1Qbxh`Br`uu~l&FDVdw0XdKoywM!AbRQEQKwYjkfJMW11Krd#IyY%g$=|mom zHjjUgaamvR0r5Sgy3)2r_;_F6;_AbC(gjIJ-VyS-3*D(A!3~zfUSG`p{`TC+pJIgV~>ZF`+<&7hYlP4vu`rTi2dKqG?*EP#b+1y z&)YrSW5?uk4~cpV#1_y8+&$rwzDG=rCpe@ngNoSZgY*F5c#7C8(su1gsx=Obh;(O6 zNIRLp-TkZ)i`zkp#{+Ma2C;Ki6wRH3Ta|RZ0^e-Y7!G!-z1HGx{!|1hm8-w%1EZ&H zXVbq7Y`NU8V~S=~)~BL%Bv#dpNFH(v>nU~N7bZd*yv-FjXIC%ikx0Co^_+_zdys5y zA#QTyT0LU~+lzr1C;cVM3$)<4%v(S-hW1~Y&0b258xk_KT35Xkv=E8QD_8$l*>HKM zAD{1jMbzCekg>*#VoS$4E_7!{&9RgC(3#SdBGMcA+~Q_RWDjpuv3)?+iuKF#QA6e< zt4?ao{&P~HTlT8f$iAdpH`9=$Fsg$UHn&9I=JTr1*4s33G6xCg79M9uuh(fg#Iq2# zk#VI4b%kbk+q_M7zUIa(t{TKX-wPo(N;l=bw}r$wXXFdD#jbgql0Ih5A6F4iwmyCL z%n)a#MYH>)*G^3OTB(+G!7M6ZBvQiZo`Vl@oIe)Gj&rp+(=&y*S_z;X`^t@dz&;?# zb<0iugwgnAXmiA4&ifT&?5oHm>~Rer->L9gK&j?yd%AiXCyzK)?W9TA34R@_b1I8? zJX2`rLK`-SI>X`cS=n_XEn%);D*owW4kE z4bFOgmh5-jOtujzduTu1>1i_=TA@QN)suzyV!Vfe?OfVd2*yR>q_=sj^#V z{fpS}HR)C6JXx^JWE-xhJ#rtI4yB|j#zWw{F5Ezfwn`#;e5;XjNp*O`uzuFX$pR6@ z5n8R>taXmne;~YXF){A#W4uL9!lbMne4NIxzS^NZl#EO$Vdi#G;a2H{Y=D?gmo0Rm z^wP8=S3!+YXYi#$WMZ~QZhElGzuT+Rlcn<3$}C;IW(}MLQu3&*THJLTl!A1)!V-zAqNg@ZRYi9O%lgmrCN|pMK;oG?NQ>hn(Xw=YUeNEO{yXNPV_5g zeJw+v4fgedT|KXSftYf^toFG!x^As`66!nrF9bb+SJzwoVRoj0epk0wsxY~$v9TmT zOojY?^O=OW;qY`YcdiBT+TGz(Qr18Kf==2a{2_y;-1g0z2df;K*IvJaqnMeFU3SqB zSdMyw^u&60ZnbMA(GIltewj%REm|a*j=uFA;7Mm3QRo`ynStqO|0k-_Y!AVM_ z4#_PoV8jziABb%X9{wrbW^(_l_YMZ~6%ovvs!>;(yvQHmHg;0KVa*~d&d#f@1WyH;S_)EhBOQtYuC3Ce0g`!J4i*ZlB~M_M-}o4S!p({ik$`FV~@=MEPj3_ukwg)~Rw7 zs7U?v#WW2V4;qNf7b%w1qJ(u^B$1b#AokBE=F{(jVE7CK#vCZJ^6JdSqh3lLE%tL!D%zQ#|^!M&atVAvw)A6_bp z$YEwaevBd?hzf4dveG}9_F{f2>|*U%Yp-;N|C{y3{@U+(s&Q63Y_X6`zAg!D7xQ1W N)bwtaT)+S1{{iZgqoe=; literal 0 HcmV?d00001 diff --git a/img/Compaction Time Impacted by Array Size (Power of Two).png b/img/Compaction Time Impacted by Array Size (Power of Two).png new file mode 100644 index 0000000000000000000000000000000000000000..8ff841d21cd9fa4bba4b6a753c787007f78e1e84 GIT binary patch literal 59674 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

    D}{rc*7XVnbZTh%qt|$2cP+G2z)%U) z2j|k-Xz4FcZpZpBXVIvT{!p78r}4sR$Pg)vfZ1`&OXoT{9d4c}kQ1Ru0=3h^mTUC< zrujD<1TZS{*&ob{;)xrP3wh0S!CT*b^Xs_L{b*;#(Acz4_5?1EY$vqHoJ9e$NC!x;!m5Ha$o=Gt)*I(HcP>R zAlJ(5ni`xtaz`5=ad!^S+v_xbK)~ztm=q1|Q_|WgC-BRXI zpu%`ziQNh+!8_QYX1}M*RlM<*ijsk%9XRdVgCuVgoqeLqtxMR%jtYnmz)M^X*|LI_ zXqtX2mAO!Mx4Zc2W!aBJ-(LUMd8Z~ml)k^nTUBe*!C`>+uNuZctAFXEy_MY%-(O^f z(lL>p|H4VJpzCAoopcC``z}2d+^>8VyRC7TOTEWclG#Ii$7C@q;3W8 zGWiz)H(%!(`fBI?_dRgBYM|&un#e1*H1Z&^TZsSN5cKljb7QzUQ!r5U9a#hW>^;-t zx;I!Sdl;0(g{q+Nw@aGRlA!aZD- zV(3%hoE>)%othHk3Hv9#!gx!Os#1!;ykJ|^GwSG-{Xe*wEc9HjHN%MZUjH{Nc~fhj zvv^~=eZZCh=>=x63gCnMMh|NLlvm6u+szcaIMX3cU=^Y8fL)TmE#Myn5Ww3sXOE~_ zAe4PV@59KgxQ6#U;*AJHdBsNpVgj7O2%Ycds0|a_8Q~#^$?U0X0G+B~^8JtWhisme zhg41Avm6?xK^VGSzprR(=DQWBjDaf{pSxTK@0vNF|1D;6z3Ju_Gh2H{RWp8&FZY0I ze@I_kIPaUjxM~AnWPR2pLI-GFgPx}Ss$QRf+jsj2yEyK!J0eHU3cgfh@~v+JTkYYG1h`Qc26{Mt%Wb#$ z@lDUgho6uj8<*6OW*5f=0e(g@I@Y%{_qR7c7(EYL3@4%YCOOdWxJv@FzyC3_a(ZNH zOO}0C?(Oy8!3f7fteDKc9RM}N>4>2bds7`UfXJ);M&xk;nfX5iPg8;R_isz_V8Wp3 z`$Cmf2;P;#_$=w&NYfYk@KVkHVusmxvep|O{KPle!0O|j%lFq}&D1Ab24C{61;ion z?nyMK^8GH+VGfmpPR*P;NU{awgP%y2wXn#6{X*RBVufM=AhhZuN&)-w7*N5#$C%;@ z2KFR$FBpuzWP&bJI&iS(5@r4J3HFCU$Nq)Mp22g4A4ZOcC4fP`pi90O&9Z(qC@zvs z5sUqR{}z_|_9AP~`a7x%haKQ>!k|+;@~!V{L3keTUoVVb1Vlw^v(7avXfm%p@K0}K zj5PM|zP=w!on8Z+qXg(E3~`gyJxMv;@t`_Rc12dNsc>Ek!uh$-_jNuL%s@Uyr=mOG zKW`DaRtX64es6xnkonC zWdn1;(9uwWA?{s2`>_DjZYJEkDKAP`MK67C`sa;N1&Tfqe&lBo4Gp@k$h1Gk*|iB20Vi z4w$nB$Fup@f1)90mL5KQK`O5_{I=ig^rrk)*4uuNq)L%SB1vE*G3?e{14Ym<)mBPjsKlH zHdKpxxClm9rLg@H9?JYYcw$F%%l|gQ*%n)t{Y*Hg>L{Nf94sId06`AL^glBJ^je6w z$i_l|tC`WX{BBfTsXi$lX>`BBTn=>DzsUja(ARwmBKE06-?kD$P#qZ%IU)D%* zuyDb56HtS1y^%w!D9(c<0rtv`kk8i!mwcSR*}nRA`;bTZH#I~IdJS)ePZ%uw%0PFz zxceqY5)2vVHj)CjD9=xalFX}ec|N%8xs&ziD~BdLm_>Rh<|4`&D4GVWLJXx@Dyf)4 z_r2VnHeHqaTF>?ECyp_Kfino}QV`sUH{S*%bU)B(1%`WjmudcHP@kcED&f$m_6m`p zC*k4ZB0uy?Z(JwZm3Gj!xS`bu=W30)voGKNHy0lGmU`SSHDn?gdj8LFXo%b?vS@E{vJ?jJiR+c`~lUo;P`iXRRFc}fcY;ul_kohaY zAQy0u>Y%^>O29NT+hosYPGZ67!{BvRxExGCT7UI5@$^K_t^#X3o5eD>kd*CQft=Ag zSwkc##}t62*siHfPFLugX8!SR>lqdK_yTiyCC|I+v-3m3YLIP-Tdr6ps3rW?nGaU@ z_QC_z#e9A1?P=S*u05Hq*yTOyiI=7aRG(D{(*<`rJ?w3KzVbI2120gMjy*5lOmDcl zH(e?#Gn4j3qPB=K{j_r{Q!EpFF1=+q_m8I1Nx(8qPr5-o?w@9L7r*p{K=gj+~{edRR5{VJ|lE?f$qA4*ikN8-KP%#iEz^z z5Ei-l=I`XQHi7f_uID1<$$`JkQf1xzZLlN&!!a!m7fJSb&AZPPT)oY(FT+aN(L z;Y}||O<{+h?}gfMj%U4HO2;|Q=QqI5hgK>~k2B;1NWPO4+Emxdqlkx$!FFKwI|m8(>^DX zcq&{VRZb(vNg|f7c_}fFFvf44<0ZZ6S}ixKQQ{Ps+3k@H_v)2PAP9WUt|4sZ8O#|3 z;%o*xQKv3W_4$`nM&U9r`T;(;Q>B(h$D<$m9-%ZJ?j(?Ng^)cpJ^V1@cwei$*AqM9e zeo~?4wO)$`%kuE3A65In5X`k+TRL6)@s^_z&bz00?jkLZ} z?51j7-tSDA9)4`Ev>+ztaWIiM;Il(5&Y2qbbYf`Zks8jKzgGWK5N)d@EjA~t6A(5a zjp}61+i09;cKSCxF6&GwtC}xwsQw(+V3-B9Z|!oT@$mZ%D_Mz6IcK}i*IM0CcD5B8 zSs-Vl*csebDN!cMPNMBGhNT?=#x11x+0kW1X2h-v#gg(Iv)mY0bG->f8Y{EZlE^N~ zFkOqHjV|?xlZgygDY_e5y2@=;>Rvll=@GwT$a2sA$R2-Gr$10?+f{LrM`% z<}(qc_m*5BfQW<CMv9TCT?BIXZ6TQ0}cjy(9Wyy#<7Tw8Q7D&9P3 zhl+(?_;feLCt<4H)0J`7)|JvW)OJjuwL7sm)Ld5_UXx!Ex1_+N&$_wmk0OrwAxr7p zuQtwx#{0z2;=OZu`8etbw{j5*zKR+Tyr!RJZMajBg{k;YBxZ#heEio_gJ~KYeYJAnI;Y`wSI3v08Y(Vn6V+S8A zN=*27L)id{JMwOK&$;QZJ&fR{zCRlfprjU8)}9sBk@04h5SCnS;hiWSr|%-RPRgVMaH>uo9($9!Vsp-px+ho zl%Hr}d6c5m4q~O?cOjE%p#EcdfjHK%6cS@`ZhP|IrvNV4sn%zpPfl5O(lE~b*Q9&*~haQ-yRZ-$mKdBGC#htBn&L<0aB(EzheypOdq0d>QBCedkAk@rA5u zQ@b4(jkJls;dbeM+8sRTh&(VRiiE~MU0_H0=*lf#_BH^Z%BZPozUt`r^T@6lPjFE=~MsMVQ@sV zL@DtcV6IaZ(9PxhHPh8s2a(A=8wb3~*wq=@xu$t?aY`_TvXx8B{gJ?N4f{B6^R(5( z5pPC|c2({658a7~ugO*y;1ryAz)0md95TCVZ8MU*3g3hcrfAA&6UjiAst>GS-)QX9C&ELxI*r)R_YD54%D= zZl+*ySlmVkq53B!cKFllbXv(;k8eu!W79#}*NTvGM5W}pDff28`ZIH^WcHF*OzxA? zz|j_HYxdN^s6fwEb2(KA1tO9vFF#Y6^)7X`a?_ROM2^62FK$|G}0QsU0TAS4Ku$IQFRNKNWHXF%It zleF3=f~gZCLXDR^5Rg#;HLIuna&(0H&wVb1>|}eFOxMLK-LtuBVRYwHY@+%_^?dcI7?v3fhTtH+(ClQ8! z!eB1wCe72Z%HEj%_zxs8_QjUt!+K<|4lP$`bsr_)r6Gf!zECE?L>#<6958E$Lphyh z7#_!Ye(=Js^h(l6%05ta5Fcbl^E_?UhM)b5{%oW*4H0r;x4zCwwSlT@W`o> z0Aog0(i_k6)#z(8B>CN2$4!f+t;Ob-JI34@HXXLZRm5O-tv=3PtThjt%oDIGn3XoW zZ1QmAQ2o5hpjtEKp3U_RU3BQ!rs1B3taU9;G(VUWMrYK(%;gUwNC$SwKqZ07wE}> z&28(gP*}%b*=U<&hU?l`5yGydIk&;R@MDesNLNeF@8%8D4RReGhVf&^C?%E7LK|v* z;O(V)Soz1FYvsBz4AOepQHgVOrK=#vjuyv0gx)!iiQL*C+`tAov;TCd8E;thx2f2| zn<_hNisg9g`(P;>JW|AdeHTQyEK6^4;ZD#P$)br&d1 zVRuToE4fJ_)t+Mky!=61ilT}mq}bqLcKNkbMrA`pyM`4Wb68EXd?72zzb+kFz@EM? zj_C9!r&gW_zG~yrVxo1LDsz*njb=>VcNLHzjDg`xF6Yi%8}$6HuOyBuG3)xj2P31w zb96H4=MDHwnLngf6q)*Y*yjo{vp54P(<;}kFbdn;coh+|DCELk9;poFyS{A z_N(<+e~Nd@#jO?dL2>#3DF(VhoO;nw?%hOkDxTa>!;QR(SK|c*gMEvN8L_v5Lg+az zaW0gA^D_}VOv%S*%r`|86=|f==3!S>>92NUDkJ8gyIDIZx=f4C|rTs>6TFid()`buLyX?*{5EB#Cw zwyaD{QH>N^8z@;BX7SWwRFdh81y9bv#nPl(0Cc2p%OQ*Zow6m4d*+D@otXFn?|eEX zL6)}{7i^Q~6Ou`F-Xbh1^}x1U0b*YGgk9KsyLpeZ(M8wKRsg+aANloX zU;F^e8fy&6iHX?i*-V~3CSV9-urlP}?dX^|h?do&w+ORqnWbpC7kgSCREWd<3HK!x z9BNHHHzxIGFOMkn`V@`O@Meq=$=U{ueDb2x?<>&S10$W@to7(@TcMK;S1vmBFNypO zA35kW))qy|NH9GMS%9zi81;IjufFSKc@uJDBETbC?k^bI@p9e*eRzJ`KIbvdQOkel zPoAE=MmNjK$v9c4=AOIx676$lGiN}>D3~Gb#cw=}P8ue9wb-@!S2>*xSjkVS@MaC8 zvQVQvUR|xgaP7**YzD?G-|i5Jerm|kWfVcvuGxFQL1L$RIswbqK^wU7%P zCKuV)P3hK?0?RXfr6}i4wN=$~^h%t1%h@|@VLuCA1^i&? zo%Rp~l+@0P=!{#P%bB)CQUWee>W?pweTHV;CdbkFPBR^pTKbe0gtbyFtG}4jk!B@$(6t9A1lV>snNE zSD(zWZ+7aOF(7tHRyFh_aWGYHo&}KLTE0mk8g)Tg%r-iyXi|q9j9ydg+Rdav*ccy1 zsP15Xxsm&TKGvIMu`_ddc&%KHLb{d{<6gx$mO4F1&9$;@3V5DawtBTiwNX>wXoTKB z8ztdtvVh%KU1xiSbUBfgtAMVy>(GMwsY>c==Be`BK>$(D&nY6>t4<1+7ojI{QBlfH_RPmHbds{ccx9-PMlfe^w8A2G>-ql^E^l4BFlZDm4&gu?`>aj$eMFQH(CMtY9HaTi;mb&eXkAG;S$ z-8|ZQv%S57*7Q2iPQ9ceYE^MEKO@e!!zao_-8VL^q*3!+&g3Vt^ZJkyR10*$Si zEsPMYf1O4FZQBy;*3obQN0R?O3c8Cr7#E6o|B%N}IF&HWWtraTeV=lvkn~Mtj z73;CY2H^m*xH)lLkqJuKTiq*<9oW{z5l;l7R9{caMEc&hgh}_nGo|$eUFtlPl?Hq| zCXUT{|ET1f9k;CZYg1JC){Vlu88a`?oi5%=Y7_Dcz8^i=0-s#a6u{5KA-#?^D_>Ah zT7Duvl^Si{q^Q)rm%?>%&WW}uuzRaPO`(240yoV}%6sPBQ z%8J?~Qv%?d&{M(aGZ!s~wY-m77fqKr%mmaUt@GUHbE7S;h6wq;nAeh$hX=7f8jm7W zEr@c-fp|~0=A=%OeU}2fV>(&6`PwNbE7#f&j)SZ2lk`P%F>1j0hda1Q`HGt~3fZP@ zqj^Oxj4i$+QAlI;be4v~F4!*^tReMANFxk*|S{S4yu_5a0DxD)*ck6QT zzw_0gfXni)i2q`l#(mE!`k|O<3f%Y7X(qKgutD-$AR!E%oJHRD2n04%?NtPN@o55l5kZ(&q!E&wD6})x5@=A7|E0eHA9% z{IAW~sbtDl*pK=5W-%%wa;wbi)a(S87$_181UxY$jfItr%8E9;p7~ zcu&&t0p%6e!3c)qnRCoYfnRiStZeeK!wd8eXQm1A8*Akasqj^9KKCYQhpsW>tU|g> ztP3ly;vD&Gp?5X|Wejmvt2#3LWJDKcq5pY{I4agtj*_>6_!GMO87fDtY!!Bltdf%y zm{iAkeyo>n$AI*NzXe+Ggw`8UkSBwr0SIak-gBHg!#zg(5J9s${>t$eu?Tg+$*x410*91vEXQor4~e$#sg-k)ofIp@ zzL?GwB4F&W;sPc_?w*)Yq*Jo8%}Y`cG60GlA<~!xfm^vP&j*xJgT#jiZ#cKN={lhW zsjvf;k;?Acu9QIuW&lBNq?;8V&k{4@hz<|WG8vDV8hyG#N-RXq#>WghCOF4vlE_(S z4CNU?CV8Pl9+SUdQ%cj521q~4Hq4h+zEV7e!(ka=B@2FVv zn5rH|l_+9n|3rjTK_4zV-)h`ccAiX#g?7>uQ#hBvt>wA94rjPNk}!u1!t04@E`d$p zNpGu@FFvKFE$eF>G5)xEkn10PBGt4p9A!K4VY;-=1Y+6d?EPuRq;|~`UpF6Za|&K_ zw=B+b=5V9A{fLzJK#HdtCVleu4^A_rW@EB$sszQS7MUaEZZ59wl^&-Q>6EytEski9 z(XK_lDlRk_jJJ;slonng@Puq|w?5%{e3=Nb*Gptnfi?iWY|xv667RD#uOgPl_;>PS zq^ik_&uvR-6+EMi^iNBeq+%(_zsrTyS98;yR4Lxwx}m<(gx(szky%C?%cP$5RhV{D zQViysH>q7af!ZO-51XkC4!<6ENX1+o z6u@QBRV1q^0$f}|QrN6v_@6lf?i4}kzdWA`aOrL+FQeccbsz7{8Rt#IS$!T273o=% zUa&`!9fR=9ENKBfF=}b(atcv$E|k%K=S%=WNr8w?6beU;o@S0#p2=yjvSiCd5JG1h zO&bVyqjuOl@?n8W-?unU+g!TPOzTM6FXZ4UMN~QQ;Wp^$GAv2Em|OWuG%0?F}DYr>$xI zDRwp?6=^bznc1pQ{xcmpQ8Y{l&ZYqm@z8qRzjNZ|JR+|lvd9EiRJQuU9A>4?AYPiO zLYzA{?Of{*LkP?)pD~?v72cW?n19!a;X#@pQy5jIL=oXXa)rp5W3`tTHcms5KC3j~ zp{=09f#|K*U2JSjPd*m(k-E=zY=); zw3-!5QM^Z;(NmORQmYlgx#Wv)mqh(ym0aAhQaDvMk-vxysl__lt5qg>zZggDiR)fq zj`wG&#v{1;h>qsh-31u#BeoW`U))xoWF>V-{|*EuP;S%UHGX?1CTgV=YH!`8%q$Xc z=qu?i=pgE!GRdOKP)#6HvK`Z|f~(varlVpxU7wB(vtX!`*2u!R4KX#ldw^taGqd(k zJ~=RKC2XqP`^7wEYv^;4TCusuPLe~r(Yt&U`4*p0t7Qjq+_L_dLMMnUH`f#;$i-_; z7N*H`$wJdmxeir<Yt~wKJo%_o`7NEB z>t6F|0UqB!pJM`+^<+8-%08p%m7NM#cS^kn+Bhz zDy3o$gQZk~FcKUVpTo zm`e{~%M1`~W+>;6&jd0qKfC+()(px1T?wgDbedXvLkKb-Fc)dsVc&aVJGTUz%*`WV zzVo4X?i0u2&OsXIQ60W~t2~$GA@mm!tb;Kt=5vODfzr$zTWrdJV$XD*P-WvEE^zBr zWmvcb#rLH3z){XJoQ?aEi}YFeat}cGaJw~y(6rHPB@WyHQ)}1s^QK36D!I|vybf4Q zsiZbqo!-pj53lrV_R#`r;=*x3~~@lOh!P&_srD`PT3!2 z>@JTca6c+49?=a?>>2UQv$dCZ$+YooYc?v5N=yj?$ZVilzi^|^1&tnNbSKm0X^}P| zE>0hA-zU3|b`nMoW)jUe{}?D}eAnr%ene=_2zO23R!t1Pv@<jdKL~n!4#SJD1VU z<-XYy3f|pQrz=jC$^hJawN`m)+B4Tn`9rCSzz?ZBpz*$mF)HJ=_sehvFXGAm)O6|| z`VD~SHb}KCr1*x5$u{i4GN0kbOzhU9!Zih%|A#~4WlLX>r$JwQ-t z0#ZVNNNCatAp{6Llska>zURH)-`{g@9>j;4J$tXc%5VMFnwf+?QB!0*!Fqy@j*e03 z(Sv7nbcYdibcZ0vjsizy#P8k!{`<@Qnc{sqRL5l^@W)|mIaN72y5cB?EwdxQ-^X1Z z>ABO`jA?In0cO>` zau(R2x~ock=PxovXGqFL5m@=H6juZZ+|YV9V0YzX-)^qEN?&s@|WZ=vDEShnfiK3Sl0wHPu4D=4zfD znV8Dn%nwJ5)XN}EYZi0~Unk`KiW_=SvTx4S`hCf_F332m;0K@O#1a+~H|cw2OmTu4 zg7WuPkDpKv9xnmK97+~X#9q4M?oxSYCo%s@Va2RqC_w)*TmPNw(;UaQ)%x55>U%y=4)woZTvInnD18s=cLu$= zMXTs6KD9xAj!xyqX3#^Knvk8aE^bzgO^0SAM0oBE=evfwCo}HCUJqR_(BG75cgfHa zWG(RLW=Pyc3#;2*NoAMjK5~tVqt)!{K61oFu7VOIn z@rq$jtuD}+3fVseqqTNFD^>1D$}cKO^tBaT^ZzHE{_du}d}{I+;kVGwNVA7#CtG}E zYRfS^19G3tQ$H+RpD6MEc+B)jyhHfAd|YrkY=^O@E(mRGG;T;Qz3Hj7R-r#*FKpNP zX+(CD5T1L!Gc*Kc0PBv?!Q&*L%{Q$Tw? zf7|0x0OQEy-oj?P*vU5ng&466IyzX~cGklku6uQtKsz5-lAacQL$iQ<8yaGFDcxSh zbt*OqPcL2DL_`%*T2_yA6svz<{|ejo&Zob&h(G5ia~fv8>w@UdqcH33Le~0{PSLv+ zd|T>+AMcwLzKY;^s&gjJA0=k1s&p!dCoH@Ie=Q!TCf6r+xfeRHvz63AfwPjN8xk>e zg8ls_{@+b`T6)=x>@dbK|931W!}8fqs9&3qSkG7xX_}B8T9li70O;ldVwQokS72~S z0*uTGAJJER&>UP6@NKjAYpOA8R=gx)c#cyH7j(zEncl0oW)>tux+#-C=^3(Kx?IH~ zMb;&iPEMmH`k)Whr&omF5tCx2vUOHpWv;fh2sr%xS@U_o21|rM*XD=`Q8`RwHGl}# z=c~&kNwnaUX|q##ea6jYcFtuvJI(sk$ttE-WAP_uZd|Mta_SLKx{G_;si;U_xhj}^vNZ|0ED=I;v0VZA+*ycj%7M+yu9LWar{=WiA)bM$!q{hIo>P;Vo=vs z^OGbAJZ+qAukr&Go|7jTAavr>dYPG9@&-`d){qgb7(tu%F#XOP7 zWINW3q_VXVmXBH)*cNA)`J7|lJ^`DuK_x0yN6orPu7*D4lVbFw5&e3XR7z{7;S)Ut z*L3ROG35|z@!md|R3Yu0G28IliH4CwYcqmF+)MflM|;BXNxhrF`hx~57tLUG=-hlWtt`tLuF60)c4)M}iMLko$XZzFe$9ap~WIb>4d?2XXee?3d44sXhfz2;QY~A|csdU^iSvfxJ(Fj1`0JU$!NhF!=h2m9*<)#Bb!TDV79B=#MJl zlST8dh%|%mK8WWN!w{JrZnW8QRyyMY(zBw_!pY!Nu?#R~jNZvH`VsUy*^X<$~0Bq;2oOCXnQ5?DvXRB#}) z3`nnn+-GpRyAPA^E}@Vz>(-WGbjCry2S#MvhGVC#Tn-KCl&0!C(PNk0<(ndCYr*So zcBKRz@^(v^@k4XyqdG?hdbHDXXwTOw>8#VfBRReSBzs?Jkx=Bw?J@F76%jY=acwg> zjVgd`v5r@x+2N(oZbo-gI(g&OR-+{n@oHg#t9S3?0_b!}xn`+d-mxhj0aW|6fg193 z;e;zvfKKJ&W;1d%jh(j8r#ws8iSOceBn!lsVOTM`--^(OxU;IX5&kSa0?#1U#Wpsn zNIiCYeFDZZTCQGHU_gHJGVCktZB+agxAEqe746AuJYz9JraG&$H^HfHpi z&j``$JR_z0M`bYdeiNR3(BAj>w%hEMKsA51E$BfAvC<3GQrJ-;(-hoq;-?5cGrInq zL-reM-zp5h>ff_0TiQ)2ddpKVQ;zeFSkcjW7mJ6aN~0j0*3-(Bt66E#&&8+UL8oEH zH^vpWs!(lgoC4UTk{dDtgbJ3yyUjIrGdshJ0YBr$OVXWEvjqL<;`voL~zG@VXByj8a|puiwBVn#O_fcj2XL< zKRF+Pwr%{X_qk%JY{V+{kbD}hdm9J7>#!;%X2AK_jXdU5@Aj>TY|Oa|HcaJ=^v1f( zGsg^oNA6M_eGw}wMHroi_;xAJ?Fi1*k(0LLTc{5>LF_^m&nPbfzeFm3SsoPy^SH+A zhL?~@PR4lJfjOQ#Ce?}?wh=dF%$cu~>k=6Q3{-kB&LV!Rv!w$C0BDjteeu`mOv773 zs-dRLr? zSo`8ma$c{-N-U(sZ6u%A|`&hmQK|tDa%h~ z%x}*o6uu`tZf>S#?Gk8qGw~ARI2Xr(ALDXmV%)W2vI8qsC`bK>!f00rJs03%0)<%1 zh_$n)iRx={vstn+_)kAg3wc7#$R(>FtZmX$EvwolnzO{u-pjT+YyDkL7^6}n2axI- zHA&YAQYZMzo+{iE-;r$ZUmB4IO$jeq8wl<+yHU^f_PQ#N64jfQeP2nd;{9$3lhMS- zKj>F7KFNUD8k?)$cP3HNI>j9Ap9MEe8)Q2k)oCeux?ybA8Ks6(Spyr1G2&~=(jA{e zwd)Z9S>9Iqi-SnYiWj1zf<=mV&U-#HpoNWaG-hN@@^L}u`p9$q^m-SdpoWtuyHBS{ zH}V)$^@M8Xo&BpP1s%sWuKBC~P1p3&f4z;qoLVQj`0g}Vn(fO*8mhivFjz_$VBa^6 zZ+{ZZ_qCDODJrKu%e>bit1mRT^LO7W10*}Mu-xRm;heYlD^f#qvdv6&Ib!?@RI+ZO zt@6Fe&Sj{mkvb?sA0Z?DDx`5Gs53m*yzn+q5cEd7G6pf|A%n+~_$%V@MJXt6_Z6-4 zCY;>C(59EAIRo()J`j@+@FOP?Qyzy}fsF(J$1Dy#ZfYZjxu&J6QsRO{!jeuPboch22;0Mmfp7Daoqj{=^e( zx}I9Z#E(=hLemCIp&{wX^Xm64^Ed>?yr$&C^>GmIld=pPZiR`GrzBDvl58#wsp+(< zBNJMS&~^CsDS5o5RAFzqBloazI@zs(YUu+>Z9|jC#&57<4%s9V0EmpSbd-1#XI3B+ zLP8Q}g=N~U?zPSB_I)$yc&^nB^A7iN37sL}n#!{u!{ zI>Cg5-zhH~(>?g~{el)RPL?l7)M!T+- zyZC?UUAfeW+iCxJB~rkHFM!n$uO(&j{D;Y#Qq`K%zV|GDc+^ocjoNH`B>JA>CgT@Z z{e??+iPUw8(Dz4d*qtY%X2P<}X=Q$$6$Ac}lQ!%5#k6-2iLpahp|Xv%ZcO_}5d6DN zM0m;RWBRD`&7jLzJrP%r)N_mjI>_^~XKX!M+Pg;hyoZ-+`y=^b%W0(IG#B>M!tKE; z11&;T3ARlG_hbt#ylUtMm+ydR(zoyC-w&NHTwDbOSZQi#``7Pe0`pC0vqt{$S}ez9>)qgLku z`Owf?wCv$UDevLc(-7g!kghE(3;J+QU*R=F`kN4{{ZYwAYAKwhW+=06kylC-4j7WA zd|$Qt&~>O|1Vy6M8K>HOnTmTl+H%r~YkckyN!!F_+?$c)QArPj`=9L*Faw#K^I=gR za_cuM#Cc()II%P}f`_J;n`5$BLl?Sxx~~!$bT(_eU@LN1y}bB`zfitqv3ziIor@#` zH#}x_^)Fpqpt>LCdJ@N*RtefR_EXVM-4OPRLJvpXYc2m$5ALTuYJ=KI(2g{<=!&f8F zA@KMVG`<^}DP~wde00&Z45MF6v#+=V!r%<)K40evIK12z1nrX>;*7_x|BUxw-wk|o z9RF8qWx&f)rGVA=+;V#MT$p!Ml(T3j97W$8pO5zL#rLg8*6#%VINrP^FTUT(YO<<&Q-6R? za9>n;4x?uoevsf5acVlpGI?D@^t)-c*RTuTIz?JF6wL_{Oxq2&*^n3LcIv?^`lYCi zoJ7%1=C;E+tQ~c0QVD|RAwj0zj?TN0=Dy`dJOE$?oO6^N2RWYa#BPYaQVfzl4POKJy4|ZBxj_)w{EO_j}K=}r#I2==yGdy zr`>@ggI;@N)r|fUPmm#yCgn zX-456w-DLn??1`h+eGHfG|WmFOYbutDhDSJ2$Dvp$$dGPNFeQ0kn$ruE>nNmr?P*U(hvKe^%e2chK_L#^68nEOe5PvBLq|89a|P6M>y>&Nl&JHHD&N|a2=8| zLcCVQ=1$9!$o9!uaN@GGzm0tvlhn{jJ$zmZF`@vB7>+7{4I zZ8uO=X}*&|f16p9_?{=CHb|P)-m|f#>|rZ+HC1A!d$(`Ps678zY46xPD;C?F<{jg~ zm4Vk?(va0-J z)kUTA9tF;y8lE@6M5trw140rb74v}#d=7WM*~jXy>oei?u{&c>q7UBEmN`ae zjU(FMkp3{cvv1b;_{KTaiXeC%)%;;Ei&`pr4rqP(UyEAYuGcdqy)G>n!WH?nz*q(~ z{fsBPjTW}ac#c+47<2b>zJo(2$CGOGCXN+9%iK$hwyL%xM9wvw}?`kk%rZ7!L*RcoahSx2_cxM@a( z8_hIxz)EAdZoyZIDpPf%)V^@L$8NJbr^E-|FJ6W_3wvq)Ab};emHoFIy7R`NM0=R_ zjl%H&X5Rus>$8SU{f#T{Q+4`8MD%ys;}prYb zJ?C2jC%C0n@qXPM3H7!<*WRN{EcjKro@L2c^S!*6r0RY>vo7-OiE_0mX&FqflqZ^F z4kGYWyb#@*(CN8y9Ml)%#_7&ID3`Z4%X^}A%T6vXK(x$g78sPhR6J=0u{XA&yywLUY z?6s*58CBa3i{7!*o9AcbO;XA@VPaPoF)9Jv(7wN7Z;v-(C}(&@u_4d21%VM z>xNX4=py7wXC6t5gVYBVbv;~Kr!Pz1>~__58v3HfLsANksQi#y1uyUQhAsM-&z`-Q z4T7twN|_*smMFQ~GO%fb0z4yGH5uLcT8yGf+s3(==Hf!96TYY|O5wL4tq7~?HDh4_ z;9^fkIftZe8)aKQ3;wp?HJUzOdxhFvG}2Ga?}Q|<7%9dpG>LB;U#XWI_JDt)#o|?E z-61>qgGg&GeeY|-o`#_98c6iu`f4v(W_jakA?dwQg>{MHaqGXZtymA$FnOzyON2EM zFncmqZP73^QdaRVx^WempCn9C&(6CU&SL#UPswT{)Gdt=HR*=J~l8MJSJVU45BPg67lSZud_~z3C-3xbG1VW1cpA zxO988Lo%zaY%WQ@rE+~_dwtraUWN-7Ru?s1r7A0KIr!0UKagO2ix^3R4%{yaC z?Y)n}I#T0g#{y*N=$aDzo(yE$dR{;YC~dxUo+fhMJWk_M3&FF${&5dv%(0?e;(srP zCVwF;_|S!F&i~4I{U-Au(35$K;qh^UcK2-3m&GG_X2uZ778hFEiydqIUD$9D6r56O zyTO@jWoWYg9jJm1a2K^*&W*_4-s{6tnFPdUHoLs-e&`sHlm z|B)PR@(LD#4EJRBB9+?3^Y)LkVvYgScyyH+yAB=)xPL6b;KiC(*$CobACQsv{8qkg zg>2jUdcaH4d*$ZDQZpQ}i57z~@IPLm#8y3{Tft|c+e|q@1wNpqK0 zYdXybD?^27)wo8>B(-bcx-3Q7LrV44SH*g}WC%eMy%z;76Y^}bsfDsnJ~XP+wnfud zGN6r{Homva@8GMP46oz;qbeK)#*I?t`9_+BI=r9Q5l&7f0`Xj?axFO(k0 zRwnz+h`-*sVz+WcsY!BIw^=^ha@W;nQSlbXDsvuSPonu?-9LoPI$JHTXPeC?P50_* zn&gp^W9cxr?@{i zfaLHnf|ErI8N>s}=!Gnbd6aG&M!A2N7bUd&@>uwnaT%^5?9aEAM%c<^_WIa~?UKKi z3A7ZIQ+&@~<8N&dnJa14XL>eXh4S{eOR7!#F^sC6kU0H<{LWt=69oY+`t6ee;!@QQ z+~tUEolTawm8a$vI2SVIG0?|nw5?Df#OJ};L3J?$a}=BA0jJ7LO0aN}{)2%!1j(ezU$PLZkINTOxrzRG`2${Pse z;C5sCw#~ZmR$jPQ-z132yR<_3^AMApnYBAQ8QJ}uFnvk5aejnM;qd1t?soO6B3o&A z+XE~>lncMANM05vpHLU=F7!W}M{`EY;E75iL*?*&qdG=f9{Ue{ z$xW;arm^*xsyp63yX%%mVUzwa)Q+&q+bFCJxW3n=1gQ-)P0J&6M%D<0N_pl}1*3C! zybIcl;Q=s0Y$D1jBh9sZsA~rEvp`BU&w-#4iqzjdqXF3ii$6 ztM`B)@-X-fH)bW-RkZ^-Rw8|h5knyl@|34%Wt0JinW_U)w;B%KuD$O*h7*0I7@=k` z{pGuI$%Z|xLalLHV;~72n>&UqPP?iy@kvZPWJ9CVR+1$Mu#7Oy#;TA))Y^^!9LZg>MvPH3BT8>-R@4<@(U<%owQX~X-4B4D~032DPM6SPX@Sg zWiR%g(V_bsTVnbp(09UgTbt^ppL_B8GWI0v^I-Ma^bXC0=9cH&bDjIssT_BEVa)e! zMo%4>O4C3MD)K5gVe|q*ziXw>X|qgtn%l=D>A3a6UwfkkiGY|hsy-$>q3J9lj=d*% zHf@eF-mSkSRmMg8)=Nef2640}o>Wj7%7%>eK?hI%y}!n|t#`)C5%E_EOBXQ^V zqYCZVX{0026Gj=8q<91|wCLS=DxGnoPmMMcC*vt>3$Ymd$cz9|N85+CXQYAGOwO!s zl21v%V;U>Sy8D+*oHzXvBlE;;?&G5-`bjl?@ZiZLLxz?@340}JmTy{M>lHzk4 zw#S3Kg}zCAucmsCw>ry;H2H#UD_2=sdMC$>)%PV07r$3oxV^k3B>eFuM`?13@o~OS zHa1`6!_<9PG>jIN!v0Pw3_9f9b2X6ZVrc>5xCS||52Y3Puw)F@Qm|@{%%+NHKDxVI zed6Z0wpR?kti%zFup_B5c$NLFTBt-$u+=fDAQbXv6V++Gf2;Xz!0TqX$4gChZZFTE z`yeP%iPJ#BGB1m9^6u=ic_9SdTN1jAtwD9Xdf*q}T0ogie9GF5G-J8$)H^9clz+a_ zyOQU9uGi9quY@I=^j$Cf@cu5$ADsGGrrTBeS%Xag`$VGakhd@jWn=mFZ;&CwY5kKQ zZ*zQGpUr}TIws0nZ6!1sRdm9%6sqCfJ1PUgUn5WET~u$XS-4Ks;X5gstSIcH+jvG8 zu0NV(R(p#@$H)@|^{uHvF|oFn8Yv{{7w7l;RTwE+4eJ}*=_D(LS~X_b6+fa0y$bFL zR-V~(^c{C;DZKdcl+bTic=u}24%+}(D6|_lxOmn<|3a6T{w2XztO@Ba5e2v>mvgYL z1ycnq?cz{pQDBnyik$5qu2`+xAQmU?q&S=whL>+YRwIWOp?%qa#|kV13d*y?3;Cla z#4bRCqp|m%5cM#yBslAgDupEbCm9dtWO7dTdsrnrY_=A(#Vq5WrtQZr zUHCb^bB{{V#a?8GXuGt}GPH&)qfxn*b-Q9KU-zV(_E*w%Wil)K0Uc#En&Z)uYRpur zJ7uYB?NpVp14>eChY?S~S1#UOFRiVJ9V%}s9YKACh3BCJjCicxX*l}dC`6fN)&qeS znc)9$Wlng1t6jky;T4ix_`hFF^f;{>@;!Pqqxu0Jbcn1@)xQ{SvE{*xP%*pj>}Cu{ z+@32Jau__Ju5S}#CNJJ4_O$kFIn%NVp{Qr`u7JTO_x8=Voyx%T86hHU9C#;MTP0z0 z_GYOpt~6I{ux9Q}9_Rjof=$b&HMm1=8kKK$d6PN5lcbYoJ9u*=oVC545IP^Zmwq^( zOwTuAGc1>+!yxQ;pFv$z-y&wCx2-AIAJX}tO}X9B&au7i{hVQmaqf{z-aXzF9tk5>4D1M@%12Jx_uGRK>5~&Vf_V0K*rZYL2=I*L(gLO@W7g7Tx20~f$c}x5 zE!Sy`FE!*PF$_(OgYOB2Jx1%k7ym9t2PR4i>dz@$_7hLC? z6Q=O*uT-fa)u@9Vc*Go9vco>;GzCIv=Eid&H3kV)f#Z1>S(-`~_HBE#_-oVai-_f_ z{E!0FO0FGMV(|H!M704A(C|brTuYOUA6x2jabTYD9+K>F5fM8v1N{o#7OBO@shQB; zQVf6=?Hl1XjSA@gRz6F-J4BmR?-Rd$?%TSr%F7S)KTTQ$Yw^#@UYH)$Y9ST#ONrL1 zsJh!zdoszD7ZBj#?}F2M(q&>Xc=Mx>hGo4lE5NRw|`i{Pvj~b3q>FDVUYn?IJBT%RkQP3OqX{algcur#QU9DS^D<`CPZva zpLcG1#*}7;m@{ZF(?ew-akUo%VN1Xh3U|6q$y1XZfsrvO`cL!4oC!KZg@^1Sl?u(> zAT?^)=;1Ori;)(|gu|YuQsz7quktvKMJE}dR_!Ed=UW}o?aDf33DB`xo`mJzQr*4B zVu6zM&E=mYJylf-E#t_^doG1E1u?2&XQl1Uliw=s{xZ)$q5e4gHV%7VxnN!Ewy|cI z>5?v=or=Y%Qi~KHsvrt@L@?A0PSn(}FYHtufsp=5*PpP{v9K*sO*Y;^ZYO#4+RkP? zs8_AFOkw&u1{J@6h;`y*5zn{$IGGsln7DDtBl`5d9N~Z86D%}d?a4iMSVaM?PQvif z*5CNc9h`LFkuG`ADG~j1dg^Y$j11r1F_XnZ`yrd1h+mmma#woSjeIfU#8J%2hf?oZ+1@?oKTO+ zwiZ}PikG+Widr=@)@I~kJ{X64#}rsPli6ti1a5woTJxV1!Y`O!C0z`%8wc2tkQ!wK zjF#b4<3G5_>Vo^MLHH0xqP*L1);W<5U*9= zviG<+z+gr2sD(`H+kCo3rg=Vz6Mf8W5iohK)%5<<(Vwk^hoV z7OUkTdvB1gVt1$M8M>V~f2hmAKE-TqV%>k?Vjnq9280yG8 zKv_ES5xE8JP=m1`?%VH^|HvVC=6hVFthPliU>tRkoD93DWSPSJMG=@hp#jBoh) zo4`PJ9wvip!J6or4t`MLI!x(6oX?sU4}VG2PP4rUh-tv#c{eA+${)RzgHrL%({f-v zQ9Ic2ODCqeL?Y4K>day0W(L*81!!Gt=d_7+w_+nA#CUB`6A8xT{Sdi8?2f8xKFA)Q zFJ%48AviBmg|aq`h~4ZR&tajORyZQ}uew`9^~~Yw1mzjSBRmnpsg`A!#D)1T&-i^D(OunySl&QQkSRb(S40llN z&}l>fx~Y7tS~f!_8`(TlY^+fszC(d;ftix8KO=UZ&uPp$r1~q2kXHe%gD)nl3<})E zXF63#pB`F%ivkm$>lEK&BCUN}uB{h2h>Xvg7Y=_}(v5D3G`K!&_pHKz*J#I!R|7Nh z)Q0t~H&Ipj&y?wLw{_-!(sm-W({6F-6c|*@AK`{pLo6R#SD#QVdz7VI_n40#`t6rn znDXiuKX1GPIIsJKWV_<;fDjvs4upc+MmvdlKQ4s1`}(9?CvhKmSHfHE0{yaV3eAAM z5o!0WGGA%PDF;lvq!>-)jOJhIRCd-k?LLrKP-_o)e)5X--fvFsA%CL9EG1V9Ws%^G z+~;$^8=p|u+6wOi?UlWcpcXMv1@#;jjQA_d`hH>$xjSy2=ErN~-=pQQskqGU^n1>@ zBXULG`GF}ZE17G4LOIvO*4l!Yv%0e;=kMdn-z`F^kv}Aw|7a|$?lJR!@atop6W}!t zJ7e97XrbhJkBiB6(SW^$ejB+pkjpEtfp76X>|&ehtOqtQCa-Hb>Ib-j3HclKke|4Y zO+6muye-rV1OQJ`&sm)E)N=Pd&thAHnJiDA;|SY>KzWgq|1ZqDh7_mw1RU!rK)cZt z>L34uQ)tSDfJUOGsT)w$**9QzJ%3eRBh2@`jmM%!ph_F<$m0iELZZ2jbpQynhtfk! zm0?Qk(SY3<(A`=7d+TR*XPN(z6OBM1tdGjMxYl%CI6bnayy3S4;fDV30c`1E**Z-C z5c*MkfY|OE)#}9Gww*2gkQsDC=SxdNqke)AvHrcj;pP)wqs_PyAiT0l{`l7`u45i| zxJar_(m;f*v@$qJMFwTW6#Qt8oJJ}O}6#uz9Vu_C|A5T-fXCR%Ts@y7? z%co-BjHM~u6lOiJZGD+tZ>}_SWMuZHn3jB#<-Vkkl?{WCx(@JE{(#m@^^ZkA;nvLX z+@S3AwHLo~`DYg(Vf_iRNHV69!k7d0hGzij4P;DJfgR6??^95q@OXU5Ve+Yh|4M`Z zWdAFp*flSoMDF3Pkxgz?_c@qM+STSPi1yZNU#WvwKB;l$aNAx+SvFSp>EwYC&ekfz zhVxpCY=oluw{XLkLj6}_0pI_B=ONDr0TF5eaUFUNLTPn&*4;ds)ygE5 z%QnBFyDOCI*f6iFa!r>-qZ^D+i~?^Q)=A6R^Q+TK>vsXMN1rImbhN%< z(uMduSKEUG@%hpsG$1tZhsD^UpG;k$lB4~e%ckEpLjTZmc-y!sEd-?qs&dCN#peGF zV>i@4pdNzfDA>2>?`7Z2kQFyd+X81{+kdv-j3sEAHONIeXTodXAehI zHeZkb9(p(Z-!zHPJ+IvAJl`6N@?=U@$?TqNLr31JYZ6I(@@E&pej~CC05MQ-cBb5i z5uWJ)FbClLQ=MWWC)TqP*s%VSPbXA7Tz;$e(FP_UeNVOip;g>vIaMb7H8n7iDvy9+M!?nc#p)fz@IMFKQzOJhldZTBx&HIC-HmA z1DIyO1LEdTeC&url8OZ1O}!)Bl9i6=hw%}i^J4dDdM+=_sCy23f!_E8bXuL0cwa9N!;6xhBmN= zsuZU@@BV+9v?ymSjrZAs;FUnGAI-dCTJ>w&B`R<6akm2Q#NFEc!Y|URfc6VKP=$su za4n)ev+>4WMQtz2vA6pdi$Icej7-NtNqq&rFC*10#o+UIM0$Z_YHo}asU!4XPy6lG zW=qL;g0dwkHNyX?vfqq8EY{7xEzz4^SST=CJt>Z5R@+Rg{$Y_m9hmx{Zl|5S1H;41 zvAMW|x{rG@*w7e~&nKn$mBi1|iGBx$5gYroMm3x1i7if*z%2}^@jZKa1Z{|1v-j*I% zrE963ol044ifDjQ2ssVShtY;j(TNwX0`3a#$z9N7vo;n3s&k;Jk@BmrdPy8Zp-^~1 z0L4V~Ky()ifE;m42b*(SL;pECL1eubq+$ScKf;*!d|;6VFK!Dg80Wf>HdPXy%F-tvZ>ipZ^sKA{A6v=uzSf#Pb zp0io}I(xIP0RtZY7Vw}DOE_lVm+$R==5Rpi2{oV4A!o23uLe4+ctLZMv}cMZWYfR@ zAlh}HwqrRk8D${umZvz=9wDh$r5*=DWj{WFhd*UfcTekJTh_LFt2v+gRFurb@-wSY zkN@$^gB+$(%5}`?Q<&O0b>$ksaK`v2;FyHEb$W_$do%lQR95**?#$&&x5XOAXEc!% zI$#fFm3}d{GN?aj`L=TG?QP>(ntz=UIL1s?8F(W(L=(AXDv!Nogc%ay)cK#ZV*zl- zDi3T+gK>@u(XVCcQOjt82efK1l7gaUgD0Q!3#WGln}pVKD-KR8@W z5#cZZ_?~^W(4;{@AZ+LDkUXc%^YJ`Y>fQfIEGl9c3g^^K5V02C4J^41yrlhrw}fbl z^ZWistrto?$OIjrK7W%jv;0aEDL~{0#W@MKH~-1_DrRzL{5ttTwgBPl!2J!YUg(Jz zX>Shyjl#c}haND8S@q9MV3VFJ&p@8o9B_@TjMX3E-%_EwOo~`rmqlCgT4iUB`I}Nh zc1e-P`3rtI!_h!4iEf}y?-GV<>mJE=jOM3UCPjh%Cq;cS!1!&jz2aK0)^h2-`MqtK zJkATs63U{gQlA3U@xT#quLUkE@YH^Hs?bFH`I=*MwoGT=tw<(JWd#3rQDiib8KXpR zfuO>Bb~OSMw7q5}KZ|gR{*To(f&5W;IVhX9M!5z3rUj1CwN8p;{UfziAlEm&BiVKn z)Qv;v?#aN6nG0n92gD)dhQ}WQVS6*Rvu1O-SO@wWdFtPodB} zft1X$N~?_=EbY<*KaTIbtE#B-Kf%`uR6BJ}%y1Fy{1Y-TpjN=^dhu@CI(0e<2(>G| z{-dZWAhox9T!ddo%{`9qaJU1C%h(_;Wvful81TN%VSfy~$q@L{F7KyiM7ii}P`)S%ZH)lz$-|e|NCxl{Ee3U=K@raKq8aFSfQ$Zt0GxtMs_YQptSQ9~ z?K(iu0~eu?{VdfMLH=Xh7{=q>oNVRl64F&13>qebOld-383V9ni%Z2=}jEB<>}J zW&*$q>uqXY6sa|K$ATFSNJ3d9Rgv!@H;P_cQpkV^$r%gFPrORjj=~PQS1)p$$b_=p z%ZI-(RnJV&b_9S{*gX$y4r`cl>b^i;;-I%`KIOP<)n8>F^3cdyog-kuNJ(F#ioBWF z$ML?ZI5P$Y;|@JA;ir))@FgaDA3^qY%&r^&C&7g(mX9k$m=KQxhM=w^Z}>wP#J$|% z3fY04)|v|l>+av<56cy`@Pm}3FahN*kAe8n_W})yu)n{#ggDDoV*a=F1$eqfN9~*>5VQ>^aA4i^z<8GnDa$I^^k0)}0z_>O z#wMK7Mj38wavj^T+9P*Br=vpu2+#J#>JS;fh9;flsrqwFwJ{|Nr7g7Ae>4J+5Z=9j z*_B?TwE+^J%lVFc1sL!+!*FOvx(1f^{=bJRk^^B)o&tuo1S2r-5TIh^N-WIS@DPwr&58Xw zQ$q^b-HU*-UMo<1Ro|)&{qf|+*0|dvQ@o&p)-|S;sZl^{1$)ETYC1t-YDb(O#LpdM zRMQxs&SMn5D-UMB&ZLVJ#9#Hw!c0h&!6ydlI zmN>`2U-eZB{1|9bBm+iZsK-G!iYvWlhV``u&~o?*nAhvo=tIhg3M+RGeH2_cJ4QL5itZUTBg3QfQI=amI|B~urHl>w2N^L3#>2Iz_7hubE3T)*R6cs$Iw z4xn^k-GyOb>q;jltSH(o+)kbsl5(H6+?dY+^HhqQ+n1npnzrK&K*6|sb0KBV3&BKB z+RC6_R?E_}2&Pul4gCdK_~CV!~nI)Cc!IL`t`iM?4JrrPT@@nwEu=l80$T*rj=3Ig}pvVfv6HGo-} zcmnr(j_$kfZAk`owwkEq3o3&94J%#|#vrE5QbEgKEk8orG_??5EUwiv;9&*(fDzq2 zDs@U6klJZM4TzHy!~NVx&Z_{87@%997C-#!{@II;4NM(CKy0@L4aQQIk(7OBNRgeG%06V5Wh}#3$8&v0=f3afdEL+d z<-2`8*XMn`mut45RjXW{X-aTVY_Zx1ro|FmLS%i#_J)(u2_fmaWLMNaw$zST=z_T27Ds!y?B$Og5~> z>I{jX_6<*0+l)8EZ3O-jl5v7RBNALXqVb!-|5y(iYc3oUH)6_5-%Rl3eu8&b(q0a| zFaSC=${$e=+^#pY(#`qtz8wJTa_Mc#`2+v5wCeWX-x=}xuqWg>Sac6ufwIQCHupD| zl}lU^J9|Y6fMSU14za82Lyh=kzZY-A=EXk21V|GD(@CNc1v+HHzo`081kv@=%^T;N7ojovkn$aS` zo3BV>U?DNM?_}ET4y+7F6TK(r4Tg7)Mnz%mN#+)UMqH&^dYFSoW)5-?RZE%m zK}HaWdU#gmIi6_7k1y#raD1oEk1I)sh4-%@m6CGhv{El^a{%5M%PXsmoD=}Nww?3J zv7eGV8J8DxxhnqU|5p#JsqmQ}BWPf#GhX(P>VVXpGs3=1is5={6y~T0XQ2+gDt)ZG z^{A%vcM1MD!Ti8l0J=xF1s~C%)ZB?{f#P2EYuq}dSD)}iA1Ff^$P(jv?wg?b`EbVn zUJ$IQtCd>;#y=;A>o|Tr*6U@~4`7P1cY${m%s7BtmpNh&{pPR#-*TXC1%1OuBTrNJ zp2B_5U3n2q%nYg(0Y?jAnsk`IJhD_6M+8MNqGZN)*|xC(v@XW{U@)+JqG0+{IIkBV z#r}xX#9k>E!M=$W52S=-r#zrJM?EwE4XzXa4^lh7;-BDuf8N~Tb-FBo;V*v*yhoo_ z(DcOHi#XlPFtv7PPn5wd>Ks)!NmFb$f@1B)j+cT0I6>d;6(VfYA$vdsbijHicBb1$lyr_RVT+Ld`umY_9p{ceWGX zd@V(gg2Qp#N=9Z^szC#)c<)#wuk`Qp&W5tkBsNe@+dN-BL7idwL2nUN0Esv#uGgbC z9QokMJ|PyK5+MSv_R5Vy-Q7uz98v+TFzh^94E=0cdm+S!Am^yjKMEPG3%%TNyo6(Fev1d zxxbJ<5~U3rUCFpTV|+UE=wswiNrNXuq&JjWx@w5(g15L+mmX#p>6~aO8EDfB+tvsL z@lD4UPGHlaInHY)8Tukr*}aBZIN`d~(xWpmNo!pOcvzJG-RYV#vyjJ7A?X3S%tfGR zX;QjJgydYpYxI}EQo$XQ2xRov6g7bWy`OuK`$BOJ&`8L$8KCD6+fG@0yoF*9u3;(qUM1&$Nsnuf}FUs+bQZm>Ayd#=6~@ z3mg|#>Ytvu-64JfS(Zk5VZGcTgxlBL!>~gAVWLs{o0SeR(2=z}s6S$`w_hkXxm}$1 zoYaAj@^WA_pNL^OeT@ItPXC@ z%F4?39-J92RwW-)p8K$~^;VSn=sy-I0|Pmqx?de$2aZ|?Wn;p4VSf}r!N&6?J_9VN zw>4`A$LzJTzB`Q9JvEbTD9ubB*I|A*iGY|Lr6Z>hcT==;p76Y0)c$h@+wVLK3_G_O zt%k$El?rNSKX_oOrS1p``_`4fLDgPfpK1+9R9NWp-I4R}b)lS~r;|ymXMSA5ie^;3 z@ii_p7uPjqmi1LdU-eykqx?l-p#X9~_VkByxi<0kjy!?*R8hwje)Ke{)Qab?hZ-1ZBG5+x4 zEaYP5!45l2IH02#yZU6jxR!14DBqad{8Zc}Q zkWdo8U#2CFIoz_E0jYMP?`xiC!(^j~4pEtd1tP4f-?1wHo*)e(yB|y;AFM8-(Dihp zAaDv&@XTyTM@!?5dVr!DPxjRkTtG2TM+_|6SPCUOKvNwTQV@~f>?uno6@4F`mBl{{JcYQ?aq?<+h~vOKcpLu|6!PVj zaLV~#dX=)@{*sU1K!!3wUK)$Q`(hUT;y9FU$WEkS3kqYjb(w`X`@@0}VfI>Hm{-tb z?2^{MC|3Hf^K*evh2{&sxmKNOz=LIC*YcfzxhJm8#5#ZuuqRO0Fb|Mah{BNlntY7JTDtawS~DYHluUSo>`} zs7dEvrhp1-%tL$Cr_86qx0s)~7fS&_*go65bRl73t%Y@~$bWUg*y3*WPBANBGs5{2 zZR~@zZsgmyG})D&VTHGq-{#YQrGoMYsaddZP{bPmk)`!j>xndvr%Ak9yNT4_Haq*c zYV#q-&gxsjm4@=(%Xf4Y)U8JwqtPH3xRxK6FuE`npmnIxcEcwv>EY^D-@I&hNV=Cj zNiIYU?SQoRn`bvFY3@-n!;>x5OQ@gE+Mc}mFO>CB$8b`!qRA`AG4zV1cZ_Yg6vf2E~==oJpc3(0*1%k zhoK{z?%!UG)~KWP{8`@IQbmtc_ubufu?`q@E2yI%vL5U{yPPXAz!gA!`_%hqMlbR= zClY=kz@4%;N@BQS{M?r{^S9y9(i65`T39)6Z!SrLAlK#lS;6XI=j(FHp6_T%a%n+r zB~3E#KYwr|ylRG3%E92D!|QU>BU4idmYC$o_ly7ZpcsU%YgE%Bydd>S9fI1XB;O$A z(e5V0|1Q46d9r)e$o*c)cek&;4&R2A^Hp&hzs||b=O~k(K|$ZNroBH9<9ZV`4BTJ6 zvwkB&kDN`w7PL-Hyo5oYBx<}MXI`e5q|!t?u!kp!PezuqFz8dnx)E$jN>%DZ>VB5bC!)rSFHb1P zQ7v^bZ78Bo6#28$l`m7u2~@IPmR$_h4LYSCjPvW1mW4f=^zNVuBA+m(%7-J7nH&^T za3o`^-omOcN!#D=IL`OmlKg8JlWexjqakA3dUY@My(-RpQo(n+t(B)NwB@1(WhGBb z)UWJJ+uvt+T2bWNajlL`II$qhoDVs}@T@K4i-uW`-c-5D8Zp}ehZ6ua>r)l)Yq`i- zl4QeC2YCL2CqkVW>oz_~p}BQP#siWxd`9zE`VC4MNr8_#*Bkg%XXWlbS<4R#*U?I# z+jwI%_;K~+JzXc5-lgy7DI}@l36grh9mVH?_rx^QHV?#Idvbph6~nt?g0_=?;&E;f6$g2Hw4kMM&<_X9Y8{Re`s^58AULfYG-1rxe& zcnWDOl1BAoU+(&ep|}A5*Jt2~;RF7*Tob#bdFU;~AcIarC?a*dhH*#;VDp?DI2QRS^$2(&_s`f)aXj0K-TWg7O(dv*48w)I* zO9qRYm5Pt%Pa~{t;0C%}Ot7kSYHmo;M;~YJ!)*{q;fbxZFbvn`jSITu7Xj8;@*)XO z)3s|{_Ys+0r&f4QvPeu1UMr*IWa&6HROqaBT`Ti6HzsU61H8yAVypg0dvwWIHS_|9O=|LUh^VOht zQ#rRt*oY9d>|Uhh9FPbJF^0p zQwX1!MOT(_eW|0(sB#OY=pEhNx(Av=ZLXj%$Lq$A$3J9`^l1&QYxOI1Qb+@*gyo=+ zoD)=+H%)uT9b_nAJK6khbnL_z)YZwWNhX^BYu7_S8);w9(TrUvqE2tTyKjCgtYX~N zi^z%B7}`qJZF@B&ApW7f!WDxz9QtDp#$2?u^y_dR!PYz##gL-kNi8DzZQ!y|Ye*PLyBDSzyddrB!rbt&Ax5(`cVeuLkCmxiT>k!bIaAI2N%Etb>agttA9s zp)Uu-3;G*N?(pP`!~}ACQbIs-1%*C{$(D|&5$PD4Q{^Tu?kAjKJg))?>BhWrOd9z0 zWCU$)Pj!rpkG@`Z?Ns`vF~lM7=vuOeW($Tm!R=@UFG0SX*D??*WJo{%;jT^S6P9%C z6AnUq&mLRZPW0R_X2D6-q%R9q?A z#-Zx^esNwWxrt`}K%1*yTC7FgsOMx>abNs$PvR@oc?4#v?;iZiDxdM1gTls|6_cs$ z*9cOtccP3_B}NOeyd|?czwbYrm7H8$^k$InZ`ZkZJ3nV!7&!I)lYz|q-Tw9TfcKpj zzF(`XVMG?hHKBeExD6gz8V7blaQGLLSGwB%mu>DXh8JzwICYD-xWF8p28$@nM%p2e z5Dz>I7`JHw#GWHxEI{`K&X=92t<#uFz9Z|lxW^L;>ykuTOR1vjeN{ul2Ps8}42BLdI$UwuROk$J*Hd5cz z4!o-2%-&(qzLA#OS3P@J*(;1=3p6#+%OaGJRc`M^;a2&EeX2Xt-iqlmTyK*o5Q7UYSt#ORL6pNEbW`Rjwn!~uJg%0DwIyZN8 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%0ArJI&t*4|W0+lu5r_3b z9!ihj19GyUi5PWJdhl9p`;&X!hHp}J2AfJ>8;{X?!f`>N3(~?NX=?F{mGWemkI*Mk zzP*9}-bi~$JGkuSkk-GxT3~`pq@fmEH=*(I#d*S?VPpAH3F>46vUj_i5*38y#)8T{ zG=w(9uKRisBwh0{8@I1ZB*ixXGrYk0YVAFC3~buS78Ozv;;x0vH%Q9r0EMv=< z3lW~irt0Y<;I9onrg|3yidy%x!9O;+X&Y$^2$aU` zSajM9{=LonvW<^`z`novzc(}=ozfBz`1wKqqPDre!_S^=sWRxKm5DnVG$xvELASTx zhqkeCdR{LgC@P`I{48P=-+afX#5Ah07X*jnllc>^P*&wlz|W*h8aCi7OA=u-Ph`o7?Cmzeqp zgiBV*f4b7bW^-3H?WfqH^Njs9Mz8{_Vpjbn=jSMi<_gL7#{bM4_PI+Q4W;Y1dC^#h zm!W%uvFUA|RTqhRX0NU@aUo3mBN~LZJsZ^>hO{b8B;J0!#U7|}C8s`0*qIGyOCRQj-yPWafQEpu zGk)j*zkiLf~ zl*)Xu-OJ=W-H8HBdh50VL`k+-h?ZWH@ zB`hlCU4>*l<;2s`!j+^Vgijbw3Rf)A!8}Cu_Ae(F*~*g+#60wWp}HsdNyVsCaFKcM znSBkMH(zPdDP#^$%zc@ zbe14PrUo~RmLMGH9`*FECj7&}4xiE0d6`3D9Q!1)$%JC!C0o0Hn}D_dcO!h3MjFY< z(S_%Ie>U_CT)NX%D&gfocJVy?LWet?!g=FMY0S+_`(nBDLX~#DQ;Csa1lPrqBNp_2*aZI^R)*qRvmnMN z{i^K=dKmk*#G(p#%G}v>KS(u;o)1IBGA8#=bqo@hsKv)>f=z{(Z9lF#4t*RS8O<|3 zyRB%hYqWjHgyPIVGhO`~5?%AQnWV{U2+io@m>+a=pNs{=f`dK|MkvY?`bRIDaL--s ziLxM8+G*()GsmA$Z)P;WmtX{DM$2;!m3b^N<$@v>w{vVBZ684&6H%}-iQ~RAdBdWn zIhMN1*5K|9pbPso&KEa+FtLWXi_{3aEXJir;=2|(Q}Ki4!FKQISv_!%AT@S5BwxRP zDM#m3!UA`mL&D1)^9P+T{OB0>hfgtvf_8mid*|ubI9?i3w6J$$ZsE;f=G54s0?pOX zxxq_ALo$s6Rj%EKV`-nAFY3oksT?={LAgCFHz01Dj|@*4Rwq~mW=9Zn)faOxdNv>o2$M^0^>)lwS@ z@uI+G@xEg_>EP7k(7YE3efmfrRCQd)xyPZ~qOH)jM&$@}>U39T^00a~j%|>YmCK#I z9sH7TO$c?4FhO#_vNY{gD;?5l7M+|R^^b3IS1w#ZF3wTR@jq~=RJgbvVW}@~>eUyeu9nkHzrmIe`D(7 z2-nc_FP`2O8lon@OlBcn$s$_>=g&U*lx5j^wY$_vT#AU%AWOo`TV`5@xtQ)BVk;*o z9d1!)?L+g7(_%?KpG=@p>SWslBPDmN`lU=4do`iW14BM=G0(;d3ySjv`ZWwAr1fze zYe+#0PQ5H0Sn`*^-n{`EJ!ehL17l-r6;_zkM}`#c6l?zG2`YDkVdCGRv2>QTBTuUW zHgOwjl2WMcX#)*rKGkj^oHRQ)mHMntU$?OZ(>U{wy9Kn@xFXyqWu)TS!~~m13OUv3 zA?_CI`yHxL2+6o1cA@4?MI)Fc)wz1S2ZerAF?!K*F5LwAjT@kADYUKiRCDSKlOS) zl+_Ytk7V4m6mo=cF`hv!D=sbSRohJ%9SbK(t)@a5FYJ*1LLH4Sp4@pfV^Aq&z#AQ% z{bzWmW?{{h4<;bLkVsVZmy3}Bx?^ocZ92y&Dx0hz(!q9IYMLt6yV_D&-47iCadguU zrT8=)#mAD}1Eh>E{tyXXHkxI4ajrTRae@mkVFof>%|6OEz{tk$5=HYO=H4X^U>wfU zbXx)fbBKeG(nil9EDvKfme|3(nP@*|Z!c(~^khooYN8XB8?1-Si zb%&>_+H}DpkM5M*5bNY|9XMCWve!CG`YcZ;>a#3#Y~Jge5}7O!j7Wmy8%L-HZJ@e) znq!TnM>{&52&xEs;Yt?QRX@_g?Uay9$b_QLnSa!E^FuB_XBmSJw0rWG(;=gYoCzK( z`znmXa2`#kmfAddr!zubts5}(=3fi*12)JQp{QwP$+vwl zRqV+SEq0l!zxoOH`F}j8D0lUxr{;C@ovKEHvnhm>$VWUBui7k{Nu4CW9u*%&%*WL9 zEJvUp&3r7$Rs4+g)Z<_i`s7UUyYvym6kh3Gy03RgJ*6X5kIx>cVOn6x{^Mt1_3KV z!}V|vKfQ)c@T?eaEsv(5(hbo8zC7#n%R$Q|drxzNPODns>{@Cd5|P%?W>7@O%{vS2k#u8Z@ss?hXrf25A3{yf zz-!FDXu;?MVd?457gjB!*)6YlY*&e|qK%PV(P6Sc7l;FL-EHh;X7(nRs79ls)a*Gw zlC6wTf!0RIcq`{UZ_ndFJkm2vkYo{Qf=dr9?fTLLM|67VtcdTK$#S*d?fE# z+AQ3H5-d81*>%~74S7E#=16v~K6CZ?ZOP5%A{}fOF`;6`qRuqS7~4kQk=d3v+z--z zMwI3fkgUFkpfz9a6J^Mw-iS{O6nwdTK;t;YoQV z>@+of-<=w#6gKqB2X|e%98|hMzt*w2Bx3X!UG}TN%|p=v6+7Jqh?In0uGo#^F+Ah5 zX)7Y+WdoCj0S8)D|J=cbk+$?(#df|u!X0$V{M@fNkkd<#V`4fHxT%LKI@-k(juI%M9xyw89n=JAUX_Z zDc$E{w@CI5`MZ7e-%-jO^A%~9qz|r2x&G71U>XZO`=c+Y^co6N+U*j$YZx4)APT|LK=g z<=5<^kg8bX6OZ;L4E5ui*?qVQCT(K>i!Tn!*Rbl#F6TOCvMnQzQgyb20$bU=EvZc# zn$A#Xnp5U|r&1q1AACQiHpGeFnLasHA`(4RcfUTK`>r=!_C$@){A`7ddDHl8Amu*i zK=YOESlo zt^X^oisHW4Y0srUZ_=cx4f=mh8t3)iww3rLC}tVDd>Pr`@D0<$$ai53bFMTDXhE@- zi<*xq?5rhI#LC?9fvmPEx!T+f0`0L}A@kls-e=?E%jx>~2;r4Zvz4cZ6J;0AQyzs} zf6C^4t_;~~iXcY=P3}Hhax)y884Se=r70!#dTusRpr0d4ev{7iI6B|{3edUQN&39W zyHZWb%_fjH4L54Keib%qmlsmR;p*N{BA|#d6=ig@|>L7n7X)fy$T>C`q74s4t zyIk!S=Q<$P-e3JBH;YlmNi0ZRtkcBPOis-XX6YPf8abOOmKQOIo=VN{2zZz4KIi|C zhqfb)BKAr??A--O0M_Yx5yyU+yvxW`sk)#s_jy{x%TpvW$e4vo(mHo)q)LYGpn?z4 zB`)N5DTzz1+zDo|6kX3v%#0VUJQEr8H}w7IyU}c$NMn#}P@$iUW@yhzNWKCa9RVRp z$}|*=CEYnEeubtbGwhrVv6ByxzSv0pK{XBv5$V}0+3T(d+Uy9jn1M==%~K9fIE*r} zg$?_#X>dNQbKL3k7B$_4qgAaZm1<`r+oCo9dyk6>-EGk^F-ohXjGpRw)Sn*fAkwFOeRye`rwJ<77m(hpbI>Lc~u*Tl^6Un%8A6Vk9DoYa!MPwc#01Hij0VJ7gwt zle+tCGtWJ+_VG!80h8obEvQ!Bw)85j;hCg4-*rFR$9z=g(Kl7@@8P_fm)dQA3AKDj z0}~3_T>tELPoY&KWq8(WNLZjQ>;N)I!A~S@L?YWzWTh=RVc9R}yw;vu=P=2deHZCE zEvv46-HQLX_)S_^r8KD-wElmV8^CDJSThL42@?>xPqPQdGBXlIcwR{PneRx0A zn>UNOLI|q9wBQmj?}}%KAT1zKMG00Sqv=0K%{%5U6M86D-p{8I@fjW$-N#x8J z1u0?^wBKHInV)5yvX3u{`ka67F=Zi_wJ$X2Jvy-WJ@K9ey_jG10xj~sGkOWx6 zfkTv$d0&v9(E;wfVKT$zJCDdJ&w3ZIoq!YoY1o0k6VZyUU zG6$G=9~{#u6Om8P8gM0>G2qT14Q>|&;)o_6jNTZ*GlPo|5{|@&6%VqsNL8T?kvHUq zq;@G)kIw56!|l?(q)A01Sd$atqbVN-2}0XZRTmd{5az2Qv|74#?bP&0&>;=pf_0Gz zbM72!o>6_&rnRBM#lNvlnEKgSmklZ4jSM!CiwgW55e|1M2M?N`(NCb>VWKf9KTCVO zXB}iY(xdcIk8qs*qVGkdv;6J^K(H+txDdpA_;|XOvW<03}l#1Ozb2)z3ykIaylhp6QL@JiT6Jj&wEm z4k~q;@oF1-{^r*v!TneW!OrU21TB&+qD6$g>;Jk#GczvtmrCQ-%6Q{+-;eI}#O098o_}bd-WFS;b0Y%9CVE zOiE@8+hyq+2h!o3FPa1)CpyXw9nO#34uiZgCYqtDS>)mQOJh2s*mPrw(fAgljOPO( z>D&cZlno5x-|4cH;-JTuvy}1WZzRR4fMw%Ls|xqa{cJ5#;`a~3)m#$6qKP-Wz`I&V zpK~}k@GavubI8e442B@aKTfX*1ra!f;~JGs=iWqmBK#&2(;|c!^G7|hxI!u+|2j}4 zJVwJ~xU3^N()p=X#hf=In@%egIn9|GwUo@!0zFI2%8RK=vN}KL*Iw=3mu^gq`d{2s zk?3J@RAzuj9vyCpjrv1TlA)#1)9girHx}Ll({S{xdN2GwZ>E_S zEhRG%@Q&_CM5C(B8{4XqA4+Y!1}&mE*d&CwcZdk82LGEr?5o=}8zDS{k?=I9XHJy{ z5WdRP(`qTKVV{c|9}lOAiiFg|Wub~GjxD_ZI(h#Y%Tl>VtRv8ii&uNpEx*;2X~u@w z7eDmcQEAsxG)Z(~T1m)i=f)K4wX~lHd@u+JIz8&5)>IOW^h=%gh2jfsTZWuuq4vg4 zP89bO0x}!T<>yJFJs)7C9t28+{Y1+o)$xm~{}Ms(Bt2b*bON3i+s|7##wZwMq)nh{ zEznPwRNI+{25iZW&EwHpEvVy~CY7v7!bQ3wjkD8{6kzn?v9Y6`UA8J_Wn{@Al=Ti- z#Y)Fxa#D*omr7xaT+h11Jc*dm==lI)$T8$q@JvyGyEZsvT!*S^Ws!6;_kN`yTY{Xh zlcH!UByC;JeZsgouvjO$RF^jZ24#W>b{=_x6Lg~?MYFJ}WH#{_K3DYyn={)0D>uQt zt~Wb6#hEqGHV+~VPZvD=U-cyy9q%+Da$Qw&?@{`IH}Y9>dMgz4|%Lad<1#wjnPq*C&&W*1V>m`KK0r^J)3Ly;Y|L-fB4e|YLvlL2 zbQYzLA!e?3@}hVqP;)_nm$JhtDFaVl$9l|rXCNO>Xo^`fTMlVf_ZwWU)@y8WTxu_r z{wB^Ukr{+VMr#%7F07R!AjtZD3$i-P--4{Y2?(-u7ym^a%0^T1?aDn`P~%+ph4gC6 z{Txb5y_vFS`)CH|3)dQr5bnu^s?%`N7<3wDaxkJK!?K8%$kNvui?c({-nHetX7i?% z)sMQokw4L{xpbi@!+;`qJEh#1t{tI9j6Z309J3%n{>b)EF#-ws%wy|r&q^carw`|9 zQPhh>CsY~?+R7jurF@uy4v%>6NIEJ7g#-mWbCT53iW@lBK21;{Yap1YC6d&U0S-~F z0$;TqY3Cv(6hkn+Lf4jVgGA-~GUY)c|DR&5rS96R?u9S$Qn z`kXDv0Lx8?m~j= zo&}&5ofH^2N_U@J?3}`@K7DrNVKLQy=Zj+vc|qsz6q>YcG4ZWo8(b@AAcV!})0LT& zD=I%HC>~3)$%&R#=w}n7WbdjpH<6QV`GfoR+V2zVoj!e}MULTI?DXPuCLHKAY$oR= z^9V%UK~f_WUGt4%>}ntXNoIL=WW?@T#S`12n4KvdeR&O|YW*BcoU>%UN(agB$`8@d zB`+J2#vlZ;Icl`RtbmvP$}Z-J7-Vp$|Duc7L`^eeOCBk$W10QN(FL?oVP&4dg+{ac zADZBf5L?7HfuRNc)kCk?))p1}YE&@q+>Kb3|M+>K;KDKrR3_wkrN>CtIQSl4Yei&8 znjLI>YJCP!21nFv(pZt5LyKHLwG{TpM+ zY<+g9*A{3%L!8voSS?%=F?21(7&C(G^R2{W>W$_J5k2PbX0`k`-E|#z3-t5hIDS9> zlCpZBQ6x-U&xz5=w$`j~&2lRCzY|&P zs}40q4S3zaOpZ$4P<|mY$Ru{exu&A$M$0Smui-Z%?oX ztD=wPLNg{@NE0tQUHbU4e_Zl70pBx?S15*j^>`a_X(%U$j`&huf~F0HYwj9wY?loR zA~KDmZ%guZcji4jXYFVri_t=Df%?uU0xd63@P^6%QX$>f$EIkj=d|6A>sGlwfw>+VN} zI(dAHL6Em@JR>X49dVV|DIjq7{oTH8_%0`Tp-7j%BR=g6X6X`N@7d4`&Jpdj;$jpV z>OTD!+IrwSIHk9C*_yW7LhW&@)V_%+&h7}qScWgHw#P&t z#l4mw>?a z4TtASXjlO+=zCbxd^2f_(fq$LUjhII4NZ@j%~e6$1MeDYbyo<paM%g zj0le31ucsmYGQ<7SHDkV4_S27LSD5-SpD>9WPJ7^8Tm@?6AAv=N?Y2nY7n%1WqF~P zrub9ds%U?S_KxU?zwsBgNf?ip3w-$%`#}69@C*==V}*8=lPBlOLQ?GQpL*Q8zf90Z zL#lB)*twGEnj5Fp(^jAMV&C^27?r0THEEvhVdhoXdHNP=w|5v0f~rE71=+Tp)A)io z{j+}68|T|>YcRZB7zf$BOd(i_NBu+jJ*EAdOb{QPT?Q_;jOF;8U^~O4ne+b=!M8NP z>pG-q-_!=7?R)20##b7iT4wwwB$}Oj|Ye1!Dev54oiHwYCx0po+Is-~G+YoO_WGCYXQCbY{(WY&r3@eRqcVtzl)1 zeIqp&PS2tq4=Q7g1bGIKjCteDKYI6Q+N7U(S<+A0tKP(8uplI3!f5UW2lT>aAscw3 zCuyXDIyW*}KF1DHse8x@8B!#%$1kTZ^LNw$eY$f>QK^*pw%>F`05_&JlhpV=5wko z>dYh*se8T*?+cKi?}jxg69jY`1bP-;9aMihLDgA6rSd8`?hLc{2?b6Tr!}#ibKT`e z_0c;E9>|`NQg52K2+y$O+!`Ql*YP|@c$w>7B`0Rp<4anc^#{a@2r|1YGr-A+N8ixCiIh;Lb!Bf0Yx@$+=U}>{BVUx!FgtX^f0e!F4c5d~fkrIed#ZSOXzj zoEkLUu|>JAMB50JYK}(6Tei?{kJ9j>qr?EM>)|6FM7si zz}dL!oSWxI4XW)CnU1tkgAfYqH2z}Py#y_1#Q~3@LHB*e=7FSbH69+E>sB0806qcU zfK&7L5F;B!DCiZ8ved+BU6T@j1aq}G&*)SFzxXfXKni@O+iK9Gq0cj zVDj&Aqc2$vu0aj@r30ermJx)Vx*n7+YBV7kx5Y@QFyt?UyvA+P7XMgi2O6R2OHi;v zBCK(PT_MzdU#k8G;@1zy!EnBFfqoP}@_j;dC|P)Q-4{;tuGJL9?|ZoyL*tEVKXC$l zQ-}K8_w5`GI?BwtXY3-W{IP=^US4bo`6`-PzEjt8wtTaRinvnK{D_k?&#~wA$n4e9 zWJWoE#bO5{x*eTX@@+%X&J^!C2!7gVk2+h*NvOpq-b*c|Jm0ssag6C(?udI`u)6wn z$Z+Cqp+kUUl^08|zZ7@r>dQ9{yT>SxWj}Kw)cluPAK^jR1vM&gN6eNBn%pKCciIYl zaM4iH^h+okMD15^T9ieK_Eh&mJ65u5%B#Y<>9S z3qqfMq6gj1hanw-PeME{t4Mx3bFzlO(f4cd2EElJPf&JJl3F(kioXj z!?xU33e_-q;gz1S;e}!7(;_`?X^v+PbXVHX+h2WyS68gt`BZU&nqG+H9dY>3>$*X^ zAu%*3<54uFOxxm4aBes*Au`V$iNL}P)#Smse~OULFREF}rTHzMSM@y82;!X!b(g43 zGO)z2kU_mT^SE@iAQ^@w$Z8()iKd5^&o4kdv9{uJG zWiHlM^+3%gP<<6ouWkP`*Pu37&M#tOn&#>_r0%-5pUZA?*xf2{whp>DKIraP#e4ibB)HI5a&nDe z+z&W@Du~oT&+AIPP~@J*#~=b8n~dz^uElo`JM9Rm@!>E18{v01YfDp16=r^{k>Ts} z!iXEivL_Dz9Nomf_PlV1hR*jW=+N8xu(|;;{#$pY{^{0nF_k56!8}lpE(jdQ`=%~R z@jnsx^!HpD*=z91Ok3B+se78fDyYu!rY)-$t$zOh(LdVbsRdSJB_7oLgL%!%3uCp6 zEvnDR!InjKmDd&uy<(vsFR2da?pw2d$J5Oh-&+7ZN4fjTV%#NI_;Q<^xH4DuT-5$_I&HrDQ?at1Kb@1A!&UP@s zMswDeiMku1jlYn=I9tWI_<=o_V%*Wv!(A180@we(wNJhK;2q&E>QSX4O!Tp;ueZU` z5&yOKo^O5ZuZ-+_&p<&N@EE9K^S?eTAW(Pclyo>wZLIqBg=>3s*MF%eZmiP?GaA# z7+hFZZG&(2ba`&dtN1Kg!%|la-F!{C1 z+r@fkgl|7EdWNYbtiekFyDhBmyY)wN#on2*#9DXwS_}n_LQb6;_X7`q>)*8}4{5NJ zNLb?x0gYxxp)F8vh&Q;AQC95Fuo; zJ*@AWbvxfm;?7;WmLvaIvm>nU2zjh`zi`SS6}w}5q})c=ZmWA25fPCfsO@cX;#Pj* z*aGg450Zj3S2V4<%nLFyGE~-AK^@&1Mwob+X9;4L+BVed^vC|7-jy9v~|gWa44*9|6hYUdfUo&1K)i-!AsfA8z=gSwfe z0eh!dDl&)ViH|MIL{7b?bWhIvw|}wDkvP{Vvbt*BU;k{X4|w)8F9U2T!~88w_DGKv z#tmvqqDw*$#pV@@V!wl27o-Y8?%6w2e0#I8rImq33!|!nbC0O5883(T*=$63KA~mo zdTFLie{DObdN*sA6nv4~drBpKY+=ZnlU-#Tx8$=^=W-n~gW=7FIQfR7-a0M8?TF23xh ziUiOmfNL9Cc2!MOLbk14yf+NE$i}M6MWq6yss{gZ!#Qs&;5x&(4)dE_XWFjS3-3NS z)YU3_);(A?y=}||Z{L09_27GO=@mDCl~2PeY@OoJJfpR=x%;5+t4~{S$nH&9r7!aw z=7K^7auOZpmEmJopl9a$Q59T0w=OOb`hoGgKwRCVJucom6Z$vE;v)lO@OYa91$Fs& z1;Oa2c@BA=>>nCsGR1`7UMsn}Q%I=h%+@fy0VgwjP_GsPR#jGwoKiFG?ku(kZEbTHe7I4)k|#N{>(3h*-qNANuy-?MlR7#hgWb@PfZ z$aN$C10a9CnzsuN7K5J9PH3(P*1zU~n>F)Q(%Fq13mIrCpo|b~>dT{w+ zClgGL1>bV-MddCUtb*f*8Gap^*EG|6<+g^6eF)3FwVB3v*qD7LNAYa<(E{__#i>E~ z6=X%oZ+kCt=*7Jt#-*1(ez^*Q@tOwB7)+X!%JZBHEGo&f1fcjzmvRV6{)4%XGfToG zFgpwW3X_d%PSEV%o_vUR{5%a!HZB^ar7pm&;mpD zbB)(BlIhaFsdXw2q~sgmf3<910yf$B+`+7>uEVd3 zOviU^jbdfRXIkaO{}0JgK=r);McDpcEH!|}pgr=Oy9+qxsm!fMw7Z11hb4VjaiP?a zdb9efUf9~2rzFD;_`m*wlsRaoGe-`sCRD^}PA0nnf|zpNV5S3*YfDM$aD_A#7VN3s z7oj^QZZ({p6UnssUHNj4r?-WE0+i!%>(+1sjbZ9xG=~St?X?Pyo7^dyrtI6ynI9#6 zJww}5%Uu?Uf4ET@R7lENX+XwevIrH~_nyn&%8%b-DsE`AkP5a30}m+<^CN#5SSKj6 zzc*=XNS-yp2xS`!3sfPJ!?-t!I*@NG3>c{z0~Jd^kA+`fZlA0L)j z@jGP<-}4Jq*nwGhb;T0T28u+PYvf*sTd|*jql3QypIrIi zDCISshWMQzFCGEH+|@fH?F(oaj;G4ScL)6kqH5`3bk2Fy=jhk(cppHt+x4nV{7nTaNcS1F$wgEy>Y@CtdE59)R{JfDyAJytI)PD)KVJ3rD88g`3G(&( z=z2=NINm#Bf_`9RIRki4fk-I z=XyQ>?@GhWlEOrZoasJfS4qD>dF?~ zTO<7-rMl-2O8DwWuYC``0Z-6|+A=h-a>0$OJe;%0(u+@XkNuPckijSXw_(JCCjw1g zuLl_fRu3A+SBh7ci^^$R@;vi;MU|<56_+#t?`?pmpNS8fIh!}NdUGa`_PY@A^XTju zab?|>nWd_nr24w3W+m6@wOI?u2b|~gb2&pEojwpylN7{O5E?_V z>v4vDpPF;#>!@@fD_LH6i#!#XK-`&}^wljlyZs{ejyofsp93K#0E{`z7x-=-yS-kb z*}FH@TRCf+)qu)#8)V1>f@O}a`NxK*Z9{&b?)&O>nJb9--2*1P9(4Y8(9Ai0`9t#xMn$r4OG#u68Au`7x|e_o&lvsN<)B{_)seFe#d#} z*tMost-V24bjhkO8{l29@UwyIC9Q@L+AgH-h+-M!G#8cV%b)PC6;cgY zuvI(d$3H!306)|ik$oJr=_?)*UoXzD_Jo&4Uz3bR4oC>`N#MN6MDWVvz4s{LK!qVk zZG5|)v>5>nSOlnp5MYpx^l8v<9D2UxiuehBScS5cUzGV?|7HEc+>YQug$l*OHk;69 z?s8Kzwc~fia)Kd`$5(}8yBUb|JnX)4ZG7#5y9rc{1c2E)wku_X#~#@kcwY)S#7AZ% z%SQebQP~9sdR2Sz#^1lH! zTYe%Af`!!N=HSSCQ;CKj4?n*vG&HGs?=H?fQzu9cd_GT+`!KZ(gqu z0@_f0Ynayijj{@$pVJ3&`-%yG`}E*!}xK_s15jDlg!swnP?PaWhaQHRNLO zjvd6gZb-p7D>?s|SZMF+b1-ncESowGu>`I!{nf8Pk*D2vy!TVXV}g}!Mzr$7w` z1CgXl;}_SbCc2*+Nz3ybY(^}NAfsx|@_wO)f;u<&VW(1B7`{^rSisGwYBWa z!m9e*UEPNKzkUD4ckEpo70@g(4s2Z(7fvk)xqtb%Eo^K%wlmmP^TzApZGfTQmJHhu zY)=6snbqlYm#}flq^d6u(pm)J&pzzMjek4#=2uYEr@#}E4G~uhkesNoSx96h=M%2mR(51TbgJYnl zFiF#qRohhqsvhW$>8+83 zpT%|u2H2^APL{8za2(eg+QZ3%IGo(K4ZFI_*GE9UwTVLAo8H7tXDbcD?dvI%a06olTM$|`aVAd^uAz97|w7`jhgi7S;=sXc|PcV%HM{~ zFuh}mwd(~1GDmj2^T60Noc1k;7T1c{j?FerQV6tZDWsg&4?hCPGUs007PEEs?*6_* zuP=6a z6FwxmA_KrZ;u`1Pq#fqh%PS^IUh9evp}jlk*j@+~zBJEUaYl$kh2H7N;`uWLniBl@ zW<|-p)m3&*v6j}{kUd_LzUwmNQw5lzhytMs)WnQ+N@DXKKi>z&pmFhlC#istgJuN= zDw>YSiulwrcPGMoK z`k5sO$$PQ1ZklC$>tk}SC^TpOimY|Z;~jd{IY0_mtV!WurRC4-POAh{jR!U1o@{VGWi1AHWSUw7;paP^UaqGxIQV84~Zk4Iw*vgiJi#i#Svr8Dw7 zlO~fU+V$bOH(Qu^*GoVUne%0!Boe=hHGvlfzYw+^{P(A1czd*@TG`Iyx((3(F9Yc?~h;6{NxL$-h5m#G2=pe}LV*2)Z`l zc?`RlAzIyNv%ag&zP>&)&=(l1dv}7NAg2)TWs^Jp4K!YfKl<{NJrpP>fx_IegSEx2 z%LV9|!r$(Hxo?&n`VjCAsS_riU6#}TqdiYtebh^VavVtby+G4et}6N-3ps!H-!kvK z;?}S}pVE>%7!Zi#VLMLF%EAi_Tw4~1Td~Hk6Wm4jR>$zc(KOrA@R{{`z4xg(klt2& z8)QZ3)7wU}Lo8mMtyFq*T!@q~7EC;PTDELADX(xB@tUMn@*yI_!mSVFY7T7;BfbZl zo+H;56I3p{Hp@2Z;5^35a~Ds-llD4w1m>A{uZdY=|IuQ$)%05EPBjMgngD6D;Lk^a z5{-5MeQQpowO!6^nM5$$Arz-VO#HI@sr4bpuqbGMDWI_f2&S@Ww8L1reRlN} zsmKJs@&q}G&X66b3EXzI-($`5#h`zD1W*WSwc_i9qd>7weFn90nGa_t|H}e!;t?2TxN9@%59R2;e6w5<=;Fpsoh0wk>hy+Z~`M{QXuP zKfH7d#9=+ZhE@2J)g3AMKx>7Ys@dAcqI|hw{=?Y>bz7K|LM(_^Azw3s#`C^wo7jJA z^Qo7DK;Qb2F7O4#OlieY(0eIN)airylo8v`;QzLhXpaKm%^6z|Zrmta5M!HS2AHPi z9O`&)?aZ|tH<$ta?X@wj|FcxDIlbnVxA%BAe`@{rS$C`_!kBG1H|sy_!aE30iUS?^ zFz6cIX8IZB^wqS()(mVf0L3ps#=DdB5teGXA7*^^FWi;mX5>!T(IY1?vOw8^o)YVU zSX*G&6(pp}T0*82S5G$A5+SleFYM}Lx0up83EuCROtG_~HG1-!#{_;)RL?863{AoL zUSCr3(u4b4achx&Bxp=+j*B5C6j^L%nKgvXoN*gBpJc)R*DBTWdm*|UA=-~@Ss{9C zq*@pbFoY>EzUU00pXu1uXkCUAg z)=dYapkA=q2Vk@F$;GIHDVhL29=*(HW-f2frA8T6N8FY>yK%#9S7XC*|VwsHUI=5I7fb$tOf4jPo{@~m`S=* z4k4!K+ zhE>4s6~^Y*n^jcT5>Q9Je$$XU;jiU;-#8xB=@i26#ITwpYkfI{Iu2{O-`U;y3shcZ zPX+rOssV22bZ}vQ<%G2WytD#+EgO&sNION)?bO;Z`Pbj_88%;TDKqSUPwR{?>8oJ^ zx7HLC{yt=>IleV)BXCc)FR@}9=%H2kMJAvk=sqxK|3sSf-kRHb!(7}r6sh+IrC`7( zR0_s8V`bnLVY!+EScRq2Qcy4elPKgzZtOWoB=pO5v-S;6%}ItIc%uc9!Qca)P!XMd z=7^RQ)Ez&}to{lk{j;}P1>mNQv*!;~JL0Vz=4QYt#ZRC~$Q}qun`hmVzJRh?d zk8KT$1^fxLo|e@9{XrE3^kJ$MG(!%Rzr`eLjDL&nSnO)hz1D-S3vyb0Rcfu2EC%Ng z(5u5`5RmE)7|B#FfW0?^f~WnS&pUiySk|1V%d-U8gr(6+L90xV_rK!$NX^!u@i@^x zMtBEH7+X*IZw9*V+Tw}eP`5lmJ_YoHJNV)U0LY_`@1zKd{y7 z$*PcEi2^sccH5?bS=9&03<_d3+IY{uq4w}U=99-9e*ljbfi%um%6Yv%!|Vu^7=VPc ztAs_iC`@e;nczq#esilw0JP0#^(0PnPI%=4$`$6VNj5$F`x*aEZ@5ZTrN13 zm_ctcCSXzs=p*rRgUJ_U!2}qbigcEi43F;LTU{atm~7^LN{ySX#M(U=ea&=7@lEy8 zH=N7}E?>proMyhZ{+eMHU@9vh9OZCO3TiXzw!ZTt`|P~ywdTkxIzX=Q&cQh_aIo}6 zR9&I%adjsQYANU62-KFwyI+QXHUUaz^Y4-gm;#)n&5$nOR*#|B*4Er<(EI3)EyO>X z@%w|o=WRpuN?`gJI3Cn|&mfg$j?r-0;22IN(l{r5=T39d_D9Or`CANs^|=eLhg=bi z4lV;-9SBA6+fL-FX_^`!Jru^6i@V_L7l389WBJ8=jSkK$+SG8i-{Csj`e!?*)zufj9@rZ4&srtdr$OY{hIxu0+6EB-!EeL-oYYZe zee8ihfCpNaFaZWc;RM4+zdEu5Az#_150@_n+Mc z9*)_C14Tt#{mIGK3DNhnSjIpxm4m?h&qT_wYOU7;ue*EG(pnh^92_$!M3{2vBdHl? z6+t8d>ck0u`Uf4^9ch-Z^)z`fwlMZk(3k)Y%wbN5Sfx`}=c>#rxUoP%atlO*i6Br= zz(66O0&;0K>vz2eYIvoQf1v%5aa18*AvE_KDu4NTPar-=rXM6Mzg~t|SH2IdUe6Og zz&7(G=dU%;Xt^R{E7Z?SUg5J=!bw6xG^m=ER{s}WUmghM`u5+hg|wVFS=(^zrLr%T zQ$kD)veRNo4A~i5S~#Ur29sR2tm#b{1Q%4D&hFe#_o0` zie9rVSJd4T^^JiGyHk~^^=rdMkCW)Z?vUyd6=#a)&F;Vhue_Xy#npxKJqttC*u~0aQLfWwq(iY$uuh*|D+B;vhkrb7AL!!vS3*j}~usbyVe^!y2YM&o)%0ht3 z|7LU&b>$D)R#E(?4#5p0o`>U$l3SM<(2*Z5OV3P!x3)IaR1>*4QwBlokUdr6Bgc=e zye!)2u6ns&+StIh4D+>Ppc6nc^h%@dPyi6S-&{zvv+*`u47WC{dGvXrm={t$#FWOK zgW=4lu_>iSmZ>vxNP-&+HeZF{1P_jUQr^hUoYOGXO`X(piY`q?F~Ypa>Ie1d%^{|E zsMy_j5B3lL4T?JG*$iU>@y&v^5m~wkpPZqJfrF=SjJ&FQ&S{sfVOQ4=d{&&l|Nkmb zoliErvo(}U_1SsCn%33afCI$%5KPl7FANAe$gG~ZGcxN#@lC4&hLy`|CPZPU;^GBzn9zw zNR5bXWLC-E(g6zP3MD21iiyGsBgD{kqT`wcXa2T5&wk|IdZ4=T${75K=EEa@2C-;E zt;CPPG#>-<_Aq;N&UK4C7am!NgW^c+!N7i;+OnZR?8hKP1w3Wd-a=*zR}q&BzK$8awE-51EL1Z!AaF5mIUq8A-4a@KznS1!~p%-8< zr7h;Bam}y;Ik7^*Vd68SV=nTwMuLBElpF^))u_;Jbh6^thMju|*hTydBT(H`fVP1L zsZ5+3}KUECOr8|}wjT7zKd zmeSp5I4L-SmM1(B_>&*8Xo{MXiS#8vSrx4-kXocGMAYv(vM1qM*Q?yh(- z;uuOnWHR}l({|MRzLZq9=KC8qbN`~no4v6q;nVvC2ws!?y^({5WE(VpRw^&-Q;U{AvDn{BsO zh9`XDlD85LW(vtvo1v!hI!fBF)batHVTtkY)|FS!7LbC>vc4tapX;#}DHK zQ;|vv*t+%dOd^xR#lLLVo%5;*VWRqdgaMqHpa*h-Px6bkRFLIA4mLP_-Y=^MC`DLX z({+PcvuRdH=1h@;XuvIhu7BH=8z6_<$|X;+e6W6qOYVN;QEuP$UqvbWCNF1aOy4c> z*PHwgp4_z!g}4=L)hz|@^n>s=s*ubYMNsG9>Yu6<8WB^}N!yMAGtxP?@$?enqwpkg z|6PX?pd_9eft1t!BS#MM2wOL9o&BVOT!@3kmAfF6wu}AMo_r4!kjTNjkdY!t0_LBi z_qHT7UfF?i@AI^N{97zIUPM~8x3sW`&vG2PWPQIy%hah#AZ#MNDBY=9OGa<{)6iZr zl|#c6+eW=7Uk?&|x@O+6pLGY| z9J{Oh;BTQ~vngqfNf$NFvr95@ZPg14k|_Ls_=u~Kd`X=eIdR@q+##-wMY}jo*rki{ zy*7-SIIn8$mor^Jv#=gpU`)8XFG`LcyJsYeT(%0{0a->4mc6l&zQA&h0T2Ra#hw=) z{(1k*(#=M0D2$~hQ3I}hFWU0P953^p+_Q5%++Ep0RF-jGl+7uA4;h|y_4aj>H9Y`^ zu{S6D;`6dyuP<)wk$ibZeQgZLJ6!c=L*;W;xNL2pkhJCT*SQ$L(w22+zwBmb=&ORq zxW6Z`zV>;`8)^|aqXh4)+#GOB7C{XZ{eiQ6Du&(fRQtF6IJ&V(XL*!m^8Zg|E7%io zvz*&?2kN4Oxvin@&Zzrx@6PKK9eae>BJ!3K;sBTDc#P??#bk}FrV$80;x-}1(wt`5 z_&ezAg*b2k(5NSmE}7!tWPcrSZaxt$J~a(lKt)>>JG0q4_#(c;ggA-^Pwfp@nP*9JSU1d=v^wIF?D;tk@jveZS*B%W>@ohdlvjj^g(-aW`hdAf@ z0>;c0O@U8UVjf!dZ}>EgsQCn{SWb9F479rck3Bzh$F**+p6>F zkMR7W3yCfX-U;iQ6*L&9bJjz|gFiQXyS1&~VA{~?6E&0bI%&UN;58JfVnKnx|C8tW zv!#E4{>ViQFn~g91b!~el?6XEBz_@rPnu=<;TmzdGT`i={_?bj9NWtGqKQufw2*vR zzOm~h3)+Wp5E87rvuBolZ5@HetGijg2MUOH?x;_lUU|9Vf88#y_y(}%^N|C7Cw`?A z;fHoVt^^qLE2J>n+XCb=t<7!pK^E9|M_l~z#f*Jm!He19+bxS#JiS38qA%gN+Hp$r zXYNI0r#D$e&M>&w>pG7rqmybt4z;HDLq!a+!u-6GW6EF9WZ3u_P#yv219V=i~FNW&o94$ap4RlJH*H!*u2 zOn;5{I$f|O@$Se0YXi~s$A7JLeqXWp2G4pYEcfP%|F6_`Y*M9|#Nqg`*5Z2}#AK+~ zcMr2h<+acKQcGItKwUe|VDiKNu&Ok5!R!Bbx&1W>y|4(bEFM8>vySvc8W+xc_zmtw z==4>~-)L_(CCa&O$r_Y?$P04}KS?A<{_h(64N^-7UYvo0`DLbQhGMd;f_r&Avph z3%{g2uYnrk;RZnATVOx{v%BkLAi!D#U~D|Ch9T6Q;GwyJUA{*O*di64Ip)`{(X&d{ zxYLlu4emt*6zh5J{Z7yZZ+-zG3{r6~!$=*h*3t+d;e&9xF9Q*dYsrJUZ~_AV>7?!v zYHiY$f)f?Qu-R7-p zpOzZO9-CN7`H8`IFW~(Bt4W5&xXgYUg16?^8I9)7nGCX8_n$Z$u4!g?xPw;p+nizR z5rm@;DT)s>g>7xAT@^K`<|9IUkHo@(+Vs=1tR|wYtBpsfk_2C|3I`m<>AmhX3BS|P z!luV60^`X%NvCyeFQHxy#D>ZXhVj-WWQ_!;e-CFjh&gN;VWi_bfe07qW89vmKud~( zv-Rynz|NY}#!T1xAK`wXHl=^H=J3@pq=^;NA%g#_dapIUy;@ZUYEg>pFGR+9pm@H{ z>(;()G8aKg1PQ%=?pbx->lza=(&r3_RG>FVoo)pr zO>4D4-S1PQ5891V1Z~?5CfYifxRTTYQUv89+c%FOxFfkcR7++}<_XQ_ADka)wKkdO{bG4f>U)#wKLOUI z20$}#jrPDbx&!T;R=4SIL;xloCQhvBvW||KG)66_39Yr2++VQh$D;48Q@OipdWy~Jm{9B8ka6-R&wrzJI~C5eJGx<5E ztu^}*c4ViSFpYe9z3qT|Z?A@B-el_0%V$mQ>e*f*)0Q4^ywPY>I0+aMlnI)tmVJ#% z5k3AmT?x0Oq;97sCCAsavgWijk?6y#nbW32tda5HFM2__?q#fiJ?9af zf7@VzxnAVV-TUHInp-Q1trN8F*G>Dvi>(v-MJ75|(N`yUfCc~BHaI17k8!Z6liIni z>a_FpFwC13i`=FJDog#Z2=}Qw+lLXKulDex{u~9tH2#yBUvJ&7AZ-FXLNWM-6k}<- zj@c7ahNTHBDoIo1Lry!iTkpCT_<`{Gn%6>ndmRX`TqBtmOk4xTg#RbVk{mbaE!7swY67_bi|h^N z>SQ}G(pM1*9IDu-hkPPqqwB&;M|XmDy*j)!nb>cY{daKEA0@_vaiBh!U4&;jPrubv z5@F)6lk4>4^e_JRNA8iGefvPXaTdh0{z&}@fhENQQK%;@+!HBU+A6KE@D@=MvPMgL z3K`WDza`r?%}dK|O`LKq{{1pYe*k{Dl-LTH6ED6xRQuk#r0Td=s_<%l?Ovt7#IO#I z0ovOgf^vWCS*~$e-sAcLDDLH&-|ZHoT?oex&k?q#d|+O>xon3_ECSpqmQq%7FvCbR6^o&x=^sg z-pEv^Clj>xso%eUP+nf%zFfM-sXylO-MW;rGb-7&{Ap=Q?5*rF#eM$`=U}@$Bpd@y z-wWZY5y(hoom{r~by5&1!5RcWm0$qY)ME1*4?%U_Nmav8Z4PpjD8;8cZa>~~rsbd8 zuXPP(eSw2O+u z?**I*@T|)Q3*Suqcb=UW=w_ZM62<;YEJCQ3wH#3wdB(~fQ3jvsvjA;&08&!yvTXKq zl(Yk}h7)Ctvr4pJknXsvq5dsgG-!fB{v+zrgsm^jr6K6FX_%2tSGizh*6iIGVUW&5 ziSCTE%J}?1hRck+TGT79L}unzwLd3^&=Fq!V^7G|-`fJq(T6mm(Ow-)fBHx}GB{g3 z;iBaig(DCJ+_oPD{UMP(s4q@>7e`#$>XZBzbRj0hYH57drmdhErohfUCu5(v9F^ARwk!%)_x7(>B`*9y3(QQrwRoE-K^6;w1Ep7||4 zey?~5bJ*3K5e@5W)B82I!RC1`%Ftl;y83F*eyLV?jNpLC;^UYDVz-7?tA-*$sBbce zU3LAP?3bK~?)0`;BTG6!(q8IOch55R_)`*!*T@&HqwWz+CjmqEW&MRb&I8F82v1`7 zA3Ukq$H`3Y*vPt2iK>_dHtR7LX8+X@rAnWPV;N}AXUJ>qpOJ-E0!*iu?}bMc50~Em zPM%6EJlz&BkX6gD_>AAR9*cJ!7RE>0Pw4=E=>zHoRsDuP#3>4Gg5}2&y-rd3uB1ag zUhw7cuXGWso}A(RE+(7OyR}^oWRa5It`&)?K24zFdzaa7I<`CFoq&>g#vjFNSyh?e zDNAn_inZ#>Y`lKUpx)}ovx}FW0Tl9#3wGk#<7)l-qK3or>OO6P5g-HP<>e?L7Ct~U zKe3M@i&rrR%9{TrxoHr+Zc)Pm#GT4@zi0{L0e{*Z|VIq5pd zB{*g9sY(+-fgS66BbSSwg=V`|ou)a(?W)K`#l zTWidybXc6jePmkn!x3?b+92%i7leZYItq>m(8(NaBX`G?2FmWpi^l66F$<;rU}``? zX$<^Rss6SxQoLN3JeNX{L$!9*!$4BNHn6~V(qVDq8INH~uqRY~fC~HmkPoTCVNWBk4a#?7= z;D(Fo^;xwa=^6HEIwXbo>wNW+PQlHB@nkzBfz;@UBYXeKB~I!inFFH6*IQnUi4f0d zF$3t)2^jI?tq~U=ZJ*&qyMtS}g9tvgwzydQYZ)#f2AzZLNOzfnU2;2TnyG4{4k8Av z2el>9Fp|@3Xw{l9##XsiP>sztLu-eN#eZp zoEuuI!o+=Y<)Gz@Vhc8)(k++-I&WyH%UPP>?}qw05-}dIZM0>F*Mr) zJ(~`%3wN;H`-XWP8t(4dI`lJ`1#@MTi3y_a($}yIKIg|*8i9XkMN8%zZZ_@iiuITP zU~NC-VHN+Cn|DIP$T9-7LJl`o(;m83*~Jaw7!yU8!lfqqb-uoZFAYfllNcyfj`y)( zq?IzHGAExH2lvs4-x&DP^W$Y{wz$|f^Gn<{0yRSg!;+QD2mM}gHLI4mylx>#F~ttM z4|+&6%DCAL`q1f;onEPaczq?=St{?h9cD`~F*D&D-NFg@@Pc8VLZQ&#uvU(ku?L`& ze9(OHO5Tg;-yI!ThETFcxMWS|bD7nv`ZHs!NVF=Ed}KLeBOMuY4@Htd9j+H&ngQ5G zYsmH>e{Wmt&mRU7jsuGa^@MzfSfvvTZWj#4p3MoVA%zuMrK)`NwS^>C%>7*W+Q+$` zCU<+&BA2B+|6vJZmXP`)pBqAZFFtEmx);;MZD*m7pp`0 zwX83x*iC6c&zpYBmc*d8SiOSzr-$lZ3Sa-KQQqBabt=V${XN_uI)71!q}Ud_^3y=V zlM40YJAlardrv3GeHyC`q50kr!~ax2yRSw-f`0}TC7Mq@aoGLQGe%jP300h)rd7Nc zXEG?j&X+rXdTLZs*2yb4*d8Acf_eYnu$nZX{h4nQ(&{EPf)>dpjPxCY?j1GI7PL1| zzGXF2yR2Z(7<%sQLN)TgW^A z;f&W1Ldn6Bg!g8f*6(^qY+6qz(dXD~@zBfhhZFuEILyetut%Q|qjd2;F2= z3OZ#W7xN)N#J0qtx-wYYeA?QWgd*jan$rq>u|HmrLlQMjMexKFugw=LSnei={hTuJ zqmr}W3oo#=0jx!^jIw&;V{^Hh%8G73Lh>EBJ6!2$TZ@?O4kNxFi|$+>^UQtI?(X$p z=vX#T+C))6c%T_aPgJL?5K1bA)Dps;ht3j=#zPKH0qX~eZ9q`c5~nrR_uhOl>f`P3 zVyBgkFTTK3RD6Sq8SI`LgNh~KrD}f^j!JJ+$RgG1z$9o zlJgFzrtY`oC-Afei|72PYnUmNuSKd#1kOf9C0uh^YE@5aRa~AwN#zS!#az?A+dL&u zbTmZeCBxQYVo|BK^jJO(QO~s7)d-N3N~H_h+ir(Q63O2MBw0~?Bf@U^?pHQS`I?OD zVBf!w6i_|&&@uuolrqy1yq=}G`7Yff4vaQ_=~dimXy`PUW&Q~wW-T=^Rn^ArLA0Sca#0KB<8~I-q&F(wBUyHO>Zk-Wnq0~Q@@tRLq)d1 z^pNh+n%R2WtBL;6JKVYYZC<*QPH7&1Gc5Ckygz9OgZl+`XANdL0gViGb7U$y0$tZ- zyj!y`geAkXkKGg;C)25QD8qX;hm*HBO~vs?-jr9diMVT}hs2VQn!(AMFb@kjU{6|d zomTCZx+Q6Sn5|Xq7~{wl_o5^v6g#F_wP)d~jM8u#cFb79F{dTTsYs$hbqIKv$mF9& zeh!nu(lia(0E}co+Trdqzi{mM>_~kOiK-yow*a-{T5b|@auxJM`ffvHcmOF%+k5WV zKbVUPoN^ES4O8xZf?8?(E?dc&l`iaLhf z)t3~ZL-hhGr}9=$3{_y8=EjdcUwuNltTfnDssxTqfTg2$WBfq205Iz_5a|Hgp&~uH zXKd*UC#964uCR+XSJVt^t~&bt9G`#cS1>;3=dv9d)+=?H9(D6kab>J6GnF)+3kAbr zw+p_=7kJ0FXdGs8DLt#V-<{ykywI--7CUVm=`n@4psZSzBi&2?d}I!*gV8%zIzOo) zq~jR_LQ?j7wI^ddED)k3uW(~wq{SEp14#ffzVm2U2(bG|oi5cBiKwVgvXdPj@{jq` z81+)zykG5GGP!f98^6qg^0pZn81TFI=*sh4S`)7*d(4v=tNe@(a~ zq;}uLzH?L>_!N`VZGQ~gFtt@d>E^^as%Q6(kRm(8d3)GX6!K|8%7XNv`-*LKFBvW+ zJ(ca3ecToCDYBGPMCK$n+9%Td6~xlu9oqa#VjoQ0f83>W zdZ?|=_4ql$(Z`N;`K5U~-0>qXOjR#FYwRCDCpC{aE&7`{k@gWY7u7sfZ|C(537QL=5Zikf_qc#SYXMBSg!gucb|h0c-tfbYt# zUAON|KLP+%GfN^~QcXPlg6H0jbLq>yoNgahMxF}EKTNpe<1kbjCR!(#n?>uu%hbN- z+B0dQJrGuy~TNvu+O)nAd&EOpHk7U=3H}tUgo<9%Ok!q z)@sw9YvY+z+op)7=-e{O8qFs=Yi^8PZfgQ|B!qoJ&e?a3z-hN!qZdr9gzRpDg_~q@ zcsG^SP(}CgE!?=ojiZ`KMplT|S=(=|>l04z6q$qyx_u2Zde0Zmn z+s&~6oi@pLbFBAH!nYxV=FrAUW;RSh^QJ4*i`HDSX>~p& zP9y3mBE+?(JtBUJaGyXK#cb->2rB(iyJFqpzqE93mUrtG{%puV^t_49!F6)vD8IZ` zxEKz4ZIg9i$d)I5CG9(jWq77xyfwu=vyr#cZ*5h7A_sku8}Sk@0>w=X26WAx5%XYt zC#jbD&DFJ=5(jd_iqbu9jx=foy9cP@gd^y$#fFZ9UJj9>s{(6#HwE;Cf|{y=N!@2; zn%hq33n0FBd;E8^ zX;!f$MIJ^Fq(Nuib%*R$xF#+a8Yz81Bc#`uS+zrt(x(mGi^ZDB^*eGc{F`5zN*quG zA=g_p)$FRUM+Uo$CqL_+zFlZejox@Ku7b~RJO46dx@N5?xvWZj>VMGdLt=-zWqQix zGVKxwLXr$&T?((CzgFaUEw@2^KXNUxy>qIA!!s1B`}-F5ctOPo`jt?L_Hbfjn_9bO z`wXG5G;f?szU0Wx2SreawN@d-d4h)OI~Y?IeM_JF`|QJb5x3mq>*AC>l_vZL$RbKl zKE+&F8OTt=tTfiFF}L)-*Py31DW%%w3Jo)StMFr1;T3*;j%4L6e9&~u-RW?SwS?ff|ZG=72+|V;;LD72lG&c?3==Wj8X1*?r)Hj<@{ZpJj zsfW>fP=vVRTT0F5=NO;xp}6MjFVqfr^9msdJHMerJ*`FzEJfgOhm(A@=zvFh5 z>}yJqHQMHI?BS(r1sgCYg@E zHkFCJt|uO7Pjj(a5an04^RcWswN`%^hArWLc7f1?*(x~Eg$xn!A*ra3OCqqzp9s!% z`aGDBxNocWH=4TA4Sj_Rv)g{CuE_pu+Uvl5dHPn`ru!0)WIRwAp~bw= zn3EE}7>+eJSXhqN4wVPQ2g1e(l^5;ob_~87ms+WX#-isA3eJl~7iswRZCf>PhsUN*F z=6;{Fo1N6@7)?7@pN^S#zGCLAeYV-#?#pr7&&K@m!lNGAH_&%4A|N=g7;RSplc3Sa z9bN;ds}PO*@Zx2~PZ8__6H2y$U$hcerSyN|`F!3^tj3$&UVSoS2L+6KWW2bNgU-Hf zfk31Q91wKXm8#W)Nk?m_NC+yg#koX~xqlLD;lndqv8HrvR-;}zbiAkP?Z2?OyE_FDF|(x+ zov2~D?}Z2HC6TLa#bi7`{iRiDcu$O+$_e|zNkOQ={hPu2`I;a}hu!FMDB@?!xo`;*%iT`Ka72ic66P zH)YB`%EzLTkV!+^XGYLo>Ltc^wPXi3*_ei5hRcF!-y6xuso?f9$O#~|s*Qe8;8)0h2 zOT29TsI}5hbQ*d+Bj3@CBPB4|NXm55w2O&0OV#v@kB_#L;< z^eW6Uw3}OUz4rOKCFd-f>w`_^BK2;ATMGS;Zo8m5b+xE_ZE3c2w_?=aB6wN%i2()W zT0xtWRrAnRmQZlzZtnC^%WPym#Yxk`C4&4^vu|Wh8pFBh#E9nSc9VIV4<>_gb3Gvy z7^zK4_N6O5Yga;h(n%VWIIPU$ZuZ`ya~kX;&8o}FV)^tb?1xxhDqXDG;?8a2Y5+eY z_r0=Pfr1$bjMR@;w!yyir8@fk%d2)%_G*R-WDK&uqYv$UleE1sSvERz#g%pws8Nf<7!+R$ zghf`U^YC5qW$&^Le5XlzPF_s0d@>$gm>4$gNboX?zUg%fQ2gjtr5qPjnuBM3vr@iY zc3fre>CEBBBsr@Y1(OU$?lQAWrl(|TY*->HA5o^h7D}LMx}IJyQot|cqbByHe9W!V z;rr8o$}TN@(t#r9H`${SG(%~SHq$hGrFr*+>tuS^E1dE&e0)IPAt+G&VAwR9z*o;mc<}q3 zXLN|VGCFx9;nU#Mdisrs0o4M2Cw=X1g=yuzecbM`cEWs6MI!g2NT?*;?-kZSV(l7} zsm)YAk*g))5LT!!v1T;BHcXX__Z4wXG+B#lnL_8Q`=|xr7$Umq%OnjS0Y>SXza@ytZ!yac~F zw6;}^_!f9STi_GMv*W72(^Nrs>_=EgTu>1kQvR!i<@*Tz`=?eXAHRZ?y#*_7N%@ya zeN_5$5G2P)NeGl=;3w9OSD16Zz-EN>;cIB{wege(bg6M9>84a{q}};lXYUDna28(J z^7PGz;g1#dtM9GtOe0skS7?lM)RbWXa}SHYgxpL}`ne>`(l5hOaGnFhipwJT28X%w zyu`NTGM|V2>3!!0el16xoOX{<^`6$A?@QTz@WWR_sz*PWc}lXE6l;)|>qnvA&1j{2 z-=bH$E7RkuW$KhW5C4@b8oO}^>&YeakM@uZk-&)%r1yM*b0vX;t58{(m~$T%0&P#U)zmx^s^D#hli?tF!T< zW7|uZ@S>Iowg4DKZF=|Nw2#a$^l#3ZBpV#<(Y=tsCL5v_J_mP0B@T<8d_Zp*SI?qZ zbOL+VdhqsydX8E#xrW9$UX`07)Y*o^OsMC>p1L;R94FKZXu~}hXZ+&nG;EVSg`|^C zycRG~RZKcYP@%287_Ta&#gn$rC^dQAH(7gY!pvNtNa9yBo+I0 zJ_^eeKkS>PdtM?~0~1~&bGcUxPdrW#Lbc;QtX&Q06($JjuRS(dQ%N$f8Sx_IRgYlM z>{XUZaz!!mt2dK~9eJZoBF>W0&`*ekbJ%sCHB2fXV6uax28k`>-xy(Jw0)^jRo1UY$Iq1jNPd$zj{!;u7Ke_B>F=_bzg z;@0DAFHHQ=MNRjUxpW=>;=RvDAR`K{t9}f**HLlkl)}l$dOd9=%4D_i3m(rqo^JEq zcHyv8o3Q1#R>88fT&F_Tcxwcv9Wlf^7?8^F%$R3IYPE&%?Y0j5f?RRCr3e|*Wd5<) zJiF-U!Om*qY*I3?@Zw%PW_^uTh#KZbI&zW|5n2UcHB>>KrL#bt=Zz_ewVSx>$R!?& zy&m?Alpd~6dFDO$y*gNBKCjxrDI+=R-WTC87;_8VujGzYBzpch>zic1c;{_=d5Ckj zwBDf3KyI*4;0`r#9Huts^w^SRL-(EwepBrkSxOs0>8>BypKx}~B{Sqkd&As$-3-q{ z+ii7V_c7!p*Dq&3cGR_-Jrue9O8?iZv2YGB5S@knD$%phx6 z*P+0s&106$j(rJ5%DL9fjOOs$O!JY7z%&vcOy+p+#dF>Fl{hkxw9KTjB>X3#urJPk zKm5kvp9ktO`8MC{*OF$xzF$ivW1LD=)T3Qnu5lo>_j~h?7m=|4T66_%I@6#!F!}OR zx^I{^dr7nE?84PzFa^WzHo>)Ct6iIvZo)?GUMUx~m!B%TFa;@WA!dqO6d=pzkF*JA zH^4$?fA}0So6eG6;W|W9BstmO?KcwQ#|uEMBcn_kmHBm3S?bSf{Zgt2iGC0?^P1z$ z*gtzMJ_|-%s;9Y(1*5#Xi-0Onc}}dmXuH}Nczy9lc(T6^OjFd7FIr;DlSkIdikqn0 z&Yj@&SMPgH6`FIm@=}&o9V7LluK;bo@rg}WkVZHt1sLkQLawi77%D9dcd`hZ!&-I~ zx`)>JiQyIH7T>g8RjDm04N+Kmwrqxs4k}zYO5oJhM`odvO%CD5N82pe36M^v59m`6 zXDSECK+J^lv+$l+8HXuUajW3g`{^*j1sYmNB7VWI(D~IgwULa|=f<;qMdzF5l?WKe zzMoxRY)6#FtlB3G(Wro3`F>D~!i$c=8~foVHiiv%`N_^#b#A!^995iM#B zBuO+5OC0Q6^clOp<>G zZUITAWbYeIvmtD4a%*m7aSC<1LL!Mp8@ip=nmQXp*D>2Ny8&3qfc4X^RTJlen`SLwrAYG7o&=OcfjYjGvL>!lZ-pH78`86yuGtRK zdkK-x(rod?W~JXvCkkh{MIGr#n$cykX*3SHq^I8-Tky^6DlUzUGQW3_;NN4Rleu-1;ZEYZ;ChGKni zLqCZ=I=@uETN>8Ogjz zU%>09A&7UZy+CXqU5gA_DZ2v4#7Zp#UhyzHtJqQ?lDS6(;|#zw%)8`Y4zCE8vBGp4 z1*phjD*P&dlRoC@fzMBNXkl|&%177TyHltU?wr{2)oBTb79FA1VZXgOXEWQioB!CiDzO|DODW7)I}}#Wx73*c`dZ=M2>H|%uI?6OZ>+Y! zQf2>t8IT@3KXL#H1OjVrQ;w2vi-GX39r$pmjK%3Kf)nd!i$r&aHotR8&4l!@3A(|~ zGq=wwderet$M}rw_~RO*~g~#BH3?gGKfkJZzD^7Y6o9nZR%2P80HW|i_oC_s1PM7O|6E- zM*SSEE{XL>W60&78-I431zIj?-r7Q4z3Yxg5FC#V=YNFzHKy*y@qii8c}i+(fShSl z;0HZOjQ|q}FxhW{6|5kg)o-t`9dRhw^vK7>cbttxPYx%NHp zHlCT$vljSWN(y_q9jMOBK8oL6R;6Nx;>kZjqOncsV-DZA9@|;xs%FcT2=s(ShdxL- z>Ry%3TlBnLVYB%8m`XopIQms8qh@&d5S1P&HRDi~X=`b6KH&NI&09{ZJCY(tsO}aW z7%JT@qMn^V)?Q-h6tEG0(&jQ4w0ad<0>f`M!d-E;SEr9r6sf${2$NjDD|`1AGS!Hl zZBP74CVQGI2KLlB1zc!0LM~@AH8=R9~D%jYLgOdz*>36fVA| z>ndXn`gcZY_=RCJlzza*Wp>yZ7u8G~J3nzYM45G7> zVje=eTi-o!hbEqHCY#YR0`rEMflXQg-UH@G&BxTDf-3_;B$sS)GeUn-r2cF?m`@jC zqOiW=L(^d~X;OBPCVrROhTNOx)s`5U3pq-1^S6>e-o{_|oqw{Hv@-apM8w_Oid0S4 z_C$@0*7NIjdSA*z8{kt+T-%<6)zmAL6bii(-Smc1*g$;i^i?kL`crfHLZ^B1-qfDC z&Ncm|*14Lfe1f$tBhH&{@AvFFe?HY9UAa`UjqK0bOb$>q525mekXyUHsL^7NV(o=} zV#W&+7NT^pPSo7M=+bs&pY|RQO}&B9?A}xOL6j(C0M0#G)uNV z*2nt6kSKh>b_f0?uYXpQOquqf%l<8~rv8n(8lwewkodFoZpqA(hbhba6#s$p!HgYe za(0+3%3Z(e?Ye5uTu~EMS)TL_Gxv2Wm|v_l(7Jsto_Nc8=2UPeGc^_&NSJvXMtECl zaEdbw{LOCwQD891r96zzHltp=bslOS7rp~BogtRuU8)p8&C(V=8*{hlVEw1bt=_CS zqgDdhH_oXS&mtld!z70BN9ANW(S@4px_h#)ibvkqBaLpCV0>{D42+N(8CstM7{nXc zS$nODGh_)Vs68+DSZIdV$GPY%M7}?`Rt#u=@6sm%hl_ap$tpe0So&9@*=iVyX=q=c zXN*$npN{p##v11@&R}aVu>E6o0ZCR7{!(jw)-p4DAvFs@dT%h~VurU$2X@z@tMG5$ z+0A%D2AJ)0*+hs?lRM&&Lu;fp(Y%t&2>GV@1ijHt+*pVTC0)4UF3(E>Ep!|p{>HuJoc0>kkgy%U!Lp1#Y}&|aDV2^K2|6yNZh4`XyIyIkFG%tybt~s+{VGm0 zm9j*gzdfc{8Wj~nd^Kr4^ z+Xg(LucZ&Te z+~1tA7p5#^50?M4@W=3SE|zK^u^1_J1vTmu!CGYS&GbY&&4T3rLk-3BiHTt~8C}ym zT&g{O#W1+pvd2bh(gMgv0Kb-BAZ=woeIwdWVVfK&a#yfYPOJNrgbNnD|3;zHg+$wN z;S*IgmJum5i&3dwg@xf!Y>2Z`XF<$@3EiU+_tpXNlvuQjl3ZcT2~)aB3oZeKH$vC& zmc_cL7Yg~iS(@ArN7C999rvybN{zagHxu4Tf>mQGWeoK zioDsf-TJpPoW)y|9!h(z84G)mp^2X*z290|qwS&UVCGnD;0^WbfhTumYtwIN=&uVP zjS%%Cg7m-MbFDp*dQ4)X^YxXZZaB=!uZ45ESj*qd^Z? z_Ys?P_QO{Zc*h6sZl5`b*4KDm@cCU;_>UPGG#!oLt)SQoQqrc>@7dgP_&?^ zg)J4-htDN#UY~;6kX9|;H&lUqsG-~#lpmnG_8r_EBxo!}RH-Ufv+PU!?zEU;GBn43 zTkNlGnq@2T#LI}(mv$OyCr3)fh9|&c3iHhMadH$(YV;284oW~v)z7F$AE)g%tV0`% zHSFO#4aU`iOd>7-lFhFX#LEYk7+p|zlVJ)@w-3n=1)s_ZBL-HHhT^rujfBqr<@%9z zEqtX{%+CQwR0$)}t4SpFf(J335)TC4s{VG!JTR<2d5BQIJ~FERz=m!mAJp19X#JWI zOnT;>EP;6j;RpRz())^Ql84MFO1&IxSH51@`;VY8yv&&frPocZ>-~`7&~Et}%gheJLvT#;$5*I;8OO_&*vj!^b0+{)h3I(fw?v;`>gx zerSn+ffSnKoKBsG9$jsQ7dyuebx=xkMAO5%O!z#9P4N0r*b^I|+&Y^$#(VQ-gXzZF zcwHVh+Vin5JuY0FYyKQ4@AILfZG=jH3ohtY;g#_~=tV8qvOoEwFWG@~Ta(_?r1Z%J zCDHqS;+Al4g(iKWNvZS&ZlI9m_4KYqzTVSU==++LzS;$UU_evJTNj7F)~$v^Q0bW#yY-%Y{x-K1ct4FQMWXn;nGhjxWXdk+B0J>xhUkn} z*o+n-f&_e4Kmi>@nU&shY!mJs*#`R8VYKdLw)K;id2ei2fvVD}{Ft}Ks1{Qg+O%%I zq}Uoo$)PQmac7{age3ci~qoO>NwaC4!qWe`lxU&-Luy#Ibo-2XQ0 z(TrJ*8Op#1JjlKq(VRfz;x|^UTX4R_Xk5o>NgSEjk#}d|A3!-OcOajPa0su~NCOqR ze9{`OCVii^V9@=YWe>vs&7;aTw`$NDiPKxo3}Rl3<0T4EQjP0@BV@v3~|e*FF!pID`6iIG+4ac{GOA9T%NdyZ zF}d^mCM9UTNhnRz6Rs&U48Kq!-1L%0IQ?x)En3xSRW`|8y#zfTk(azF^A3F8#@_?J z4g>)l=>bN30v3g+26*NcS%dnzpe;*~#=U-umY%Dd3e$Ea`Fw_X%9zI2mVney;ASGZ zXbJuahOgQ9jwHv!qpT0C-dT7;2%6EP+`JbXw*0asE4yBq;fdVu10|!8lF=l${uK}N z^%(P(uDdnyoy-`r@vxvNKjyJXlE7I#vUE^0=CP_0&+noBgr0@9y$||fWR<3mUNXr0 zGXQ_v`6emEa(pSgRG7BCfa#bdb9t`0Z&Sl15gnsw7;@(lpk*Yb?X`X`$F!iKzvmF2 ztIoih!;Jk~jNF8Lee88RuRpW1EE=WcyKZ?CFo(B=1)Ox&*KXa#dg6?xz95;$=%Vq% zw^d4dLX?vyf4Kf>(#7?X^X#`nC#sal-?%I7kAA+T#Wk(jS}-tj>G_tUc{%R)K5jGl z^N-xtPfnw2DJ!vBQ(dT%Xnf>6bv2b{?xliKs@Fj&=@q$6kta>b3q3-7jItg_+X-xt zUx{aZ58i9O!}3kp+>@x-rY|p0vnwA7?{Vjf4&`ZU-HFa>*oGG@G)s8$|JZx)peD07 zUYzfDcXh4ks-V(VMWWI~kzQ625h+oTP$G%+8e*YCz}{#I(wl(v5?X>l2sVfi>4ZQ6 zMCl|H69^C>a8E$pJNMqd?mxfz&D?hwX5jSa`8@TU_dSXxcl|B?BlOz@+_=3_Mi{g0 z65}yv5HRlD0JkTvYE4lkp-Tj|S{|8_T05WZKMsAg?GN+-}#~!5E~Jd;}fW(ax#1cAHdiv8zza@lhJG#LMfji|U8& zoTR5~#7CYdijzWFGDC`OCZyT|p}RJ(*Di`CIOLNc+_b5U&ULRX_-UM3@WjkE4%#Q> zj86Ma{&q)~*E6BMs@bx$vu>GM$EVhL8ATJWM;a@eWLSHS5Cpdh-2FH`Pe<1|U@-j8>><)Dj--7p zZKZ0zEo4iz{`YPqH<8r(NE)77jh&<(ciZ9gO=BU(>$ zSEO}N-=K|1rMPbJN(_G5KX4^rW~b1NG@~**_2%b_=OIaZ@y3qp)W7?{?#`Xrv_A0K zA)}l~4DP4VXsG$zwPOqM+6^+#@Z#O0X_hN>^DA+35!QsBL3pj0(B0oIG3=h3s`!t? zFE6RQ5*6r=lC%`HTZ1(MKG?gvyVu#V4{gH?9n-L?2yY9CsG$#DfHPLK7y3SiNdNb) z-h~C%4t}Ctv7`)zF69OzWlKefCp~AV5s{ zWG#QrabkebyF*$3D~RsaPJeo~hfzf&uIho|(WS>Gd5pzRZ4r-f%aHj+xCj>K_pLD+ zvQ~wa6uMhAH#!?9<6kA2;F5SA*Vp8~el9hz86<3ZVSu-BaDqPoS4F+(l)qP*OMxva zxM@(gca{n#ET+r^jjeqx*erD8G4cH?7{lQ?RPFej$+2~=-cWoCe5N`S27_rI6qOsO z!{g`w2n;h7L7gdVhQbN-)U}Fwif`X7(%Lxa;8rqu6&c1S|etXL3NNGL30?LyAlCD9a*tuObXX9e0o zNFlanhPXW8+wV;k29)H7)h`1f)wM_xr{ygs)4DY(6pA`6goWPWrL9Vno$5t1qD{8K zvri$!LF0Fx?Um0#b!0aBfE9t1x@LvC?PBnO#wXNc=2yn#irXu51OrbV!-O8!=p9Z+ zpPisz-e_vt&VLD-V)2U;I2_Iw9%Q{oPxC-`_Vnyr@V5R1*DDM6IF#RnO5DBDWcsnk zReG<5+HbV<8P}~X!eZ-s2DyNBYmI|uK%%TFC?zU&F1Ki@b-jZlOOZZ+??MU(`3BXW zrOmW;^42`Y)`1gti!#+w+6Jx7(d)l%^0$23_v=&W~+CoCm zr~gOB+nAKra<>Is9|Zsilw0kAJoY)Y+CtNHX8Q!L9udGZTYw$yvy2;;3eczO zA<27}WH!Lx<^^=d^?<=o&v;<%V)D}npsU`hs8<}Zozih*9|}dP2d^wf_AU|W0@A1c z@A}|wt*5K&L~MP1{kHkHu91;FL(fJ=M&7UOcJko6V{3h^M&wKbyVEn!X8@%b?a9(K zPrzMmr%0(%5`B_g4Q}O~4OCH8U3-QV0dq823pZVhQPAk!dsud0UBXJFT%tY?o;BHY zyp})+;tdWC);1Mvo!bv*aLyQ-%j*{Ifda(MY>n2ZKLcxE;7D|Ngg}L9FLdRZK{@6? z#IgSe$Sl9-a5&~hMn*}Aa-72F#G;C~Z~fleQOYwKx+^PWl1&$9JDp*=QwwNRrl^{4tDJlR&fGsI#=TuEwD_Iqp^`@xk$4 zf624l*Iru#b$ii>mU-(b)q&6ezB+w8_jG6MbCg+nYAk^mQ?x*OUR@1AJHi z;(s#@cOQKH+f++?<@?8^-@$#PXD7pZ7C)0zu_3ch2BS?R(JS1|8Qxp&gLB${&+9FE z{cb0+xi7OZ`pS=)`5I6DEhzhQaF9fs(R%C8bypF{xV%|{rOkS)r~JQkB<}4uS&_r7 zSZKiUZtSO!OuQM=dtWLzw6ghP;y!e!iOQpkWrLW;OYKX-#y~UN6q1vd?{{Or77+9q zfN9`5NsYn5@|)kkV3Ymv)6~659{Kun^bSy6?M7@|oFdZNnpQz7&?>N-Ad5(?9q7+@ z)<@+KWm5JE23qb5LJ$u(HyHr>9r`8EH}^k8%RfrGyX?^MpxN*cxkf+QI5l~{b=|XP z5Fw$R5z2HwGlvY`v(J=y-I10ebj6S>}@BbQikBjVc(E%}AvS4v#^ zeM4}E@_gD61E{ukGkH02j|ul8hZC@_uE9*_;Fj{mre%ZWrHwL?o1?@`L$K@i3=}P8 z`SYq9q&vMFMkEX(QUaoW7F5^HWpkpWWuX@UY@-NYY6U(Lc-qjmBaD~sh+8@_Fw<&4|EFCaJ z!~#U0C>z8^t$e|)>q;=lc+QriCUW|aWV!q;d6_wB-`3S2Kwj|D#C4Cd;}3%a#`Fay zRq(HB^|zjXNhW!0O-~97{59fj`P|AUPs?>&;Uj0M(7iYhGiTFud>D?jpV*{ zX9@Jf7lE}PQXT5`HmG_IkRjj~O`_tk0*|JL`$1Vv~M6>Pc* zI_dy)e>v=UV4cmYCmLI?vwp2P@p8wft6m=(GZJ5D04DyLY))EBJz(>Aj_ez(JW+)!_mmaudg2`t&qwV`vjK);e%;3gDyfp^VXxHK zBn&jS+bzb+%$(F|;2{Z~yFL@l2H|Xf-aq#DT~*4$RX2hQpqFf-&?_!caUr`>9P$ld zIvPOyzPoKS`saG})m6bDPfbsqIo#M}Cs3=kCpHRC$~KZ&orD#KJGYNZ)^DCxftYiKX11oVwEHdQ(YCs3Sw077}uQATzI7{%Xr~XkF1x8 zPkiYx(m3qG)B05*sqWiq&QU8~IT)g{=l4!yhk9^rN^qowASwh;wghiMYGp}U5nZ}S z8votwNMRqgmEpH`y7uQJP`2C$4B!&OllB-Dy^N{MGMEW@{HwXmt%{X-X<5&3Qw4oM z8Duq>kUZkYwb=3al4>@#gFvWNFYOWmvme}7AjTM{{IGwnhD3J1D`KEG+48voTX^CU zdsgu}?=v;Pdt+`lXhA;H%Ta||yVGtY?v!1i8sgavM|ixPe=B?lA5(zNa#WL|jpW%+ z>q`Xz#J{CMFvLrT`kI4#jM{-yac5R`#2s5by%PODtu2disNctBoR>zU4!}SIkdyK=uq!vUuoP9q56Q8w3+C*Bw$Mk2% zO)mTY!0e6K;KLUDYYL~{EAO$YN>BUxZ-M83i<9mdK;jRkucvW-brdryW&ki5Jvw~V zs4uS2gYc=~hjr{sz0=RbUM%Be1Ajmw;dCDsfQug4$lQsIjrC*??yIDF78kC3t0U2L=^-#J8!SFOhkGX z6ZuElw`4mJ=0X@fLFE3rO5SFv&`NM!j36@F^=bY?&XJvwQ^uPbNE|a)s5uWTw7v`thELkbCtNHSE#Etf?#k5 z@O6}%Lxq(gan^&;h6u#Wx}e_h{okXeGuf;0WhNkS`loMQdpPa}A|h~|Ulza8{r01o zyrLqKSW!{o8foDVtM7=D*IDg+`vW??GVq2^dxW~g1yayVMxsm=>JK-PbuV(lrMUS5 z)p3(8$5VazA-ooIfBgOE`N)y}jAuunrrV1Y?VGxl*uM)Q%U+1;CX9|8Y2K23QR_vq z=gMmf0Wa=C8ag^Uj_{fzXst;$0>r*K{sz@%kMx9XE||60^#Ox6r&4Q{(}{qDFjc25vLq` zi8DA``Yd}_BvdV>_I<%diO^IB!S8I8Xpa4QkQR;vwnbOBxnM)*3Ei4#9#b^oaHdKP zvjZ#>mOF!vuz%Xm8VB#8YH3AX(Il6xz(gT)tV#!eD7U*l7Q@b|X~Xr)pj(h>oALYB zlz`>_Y}q#}h!$oCi`qf24)sq&VNJ5N2RA0vrqE25GAbWDeH!HGuB;TrSaDBml>Afk zh*I8aQqCbRo;Q;(3-^_*TJ53+p4lkDoJ}EQW7zb2gP*h6b%XJci3bd>O zG2JMKdciUedGHtzEB|Pav|fK`M^%$o2c%^gU?KSiQTu$eR7KZ5{GxzC@M4#)5v*n4 zuO#3@MD45F(7ZnyPesKHK8Y?|?Cd$;DP6{C_sa4M|J89b2-1C`VrIfkl_^JLyG3BF zLD4^FG`OL%%LjGOLlUxw-an$;vG}=`*Zt>Ut8`^qh4V5A#JyJRcx__$FMf$c#I{~4 z=L{qmW+xn*CJr`ml77-|mv8f#g&_Z^6n^ibbY~nuXk^QnGjjANMtlrma_|*u&v`TL zD1u+@uX!Hrt(v(6?16yE(*FLZ8e4;te$JD26a>lk(Z+%ZerUpt%}0Q9LxRU8Zg>P| zh**gO-5rVe<#F}zldboa@#je$0k-hiYMSh9_{=Yts|I*AyV4x;^od#i zjRX0E_H|-`S27THnzfPBlpn=!Wj*EU)SE+V0A&Ea7Zk+h(?)(4`T)(O()^s{Bp7d> zs7M)y@oO&qADC4IAb7v&6qR?tiY>K{f?xFM`@l>4+SVKYZ2%>dq*;Qq$5*FYMVQqNNQH15!YapTzhF3O1yEw%er|@-ZaX8iWJZ9#MIchKOX-*}*^lC9Q)q zTA(xq>LH4-7!;L;iTNoWPBvB6T98Jv#ZfDEi?rgZj7odgQzQ}i#Cw0bS6`YX)B~6k z+x%~tM8(trzdb=&aaHA1Y1d!%y~>(_pOQ8f{?68Wn36+u(~$*9fbb-sq2)uN^^jKq zLoXi@77fwshoixUSM$ma=QQ=SeQOHMP4uY3#oEumcfbZMB8SJ)m_Hc)?rhw^wc!4s z;CaVJH}+}ZaK{bnk2Sv|8L!KN=6rUobGq>cYO`gnFK^IWw5jX?7Ma=J6)`7Iz1Pk&yxGApe(5baP8rO%2=0ndi=3j)%$6RT)o z_D8lAjKDhxYR;`|N*cBmBgb?cP(hgqrFI-4dy%Qk@UsQV6hv+y{tI&Q z$#8+Q4c%v_9dKVJ*?&;Qm&bLv<^q=oWRG7PqIE)C%c|K-Wm(n3d-UNEK(IO_XN+K> zX$h^ZM7i3$6%FLk^~yp!%Sd&-*9Kyo>g}5iGmC&fTNmdvf||8r&y1qgmW`1=6y(ka zb3m)*C;349*+{!+13iF2sMQKA5!I)a7Gojq&&|UMHdO@A*EThuNpeR_xo*5e{jy#3 zMgEl)R8(9JkjY1n2yaI}x0^v1Vt>$Zzs*aumM-x7Ov^dj%A*Za*zMA?0|~<;1;y9p zQ-_*2s(n4V5tsWX?T% z(lxixH`Qks8?afuRYwMXq;*fKR+dyNr8$jgMiEwOdOlr+OZ&5fL!~h7+!_8Q^wy1@ zp7gKBQKKX7orNowch2RV76`{a-P3ge^B@tuQR!XZ^{6;1NL{17zAW1SXGO;hp8DCrlYT)yRyi%rUq3OWR#7Lf>n|%_ZoR~;f9Y3~4F-XJK(=5ld3Xd1 zaz*tChFK98%gQcVG^MHCp3Fp!{HXS|1SGTT6dIe70QLBS2?Od)C@Ti9HWe2r@x5s$RS5 zEtUQG%~gY-D+_@gnE$C?(={v8HQVAP=pFX6EI$Y5na+@k&Jg_UujWT(>p=#Jpwk=* zJr9YY4Mn@ch~J(kHK7;&MVYj0EKtT!2f)=R!gVO1?ZEn-Y9Ijxz!9)^2Uu;CA#7FO z<7%FK;mYP{0%5gjvd`@2^2B`vJTxh{JK7i;`AH_m`iShRR%278bU{uX^@lkV8XXm& z0jQkt@i$j39O`R96vq0&v@gwqAi7MjGbyP$#oisLRSGsi6BMUGFy#<_&`t z&bAMEl=8JxjnC5z%LmT^kja;E?B^G0ASFg@|1pqXvdkSh$*xb~9b_^&PEkQ&pn#D7 zPoxspx3o|uH{Wso^QX>#6suQjkqN`~k=BF|r*nBn1keZWW+{+_nID`rh9eL}H&<6z zvuKS}^U^s-LDVG&)0TBJ=J%g)Z$0zP>qA-^?Ao@r6U{9WhMaJu5oZu>zsCsm66A!G zWkXi-SuMJ~KW6n5zP@9ckqvfCvsV>ji)2#H^HAKKHL|m(87~CBTG^nmee@+15M$-W zP;e5YlkpQ{bDh%7g0L?&*^Y;;=$UiqieIWR$D4BZrarX#9O~XdSeydLvj7S{sqqpI z{X<9Gy(J=5cVIyYYT8~Kqx?QIt^SUa z)zq0Etn^^OAb$7Phw1nHu}vDNjlht>=BUxjx2w%kG_By72T8)1!9DGG!9M7ZAHPA6 zE10h=GX4I$J#z-uTm4aoJ;zb)lS*;eS~?ffU&kBeGWz9oSJ*C?e_Q=Me*vTlR`F_I z5tr6e1z?s|64M}t7Ca@QE>TW-BXy+SGV@Ratpn?DDl*d+qyz-d_w!bOEtJ8tP}9YQ zttz2QT0P0{N(pe~1H+Ba(z%Y6O`EK{ae^Zp;1TWpUxRps|0#%{bg;_870MUxjJ~{4 z{r~d!&0RKuQ#dkMRHS9{eBm)g-x)A$Ht7Kn3k#mz`JTn=o0wzjD12a>%d!U?>JrGUo}WB$5E^c< zUu;`=r!0p3s)u*ho)rquQ-qmfLtAEBgS#qG_6^_~b;5~)fc%-z9G6AOa6wi!4-0EC>pfJ1>ck1-Fdc3~9D=R?*Yh}!> z??{=!N!F4w<{!nlPm^2j@bAt#uu7eHDOA}eVbmwPNu^zTB961j!|@fQyj2fpv3rn* z60bCRCqAVMKP%dtv(r;zMTGQfUi4E@Q~B5f#dkaRguiSs7}{(4BDTBH4Dw+73HhJp zkL2)bHMOT+K|D26g?Cd|M4_ii9%@?x%imnL z)bkk=zO11;G3Zw&{K~n#O4!5Sz0SU?xX772(`+3{`|gmF?g+lQJ9{rx)&64LlI8N! zi-p%TGi#I^A;w~#%eRragJKo(ZctlpzHnhadg42crEOZVGlpV$tVjc%6c{R z0Frz36@6;~c42EudA@LIs`gXLvlKD!miPlma;Lw28_$4WqIN}!x=TjGU#THJ*gb)R z;*A4VgIAttS6L-o?z9wK<<6I5MY&tMawTHW5k(&+3)tr1Bbqa3%*80?4}$(ZY#kk#~Qa3=#JM~v0ODbEANn}`+D{k<8N&rqT>4T#@L#( zQoAS-Sm#l_hgfH)z9d?cRgKxQLF*HNe9rhRWlVKg=Ar_{`PCImsIi8G*@BTB#O$lO zk7N6vEAe60ywv29l@`DSon4>IsQB;$jFXQkA2yM(M2Vrs=UD~Z0M3>yA{;3ry2dQ1|9U4e zroY2oxyxNllY1yu_u;&wM;*nAZZlR`?3lv$EIUOHMt27+;UW92RpvrmYP@04D8#3<&eiW@nTR-;&*+Nir`SA3 ztm^nmX0;x<+f|&_pzxF{@1n4cl&|eM@te;LZlxE>b!5|&l)O9L6W4w{+vgf7`oR>A zjU#Ta&UUjO*<6RL#7V%h4Y}xKTCRM^!F>&K-EqZ^-s!C{;+_B2H;wo7wzIsr?X={C z_-koQe`cEg+CnAn6i;dy=bi&G;o)W~=ahB1-Hu zF~CE%AXG)ZVCJJ!fZ`QKg?8#BE{2+m?`N8ajJS(A;|`Fe&S98hNPwM&Sbg0t;R)Yp z{E_bN%huGkTl>va=IYSNb`>UDp%+|}=uMWvb9y;TSoRLg)r6us#miE18oImkBI&)l zXYbeqx(1QNMKKjEN~pXb`r_kY3h8r4blN@c6&u`4K|jd z2&sHDEPH_-fbg8V)uBISRa47oD!UCG{$$3wWlOeRJGm=2L{Fe&#{c%zd=Z0vUZ0QY^rmczX68-hm;`o{kl|PP9^X%F{$`T@PhtTwM7|Qo{-1JEv|o z1y9ppkQ?UUn9G3&(SbVS)@6;%na{W^rb~Zna)!#j)a0w0PBIM7D*>{Yp3ot&hg0GK zVUIWgo{_aPR0$qsmFrO7QKQ0knDS&To%GSFxT3CDcZ52TpSdJb%lN&cS}uc>%fa$Du}$}N<;E8%79AnKjr=j#O|ou~R1h)b zhDk4cr0^P|%C8usK!Yc5eK$Go`(Od}UA>ts92}lMwe;eZIGt!qGbXKsafB>kKT}8I1mwmzNo54M`0wDt3)houV9VB3z&YlA1^qT^>sEs zH9fgl_I@n?pP}?%f8cx9ab1)a0hh?rfJ+NUt3!gU=Bkg+;RZHmnQv&HqHWkmOFlkZ zM&viuBA4+{ldT1<2%r44Sk`^hwB(2jhp4Qio?&U6n9tecW%hBjFTYTgF-A$>9K zz_GmzB9Dx?S3wNgd%Pr$e0%$SIE?5W*?ZyZmQ2z6AEM1(VIOD_##wSm#nrQr7aygQ z_j~;pxH)7hRXQmoC7!n}JaTzlb@byuq~!3{FOO;(jCdl^YsIjT=&k;Cu2X3V(dA8x zWxw&M_rH&d1pZdBg0it(+%S&&O00 zoi1@S6Aiat>VLxx=$EfmrQ)Frx3-9KxzAoE=!DB@?%|e3SteNev7dKXKY`>t^nNnZ ztymlE{0To844{vJ}(fzS8YkJTX0^y{KnG@~In%V_3SJBb;#baHHn9-wmt&KW@)mQ2>7Dsa|HQx(m#Tm+(jCCDT(9yFJKkw(lnFkFR4lKD)KWhxzWLk! z-0~m^mYMx)FSy^!=L=`7izT65i`|cuau>3Uj-izn`5MF2Bi#$dx7;V6xGit~TWu zG(KptO~*wHDYg8YcKX4Hk3E0fZP2&>+IYaa8-JaIqfo^dUFXwW5-3SkyZsqU^AD8h zDn3C|{#=SrDD$wGBAm%T)m!EY^5^C;5e=J z*G*`l3mDC8m#cI)GJqu#>DijO@NwKNGaPTgoxIiNevuVk1TRc!;dkPSOTtfNj&a}i z4AJ%Jo=W5U|C)i%+>*-W7o)DgZOFgHl;X34HHN)2*QObv=UuCoM!@bkzdN&oa(`2i z5t-Ivh4(PP%GWF%?k-;K>>bvzW?FnUt6eJ1tEeYRGO{ld(PHQS(# zO2X556=k9swLoVRh3Il&*3YFQfbaTBUdo$))tN_;8q?}E!n6Ymrq3#Ie1PrrUdgLX zUoLm=Z=!Ny*|oXUUEcPU0-GhU{I7}~F^Vrf=CeNiZ9NLf{Z8#k2sIM$YdAfpw2a+m zkzrt>@dwOe4=j4fa``nXC>6v4;9{GQqvDMO2Pp>XrIaJYt zXYZ@s)a650chls1Ue!!5%1%dBl=?V({@IsprBYbqo=mgU2KNZrf9h7{8a%9C@}bVx zf6-s;S+(LZR~2cnR;Ht4WktwRH_oD=GIB|`q7cY&T;;qovDqvK|2XVrM5L2d7DWoW zGh3w)+K!P7o2XoR?S=b01A%YByOOZ-%S##FwA&_gOuiur%{9^EVy&RAp%_h~lC7q1 zJ^^pW@0`6EMjQIFe90q$IUjB&h8uxq7WT{ANIh2+TZs0ELy6ax3>E>Icds^IkwF=2<+FP85DE{xW91qr<4F1h- zPHgV19po#@MB`aQNw7G5c0BxGmeu^Bc6AYf z9`MB7c$DmrnEjBrf?9!a_aO;-P6n6GflOY{AckAjHKZ32I3N9%e44|2Pv<{xNS&eS zXXZ}fPvMPcawtzSN`ZUpSTjGMl^tB}aj`P|tY|?F1~>wXZ}rJNWz1Aaz%)u91Xmb- z#i>k4%6V?XblM>nO?HT$gA$|rF)qZQ#Tc}zTW#F?P2D6j*L5%K0zB8jeHo8 zy<58)g8$h*a3RKA0x$tp5}$ZOs%H8IHVkdNe>QzY4@qls7xVBxb77vaw8;VY_lH;$ z%pI6Fz2P;K8X)bF199#NfMb!@TJ64L%DZ5g8s;lqCo%JG=48*CIDu=+&79ePg^qIc z=p8nIin%^Aj4(5r-5fV= z{#jAZY^^bd&E?L+F;{zgh&xGV3sV%B3>eMtLD;2VtP973#BGKIJ zF$d;?Q6uwTK1Da^Im%tIsSA^UmU1+GQi{Fd+li}e4rZvCy5)%7?twHCYoiLo9W@2~+CO6k*SDKgcY_QfHqp}$+SX5rgCF(lW7zE87(=Ca*G z0=T~OmL?Gmw4Ee;lOL=nyPfnHgm<*2rtL(X?Q(UqkN_oHV-{V;Ht9)(_x?I3O`B^7 z`cUKXChBcyL#O?B8OK9F{)jC)_ z3b`M?OsTxxmD({7H}0=>XdU=BF<^f3NOB7m=H0p0Uk|=Nwbtj3`?{LRKxim<5uSS0`68@vhSjFnN1hJ`*lxahkb+zBN-U71zs zE#K?Fbt;y}nZ#0giI*i}z=6UUGw&j&R>+u^5vwPjH~N@%rT1iN^LiWP9NWAOXM^HX zPZfQP-d9BC02dk_ObL-+C~VvhU+rRDbsc%a_ITXQ(yu&^;S%Q%b-$mWPmb+^q1(>f zrFps|y^B^}FLeDgBA+os1(qE2+_vb~E?+)xV58?!wKQya1HDBt5&yK-Prhy`^syrK zy)N%&q*}_~-h*xNytfn5r^dsLm)|kxf-kCn{_w0qHj(7!@I`ZtgLOn?S55}!peDD5 zSBe&$Z@4|GcqW$NufQG`HFhH;)KO5`@KBj-?VB=Zx(-TOqRD5AnU2*gE`X)ep$?-_xfK~E$_ zO)&KI?-|i$r5Gn(G@IL2ohh~A(d&@3cU~*NL?pKIktkin-T7u6#ejR}6^ga63nZyN zb;k3LFl$C!qh4E&4vA~WJwAm38RU9eFPB|}lL%k(3mEv~*AuX*4p~4{#M01W_T-tM znef_(hUZ~cW2*jzVTeGuhN^%6O$E39QT+VJ(#ghS6!V0L_(HQ*F>>N=?P-#Wq$tfZ zwA=mZA^M;Hm%9f4pEmpYkJa_-T1DTbg}&Yu9L%kFTOTc2FL-}(Uh>X+YVAaC5ieD; zpH$Q>I2lkvj`#aun=PEr9a^KgV{N)OTSEW4xv4%i*$V8}d_f>1$IoO_W2*?VNIZ=c zT8k2_?V#6{X=u*)2jsU#?YyFycRmvj-1v*&r10j12$aNZYM=Kv?i+*F{ECqoRpuHZ zWKFPsdh4F`nT*%PA)QCiJ+os%tRAM60(NaX>Sq64ad^@DCHb04MbBVVy$Y z?IuK;ACsvmbVDu0NM2#|Q>T3CtS@{uICJU-IFu|jsa}n}hs-th%yn&@p;T%RK6hZoaT#_?Z~L$xI1=@ZXu`jk7ZM(vYox2ukBl7xt`^mAgl3@Us#vrp!RpjZKa>o4(f%MhGSdKR?=pfS|gDf zmDfl0A#%C_a?0crP%`&AxhuQA)Xnyxd=1s^c41(e*K}dT9*PBxlhfjhD!fkT-Of*Q zgM!T;T=K|{0Z+J!o3T<@c-s7XCy(v&$gvlJ+Unny&w4Xwswkzq=fgjwvaZiwQan{p zCUi6vT0fkHd9UW_3J0ZVz$C-CXBwLFG2C=!B-0H;^y3f*!Y-r)7%z1hZ+2sFAfyW2 zw6J?)&0S^*#l&t9+)VS)HWt)*|CcbB=P3V^of~ob?}b??v~m{*5R|F`-1;-*=E=AR)xd)!pCsi5}A6&$5=c_Q19^I ziC5H2XA{@hnGB+3FY}yqVJFAyec=1h?X*ocyZjTFgFWZ~oz4D>Ct3w?9z2Dm4Qlv|l&hl1D+Y0Jc_qjHsAi@UVE zCqFeMG4-NikLTataiU;eOC85>XKi05EM5NUXuT{sUUR+&KFOf6a5gv1Z0vG)T0@V$Tb*lA%#6M)(Re60 z!>Ze^Eb{1Z;MED{3ajxrxYe&v9vcCHvii(1uesbW$)faJVv|)@<#A*2l<#&Ya<-UA zz?)~^=zKD5DL{mL_kr`@+Xs}QQWFE;+vki9l==sF-oYABpe(F!?V$ZY^2tA!Z#n(d z&ndVQ11YGO*_@&$Gee%&y1vbL3d-hCN^_P@NJX5*?$OR+sm&Fdx^>d4aKQu@Oq1CG zocWCNG3R2p#x%l(S7;@Qff3^%M^7S9vf=eXMhPMR>*F~bu)kz;Dj6zsD+X3Yn>WWU zx8dyZ9^XA_Y7wXtvU@vMVfrk zmZ)*IJvpMcEMXydtoM?rrz0Y%@`>r+!$3p zwqpPY;!a%8a0^0sCO}_wJNUAlLjlc!{N>S;@pI`!tygHo-QTU9lRAQRL_pm#*|vg0q&*!A4i`+CNzb+t*V%GPp;27dTQag zS{Wfh*dbMy_dOSbfKq$Q+-|>%zLGxEoz}8N64@Ht`UqC(T~n!+#EHFa>2vWUKdxUihCU}y;E^_H6R`#zmxh-)}aBnT7# zV(G;lnz9b&Qaz!bhK0!P>D*F6&&J4-5${R282)b*U@G1C2&vG#XXhoLCvt`gQ$68m zON&Xh!tzt!#tJCV`&xnLSS;(-UFnKk6}j3Y_SNu>9uPY)dgL0!mgOQJ!nKefb`a*Y z-|e7BY}kRUDgQG{*W^9YXTv{4@59;d#at zgXzxFc;Hl9iivR&^F{>c*8VU9Z}EIEmm*uLCH^#>v6lr8ebkd9H!Cyt0)!&OFpmOtXKj zza(v%{l>6tNjvrYP|mHn;k|U-BGHu60GkmKeng5m*PPDW&nD$zBnqfG*nTAx^FczB zd(E|+1Bk+mQ-V}LS!ShuPSH$epcYTM_v_HxDJ{EYy|L3%q9#n^shR*Qqe_Xi6Pi5r zSK4Wb+y7)uh2m%7uZO-Y<)SsOEnH`>ntD$6<1r|FdH?$!@9D=F??{MA)R}3vG+sF0 z@McJ{;Y=etlfS2d%JFVVG=A7K+dXTzOEweZ1ZdcGN)~H>Sll@?xS`nFf4S(&Ok`Fj z$pTJ1h9qmNyNFA}T4${@dyB^mNDAGNmI$d38}mKj3m%P71yaS>SPnC2cxtl8=RZPs zF<%CHykG9d3}MA?m!eT7Iu{pWsAY#(;iUoGB=g6C|Cz&Qof5IeDilZLp$}<=bToL* zOGS1rx{7P7*Uv*)8+a>4QF!`ZYMwI7HCRNNWlcBftgiE)B!WISpgg{+3M*RV;k?|A zb>D73wwocP;XLshf7ppQPoS-F%TOq|l}V~a^nY+ewjA63NJUIrl1A$pJ@48}ib$w; zv}-8SuZ-|sSJ+&Fg5$skJg-!xv(9TWgegi6tpy98-0oemCiANX+>^*YLt;=$E2~0b zTWzIpuo$+53Bzn9U6W%@X86 zKcHY&+j3UNc`xR#!Mv}*_(kaGEN}50Ix^RMK5Kx_QRpbmHP`x_-CaBO(kAzzumsZPtul4i}exKMW50fy=gS6)YIG%4@Vf(!}-uB^$}EQ2elenQfL9zh&)dWOhP^-B7WGiqb2|-I)Y+sDIckr&n&d{0HnSTM5W)#P`R(v+rlLpn*K)^dze1g3 z4?{8JP{elHDL&VW^Nl1~uniWP5V}=XH29Qg?bqD$QYbMWXllrhcX040>G z?R35-Q7*o^?un&3>W=r>nO0|=-xt{kepqYy3AZ|8L^U3N@;Y_DO6w7uv3*kuqh-bT zq9Cq3WC{)lVSi(!w``n812V;0iM)aj8kOnH@U~uk1C5O^{mVsD4vDQH``)gpp?y$0 zXb_H@Pjfb}Q2clbD8=7(TgNeH0#?;&->E40e57D7S z6I>?4?`mLEXi+C;E^#|!KcFf_K-C=Y<62gwWwne;+q$F*khP}T?jJY>&mdd_%u}uv z3-3t5GpjPJFPjxGCdYDteiK@bx7l?~RAYV<67!TD8elR%ZW6+=)xJI{%OF!jPF%s< zyo{ja&X!Rg=@<1gA%_n!Lh&8-VDnfftRUEhbPkiN5c|Ya@8XkF2vbp)=XtA(W!=K6 z&7A$M^G5NDd7js=OSv;F9zcw$o1S1?uk@FnbCrejDZLpQBDJ}+VwuZ0t+_@{KGzDt z&oM5-L>{0Orv?txa&PAs7{ss%d8ZIi?7h6H-DI&dvHNq}w|^vdWOitX_7dBO$>N~_ zU8|)erq|Jmbb!e|WA5+Ecxk}WZ(>{$iCdE{q z8HWev&rB&tTA)65g*0vh7ufs&HB3&s%I8nkcK?8BM?3DO1#^PO|5(YJHRsO!ynE^D zlliwoZcBN`i!3eGa;kjq|1~bDbTy}DwOvZ|;j*izTdD zg6y~OZGHH5#om*=d8(V%&CKnXvhvsBRIm2uLHB{JtxG!nYd0G5{NK3Ymi)ZCl^0hQ z0-F(GyH0gaU9YAc>YteUTG%=`H*(i6HV2LDz}kp!M}?<}zpa+mHs5l0<-T8^S0wt#mB3V0>e+^{B_}LE3;>xti1a<`70Z+x#&~!W{X{`x^~v# z-+^0mFaCV%HZ@#wweeQ{*^l#n&b_Vm)#zSasa!y0tN7{_J*TRRyw=zN+dnKjZa}uN zA6N(OScAIwyPLoraUkmr7i?uFNPJ*`Ma8pc|LR|rb(}2KSq?hQo59o7&t;ucLK6Vp CSSert literal 0 HcmV?d00001 diff --git a/img/Sort Time Impacted by Array Size (Non Power of Two).png b/img/Sort Time Impacted by Array Size (Non Power of Two).png new file mode 100644 index 0000000000000000000000000000000000000000..b170795fab12f000b807df207d3c1f27a5489130 GIT binary patch literal 37379 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 YPw!YZXV<0GK~KJDYIUyc%+=rj2gwc@Bme*a literal 0 HcmV?d00001 diff --git a/img/Sort Time Impacted by Array Size (Power of Two).png b/img/Sort Time Impacted by Array Size (Power of Two).png new file mode 100644 index 0000000000000000000000000000000000000000..be0e77b27341040f0d39861995e34f2babffdae8 GIT binary patch literal 39967 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 literal 0 HcmV?d00001 diff --git a/img/performance_analysis.xlsx b/img/performance_analysis.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..13f89088ee2ec02b528d875bef85b8c4fe39ba8e GIT binary patch literal 44012 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 Uy#NG+8u%Lt_~JN__2X~<3wRVM;{X5v literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 6aa07cd..9c0f835 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,178 +13,288 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 16; // feel free to change the size of array +const int SIZE = 67108864; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; int *c = new int[SIZE]; +int *d = new int[SIZE]; int main(int argc, char* argv[]) { // Scan tests - printf("\n"); - printf("****************\n"); - printf("** SCAN TESTS **\n"); - printf("****************\n"); + //printf("\n"); + //printf("****************\n"); + //printf("** SCAN TESTS **\n"); + //printf("****************\n"); - genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - printArray(SIZE, a, true); + //genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case + //a[SIZE - 1] = 0; + //printArray(SIZE, a, true); - // initialize b using StreamCompaction::CPU::scan you implement - // We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. - // At first all cases passed because b && c are all zeroes. - zeroArray(SIZE, b); - printDesc("cpu scan, power-of-two"); - StreamCompaction::CPU::scan(SIZE, b, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(SIZE, b, true); + //// initialize b using StreamCompaction::CPU::scan you implement + //// We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. + //// At first all cases passed because b && c are all zeroes. + //zeroArray(SIZE, b); + //printDesc("cpu scan, power-of-two"); + //StreamCompaction::CPU::scan(SIZE, b, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //printArray(SIZE, b, true); - zeroArray(SIZE, c); - printDesc("cpu scan, non-power-of-two"); - StreamCompaction::CPU::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, b, true); - printCmpResult(NPOT, b, c); + //zeroArray(SIZE, c); + //printDesc("cpu scan, non-power-of-two"); + //StreamCompaction::CPU::scan(NPOT, c, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //printArray(NPOT, b, true); + //printCmpResult(NPOT, b, c); - zeroArray(SIZE, c); - printDesc("naive scan, power-of-two"); - StreamCompaction::Naive::scan(SIZE, c, a); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); + //zeroArray(SIZE, c); + //printDesc("naive scan, power-of-two"); + //StreamCompaction::Naive::scan(SIZE, c, a); + //printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(SIZE, c, true); + //printCmpResult(SIZE, b, c); - /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan - onesArray(SIZE, c); - printDesc("1s array for finding bugs"); - StreamCompaction::Naive::scan(SIZE, c, a); - printArray(SIZE, c, true); */ + ///* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan + //onesArray(SIZE, c); + //printDesc("1s array for finding bugs"); + //StreamCompaction::Naive::scan(SIZE, c, a); + //printArray(SIZE, c, true); */ - zeroArray(SIZE, c); - printDesc("naive scan, non-power-of-two"); - StreamCompaction::Naive::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(NPOT, b, c); + //zeroArray(SIZE, c); + //printDesc("naive scan, non-power-of-two"); + //StreamCompaction::Naive::scan(NPOT, c, a); + //printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(SIZE, c, true); + //printCmpResult(NPOT, b, c); + + ////zeroArray(SIZE, c); + //printDesc("work-efficient scan, power-of-two"); + //StreamCompaction::Efficient::scan(SIZE, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + + ////for (int i = 0; i < 512; i++) { + //// std::cout << a[i] << " "; + ////} + ////std::cout << std::endl; + ////std::cout << std::endl; + //// + ////for (int i = 0; i < 512; i++) { + //// std::cout << c[i] << " "; + ////} + ////std::cout << std::endl; + ////std::cout << std::endl; + //// + ////printArray(SIZE, c, true); + //printCmpResult(SIZE, b, c); //zeroArray(SIZE, c); - printDesc("work-efficient scan, power-of-two"); - StreamCompaction::Efficient::scan(SIZE, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - - //for (int i = 0; i < 512; i++) { - // std::cout << a[i] << " "; - //} - //std::cout << std::endl; - //std::cout << std::endl; - // - //for (int i = 0; i < 512; i++) { - // std::cout << c[i] << " "; - //} - //std::cout << std::endl; - //std::cout << std::endl; - // - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient scan, non-power-of-two"); - StreamCompaction::Efficient::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + //printDesc("work-efficient scan, non-power-of-two"); + //StreamCompaction::Efficient::scan(NPOT, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(NPOT, c, true); + //printCmpResult(NPOT, b, c); - zeroArray(SIZE, c); - printDesc("thrust scan, power-of-two"); - StreamCompaction::Thrust::scan(SIZE, c, a); - printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); + //zeroArray(SIZE, c); + //printDesc("thrust scan, power-of-two"); + //StreamCompaction::Thrust::scan(SIZE, c, a); + //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(SIZE, c, true); + //printCmpResult(SIZE, b, c); - zeroArray(SIZE, c); - printDesc("thrust scan, non-power-of-two"); - StreamCompaction::Thrust::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + //zeroArray(SIZE, c); + //printDesc("thrust scan, non-power-of-two"); + //StreamCompaction::Thrust::scan(NPOT, c, a); + //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(NPOT, c, true); + //printCmpResult(NPOT, b, c); - printf("\n"); - printf("*****************************\n"); - printf("** STREAM COMPACTION TESTS **\n"); - printf("*****************************\n"); + //printf("\n"); + //printf("*****************************\n"); + //printf("** STREAM COMPACTION TESTS **\n"); + //printf("*****************************\n"); - // Compaction tests + //// Compaction tests - genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - printArray(SIZE, a, true); + //genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case + //a[SIZE - 1] = 0; + //printArray(SIZE, a, true); - int count, expectedCount, expectedNPOT; + //int count, expectedCount, expectedNPOT; - // initialize b using StreamCompaction::CPU::compactWithoutScan you implement - // We use b for further comparison. Make sure your StreamCompaction::CPU::compactWithoutScan is correct. - zeroArray(SIZE, b); - printDesc("cpu compact without scan, power-of-two"); - count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - expectedCount = count; - printArray(count, b, true); - printCmpLenResult(count, expectedCount, b, b); + //// initialize b using StreamCompaction::CPU::compactWithoutScan you implement + //// We use b for further comparison. Make sure your StreamCompaction::CPU::compactWithoutScan is correct. + //zeroArray(SIZE, b); + //printDesc("cpu compact without scan, power-of-two"); + //count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //expectedCount = count; + //printArray(count, b, true); + //printCmpLenResult(count, expectedCount, b, b); - zeroArray(SIZE, c); - printDesc("cpu compact without scan, non-power-of-two"); - count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - expectedNPOT = count; - printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); + //zeroArray(SIZE, c); + //printDesc("cpu compact without scan, non-power-of-two"); + //count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //expectedNPOT = count; + //printArray(count, c, true); + //printCmpLenResult(count, expectedNPOT, b, c); + + //zeroArray(SIZE, c); + //printDesc("cpu compact with scan, power-of-two"); + //count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + ////printArray(count, c, true); + //printCmpLenResult(count, expectedCount, b, c); + + //zeroArray(SIZE, c); + //printDesc("cpu compact with scan, non-power-of-two"); + //count = StreamCompaction::CPU::compactWithScan(NPOT, c, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + ////printArray(count, c, true); + //printCmpLenResult(count, expectedNPOT, b, c); + + //zeroArray(SIZE, c); + //printDesc("work-efficient compact, power-of-two"); + //count = StreamCompaction::Efficient::compact(SIZE, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(count, c, true); + //printCmpLenResult(count, expectedCount, b, c); + + //zeroArray(SIZE, c); + //printDesc("work-efficient compact, non-power-of-two"); + //count = StreamCompaction::Efficient::compact(NPOT, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(count, c, true); + //printCmpLenResult(count, expectedNPOT, b, c); + + + //printf("\n"); + //printf("**********************\n"); + //printf("** RADIX SORT TESTS **\n"); + //printf("**********************\n"); + + //genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case + //a[SIZE - 1] = 0; + //printArray(SIZE, a, true); + + //zeroArray(SIZE, b); + //printDesc("thrust sort, power-of-two"); + //StreamCompaction::Thrust::sort(SIZE, b, a); + //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, b, true); + + //zeroArray(SIZE, d); + //printDesc("thrust sort, non-power-of-two"); + //StreamCompaction::Thrust::sort(NPOT, d, a); + //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, d, true); + //zeroArray(SIZE, c); + //printDesc("radix sort, power-of-two"); + //StreamCompaction::Efficient::radixSort(SIZE, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(SIZE, c, true); + //printCmpResult(SIZE, b, c); + + //zeroArray(SIZE, c); + //printDesc("radix sort, non-power-of-two"); + //StreamCompaction::Efficient::radixSort(NPOT, c, a); + //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + ////printArray(NPOT, c, true); + //printCmpResult(NPOT, d, c); + + genArray(SIZE - 1, a, 50, 1); + a[SIZE - 1] = 0; + zeroArray(SIZE, c); + StreamCompaction::CPU::scan(SIZE, c, a); + std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Thrust::scan(SIZE, c, a); + std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Naive::scan(SIZE, c, a); + std::cout << StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; zeroArray(SIZE, c); - printDesc("cpu compact with scan"); - count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); + StreamCompaction::Efficient::scan(SIZE, c, a); + std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + + std::cout << std::endl; + std::cout << std::endl; + genArray(SIZE - 1, a, 50, 1); + a[SIZE - 1] = 0; zeroArray(SIZE, c); - printDesc("work-efficient compact, power-of-two"); - count = StreamCompaction::Efficient::compact(SIZE, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); + StreamCompaction::Efficient::radixSort(SIZE, c, a); + std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Thrust::sort(SIZE, c, a); + std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + + std::cout << std::endl; + std::cout << std::endl; + genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; zeroArray(SIZE, c); - printDesc("work-efficient compact, non-power-of-two"); - count = StreamCompaction::Efficient::compact(NPOT, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); + StreamCompaction::CPU::compactWithoutScan(SIZE, c, a); + std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::CPU::compactWithScan(SIZE, c, a); + std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Efficient::compact(SIZE, c, a); + std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + std::cout << std::endl; + std::cout << "Non power of two." << std::endl; genArray(SIZE - 1, a, 50, 1); + std::cout << std::endl; - printf("\n"); - printf("**********************\n"); - printf("** RADIX SORT TESTS **\n"); - printf("**********************\n"); + genArray(SIZE - 1, a, 50, 1); + a[SIZE - 1] = 0; + zeroArray(SIZE, c); + StreamCompaction::CPU::scan(NPOT, c, a); + std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Thrust::scan(NPOT, c, a); + std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Naive::scan(NPOT, c, a); + std::cout << StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Efficient::scan(NPOT, c, a); + std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + + std::cout << std::endl; + std::cout << std::endl; - genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case + genArray(SIZE - 1, a, 50, 1); a[SIZE - 1] = 0; - printArray(SIZE, a, true); + zeroArray(SIZE, c); + StreamCompaction::Efficient::radixSort(NPOT, c, a); + std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Thrust::sort(NPOT, c, a); + std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, b); - printDesc("thrust sort, power-of-two"); - StreamCompaction::Thrust::sort(SIZE, b, a); - printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, b, true); + std::cout << std::endl; + std::cout << std::endl; + genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; zeroArray(SIZE, c); - printDesc("radix sort, power-of-two"); - StreamCompaction::Efficient::radixSort(SIZE, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); + StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); + std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::CPU::compactWithScan(NPOT, c, a); + std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + zeroArray(SIZE, c); + StreamCompaction::Efficient::compact(NPOT, c, a); + std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; system("pause"); // stop Win32 console from closing on exit delete[] a; delete[] b; delete[] c; + delete[] d; } From c725741a98dfc442c08d8360e192287e62a089b6 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 20:07:07 -0400 Subject: [PATCH 07/14] Update --- README.md | 15 +- img/performance_analysis.xlsx | Bin 44012 -> 44901 bytes src/main.cpp | 465 +++++++++++++++++----------------- 3 files changed, 249 insertions(+), 231 deletions(-) diff --git a/README.md b/README.md index 475dc4e..06bc651 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,18 @@ CUDA Stream Compaction * GPU Steam Compaction * Radix Sort (Extra Credit) + + * When input is: + + `{41, 17, 34, 0, 19, 24, 28, 8, 12, 14, 5, 45, 31, 27, 11, 41, 45, 42, 27, 36, 41, 4, 2, 3, 42, 32, 21, 16, 18, 45, 47, 26, 21, 38, 19, 12, 17, 49, 35, 44, 3, 11, 22, 33, 23, 14, 41, 11, 3, 18, 47, 44, 12, 7, 37, 9, 23, 41, 29, 28, 16, 35, 40, 0}`, + the output is: + `{0, 0, 2, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 11, 12, 12, 12, 14, 14, 16, 16, 17, 17, 18, 18, 19, 19, 21, 21, 22, 23, 23, 24, 26, 27, 27, 28, 28, 29, 31, 32, 33, 34, 35, 35, 36, 37, 38, 40, 41, 41, 41, 41, 41, 42, 42, 44, 44, 45, 45, 45, 47, 47, 49}`. + I also ran comparison between my radix sort and `thrust::sort` (see [Example Output](###Example Output) and [Performance Analysis](#### Radix Sort)). ### Example Output + + `SIZE` is $2^{20}$. The test size for non-power-of-two case is `SIZE - 3`. CUDA block size is 128. ``` @@ -109,19 +118,19 @@ CUDA block size is 128. ![Scan Time Impacted by Array Size (Power of Two)](img/Scan Time Impacted by Array Size (Power of Two).png) -![Scan Time Impacted by Array Size (Non Power of Two)](img/Scan Time Impacted by Array Size (Non Power of Two).png) + #### Compaction ![Compaction Time Impacted by Array Size (Power of Two)](img/Compaction Time Impacted by Array Size (Power of Two).png) -![Compaction Time Impacted by Array Size (Non Power of Two)](img/Compaction Time Impacted by Array Size (Non Power of Two).png) + #### Radix Sort ![Sort Time Impacted by Array Size (Power of Two)](img/Sort Time Impacted by Array Size (Power of Two).png) -![Sort Time Impacted by Array Size (Non Power of Two)](img/Sort Time Impacted by Array Size (Non Power of Two).png) + ## Answers to the Questions diff --git a/img/performance_analysis.xlsx b/img/performance_analysis.xlsx index 13f89088ee2ec02b528d875bef85b8c4fe39ba8e..bbb26c86c99984b7168798d65f8aaae2acb2a1ce 100644 GIT binary patch delta 6736 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 TmY$dk#04Toqy6Fhf298df@`VC diff --git a/src/main.cpp b/src/main.cpp index 9c0f835..6e2ecb1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 67108864; // feel free to change the size of array +const int SIZE = 64; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -23,274 +23,283 @@ int *d = new int[SIZE]; int main(int argc, char* argv[]) { // Scan tests - //printf("\n"); - //printf("****************\n"); - //printf("** SCAN TESTS **\n"); - //printf("****************\n"); + printf("\n"); + printf("****************\n"); + printf("** SCAN TESTS **\n"); + printf("****************\n"); - //genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case - //a[SIZE - 1] = 0; - //printArray(SIZE, a, true); - - //// initialize b using StreamCompaction::CPU::scan you implement - //// We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. - //// At first all cases passed because b && c are all zeroes. - //zeroArray(SIZE, b); - //printDesc("cpu scan, power-of-two"); - //StreamCompaction::CPU::scan(SIZE, b, a); - //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - //printArray(SIZE, b, true); + genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; + printArray(SIZE, a, true); - //zeroArray(SIZE, c); - //printDesc("cpu scan, non-power-of-two"); - //StreamCompaction::CPU::scan(NPOT, c, a); - //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - //printArray(NPOT, b, true); - //printCmpResult(NPOT, b, c); + // initialize b using StreamCompaction::CPU::scan you implement + // We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. + // At first all cases passed because b && c are all zeroes. + zeroArray(SIZE, b); + printDesc("cpu scan, power-of-two"); + StreamCompaction::CPU::scan(SIZE, b, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(SIZE, b, true); - //zeroArray(SIZE, c); - //printDesc("naive scan, power-of-two"); - //StreamCompaction::Naive::scan(SIZE, c, a); - //printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(SIZE, c, true); - //printCmpResult(SIZE, b, c); + zeroArray(SIZE, c); + printDesc("cpu scan, non-power-of-two"); + StreamCompaction::CPU::scan(NPOT, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(NPOT, b, true); + printCmpResult(NPOT, b, c); - ///* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan - //onesArray(SIZE, c); - //printDesc("1s array for finding bugs"); - //StreamCompaction::Naive::scan(SIZE, c, a); - //printArray(SIZE, c, true); */ + zeroArray(SIZE, c); + printDesc("naive scan, power-of-two"); + StreamCompaction::Naive::scan(SIZE, c, a); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); - //zeroArray(SIZE, c); - //printDesc("naive scan, non-power-of-two"); - //StreamCompaction::Naive::scan(NPOT, c, a); - //printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(SIZE, c, true); - //printCmpResult(NPOT, b, c); + /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan + onesArray(SIZE, c); + printDesc("1s array for finding bugs"); + StreamCompaction::Naive::scan(SIZE, c, a); + printArray(SIZE, c, true); */ - ////zeroArray(SIZE, c); - //printDesc("work-efficient scan, power-of-two"); - //StreamCompaction::Efficient::scan(SIZE, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - - ////for (int i = 0; i < 512; i++) { - //// std::cout << a[i] << " "; - ////} - ////std::cout << std::endl; - ////std::cout << std::endl; - //// - ////for (int i = 0; i < 512; i++) { - //// std::cout << c[i] << " "; - ////} - ////std::cout << std::endl; - ////std::cout << std::endl; - //// - ////printArray(SIZE, c, true); - //printCmpResult(SIZE, b, c); + zeroArray(SIZE, c); + printDesc("naive scan, non-power-of-two"); + StreamCompaction::Naive::scan(NPOT, c, a); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(NPOT, b, c); //zeroArray(SIZE, c); - //printDesc("work-efficient scan, non-power-of-two"); - //StreamCompaction::Efficient::scan(NPOT, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(NPOT, c, true); - //printCmpResult(NPOT, b, c); + printDesc("work-efficient scan, power-of-two"); + StreamCompaction::Efficient::scan(SIZE, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + + //for (int i = 0; i < 512; i++) { + // std::cout << a[i] << " "; + //} + //std::cout << std::endl; + //std::cout << std::endl; + // + //for (int i = 0; i < 512; i++) { + // std::cout << c[i] << " "; + //} + //std::cout << std::endl; + //std::cout << std::endl; + // + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); - //zeroArray(SIZE, c); - //printDesc("thrust scan, power-of-two"); - //StreamCompaction::Thrust::scan(SIZE, c, a); - //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(SIZE, c, true); - //printCmpResult(SIZE, b, c); + zeroArray(SIZE, c); + printDesc("work-efficient scan, non-power-of-two"); + StreamCompaction::Efficient::scan(NPOT, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); - //zeroArray(SIZE, c); - //printDesc("thrust scan, non-power-of-two"); - //StreamCompaction::Thrust::scan(NPOT, c, a); - //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(NPOT, c, true); - //printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); + printDesc("thrust scan, power-of-two"); + StreamCompaction::Thrust::scan(SIZE, c, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); - //printf("\n"); - //printf("*****************************\n"); - //printf("** STREAM COMPACTION TESTS **\n"); - //printf("*****************************\n"); + zeroArray(SIZE, c); + printDesc("thrust scan, non-power-of-two"); + StreamCompaction::Thrust::scan(NPOT, c, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); - //// Compaction tests + printf("\n"); + printf("*****************************\n"); + printf("** STREAM COMPACTION TESTS **\n"); + printf("*****************************\n"); - //genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case - //a[SIZE - 1] = 0; - //printArray(SIZE, a, true); + // Compaction tests - //int count, expectedCount, expectedNPOT; + genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; + printArray(SIZE, a, true); - //// initialize b using StreamCompaction::CPU::compactWithoutScan you implement - //// We use b for further comparison. Make sure your StreamCompaction::CPU::compactWithoutScan is correct. - //zeroArray(SIZE, b); - //printDesc("cpu compact without scan, power-of-two"); - //count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); - //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - //expectedCount = count; - //printArray(count, b, true); - //printCmpLenResult(count, expectedCount, b, b); + int count, expectedCount, expectedNPOT; - //zeroArray(SIZE, c); - //printDesc("cpu compact without scan, non-power-of-two"); - //count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); - //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - //expectedNPOT = count; - //printArray(count, c, true); - //printCmpLenResult(count, expectedNPOT, b, c); - - //zeroArray(SIZE, c); - //printDesc("cpu compact with scan, power-of-two"); - //count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); - //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - ////printArray(count, c, true); - //printCmpLenResult(count, expectedCount, b, c); + // initialize b using StreamCompaction::CPU::compactWithoutScan you implement + // We use b for further comparison. Make sure your StreamCompaction::CPU::compactWithoutScan is correct. + zeroArray(SIZE, b); + printDesc("cpu compact without scan, power-of-two"); + count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + expectedCount = count; + printArray(count, b, true); + printCmpLenResult(count, expectedCount, b, b); - //zeroArray(SIZE, c); - //printDesc("cpu compact with scan, non-power-of-two"); - //count = StreamCompaction::CPU::compactWithScan(NPOT, c, a); - //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - ////printArray(count, c, true); - //printCmpLenResult(count, expectedNPOT, b, c); + zeroArray(SIZE, c); + printDesc("cpu compact without scan, non-power-of-two"); + count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + expectedNPOT = count; + printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); - //zeroArray(SIZE, c); - //printDesc("work-efficient compact, power-of-two"); - //count = StreamCompaction::Efficient::compact(SIZE, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(count, c, true); - //printCmpLenResult(count, expectedCount, b, c); + zeroArray(SIZE, c); + printDesc("cpu compact with scan, power-of-two"); + count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedCount, b, c); - //zeroArray(SIZE, c); - //printDesc("work-efficient compact, non-power-of-two"); - //count = StreamCompaction::Efficient::compact(NPOT, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(count, c, true); - //printCmpLenResult(count, expectedNPOT, b, c); + zeroArray(SIZE, c); + printDesc("cpu compact with scan, non-power-of-two"); + count = StreamCompaction::CPU::compactWithScan(NPOT, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); + zeroArray(SIZE, c); + printDesc("work-efficient compact, power-of-two"); + count = StreamCompaction::Efficient::compact(SIZE, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedCount, b, c); - //printf("\n"); - //printf("**********************\n"); - //printf("** RADIX SORT TESTS **\n"); - //printf("**********************\n"); + zeroArray(SIZE, c); + printDesc("work-efficient compact, non-power-of-two"); + count = StreamCompaction::Efficient::compact(NPOT, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); - //genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case - //a[SIZE - 1] = 0; - //printArray(SIZE, a, true); - //zeroArray(SIZE, b); - //printDesc("thrust sort, power-of-two"); - //StreamCompaction::Thrust::sort(SIZE, b, a); - //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, b, true); + printf("\n"); + printf("**********************\n"); + printf("** RADIX SORT TESTS **\n"); + printf("**********************\n"); - //zeroArray(SIZE, d); - //printDesc("thrust sort, non-power-of-two"); - //StreamCompaction::Thrust::sort(NPOT, d, a); - //printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, d, true); + genArray(SIZE - 1, a, 50, 1); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; + printArray(SIZE, a, true); - //zeroArray(SIZE, c); - //printDesc("radix sort, power-of-two"); - //StreamCompaction::Efficient::radixSort(SIZE, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(SIZE, c, true); - //printCmpResult(SIZE, b, c); + zeroArray(SIZE, b); + printDesc("thrust sort, power-of-two"); + StreamCompaction::Thrust::sort(SIZE, b, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + printArray(SIZE, b, true); - //zeroArray(SIZE, c); - //printDesc("radix sort, non-power-of-two"); - //StreamCompaction::Efficient::radixSort(NPOT, c, a); - //printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - ////printArray(NPOT, c, true); - //printCmpResult(NPOT, d, c); + zeroArray(SIZE, d); + printDesc("thrust sort, non-power-of-two"); + StreamCompaction::Thrust::sort(NPOT, d, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + printArray(NPOT, d, true); - genArray(SIZE - 1, a, 50, 1); - a[SIZE - 1] = 0; zeroArray(SIZE, c); - StreamCompaction::CPU::scan(SIZE, c, a); - std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Thrust::scan(SIZE, c, a); - std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Naive::scan(SIZE, c, a); - std::cout << StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Efficient::scan(SIZE, c, a); - std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + printDesc("radix sort, power-of-two"); + StreamCompaction::Efficient::radixSort(SIZE, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); + for (int i = 0; i < 64; i++) { + std::cout << a[i] << " "; + } std::cout << std::endl; + for (int i = 0; i < 64; i++) { + std::cout << c[i] << " "; + } std::cout << std::endl; - genArray(SIZE - 1, a, 50, 1); - a[SIZE - 1] = 0; zeroArray(SIZE, c); - StreamCompaction::Efficient::radixSort(SIZE, c, a); - std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Thrust::sort(SIZE, c, a); - std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + printDesc("radix sort, non-power-of-two"); + StreamCompaction::Efficient::radixSort(NPOT, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, d, c); - std::cout << std::endl; - std::cout << std::endl; + //genArray(SIZE - 1, a, 50, 1); + //a[SIZE - 1] = 0; + //zeroArray(SIZE, c); + //StreamCompaction::CPU::scan(SIZE, c, a); + //std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Thrust::scan(SIZE, c, a); + //std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Naive::scan(SIZE, c, a); + //std::cout << StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Efficient::scan(SIZE, c, a); + //std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - zeroArray(SIZE, c); - StreamCompaction::CPU::compactWithoutScan(SIZE, c, a); - std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::CPU::compactWithScan(SIZE, c, a); - std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Efficient::compact(SIZE, c, a); - std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //std::cout << std::endl; + //std::cout << std::endl; - std::cout << std::endl; - std::cout << "Non power of two." << std::endl; genArray(SIZE - 1, a, 50, 1); - std::cout << std::endl; + //genArray(SIZE - 1, a, 50, 1); + //a[SIZE - 1] = 0; + //zeroArray(SIZE, c); + //StreamCompaction::Efficient::radixSort(SIZE, c, a); + //std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Thrust::sort(SIZE, c, a); + //std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - genArray(SIZE - 1, a, 50, 1); - a[SIZE - 1] = 0; - zeroArray(SIZE, c); - StreamCompaction::CPU::scan(NPOT, c, a); - std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Thrust::scan(NPOT, c, a); - std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Naive::scan(NPOT, c, a); - std::cout << StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Efficient::scan(NPOT, c, a); - std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //std::cout << std::endl; + //std::cout << std::endl; - std::cout << std::endl; - std::cout << std::endl; + //genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case + //a[SIZE - 1] = 0; + //zeroArray(SIZE, c); + //StreamCompaction::CPU::compactWithoutScan(SIZE, c, a); + //std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::CPU::compactWithScan(SIZE, c, a); + //std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Efficient::compact(SIZE, c, a); + //std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - genArray(SIZE - 1, a, 50, 1); - a[SIZE - 1] = 0; - zeroArray(SIZE, c); - StreamCompaction::Efficient::radixSort(NPOT, c, a); - std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Thrust::sort(NPOT, c, a); - std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //std::cout << std::endl; + //std::cout << "Non power of two." << std::endl; genArray(SIZE - 1, a, 50, 1); + //std::cout << std::endl; - std::cout << std::endl; - std::cout << std::endl; + //genArray(SIZE - 1, a, 50, 1); + //a[SIZE - 1] = 0; + //zeroArray(SIZE, c); + //StreamCompaction::CPU::scan(NPOT, c, a); + //std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Thrust::scan(NPOT, c, a); + //std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Naive::scan(NPOT, c, a); + //std::cout << StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Efficient::scan(NPOT, c, a); + //std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; - genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - zeroArray(SIZE, c); - StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); - std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::CPU::compactWithScan(NPOT, c, a); - std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; - zeroArray(SIZE, c); - StreamCompaction::Efficient::compact(NPOT, c, a); - std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //std::cout << std::endl; + //std::cout << std::endl; + + //genArray(SIZE - 1, a, 50, 1); + //a[SIZE - 1] = 0; + //zeroArray(SIZE, c); + //StreamCompaction::Efficient::radixSort(NPOT, c, a); + //std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Thrust::sort(NPOT, c, a); + //std::cout << StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; + + //std::cout << std::endl; + //std::cout << std::endl; + + //genArray(SIZE - 1, a, 4, 1); // Leave a 0 at the end to test that edge case + //a[SIZE - 1] = 0; + //zeroArray(SIZE, c); + //StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); + //std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::CPU::compactWithScan(NPOT, c, a); + //std::cout << StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation() << std::endl; + //zeroArray(SIZE, c); + //StreamCompaction::Efficient::compact(NPOT, c, a); + //std::cout << StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation() << std::endl; system("pause"); // stop Win32 console from closing on exit delete[] a; From d55abe3a4b6f323e830e83f249a517816971b2d3 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 20:09:23 -0400 Subject: [PATCH 08/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06bc651..5a0c84b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ CUDA Stream Compaction `{41, 17, 34, 0, 19, 24, 28, 8, 12, 14, 5, 45, 31, 27, 11, 41, 45, 42, 27, 36, 41, 4, 2, 3, 42, 32, 21, 16, 18, 45, 47, 26, 21, 38, 19, 12, 17, 49, 35, 44, 3, 11, 22, 33, 23, 14, 41, 11, 3, 18, 47, 44, 12, 7, 37, 9, 23, 41, 29, 28, 16, 35, 40, 0}`, the output is: `{0, 0, 2, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 11, 12, 12, 12, 14, 14, 16, 16, 17, 17, 18, 18, 19, 19, 21, 21, 22, 23, 23, 24, 26, 27, 27, 28, 28, 29, 31, 32, 33, 34, 35, 35, 36, 37, 38, 40, 41, 41, 41, 41, 41, 42, 42, 44, 44, 45, 45, 45, 47, 47, 49}`. - I also ran comparison between my radix sort and `thrust::sort` (see [Example Output](###Example Output) and [Performance Analysis](#### Radix Sort)). + I also ran comparison between my radix sort and `thrust::sort` (see [Example Output](#example-output) and [Performance Analysis](#radix-sort)). ### Example Output From 360bb1113f41eb79874a3702ddf55067dc7e3a47 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 20:10:54 -0400 Subject: [PATCH 09/14] Update --- README.md | 6 +++--- ...ime Impacted by Array Size Non Power of Two.png} | Bin ...on Time Impacted by Array Size Power of Two.png} | Bin ...ime Impacted by Array Size Non Power of Two.png} | Bin ...ime Impacted by Array Size Non Power of Two.png} | Bin ...rt Time Impacted by Array Size Power of Two.png} | Bin 6 files changed, 3 insertions(+), 3 deletions(-) rename img/{Compaction Time Impacted by Array Size (Non Power of Two).png => Compaction Time Impacted by Array Size Non Power of Two.png} (100%) rename img/{Compaction Time Impacted by Array Size (Power of Two).png => Compaction Time Impacted by Array Size Power of Two.png} (100%) rename img/{Scan Time Impacted by Array Size (Non Power of Two).png => Scan Time Impacted by Array Size Non Power of Two.png} (100%) rename img/{Sort Time Impacted by Array Size (Non Power of Two).png => Sort Time Impacted by Array Size Non Power of Two.png} (100%) rename img/{Sort Time Impacted by Array Size (Power of Two).png => Sort Time Impacted by Array Size Power of Two.png} (100%) diff --git a/README.md b/README.md index 5a0c84b..ba2981c 100644 --- a/README.md +++ b/README.md @@ -116,13 +116,13 @@ CUDA block size is 128. #### Scan -![Scan Time Impacted by Array Size (Power of Two)](img/Scan Time Impacted by Array Size (Power of Two).png) +![Scan Time Impacted by Array Size (Power of Two)](img/Scan Time Impacted by Array Size Power of Two.png) - + #### Compaction -![Compaction Time Impacted by Array Size (Power of Two)](img/Compaction Time Impacted by Array Size (Power of Two).png) +![Compaction Time Impacted by Array Size (Power of Two)](img/Compaction Time Impacted by Array Size Power of Two.png) diff --git a/img/Compaction Time Impacted by Array Size (Non Power of Two).png b/img/Compaction Time Impacted by Array Size Non Power of Two.png similarity index 100% rename from img/Compaction Time Impacted by Array Size (Non Power of Two).png rename to img/Compaction Time Impacted by Array Size Non Power of Two.png diff --git a/img/Compaction Time Impacted by Array Size (Power of Two).png b/img/Compaction Time Impacted by Array Size Power of Two.png similarity index 100% rename from img/Compaction Time Impacted by Array Size (Power of Two).png rename to img/Compaction Time Impacted by Array Size Power of Two.png diff --git a/img/Scan Time Impacted by Array Size (Non Power of Two).png b/img/Scan Time Impacted by Array Size Non Power of Two.png similarity index 100% rename from img/Scan Time Impacted by Array Size (Non Power of Two).png rename to img/Scan Time Impacted by Array Size Non Power of Two.png diff --git a/img/Sort Time Impacted by Array Size (Non Power of Two).png b/img/Sort Time Impacted by Array Size Non Power of Two.png similarity index 100% rename from img/Sort Time Impacted by Array Size (Non Power of Two).png rename to img/Sort Time Impacted by Array Size Non Power of Two.png diff --git a/img/Sort Time Impacted by Array Size (Power of Two).png b/img/Sort Time Impacted by Array Size Power of Two.png similarity index 100% rename from img/Sort Time Impacted by Array Size (Power of Two).png rename to img/Sort Time Impacted by Array Size Power of Two.png From c57c4a22b9a06d7683c626ef1331a118c297f7c9 Mon Sep 17 00:00:00 2001 From: IwakuraRein <28486541+IwakuraRein@users.noreply.github.com> Date: Sun, 18 Sep 2022 21:35:07 -0400 Subject: [PATCH 10/14] Update --- INSTRUCTION.md | 6 +- README.md | 60 +++++++++++++++--- ...me Impacted by Array Size Power of Two.png | Bin 59674 -> 56075 bytes ...pacted by CUDA Block Size Power of Two.png | Bin 0 -> 34401 bytes ...pacted by CUDA Block Size Power of Two.png | Bin 0 -> 31493 bytes ... Impacted by Array Size (Power of Two).png | Bin 60721 -> 0 bytes ...me Impacted by Array Size Power of Two.png | Bin 0 -> 58889 bytes ...pacted by CUDA Block Size Power of Two.png | Bin 0 -> 44395 bytes ...me Impacted by Array Size Power of Two.png | Bin 39967 -> 56537 bytes ... Allocation of the Down Sweep Function.png | Bin 0 -> 69370 bytes img/performance_analysis.xlsx | Bin 44901 -> 60072 bytes src/main.cpp | 28 ++++---- stream_compaction/efficient.cu | 2 +- 13 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 img/Compaction Time Impacted by CUDA Block Size Power of Two.png create mode 100644 img/Radix Sort Impacted by CUDA Block Size Power of Two.png delete mode 100644 img/Scan Time Impacted by Array Size (Power of Two).png create mode 100644 img/Scan Time Impacted by Array Size Power of Two.png create mode 100644 img/Scan Time Impacted by CUDA Block Size Power of Two.png create mode 100644 img/Threads Allocation of the Down Sweep Function.png diff --git a/INSTRUCTION.md b/INSTRUCTION.md index 69d427c..ccb1ed1 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -153,11 +153,9 @@ For thrust stream compaction, take a look at [thrust::remove_if](https://thrust. ## Part 5: Why is My GPU Approach So Slow? (Extra Credit) (+5) -If you implement your efficient scan version following the slides closely, there's a good chance -that you are getting an "efficient" gpu scan that is actually not that efficient -- it is slower than the cpu approach? +If you implement your efficient scan version following the slides closely, there's a good chance that you are getting an "efficient" gpu scan that is actually not that efficient -- it is slower than the cpu approach? -Though it is totally acceptable for this assignment, -In addition to explain the reason of this phenomena, you are encouraged to try to upgrade your work-efficient gpu scan. +Though it is totally acceptable for this assignment, In addition to explain the reason of this phenomena, you are encouraged to try to upgrade your work-efficient gpu scan. Thinking about these may lead you to an aha moment: diff --git a/README.md b/README.md index ba2981c..3ee049a 100644 --- a/README.md +++ b/README.md @@ -24,15 +24,18 @@ CUDA Stream Compaction * When input is: `{41, 17, 34, 0, 19, 24, 28, 8, 12, 14, 5, 45, 31, 27, 11, 41, 45, 42, 27, 36, 41, 4, 2, 3, 42, 32, 21, 16, 18, 45, 47, 26, 21, 38, 19, 12, 17, 49, 35, 44, 3, 11, 22, 33, 23, 14, 41, 11, 3, 18, 47, 44, 12, 7, 37, 9, 23, 41, 29, 28, 16, 35, 40, 0}`, + the output is: + `{0, 0, 2, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 11, 12, 12, 12, 14, 14, 16, 16, 17, 17, 18, 18, 19, 19, 21, 21, 22, 23, 23, 24, 26, 27, 27, 28, 28, 29, 31, 32, 33, 34, 35, 35, 36, 37, 38, 40, 41, 41, 41, 41, 41, 42, 42, 44, 44, 45, 45, 45, 47, 47, 49}`. - I also ran comparison between my radix sort and `thrust::sort` (see [Example Output](#example-output) and [Performance Analysis](#radix-sort)). + + I also ran the comparison between my radix sort and `thrust::sort` (see [Example Output](#example-output) and [Performance Analysis](#radix-sort)). ### Example Output -`SIZE` is $2^{20}$. The test size for non-power-of-two case is `SIZE - 3`. CUDA block size is 128. +`SIZE` is $2^{20} = 1.05 \times 10 ^ 6$. The test size for non-power-of-two case is `SIZE - 3`. CUDA block size is 128. ``` **************** @@ -116,22 +119,61 @@ CUDA block size is 128. #### Scan -![Scan Time Impacted by Array Size (Power of Two)](img/Scan Time Impacted by Array Size Power of Two.png) +When array size is small, the CPU implementation is faster than GPU implementation and the fluctuation in GPU implementation time cost is small. When array size is larger than 2.62e5, both thrust function and my work-efficient implementation outperform my CPU implementation. + +![Scan Time Impacted by Array Size Power of Two](img/Scan Time Impacted by Array Size Power of Two.png) #### Compaction -![Compaction Time Impacted by Array Size (Power of Two)](img/Compaction Time Impacted by Array Size Power of Two.png) +The situation is the same as scan and the turning point is 6.55e4. - +![Compaction Time Impacted by Array Size Power of Two](img/Compaction Time Impacted by Array Size Power of Two.png) + + #### Radix Sort -![Sort Time Impacted by Array Size (Power of Two)](img/Sort Time Impacted by Array Size (Power of Two).png) +My implementation of radix sort is very slower than thrust function. + +![Sort Time Impacted by Array Size Power of Two](img/Sort Time Impacted by Array Size Power of Two.png) + + + +### Performance Impacted by CUDA Block Size + +`SIZE` is $2^{20} = 1.05 \times 10 ^ 6$. + +#### Scan + +![Scan Time Impacted by CUDA Block Size Power of Two](img/Scan Time Impacted by CUDA Block Size Power of Two.png) + +#### Compaction + +![Compaction Time Impacted by CUDA Block Size Power of Two](img/Compaction Time Impacted by CUDA Block Size Power of Two.png) + +#### Radix Sort + +![Radix Sort Time Impacted by CUDA Block Size Power of Two](img/Radix Sort Impacted by CUDA Block Size Power of Two.png) + +## Why is My GPU Approach So Slow? + +The optimization I made to the the work-efficient scan is to avoid Warp Partitioning by compressing the threads: + +![Threads Allocation of the Down Sweep Function](img/Threads Allocation of the Down Sweep Function.png) + +Due to time constraints, I haven't implemeted the shared memory part. I guess this is where the thurst function surpasses mine. + +My radix sort (6 bit)'s time cost is about 10 times as much as my work-efficient scan's. This matches my instinct because radix sort will repeate the scan function in each sort. However, I noticed that the time cost of thrust sort function is not 0 times as much as its scan function. For instance, when array size is 65536, the thrust scan costs 0.04ms while sort costs 0.09ms. This drives me to think if there is more optimizations I can do on radix sort. + +* Roughly optimize the block sizes of each of your implementations for minimal + run time on your GPU. + + * See [Performance Analysis](#performance-impacted-by-cuda-block-size). - +* -## Answers to the Questions +## Some mistakes I made -## Some Thoughts +* At first I put the for loop inside the kernel functions and used a `__syncthreads()` at the begining of each iteration. However, since `__syncthreads()` is block-wise, my result went wrong when the array size exceeded my block size. Then I put the for loop outside the kernel functions. diff --git a/img/Compaction Time Impacted by Array Size Power of Two.png b/img/Compaction Time Impacted by Array Size Power of Two.png index 8ff841d21cd9fa4bba4b6a753c787007f78e1e84..fe1bf9b211edc92ebd05c448433842e8d6da0621 100644 GIT binary patch literal 56075 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