From e3dd02911f34876e22c551ff21482a278a0399b5 Mon Sep 17 00:00:00 2001 From: Sasha Sherstnev Date: Tue, 24 Sep 2013 15:08:57 +0100 Subject: [PATCH] Add GLprobs and MSAprobs to binaries --- binaries/src/GLProbs-1.0/Defaults.h | 120 ++ binaries/src/GLProbs-1.0/FileBuffer.h | 117 ++ binaries/src/GLProbs-1.0/MSA.cpp | 1541 +++++++++++++++++++ binaries/src/GLProbs-1.0/MSA.h | 95 ++ binaries/src/GLProbs-1.0/MSA2.cpp | 1562 ++++++++++++++++++++ binaries/src/GLProbs-1.0/MSAClusterTree.cpp | 153 ++ binaries/src/GLProbs-1.0/MSAClusterTree.h | 27 + binaries/src/GLProbs-1.0/MSADef.h | 26 + binaries/src/GLProbs-1.0/MSAGuideTree.cpp | 327 ++++ binaries/src/GLProbs-1.0/MSAGuideTree.h | 119 ++ binaries/src/GLProbs-1.0/MSAPartProbs.cpp | 1023 +++++++++++++ binaries/src/GLProbs-1.0/MSAProbs.vcproj | 272 ++++ .../MSAProbs.vcproj.STUDENT.LIUY0039.user | 65 + binaries/src/GLProbs-1.0/MSAReadMatrix.cpp | 215 +++ binaries/src/GLProbs-1.0/MSAReadMatrix.h | 151 ++ binaries/src/GLProbs-1.0/MSAdiv3.cpp | 1472 ++++++++++++++++++ binaries/src/GLProbs-1.0/MSAfull.cpp | 1471 ++++++++++++++++++ binaries/src/GLProbs-1.0/MSAgl+l+p+gl.cpp | 1512 +++++++++++++++++++ binaries/src/GLProbs-1.0/Makefile | 16 + binaries/src/GLProbs-1.0/MultiSequence.h | 735 +++++++++ binaries/src/GLProbs-1.0/ProbabilisticModel.h | 1338 +++++++++++++++++ binaries/src/GLProbs-1.0/SafeVector.h | 65 + binaries/src/GLProbs-1.0/ScoreType.h | 368 +++++ binaries/src/GLProbs-1.0/Sequence.h | 444 ++++++ binaries/src/GLProbs-1.0/SparseMatrix.h | 266 ++++ binaries/src/GLProbs-1.0/glprobs | Bin 0 -> 237120 bytes binaries/src/GLProbs-1.0/main.cpp | 16 + binaries/src/MSAProbs-0.9.7/ChangeLog | 9 + binaries/src/MSAProbs-0.9.7/MSAProbs.ncb | Bin 0 -> 2960384 bytes binaries/src/MSAProbs-0.9.7/MSAProbs.sln | 20 + binaries/src/MSAProbs-0.9.7/MSAProbs.suo | Bin 0 -> 28672 bytes binaries/src/MSAProbs-0.9.7/MSAProbs/Defaults.h | 105 ++ binaries/src/MSAProbs-0.9.7/MSAProbs/FileBuffer.h | 117 ++ binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.cpp | 1349 +++++++++++++++++ binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.h | 100 ++ .../src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.cpp | 151 ++ .../src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.h | 27 + binaries/src/MSAProbs-0.9.7/MSAProbs/MSADef.h | 26 + .../src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.cpp | 327 ++++ .../src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.h | 119 ++ .../src/MSAProbs-0.9.7/MSAProbs/MSAPartProbs.cpp | 728 +++++++++ .../src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj | 272 ++++ .../MSAProbs/MSAProbs.vcproj.STUDENT.LIUY0039.user | 65 + .../src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.cpp | 174 +++ .../src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.h | 87 ++ binaries/src/MSAProbs-0.9.7/MSAProbs/Makefile | 16 + .../src/MSAProbs-0.9.7/MSAProbs/MultiSequence.h | 733 +++++++++ .../MSAProbs-0.9.7/MSAProbs/ProbabilisticModel.h | 1365 +++++++++++++++++ binaries/src/MSAProbs-0.9.7/MSAProbs/SafeVector.h | 65 + binaries/src/MSAProbs-0.9.7/MSAProbs/ScoreType.h | 368 +++++ binaries/src/MSAProbs-0.9.7/MSAProbs/Sequence.h | 444 ++++++ .../src/MSAProbs-0.9.7/MSAProbs/SparseMatrix.h | 266 ++++ binaries/src/MSAProbs-0.9.7/MSAProbs/main.cpp | 16 + binaries/src/MSAProbs-0.9.7/MSAProbs/msaprobs | Bin 0 -> 215232 bytes binaries/src/MSAProbs-0.9.7/README | 48 + binaries/src/compilebin.sh | 15 + binaries/src/setexecflag.sh | 9 + 57 files changed, 20537 insertions(+) create mode 100644 binaries/src/GLProbs-1.0/Defaults.h create mode 100644 binaries/src/GLProbs-1.0/FileBuffer.h create mode 100644 binaries/src/GLProbs-1.0/MSA.cpp create mode 100644 binaries/src/GLProbs-1.0/MSA.h create mode 100644 binaries/src/GLProbs-1.0/MSA2.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAClusterTree.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAClusterTree.h create mode 100644 binaries/src/GLProbs-1.0/MSADef.h create mode 100644 binaries/src/GLProbs-1.0/MSAGuideTree.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAGuideTree.h create mode 100644 binaries/src/GLProbs-1.0/MSAPartProbs.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAProbs.vcproj create mode 100644 binaries/src/GLProbs-1.0/MSAProbs.vcproj.STUDENT.LIUY0039.user create mode 100644 binaries/src/GLProbs-1.0/MSAReadMatrix.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAReadMatrix.h create mode 100644 binaries/src/GLProbs-1.0/MSAdiv3.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAfull.cpp create mode 100644 binaries/src/GLProbs-1.0/MSAgl+l+p+gl.cpp create mode 100644 binaries/src/GLProbs-1.0/Makefile create mode 100644 binaries/src/GLProbs-1.0/MultiSequence.h create mode 100644 binaries/src/GLProbs-1.0/ProbabilisticModel.h create mode 100644 binaries/src/GLProbs-1.0/SafeVector.h create mode 100644 binaries/src/GLProbs-1.0/ScoreType.h create mode 100644 binaries/src/GLProbs-1.0/Sequence.h create mode 100644 binaries/src/GLProbs-1.0/SparseMatrix.h create mode 100755 binaries/src/GLProbs-1.0/glprobs create mode 100644 binaries/src/GLProbs-1.0/main.cpp create mode 100644 binaries/src/MSAProbs-0.9.7/ChangeLog create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs.ncb create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs.sln create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs.suo create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/Defaults.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/FileBuffer.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.cpp create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.cpp create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSADef.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.cpp create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAPartProbs.cpp create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj.STUDENT.LIUY0039.user create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.cpp create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/Makefile create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/MultiSequence.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/ProbabilisticModel.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/SafeVector.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/ScoreType.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/Sequence.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/SparseMatrix.h create mode 100644 binaries/src/MSAProbs-0.9.7/MSAProbs/main.cpp create mode 100755 binaries/src/MSAProbs-0.9.7/MSAProbs/msaprobs create mode 100644 binaries/src/MSAProbs-0.9.7/README diff --git a/binaries/src/GLProbs-1.0/Defaults.h b/binaries/src/GLProbs-1.0/Defaults.h new file mode 100644 index 0000000..953cdac --- /dev/null +++ b/binaries/src/GLProbs-1.0/Defaults.h @@ -0,0 +1,120 @@ +///////////////////////////////////////////////////////////////// +// Defaults.h +// +// Default constants for use in MSAPROBS. The emission +// probabilities were computed using the program used to build +// the BLOSUM62 matrix from the BLOCKS 5.0 dataset. Transition +// parameters were obtained via unsupervised EM training on the +// BALIBASE 2.0 benchmark alignment database. +///////////////////////////////////////////////////////////////// + +#ifndef DEFAULTS_H +#define DEFAULTS_H + +#include + +using namespace std; + +/* + float initDistrib1Default[] = { 0.3202854395, 0.3398572505, 0.3398572505 }; + float gapOpen1Default[] = { 0.1375414133, 0.1375414133 }; + float gapExtend1Default[] = { 0.7832147479, 0.7832147479 }; + */ +/* +float initDistrib1Default[] = { 0.6080327034f, 0.1959836632f, 0.1959836632f }; +float gapOpen1Default[] = { 0.01993141696f, 0.01993141696f }; +float gapExtend1Default[] = { 0.7943345308f, 0.7943345308f }; +*/ + +float initDistrib1Default[] = { 0.06188, 0.93812, 0.1959836632f }; +float gapOpen1Default[] = { 0.01993141696f, 0.01993141696f }; +float gapExtend1Default[] = { 0.7943345308f, 0.7943345308f }; + +/* +float initDistrib1Default[] = { 0.2031769156f, 0.7968229055f, 0.05529401079f }; +float gapOpen1Default[] = { 0.006541831419f, 0.006541831419f }; +float gapExtend1Default[] = { 0.3042867482f, 0.3042867482f }; +*/ +/* +float initDistrib1Default[] = { 0.109684445f, 0.8903156519f, 0.01231110841f }; +float gapOpen1Default[] = { 0.01968936995f, 0.01968936995f }; +float gapExtend1Default[] = { 0.5699355602f, 0.5699355602f }; +*/ +float initDistrib2Default[] = { 0.6814756989f, 8.615339902e-05f, + 0.700645f, 0.1591759622f, 0.1591759622 }; +float gapOpen2Default[] = { 0.0119511066f, 0.01993141696f, 0.008008334786f, + 0.008008334786 }; +float gapExtend2Default[] = { 0.3965826333f, 0.7943345308f, 0.8988758326f, + 0.8988758326 }; + +string alphabetDefault = "ARNDCQEGHILKMFPSTWYV"; +float emitSingleDefault[20] = { 0.07831005f, 0.05246024f, 0.04433257f, + 0.05130349f, 0.02189704f, 0.03585766f, 0.05615771f, 0.07783433f, + 0.02601093f, 0.06511648f, 0.09716489f, 0.05877077f, 0.02438117f, + 0.04463228f, 0.03940142f, 0.05849916f, 0.05115306f, 0.01203523f, + 0.03124726f, 0.07343426f }; + +float emitPairsDefault[20][20] = { { 0.02373072f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f }, { 0.00244502f, 0.01775118f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00210228f, 0.00207782f, 0.01281864f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00223549f, 0.00161657f, 0.00353540f, 0.01911178f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f }, { 0.00145515f, 0.00044701f, 0.00042479f, + 0.00036798f, 0.01013470f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00219102f, + 0.00253532f, 0.00158223f, 0.00176784f, 0.00032102f, 0.00756604f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00332218f, 0.00268865f, 0.00224738f, 0.00496800f, + 0.00037956f, 0.00345128f, 0.01676565f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00597898f, + 0.00194865f, 0.00288882f, 0.00235249f, 0.00071206f, 0.00142432f, + 0.00214860f, 0.04062876f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00114353f, 0.00132105f, 0.00141205f, + 0.00097077f, 0.00026421f, 0.00113901f, 0.00131767f, 0.00103704f, + 0.00867996f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, + { 0.00318853f, 0.00138145f, 0.00104273f, 0.00105355f, 0.00094040f, + 0.00100883f, 0.00124207f, 0.00142520f, 0.00059716f, 0.01778263f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { + 0.00449576f, 0.00246811f, 0.00160275f, 0.00161966f, 0.00138494f, + 0.00180553f, 0.00222063f, 0.00212853f, 0.00111754f, 0.01071834f, + 0.03583921f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00331693f, 0.00595650f, 0.00257310f, 0.00252518f, + 0.00046951f, 0.00312308f, 0.00428420f, 0.00259311f, 0.00121376f, + 0.00157852f, 0.00259626f, 0.01612228f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00148878f, 0.00076734f, + 0.00063401f, 0.00047808f, 0.00037421f, 0.00075546f, 0.00076105f, + 0.00066504f, 0.00042237f, 0.00224097f, 0.00461939f, 0.00096120f, + 0.00409522f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { + 0.00165004f, 0.00090768f, 0.00084658f, 0.00069041f, 0.00052274f, + 0.00059248f, 0.00078814f, 0.00115204f, 0.00072545f, 0.00279948f, + 0.00533369f, 0.00087222f, 0.00116111f, 0.01661038f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00230618f, 0.00106268f, + 0.00100282f, 0.00125381f, 0.00034766f, 0.00090111f, 0.00151550f, + 0.00155601f, 0.00049078f, 0.00103767f, 0.00157310f, 0.00154836f, + 0.00046718f, 0.00060701f, 0.01846071f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00631752f, 0.00224540f, 0.00301397f, 0.00285226f, + 0.00094867f, 0.00191155f, 0.00293898f, 0.00381962f, 0.00116422f, + 0.00173565f, 0.00250962f, 0.00312633f, 0.00087787f, 0.00119036f, + 0.00180037f, 0.01346609f, 0.0f, 0.0f, 0.0f, 0.0f }, { + 0.00389995f, 0.00186053f, 0.00220144f, 0.00180488f, 0.00073798f, + 0.00154526f, 0.00216760f, 0.00214841f, 0.00077747f, 0.00248968f, + 0.00302273f, 0.00250862f, 0.00093371f, 0.00107595f, 0.00147982f, + 0.00487295f, 0.01299436f, 0.0f, 0.0f, 0.0f }, { 0.00039119f, + 0.00029139f, 0.00021006f, 0.00016015f, 0.00010666f, 0.00020592f, + 0.00023815f, 0.00038786f, 0.00019097f, 0.00039549f, 0.00076736f, + 0.00028448f, 0.00016253f, 0.00085751f, 0.00015674f, 0.00026525f, + 0.00024961f, 0.00563625f, 0.0f, 0.0f }, { 0.00131840f, + 0.00099430f, 0.00074960f, 0.00066005f, 0.00036626f, 0.00070192f, + 0.00092548f, 0.00089301f, 0.00131038f, 0.00127857f, 0.00219713f, + 0.00100817f, 0.00054105f, 0.00368739f, 0.00047608f, 0.00102648f, + 0.00094759f, 0.00069226f, 0.00999315f, 0.0f }, { 0.00533241f, + 0.00169359f, 0.00136609f, 0.00127915f, 0.00119152f, 0.00132844f, + 0.00178697f, 0.00194579f, 0.00071553f, 0.01117956f, 0.00914460f, + 0.00210897f, 0.00197461f, 0.00256159f, 0.00135781f, 0.00241601f, + 0.00343452f, 0.00038538f, 0.00148001f, 0.02075171f } }; + +#endif diff --git a/binaries/src/GLProbs-1.0/FileBuffer.h b/binaries/src/GLProbs-1.0/FileBuffer.h new file mode 100644 index 0000000..06af54b --- /dev/null +++ b/binaries/src/GLProbs-1.0/FileBuffer.h @@ -0,0 +1,117 @@ +///////////////////////////////////////////////////////////////// +// FileBuffer.h +// +// Buffered file reading. +///////////////////////////////////////////////////////////////// + +#ifndef FILEBUFFER_H +#define FILEBUFFER_H + +#include +#include +#include + +using namespace std; + +const int BufferSize = 1000; + +///////////////////////////////////////////////////////////////// +// FileBuffer +// +// Class for buffering file reading. +///////////////////////////////////////////////////////////////// + +class FileBuffer { + ifstream file; + char buffer[BufferSize]; + int currPos; + int size; + bool isEOF; + bool isValid; + bool canUnget; + +public: + + // Some common routines + + FileBuffer(const char *filename) : + file(filename), currPos(0), size(0), isEOF(false), isValid( + !file.fail()), canUnget(false) { + } + ~FileBuffer() { + close(); + } + bool fail() const { + return !isValid; + } + bool eof() const { + return (!isValid || isEOF); + } + void close() { + file.close(); + isValid = false; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::Get() + // + // Retrieve a character from the file buffer. Returns true if + // and only if a character is read. + ///////////////////////////////////////////////////////////////// + + bool Get(char &ch) { + + // check to make sure that there's more stuff in the file + if (!isValid || isEOF) + return false; + + // if the buffer is empty, it's time to reload it + if (currPos == size) { + file.read(buffer, BufferSize); + size = file.gcount(); + isEOF = (size == 0); + currPos = 0; + if (isEOF) + return false; + } + + // store the read character + ch = buffer[currPos++]; + canUnget = true; + return true; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::UnGet() + // + // Unretrieve the most recently read character from the file + // buffer. Note that this allows only a one-level undo. + ///////////////////////////////////////////////////////////////// + + void UnGet() { + assert(canUnget); + assert(isValid); + assert(currPos > 0); + currPos--; + assert(currPos < size); + isEOF = false; + canUnget = false; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::GetLine() + // + // Retrieve characters of text until a newline character is + // encountered. Terminates properly on end-of-file condition. + ///////////////////////////////////////////////////////////////// + + void GetLine(string &s) { + char ch; + s = ""; + while (Get(ch) && ch != '\n') + s += ch; + } + +}; + +#endif diff --git a/binaries/src/GLProbs-1.0/MSA.cpp b/binaries/src/GLProbs-1.0/MSA.cpp new file mode 100644 index 0000000..0144492 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSA.cpp @@ -0,0 +1,1541 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSA.h" +#include "MSAClusterTree.h" +#include "Defaults.h" + +#ifdef _OPENMP +#include +#endif + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; + +bool enableVerbose = false; +bool enableAnnotation = false; +bool enableClustalWOutput = false; +bool enableAlignOrder = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; + +float cutoff = 0; + +VF initDistrib(NumMatrixTypes); +VF gapOpen(2 * NumInsertStates); +VF gapExtend(2 * NumInsertStates); +VVF emitPairs(256, VF(256, 1e-10)); +VF emitSingle(256, 1e-5); + +string alphabet = alphabetDefault; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +string posteriorProbsFilename = ""; +bool allscores = true; +string infilename; + +int flag_gui = 0; //0: no gui related o/p +//1: gui related o/p generated +int flag_ppscore = 0; //0: no pp score sequence added to o/p fasta alignment +//1: pp score seq added to o/p fasta alignment + +/////////////////////////////// +// global scoring matrix variables +////////////////////////////// +float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +char *aminos, *bases, matrixtype[20] = "gonnet_160"; +int subst_index[26]; + +double sub_matrix[26][26]; +double normalized_matrix[26][26];// add by YE Yongtao +int firstread = 0; //this makes sure that matrices are read only once + +float TEMPERATURE = 5; +int MATRIXTYPE = 160; +int prot_nuc = 0; //0=prot, 1=nucleotide + +float GAPOPEN = 0; +float GAPEXT = 0; +int numThreads = 0; + +//argument support +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +argument_decl argument; + +extern inline void read_sustitution_matrix(char *fileName); +extern void setmatrixtype(int le); +extern inline int matrixtype_to_int(); +extern inline void read_dna_matrix(); +extern inline void read_vtml_la_matrix(); +extern void init_arguments(); + +MSA::MSA(int argc, char* argv[]) { + //parse program parameters + SafeVector sequenceNames = ParseParams(argc, argv); + + //initialize arguments for partition function + init_arguments(); + + ReadParameters(); + //PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + //read the input sequences + MultiSequence *sequences = new MultiSequence(); + assert(sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++) { + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA(sequenceNames[i], true); + } + //allocate space for sequence weights + this->seqsWeights = new int[sequences->GetNumSequences()]; + //initilaize parameters for OPENMP +#ifdef _OPENMP + if(numThreads <= 0) { + numThreads = omp_get_num_procs(); +// cerr << "Automatically detected " << numThreads << " CPU cores" << endl; + } +// cerr <<"Enabling OpenMP (with "<WriteALN(*alignOutFile); + } else { + alignment->WriteMFA(*alignOutFile); + } + + //release resources + delete[] this->seqsWeights; + delete alignment; + delete sequences; +} +MSA::~MSA() { + /*close the output file*/ + if (alignOutFileName.length() > 0) { + ((std::ofstream*) alignOutFile)->close(); + } +} +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints MSAPROBS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void MSA::PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename) { + + // print parameters to the screen + cerr << message << endl << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) + cerr << setprecision(10) << initDistrib[i] << " "; + cerr << "}" << endl << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapOpen[i] << " "; + cerr << "}" << endl << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapExtend[i] << " "; + cerr << "}" << endl << endl; + + // if a file name is specified + if (filename) { + + // attempt to open the file for writing + FILE *file = fopen(filename, "w"); + if (!file) { + cerr << "ERROR: Unable to write parameter file: " << filename + << endl; + exit(1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) + fprintf(file, "%.10f ", initDistrib[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapOpen[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapExtend[i]); + fprintf(file, "\n"); + fprintf(file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) + fprintf(file, "%.10f ", + emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf(file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf(file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf(file, "\n"); + fclose(file); + } +} + +///////////////////////////////////////////////////////////////// +// doAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +extern VF *ComputePostProbs(int a, int b, string seq1, string seq2); +MultiSequence* MSA::doAlign(MultiSequence *sequences, + const ProbabilisticModel &model, int levelid) { + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + //create distance matrix + VVF distances(numSeqs, VF(numSeqs, 0)); + //creat sparseMatrices + SafeVector > sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + // do all pairwise alignments for posterior probability matrices +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + //posterior probability matrix + VF* posterior; + +//low similarity use local model + if(levelid == 1){ + + VF *forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + delete forward; + delete backward; + + } +//high similarity use global model + else if(levelid >= 2) posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + +//extreme low or extreme high similarity use combined model + else{ + +//probcons + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix(seq1, seq2); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2); + assert(backward); + // compute posterior probability matrix from HMM + VF *probcons_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward); + assert(probcons_posterior); + delete forward; + delete backward; + +//probalign + VF *probalign_posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + assert(probalign_posterior); +//local + forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + assert(posterior); + delete forward; + delete backward; +//combined model + //merge probalign + local + probcons + VF::iterator ptr1 = probcons_posterior->begin(); + VF::iterator ptr2 = probalign_posterior->begin(); + VF::iterator ptr = posterior->begin(); + for (int i = 0; i <= seq1->GetLength(); i++) { + for (int j = 0; j <= seq2->GetLength(); j++) { + float v1 = *ptr1; + float v2 = *ptr2; + float v3 = *ptr; + *ptr = sqrt((v1*v1 + v2*v2 + v3*v3)/3); + ptr1++; + ptr2++; + ptr++; + } + } + delete probcons_posterior; + delete probalign_posterior; + } + + assert(posterior); + // perform the pairwise sequence alignment + pair *, float> alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); + + //compute expected accuracy + distances[a][b] = distances[b][a] = 1.0f - alignment.second + / min(seq1->GetLength(), seq2->GetLength()); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + + delete posterior; + delete alignment.first; +#ifndef _OPENMP + } +#endif + } + + //create the guide tree + this->tree = new MSAClusterTree(this, distances, numSeqs); + this->tree->create(); + + // perform the consistency transformation the desired number of times + float* fweights = new float[numSeqs]; + for (int r = 0; r < numSeqs; r++) { + fweights[r] = ((float) seqsWeights[r]) / INT_MULTIPLY; + fweights[r] *= 10; + } + for (int r = 0; r < numConsistencyReps; r++) { + SafeVector > newSparseMatrices = + DoRelaxation(fweights, sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + delete[] fweights; +#ifdef _OPENMP + delete [] seqsPairs; +#endif + + //compute the final multiple sequence alignment + MultiSequence *finalAlignment = ComputeFinalAlignment(this->tree, sequences, + sparseMatrices, model,levelid); + + // build annotation + if (enableAnnotation) { + WriteAnnotation(finalAlignment, sparseMatrices); + } + //destroy the guide tree + delete this->tree; + this->tree = 0; + + // delete sparse matrices + for (int a = 0; a < numSeqs - 1; a++) { + for (int b = a + 1; b < numSeqs; b++) { + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + + return finalAlignment; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger(char *data, int *val) { + char *endPtr; + long int retVal; + + assert(val); + + errno = 0; + retVal = strtol(data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) + return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) + return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat(char *data, float *val) { + char *endPtr; + double retVal; + + assert(val); + + errno = 0; + retVal = strtod(data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) + return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void MSA::ReadParameters() { + + ifstream data; + + emitPairs = VVF(256, VF(256, 1e-10)); + emitSingle = VF(256, 1e-5); + + // read initial state distribution and transition parameters + if (parametersInputFilename == string("")) { + if (NumInsertStates == 1) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend1Default[i]; + } else if (NumInsertStates == 2) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend2Default[i]; + } else { + cerr + << "ERROR: No default initial distribution/parameter settings exist" + << endl << " for " << NumInsertStates + << " pairs of insert states. Use --paramfile." << endl; + exit(1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++) { + emitSingle[(unsigned char) tolower(alphabet[i])] = + emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = + emitSingleDefault[i]; + for (int j = 0; j <= i; j++) { + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + } + } + } else { + data.open(parametersInputFilename.c_str()); + if (data.fail()) { + cerr << "ERROR: Unable to read parameter file: " + << parametersInputFilename << endl; + exit(1); + } + + string line[3]; + for (int i = 0; i < 3; i++) { + if (!getline(data, line[i])) { + cerr + << "ERROR: Unable to read transition parameters from parameter file: " + << parametersInputFilename << endl; + exit(1); + } + } + istringstream data2; + data2.clear(); + data2.str(line[0]); + for (int i = 0; i < NumMatrixTypes; i++) + data2 >> initDistrib[i]; + data2.clear(); + data2.str(line[1]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapOpen[i]; + data2.clear(); + data2.str(line[2]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapExtend[i]; + + if (!getline(data, line[0])) { + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " + << parametersInputFilename << endl; + exit(1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); + data2.str(line[0]); + while (data2 >> token) + alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) { + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++) { + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// +void MSA::printUsage() { + cerr + << "************************************************************************" + << endl + << "\tMSAPROBS is a open-source protein multiple sequence alignment algorithm" + << endl + << "\tbased on pair hidden markov model and partition function postirior" + << endl + << "\tprobabilities. If any comments or problems, please contact" + << endl + << "\tLiu Yongchao(liuy0039@ntu.edu.sg or nkcslyc@hotmail.com)" + << endl + << "*************************************************************************" + << endl << "Usage:" << endl + << " msaprobs [OPTION]... [infile]..." << endl << endl + << "Description:" << endl + << " Align sequences in multi-FASTA format" << endl << endl + << " -o, --outfile " << endl + << " specify the output file name (STDOUT by default)" + << endl << " -num_threads " << endl + << " specify the number of threads used, and otherwise detect automatically" + << endl << " -clustalw" << endl + << " use CLUSTALW output format instead of FASTA format" + << endl << endl << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " + << MAX_CONSISTENCY_REPS << " (default: " << numConsistencyReps + << ") passes of consistency transformation" << endl << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS + << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS << " (default: " + << numIterativeRefinementReps << ") passes of iterative-refinement" + << endl << endl << " -v, --verbose" << endl + << " report progress while aligning (default: " + << (enableVerbose ? "on" : "off") << ")" << endl << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" + << endl << endl << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << " -version " << endl + << " print out version of MSAPROBS " << endl << endl; +} +SafeVector MSA::ParseParams(int argc, char **argv) { + if (argc < 2) { + printUsage(); + exit(1); + } + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + //help + if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-?")) { + printUsage(); + exit(1); + //output file name + } else if (!strcmp(argv[i], "-o") + || !strcmp(argv[i], "--outfile")) { + if (i < argc - 1) { + alignOutFileName = argv[++i]; //get the file name + } else { + cerr << "ERROR: String expected for option " << argv[i] + << endl; + exit(1); + } + // parameter file + } else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + //number of threads used + } else if (!strcmp(argv[i], "-p") + || !strcmp(argv[i], "-num_threads")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << " ERROR: invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < 0) { + tempInt = 0; + } + numThreads = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + // number of consistency transformations + } else if (!strcmp(argv[i], "-c") + || !strcmp(argv[i], "--consistency")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_CONSISTENCY_REPS + || tempInt > MAX_CONSISTENCY_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " + << MAX_CONSISTENCY_REPS << "." << endl; + exit(1); + } else { + numConsistencyReps = tempInt; + } + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp(argv[i], "-ir") + || !strcmp(argv[i], "--iterative-refinement")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS + || tempInt > MAX_ITERATIVE_REFINEMENT_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " + << MAX_ITERATIVE_REFINEMENT_REPS << "." + << endl; + exit(1); + } else + numIterativeRefinementReps = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // annotation files + else if (!strcmp(argv[i], "-annot")) { + enableAnnotation = true; + if (i < argc - 1) { + annotationFilename = argv[++i]; + } else { + cerr << "ERROR: FILENAME expected for option " << argv[i] + << endl; + exit(1); + } + } + + // clustalw output format + else if (!strcmp(argv[i], "-clustalw")) { + enableClustalWOutput = true; + } + + // cutoff + else if (!strcmp(argv[i], "-co") || !strcmp(argv[i], "--cutoff")) { + if (i < argc - 1) { + if (!GetFloat(argv[++i], &tempFloat)) { + cerr + << "ERROR: Invalid floating-point value following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempFloat < 0 || tempFloat > 1) { + cerr << "ERROR: For option " << argv[i - 1] + << ", floating-point value must be between 0 and 1." + << endl; + exit(1); + } else + cutoff = tempFloat; + } + } else { + cerr << "ERROR: Floating-point value expected for option " + << argv[i] << endl; + exit(1); + } + } + + // verbose reporting + else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + enableVerbose = true; + } + + // alignment order + else if (!strcmp(argv[i], "-a") + || !strcmp(argv[i], "--alignment-order")) { + enableAlignOrder = true; + } + + //print out version + else if (!strcmp(argv[i], "-version")) { + cerr << "MSAPROBS version " << VERSION << endl; + exit(1); + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit(1); + } + } else { + sequenceNames.push_back(string(argv[i])); + } + } + + /*check the output file name*/ + cerr << "-------------------------------------" << endl; + if (alignOutFileName.length() == 0) { + cerr << "The final alignments will be printed out to STDOUT" << endl; + alignOutFile = &std::cout; + } else { + cerr << "Open the output file " << alignOutFileName << endl; + alignOutFile = new ofstream(alignOutFileName.c_str(), + ios::binary | ios::out | ios::trunc); + } + cerr << "-------------------------------------" << endl; + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +MultiSequence* MSA::ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + MultiSequence *result; + + // check if this is a node of the alignment tree + //if (tree->GetSequenceLabel() == -1){ + if (tree->leaf == NODE) { + MultiSequence *alignLeft = ProcessTree(tree->left, sequences, + sparseMatrices, model); + MultiSequence *alignRight = ProcessTree(tree->right, sequences, + sparseMatrices, model); + + assert(alignLeft); + assert(alignRight); + + result = AlignAlignments(alignLeft, alignRight, sparseMatrices, model); + assert(result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); + assert(result); + //result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + result->AddSequence(sequences->GetSequence(tree->idx)->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::ComputeFinalAlignment(MSAGuideTree*tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, int levelid) { + MultiSequence *alignment = ProcessTree(tree->getRoot(), sequences, + sparseMatrices, model); + + SafeVector oldOrdering; + int numSeqs = alignment->GetNumSequences(); + if (enableAlignOrder) { + for (int i = 0; i < numSeqs; i++) + oldOrdering.push_back(alignment->GetSequence(i)->GetSortLabel()); + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree); + /* + int numSeqs = alignment->GetNumSequences(); + //if(numSeqs < numIterativeRefinementReps){ + for(int iter = 0; iter < 5; iter ++){ + for(int i = 0; i < numSeqs - 1; i++){ + DoIterativeRefinementTreeNode(sparseMatrices, model, alignment, i); + } + } + //}*/ +/* + //DoIterativeRefinement() return 1,2: this refinement unsuccessful + if(levelid == 3) numIterativeRefinementReps=10; + int ineffectiveness = 0; + for (int i = 0; i < numIterativeRefinementReps; i++){ + int flag = DoIterativeRefinement(sparseMatrices, model, alignment); + if(numSeqs > 35 && levelid < 3){ + if(flag > 0){ + if(numIterativeRefinementReps < 10*numSeqs) + numIterativeRefinementReps ++; + if(flag == 1) ineffectiveness ++; + } + //else ineffectiveness = 0; + if(ineffectiveness > numSeqs && i >100 ) break; + } + } +*/ + + //if(levelid == 3) numIterativeRefinementReps=10; + for (int i = 0; i < numIterativeRefinementReps; i++) + DoIterativeRefinement(sparseMatrices, model, alignment); + + cerr << endl; + + if (oldOrdering.size() > 0) { + for (int i = 0; i < (int) oldOrdering.size(); i++) { + alignment->GetSequence(i)->SetSortLabel(oldOrdering[i]); + } + } + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::AlignAlignments(MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + // print some info about the alignment + if (enableVerbose) { + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } +#if 0 + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), align1, align2, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + + pair *, float> alignment; + //perform alignment + alignment = model.ComputeAlignment(align1->GetSequence(0)->GetLength(), + align2->GetSequence(0)->GetLength(), *posterior); + + delete posterior; + + if (enableVerbose) { + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min(align1->GetSequence(i)->GetLength(), + align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence( + align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence( + align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the weighted probabilistic consistency transformation. +// 1 +///////////////////////////////////////////////////////////////// + +SafeVector > MSA::DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + + // for every pair of sequences +#ifdef _OPENMP + int pairIdx; +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int i = seqsPairs[pairIdx].seq1; + int j = seqsPairs[pairIdx].seq2; + float wi = seqsWeights[i]; + float wj = seqsWeights[j]; +#else + for (int i = 0; i < numSeqs; i++) { + float wi = seqsWeights[i]; + for (int j = i + 1; j < numSeqs; j++) { + float wj = seqsWeights[j]; +#endif + Sequence *seq1 = sequences->GetSequence(i); + Sequence *seq2 = sequences->GetSequence(j); + + if (enableVerbose) { +#ifdef _OPENMP +#pragma omp critical +#endif + cerr << "Relaxing (" << i + 1 << ") " << seq1->GetHeader() + << " vs. " << "(" << j + 1 << ") " << seq2->GetHeader() + << ": "; + } + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + float w = wi * wi * wj + wi * wj * wj; + float sumW = w; + for (int k = 0; k < (seq1Length + 1) * (seq2Length + 1); k++) { + //posterior[k] = w*posterior[k]; + posterior[k] += posterior[k]; + } + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) { + if (k != i && k != j) { + float wk = seqsWeights[k]; + float w = wi * wj * wk; + sumW += w; + if (k < i) + Relax1(w, sparseMatrices[k][i], sparseMatrices[k][j], + posterior); + else if (k > i && k < j) + Relax(w, sparseMatrices[i][k], sparseMatrices[k][j], + posterior); + else { + SparseMatrix *temp = + sparseMatrices[j][k]->ComputeTranspose(); + Relax(w, sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + } + //cerr<<"sumW "<::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend) { + + // zero out all cells until the first filled column + while (curr < XYptr->first) { + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length) { + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; +#ifndef _OPENMP + } +#endif + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior) { + + assert(matXZ); + assert(matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert(matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++) { + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * XZval * ZYptr->second; + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax1(float weight, SparseMatrix *matZX, SparseMatrix *matZY, + VF &posterior) { + + assert(matZX); + assert(matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++) { + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * ZXval * ZYptr->second; + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +// return 0: successful refinement, 1: ineffective refinement, 2: random problem +///////////////////////////////////////////////////////////////// +int MSA::DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + int i; + // create two separate groups + for (i = 0; i < numSeqs; i++) { + int index = rand(); + if (index % 2) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) return 2; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + +//start add by Yongtao +#if 1 + VF *posterior = model.BuildPosterior (groupOneSeqs, groupTwoSeqs, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), groupOneSeqs, groupTwoSeqs, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + SafeVector::iterator> oldOnePtrs(groupOne.size()); + SafeVector::iterator> oldTwoPtrs(groupTwo.size()); + i=0; + for (set::const_iterator iter = groupOne.begin(); + iter != groupOne.end(); ++iter) { + oldOnePtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + i=0; + for (set::const_iterator iter = groupTwo.begin(); + iter != groupTwo.end(); ++iter) { + oldTwoPtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + + VF &posteriorArr = *posterior; + int oldLength = alignment->GetSequence(0)->GetLength(); + int groupOneindex=0; int groupTwoindex=0; + float accuracy_before = 0; + int j; + for (i = 1; i <= oldLength; i++) { + // check to see if there is a gap in every sequence of the set + bool foundOne = false; + for (j = 0; !foundOne && j < (int) groupOne.size(); j++) + foundOne = (oldOnePtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundOne) groupOneindex ++; + bool foundTwo = false; + for (j = 0; !foundTwo && j < (int) groupTwo.size(); j++) + foundTwo = (oldTwoPtrs[j][i] != '-'); + if (foundTwo) groupTwoindex ++; + if(foundOne && foundTwo) accuracy_before += + posteriorArr[groupOneindex * (groupTwoSeqs->GetSequence(0)->GetLength() + 1) + groupTwoindex]; + } + + pair *, float> refinealignment; + //perform alignment + refinealignment = model.ComputeAlignment(groupOneSeqs->GetSequence(0)->GetLength(), + groupTwoSeqs->GetSequence(0)->GetLength(), *posterior); + delete posterior; + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < groupOneSeqs->GetNumSequences(); i++) + result->AddSequence( + groupOneSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'X')); + for (int i = 0; i < groupTwoSeqs->GetNumSequences(); i++) + result->AddSequence( + groupTwoSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'Y')); + // free temporary alignment + delete refinealignment.first; + delete alignment; + alignment = result; + delete groupOneSeqs; + delete groupTwoSeqs; + if(accuracy_before == refinealignment.second) return 1; + else return 0; +} + + +void MSA::DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + vector inGroup1; + inGroup1.resize(numSeqs); + for (int i = 0; i < numSeqs; i++) { + inGroup1[i] = false; + } + + AlignmentOrder* orders = this->tree->getAlignOrders(); + AlignmentOrder* order = &orders[nodeIndex]; + for (int i = 0; i < order->leftNum; i++) { + int si = order->leftLeafs[i]; + inGroup1[si] = true; + } + for (int i = 0; i < order->rightNum; i++) { + int si = order->rightLeafs[i]; + inGroup1[si] = true; + } + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + if (inGroup1[i]) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void MSA::WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices) { + ofstream outfile(annotationFilename.c_str()); + + if (outfile.fail()) { + cerr << "ERROR: Unable to write annotation file." << endl; + exit(1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position(numSeqs, 0); + SafeVector::iterator> seqs(numSeqs); + for (int i = 0; i < numSeqs; i++) + seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve(numSeqs); + + SafeVector lab; + for (int i = 0; i < numSeqs; i++) + lab.push_back(alignment->GetSequence(i)->GetSortLabel()); + + // for every column + for (int i = 1; i <= alignLength; i++) { + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++) { + if (seqs[j][i] != '-') { + active.push_back(make_pair(lab[j], ++position[j])); + } + } + + sort(active.begin(), active.end()); + outfile << setw(4) << ComputeScore(active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int MSA::ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices) { + + if (active.size() <= 1) + return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++) { + for (int j = i + 1; j < (int) active.size(); j++) { + val += sparseMatrices[active[i].first][active[j].first]->GetValue( + active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} + +///////////////////////////////////////////////////////////////// +// ComputeSimilarity () +// +// Computes the average similarity for a particular family. +// extreme low similarity(<=25%) return 0 +// low similarity(<=40%) return 1 +// high similarity(<=70%) return 2 +// extreme high similarity(>70%) return 3 +///////////////////////////////////////////////////////////////// +int MSA::AdjustmentTest(MultiSequence *sequences,const ProbabilisticModel &model){ + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + //average identity for all sequences + float identity = 0; + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + + // do all pairwise alignments for family similarity +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + pair *, float> alignment = model.ComputeViterbiAlignment(seq1,seq2); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + float N_correct_match = 0; + //float N_alignment = 0; + int i = 1;int j = 1; + for (SafeVector::iterator iter = alignment.first->begin(); + iter != alignment.first->end(); ++iter){ + //N_alignment += 1; + if (*iter == 'B'){ + unsigned char c1 = (unsigned char) iter1[i++]; + unsigned char c2 = (unsigned char) iter2[j++]; + if(c1==c2) N_correct_match += 1; + } + else if(*iter == 'X') i++; + else if(*iter == 'Y') j++; + } + if(i!= seq1->GetLength()+1 || j!= seq2->GetLength() + 1 ) cerr << "similarity error"<< endl; + identity += N_correct_match / alignment.first->size(); + delete alignment.first; +#ifndef _OPENMP + } +#endif + } + identity /= numPairs; +/* +FILE *fi = fopen ("accuracy", "a"); +fprintf (fi, " %.10f ", similarity); fprintf (fi, "\n"); +fclose (fi); +*/ + + //adapative + if( identity <= 0.15 ) initDistrib[2] = 0.143854; + else if( identity <= 0.2 ) initDistrib[2] = 0.191948; + else if( identity <= 0.25 ) initDistrib[2] = 0.170705; + else if( identity <= 0.3 ) initDistrib[2] = 0.100675; + else if( identity <= 0.35 ) initDistrib[2] = 0.090755; + else if( identity <= 0.4 ) initDistrib[2] = 0.146188; + else if( identity <= 0.45 ) initDistrib[2] = 0.167858; + else if( identity <= 0.5) initDistrib[2] = 0.250769; + + + if( identity <= 0.25 ) return 0; + else if( identity <= 0.4) return 1; + else if( identity <= 0.7) return 2; + else return 3; + +} diff --git a/binaries/src/GLProbs-1.0/MSA.h b/binaries/src/GLProbs-1.0/MSA.h new file mode 100644 index 0000000..2e37e85 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSA.h @@ -0,0 +1,95 @@ +#ifndef _MSA_H +#define _MSA_H +#include "MSADef.h" +#include "MSAGuideTree.h" + +#include "SafeVector.h" +#include "MultiSequence.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "SparseMatrix.h" +#include +using namespace std; + +class MSAGuideTree; +struct TreeNode; +class MSA { +public: + MSA(int argc, char* argv[]); + ~MSA(); + + static void getSysTime(double * dtime); + MSAGuideTree* getGuideTree() { + return tree; + } + int * getSeqsWeights() { + return seqsWeights; + } +private: + //print usage + void printUsage(); + //do multiple sequence alignment + void doAlign(); + + //for sequence weights + void createSeqsWeights(int seqsNum); + void releaseSeqsWeights(); + + //weights of sequences + int * seqsWeights; + //guide tree + MSAGuideTree* tree; + //output file + string alignOutFileName; + std::ostream* alignOutFile; +private: + SafeVector ParseParams(int argc, char *argv[]); + void PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename); + + SafeVector PostProbsParseParams(int argc, char **argv); + MultiSequence *doAlign(MultiSequence *sequence, + const ProbabilisticModel &model, int levelid); + void ReadParameters(); + MultiSequence* ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); + MultiSequence *ComputeFinalAlignment(MSAGuideTree *tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model,int levelid); + MultiSequence *AlignAlignments(MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); + SafeVector > DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices); + void Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior); + void Relax1(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior); + int DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment); + void DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex); + void WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices); + int ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices); + int AdjustmentTest(MultiSequence *sequences,const ProbabilisticModel &model); +#ifdef _OPENMP + //private struct + struct SeqsPair { + int seq1; + int seq2; + }; + int numPairs; + SeqsPair* seqsPairs; +#endif +}; + +#endif diff --git a/binaries/src/GLProbs-1.0/MSA2.cpp b/binaries/src/GLProbs-1.0/MSA2.cpp new file mode 100644 index 0000000..f27a7bc --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSA2.cpp @@ -0,0 +1,1562 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSA.h" +#include "MSAClusterTree.h" +#include "Defaults.h" + +#ifdef _OPENMP +#include +#endif + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; + +bool enableVerbose = false; +bool enableAnnotation = false; +bool enableClustalWOutput = false; +bool enableAlignOrder = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; + +float cutoff = 0; + +VF initDistrib(NumMatrixTypes); +VF gapOpen(2 * NumInsertStates); +VF gapExtend(2 * NumInsertStates); +VVF emitPairs(256, VF(256, 1e-10)); +VF emitSingle(256, 1e-5); + +string alphabet = alphabetDefault; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +string posteriorProbsFilename = ""; +bool allscores = true; +string infilename; + +int flag_gui = 0; //0: no gui related o/p +//1: gui related o/p generated +int flag_ppscore = 0; //0: no pp score sequence added to o/p fasta alignment +//1: pp score seq added to o/p fasta alignment + +/////////////////////////////// +// global scoring matrix variables +////////////////////////////// +float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +char *aminos, *bases, matrixtype[20] = "gonnet_160"; +int subst_index[26]; + +double sub_matrix[26][26]; +double normalized_matrix[26][26];// add by YE Yongtao +int firstread = 0; //this makes sure that matrices are read only once + +float TEMPERATURE = 5; +int MATRIXTYPE = 160; +int prot_nuc = 0; //0=prot, 1=nucleotide + +float GAPOPEN = 0; +float GAPEXT = 0; +int numThreads = 0; + +//argument support +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +argument_decl argument; + +extern inline void read_sustitution_matrix(char *fileName); +extern void setmatrixtype(int le); +extern inline int matrixtype_to_int(); +extern inline void read_dna_matrix(); +extern inline void read_vtml_la_matrix(); +extern void init_arguments(); + +MSA::MSA(int argc, char* argv[]) { + //parse program parameters + SafeVector sequenceNames = ParseParams(argc, argv); + + //initialize arguments for partition function + init_arguments(); + + ReadParameters(); + //PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + //read the input sequences + MultiSequence *sequences = new MultiSequence(); + assert(sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++) { + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA(sequenceNames[i], true); + } + //allocate space for sequence weights + this->seqsWeights = new int[sequences->GetNumSequences()]; + //initilaize parameters for OPENMP +#ifdef _OPENMP + if(numThreads <= 0) { + numThreads = omp_get_num_procs(); + cerr << "Automatically detected " << numThreads << " CPU cores" << endl; + } + cerr <<"Enabling OpenMP (with "<WriteALN(*alignOutFile); + } else { + alignment->WriteMFA(*alignOutFile); + } + //release resources + delete[] this->seqsWeights; + delete alignment; +*/ + delete sequences; +} +MSA::~MSA() { + /*close the output file*/ + if (alignOutFileName.length() > 0) { + ((std::ofstream*) alignOutFile)->close(); + } +} +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints MSAPROBS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void MSA::PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename) { + + // print parameters to the screen + cerr << message << endl << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) + cerr << setprecision(10) << initDistrib[i] << " "; + cerr << "}" << endl << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapOpen[i] << " "; + cerr << "}" << endl << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapExtend[i] << " "; + cerr << "}" << endl << endl; + + // if a file name is specified + if (filename) { + + // attempt to open the file for writing + FILE *file = fopen(filename, "w"); + if (!file) { + cerr << "ERROR: Unable to write parameter file: " << filename + << endl; + exit(1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) + fprintf(file, "%.10f ", initDistrib[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapOpen[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapExtend[i]); + fprintf(file, "\n"); + fprintf(file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) + fprintf(file, "%.10f ", + emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf(file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf(file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf(file, "\n"); + fclose(file); + } +} + +///////////////////////////////////////////////////////////////// +// doAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +extern VF *ComputePostProbs(int a, int b, string seq1, string seq2); +MultiSequence* MSA::doAlign(MultiSequence *sequences, + const ProbabilisticModel &model, int levelid) { + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + //create distance matrix + VVF distances(numSeqs, VF(numSeqs, 0)); + //creat sparseMatrices + SafeVector > sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + // do all pairwise alignments for posterior probability matrices +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + //posterior probability matrix + VF* posterior; + + +//high similarity use global model + //if(levelid == 2) + if(1) posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + +/* +//low similarity use local model + else if(levelid == 1){ + VF *forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + delete forward; + delete backward; + } + +//extreme low or extreme high similarity use combined model + else{ + +//probcons + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix(seq1, seq2); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2); + assert(backward); + // compute posterior probability matrix from HMM + VF *probcons_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward); + assert(probcons_posterior); + delete forward; + delete backward; + +//probalign + VF *probalign_posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + assert(probalign_posterior); +//local + forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + assert(posterior); + delete forward; + delete backward; +//combined model + //merge probalign + local + probcons + VF::iterator ptr1 = probcons_posterior->begin(); + VF::iterator ptr2 = probalign_posterior->begin(); + VF::iterator ptr = posterior->begin(); + for (int i = 0; i <= seq1->GetLength(); i++) { + for (int j = 0; j <= seq2->GetLength(); j++) { + float v1 = *ptr1; + float v2 = *ptr2; + float v3 = *ptr; + *ptr = sqrt((v1*v1 + v2*v2 + v3*v3)/3); + ptr1++; + ptr2++; + ptr++; + } + } + delete probcons_posterior; + delete probalign_posterior; + } +*/ + assert(posterior); + // perform the pairwise sequence alignment + pair *, float> alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); + + //compute expected accuracy + distances[a][b] = distances[b][a] = 1.0f - alignment.second + / min(seq1->GetLength(), seq2->GetLength()); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + + delete posterior; + delete alignment.first; +#ifndef _OPENMP + } +#endif + } + + //create the guide tree + this->tree = new MSAClusterTree(this, distances, numSeqs); + this->tree->create(); + + // perform the consistency transformation the desired number of times + float* fweights = new float[numSeqs]; + for (int r = 0; r < numSeqs; r++) { + fweights[r] = ((float) seqsWeights[r]) / INT_MULTIPLY; + fweights[r] *= 10; + } + for (int r = 0; r < numConsistencyReps; r++) { + SafeVector > newSparseMatrices = + DoRelaxation(fweights, sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + delete[] fweights; +#ifdef _OPENMP + delete [] seqsPairs; +#endif + + //compute the final multiple sequence alignment + MultiSequence *finalAlignment = ComputeFinalAlignment(this->tree, sequences, + sparseMatrices, model); + + // build annotation + if (enableAnnotation) { + WriteAnnotation(finalAlignment, sparseMatrices); + } + //destroy the guide tree + delete this->tree; + this->tree = 0; + + // delete sparse matrices + for (int a = 0; a < numSeqs - 1; a++) { + for (int b = a + 1; b < numSeqs; b++) { + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + + return finalAlignment; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger(char *data, int *val) { + char *endPtr; + long int retVal; + + assert(val); + + errno = 0; + retVal = strtol(data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) + return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) + return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat(char *data, float *val) { + char *endPtr; + double retVal; + + assert(val); + + errno = 0; + retVal = strtod(data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) + return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void MSA::ReadParameters() { + + ifstream data; + + emitPairs = VVF(256, VF(256, 1e-10)); + emitSingle = VF(256, 1e-5); + + // read initial state distribution and transition parameters + if (parametersInputFilename == string("")) { + if (NumInsertStates == 1) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend1Default[i]; + } else if (NumInsertStates == 2) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend2Default[i]; + } else { + cerr + << "ERROR: No default initial distribution/parameter settings exist" + << endl << " for " << NumInsertStates + << " pairs of insert states. Use --paramfile." << endl; + exit(1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++) { + emitSingle[(unsigned char) tolower(alphabet[i])] = + emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = + emitSingleDefault[i]; + for (int j = 0; j <= i; j++) { + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + } + } + } else { + data.open(parametersInputFilename.c_str()); + if (data.fail()) { + cerr << "ERROR: Unable to read parameter file: " + << parametersInputFilename << endl; + exit(1); + } + + string line[3]; + for (int i = 0; i < 3; i++) { + if (!getline(data, line[i])) { + cerr + << "ERROR: Unable to read transition parameters from parameter file: " + << parametersInputFilename << endl; + exit(1); + } + } + istringstream data2; + data2.clear(); + data2.str(line[0]); + for (int i = 0; i < NumMatrixTypes; i++) + data2 >> initDistrib[i]; + data2.clear(); + data2.str(line[1]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapOpen[i]; + data2.clear(); + data2.str(line[2]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapExtend[i]; + + if (!getline(data, line[0])) { + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " + << parametersInputFilename << endl; + exit(1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); + data2.str(line[0]); + while (data2 >> token) + alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) { + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++) { + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// +void MSA::printUsage() { + cerr + << "************************************************************************" + << endl + << "\tMSAPROBS is a open-source protein multiple sequence alignment algorithm" + << endl + << "\tbased on pair hidden markov model and partition function postirior" + << endl + << "\tprobabilities. If any comments or problems, please contact" + << endl + << "\tLiu Yongchao(liuy0039@ntu.edu.sg or nkcslyc@hotmail.com)" + << endl + << "*************************************************************************" + << endl << "Usage:" << endl + << " msaprobs [OPTION]... [infile]..." << endl << endl + << "Description:" << endl + << " Align sequences in multi-FASTA format" << endl << endl + << " -o, --outfile " << endl + << " specify the output file name (STDOUT by default)" + << endl << " -num_threads " << endl + << " specify the number of threads used, and otherwise detect automatically" + << endl << " -clustalw" << endl + << " use CLUSTALW output format instead of FASTA format" + << endl << endl << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " + << MAX_CONSISTENCY_REPS << " (default: " << numConsistencyReps + << ") passes of consistency transformation" << endl << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS + << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS << " (default: " + << numIterativeRefinementReps << ") passes of iterative-refinement" + << endl << endl << " -v, --verbose" << endl + << " report progress while aligning (default: " + << (enableVerbose ? "on" : "off") << ")" << endl << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" + << endl << endl << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << " -version " << endl + << " print out version of MSAPROBS " << endl << endl; +} +SafeVector MSA::ParseParams(int argc, char **argv) { + if (argc < 2) { + printUsage(); + exit(1); + } + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + //help + if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-?")) { + printUsage(); + exit(1); + //output file name + } else if (!strcmp(argv[i], "-o") + || !strcmp(argv[i], "--outfile")) { + if (i < argc - 1) { + alignOutFileName = argv[++i]; //get the file name + } else { + cerr << "ERROR: String expected for option " << argv[i] + << endl; + exit(1); + } + // parameter file + } else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + //number of threads used + } else if (!strcmp(argv[i], "-p") + || !strcmp(argv[i], "-num_threads")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << " ERROR: invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < 0) { + tempInt = 0; + } + numThreads = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + // number of consistency transformations + } else if (!strcmp(argv[i], "-c") + || !strcmp(argv[i], "--consistency")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_CONSISTENCY_REPS + || tempInt > MAX_CONSISTENCY_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " + << MAX_CONSISTENCY_REPS << "." << endl; + exit(1); + } else { + numConsistencyReps = tempInt; + } + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp(argv[i], "-ir") + || !strcmp(argv[i], "--iterative-refinement")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS + || tempInt > MAX_ITERATIVE_REFINEMENT_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " + << MAX_ITERATIVE_REFINEMENT_REPS << "." + << endl; + exit(1); + } else + numIterativeRefinementReps = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // annotation files + else if (!strcmp(argv[i], "-annot")) { + enableAnnotation = true; + if (i < argc - 1) { + annotationFilename = argv[++i]; + } else { + cerr << "ERROR: FILENAME expected for option " << argv[i] + << endl; + exit(1); + } + } + + // clustalw output format + else if (!strcmp(argv[i], "-clustalw")) { + enableClustalWOutput = true; + } + + // cutoff + else if (!strcmp(argv[i], "-co") || !strcmp(argv[i], "--cutoff")) { + if (i < argc - 1) { + if (!GetFloat(argv[++i], &tempFloat)) { + cerr + << "ERROR: Invalid floating-point value following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempFloat < 0 || tempFloat > 1) { + cerr << "ERROR: For option " << argv[i - 1] + << ", floating-point value must be between 0 and 1." + << endl; + exit(1); + } else + cutoff = tempFloat; + } + } else { + cerr << "ERROR: Floating-point value expected for option " + << argv[i] << endl; + exit(1); + } + } + + // verbose reporting + else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + enableVerbose = true; + } + + // alignment order + else if (!strcmp(argv[i], "-a") + || !strcmp(argv[i], "--alignment-order")) { + enableAlignOrder = true; + } + + //print out version + else if (!strcmp(argv[i], "-version")) { + cerr << "MSAPROBS version " << VERSION << endl; + exit(1); + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit(1); + } + } else { + sequenceNames.push_back(string(argv[i])); + } + } + + /*check the output file name*/ + cerr << "-------------------------------------" << endl; + if (alignOutFileName.length() == 0) { + cerr << "The final alignments will be printed out to STDOUT" << endl; + alignOutFile = &std::cout; + } else { + cerr << "Open the output file " << alignOutFileName << endl; + alignOutFile = new ofstream(alignOutFileName.c_str(), + ios::binary | ios::out | ios::trunc); + } + cerr << "-------------------------------------" << endl; + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +MultiSequence* MSA::ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + MultiSequence *result; + + // check if this is a node of the alignment tree + //if (tree->GetSequenceLabel() == -1){ + if (tree->leaf == NODE) { + MultiSequence *alignLeft = ProcessTree(tree->left, sequences, + sparseMatrices, model); + MultiSequence *alignRight = ProcessTree(tree->right, sequences, + sparseMatrices, model); + + assert(alignLeft); + assert(alignRight); + + result = AlignAlignments(alignLeft, alignRight, sparseMatrices, model); + assert(result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); + assert(result); + //result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + result->AddSequence(sequences->GetSequence(tree->idx)->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::ComputeFinalAlignment(MSAGuideTree*tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + MultiSequence *alignment = ProcessTree(tree->getRoot(), sequences, + sparseMatrices, model); + + SafeVector oldOrdering; + int numSeqs = alignment->GetNumSequences(); + if (enableAlignOrder) { + for (int i = 0; i < numSeqs; i++) + oldOrdering.push_back(alignment->GetSequence(i)->GetSortLabel()); + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree); + /* + int numSeqs = alignment->GetNumSequences(); + //if(numSeqs < numIterativeRefinementReps){ + for(int iter = 0; iter < 5; iter ++){ + for(int i = 0; i < numSeqs - 1; i++){ + DoIterativeRefinementTreeNode(sparseMatrices, model, alignment, i); + } + } + //}*/ + //DoIterativeRefinement() return 1,2: this refinement unsuccessful +/* + int ineffectiveness = 0; + for (int i = 0; i < numIterativeRefinementReps; i++){ + int flag = DoIterativeRefinement(sparseMatrices, model, alignment); + if(numSeqs > 25){ + if(flag > 0){ + if(numIterativeRefinementReps < 20*numSeqs) + numIterativeRefinementReps ++; + if(flag == 1) ineffectiveness ++; + } + //else ineffectiveness = 0; + if(ineffectiveness > 2*numSeqs && i >100 ) break; + } + } +*/ + + for (int i = 0; i < numIterativeRefinementReps; i++) + DoIterativeRefinement(sparseMatrices, model, alignment); + + cerr << endl; + + if (oldOrdering.size() > 0) { + for (int i = 0; i < (int) oldOrdering.size(); i++) { + alignment->GetSequence(i)->SetSortLabel(oldOrdering[i]); + } + } + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::AlignAlignments(MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + // print some info about the alignment + if (enableVerbose) { + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } +#if 0 + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), align1, align2, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + + pair *, float> alignment; + //perform alignment + alignment = model.ComputeAlignment(align1->GetSequence(0)->GetLength(), + align2->GetSequence(0)->GetLength(), *posterior); + + delete posterior; + + if (enableVerbose) { + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min(align1->GetSequence(i)->GetLength(), + align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence( + align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence( + align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the weighted probabilistic consistency transformation. +// 1 +///////////////////////////////////////////////////////////////// + +SafeVector > MSA::DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + + // for every pair of sequences +#ifdef _OPENMP + int pairIdx; +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int i = seqsPairs[pairIdx].seq1; + int j = seqsPairs[pairIdx].seq2; + float wi = seqsWeights[i]; + float wj = seqsWeights[j]; +#else + for (int i = 0; i < numSeqs; i++) { + float wi = seqsWeights[i]; + for (int j = i + 1; j < numSeqs; j++) { + float wj = seqsWeights[j]; +#endif + Sequence *seq1 = sequences->GetSequence(i); + Sequence *seq2 = sequences->GetSequence(j); + + if (enableVerbose) { +#ifdef _OPENMP +#pragma omp critical +#endif + cerr << "Relaxing (" << i + 1 << ") " << seq1->GetHeader() + << " vs. " << "(" << j + 1 << ") " << seq2->GetHeader() + << ": "; + } + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + float w = wi * wi * wj + wi * wj * wj; + float sumW = w; + for (int k = 0; k < (seq1Length + 1) * (seq2Length + 1); k++) { + //posterior[k] = w*posterior[k]; + posterior[k] += posterior[k]; + } + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) { + if (k != i && k != j) { + float wk = seqsWeights[k]; + float w = wi * wj * wk; + sumW += w; + if (k < i) + Relax1(w, sparseMatrices[k][i], sparseMatrices[k][j], + posterior); + else if (k > i && k < j) + Relax(w, sparseMatrices[i][k], sparseMatrices[k][j], + posterior); + else { + SparseMatrix *temp = + sparseMatrices[j][k]->ComputeTranspose(); + Relax(w, sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + } + //cerr<<"sumW "<::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend) { + + // zero out all cells until the first filled column + while (curr < XYptr->first) { + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length) { + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; +#ifndef _OPENMP + } +#endif + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior) { + + assert(matXZ); + assert(matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert(matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++) { + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * XZval * ZYptr->second; + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax1(float weight, SparseMatrix *matZX, SparseMatrix *matZY, + VF &posterior) { + + assert(matZX); + assert(matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++) { + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * ZXval * ZYptr->second; + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +// return 0: successful refinement, 1: ineffective refinement, 2: random problem +///////////////////////////////////////////////////////////////// +int MSA::DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + int i; + // create two separate groups + for (i = 0; i < numSeqs; i++) { + int index = rand(); + if (index % 2) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) return 2; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + +//start add by Yongtao +#if 1 + VF *posterior = model.BuildPosterior (groupOneSeqs, groupTwoSeqs, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), groupOneSeqs, groupTwoSeqs, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + SafeVector::iterator> oldOnePtrs(groupOne.size()); + SafeVector::iterator> oldTwoPtrs(groupTwo.size()); + i=0; + for (set::const_iterator iter = groupOne.begin(); + iter != groupOne.end(); ++iter) { + oldOnePtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + i=0; + for (set::const_iterator iter = groupTwo.begin(); + iter != groupTwo.end(); ++iter) { + oldTwoPtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + + VF &posteriorArr = *posterior; + int oldLength = alignment->GetSequence(0)->GetLength(); + int groupOneindex=0; int groupTwoindex=0; + float accuracy_before = 0; + int j; + for (i = 1; i <= oldLength; i++) { + // check to see if there is a gap in every sequence of the set + bool foundOne = false; + for (j = 0; !foundOne && j < (int) groupOne.size(); j++) + foundOne = (oldOnePtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundOne) groupOneindex ++; + bool foundTwo = false; + for (j = 0; !foundTwo && j < (int) groupTwo.size(); j++) + foundTwo = (oldTwoPtrs[j][i] != '-'); + if (foundTwo) groupTwoindex ++; + if(foundOne && foundTwo) accuracy_before += + posteriorArr[groupOneindex * (groupTwoSeqs->GetSequence(0)->GetLength() + 1) + groupTwoindex]; + } + + pair *, float> refinealignment; + //perform alignment + refinealignment = model.ComputeAlignment(groupOneSeqs->GetSequence(0)->GetLength(), + groupTwoSeqs->GetSequence(0)->GetLength(), *posterior); + delete posterior; + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < groupOneSeqs->GetNumSequences(); i++) + result->AddSequence( + groupOneSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'X')); + for (int i = 0; i < groupTwoSeqs->GetNumSequences(); i++) + result->AddSequence( + groupTwoSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'Y')); + // free temporary alignment + delete refinealignment.first; + delete alignment; + alignment = result; + delete groupOneSeqs; + delete groupTwoSeqs; + if(accuracy_before == refinealignment.second) return 1; + else return 0; +} + + +void MSA::DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + vector inGroup1; + inGroup1.resize(numSeqs); + for (int i = 0; i < numSeqs; i++) { + inGroup1[i] = false; + } + + AlignmentOrder* orders = this->tree->getAlignOrders(); + AlignmentOrder* order = &orders[nodeIndex]; + for (int i = 0; i < order->leftNum; i++) { + int si = order->leftLeafs[i]; + inGroup1[si] = true; + } + for (int i = 0; i < order->rightNum; i++) { + int si = order->rightLeafs[i]; + inGroup1[si] = true; + } + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + if (inGroup1[i]) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void MSA::WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices) { + ofstream outfile(annotationFilename.c_str()); + + if (outfile.fail()) { + cerr << "ERROR: Unable to write annotation file." << endl; + exit(1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position(numSeqs, 0); + SafeVector::iterator> seqs(numSeqs); + for (int i = 0; i < numSeqs; i++) + seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve(numSeqs); + + SafeVector lab; + for (int i = 0; i < numSeqs; i++) + lab.push_back(alignment->GetSequence(i)->GetSortLabel()); + + // for every column + for (int i = 1; i <= alignLength; i++) { + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++) { + if (seqs[j][i] != '-') { + active.push_back(make_pair(lab[j], ++position[j])); + } + } + + sort(active.begin(), active.end()); + outfile << setw(4) << ComputeScore(active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int MSA::ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices) { + + if (active.size() <= 1) + return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++) { + for (int j = i + 1; j < (int) active.size(); j++) { + val += sparseMatrices[active[i].first][active[j].first]->GetValue( + active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} + +///////////////////////////////////////////////////////////////// +// ComputeSimilarity () +// +// Computes the average similarity for a particular family. +// extreme low or extreme high similarity(<=20% or >80%) return 0 +// low similarity(20%-50%) return 1 +// high similarity(50%-80%) return 2 +///////////////////////////////////////////////////////////////// +extern pair *, float> partViterbi(string seq1, string seq2); +extern float computeS(string seq1, string seq2, SafeVector * alignment); + +int MSA::ComputeSimilarity (MultiSequence *sequences,const ProbabilisticModel &model){ + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + //average identity for all sequences + float identity = 0; + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + + // do all pairwise alignments for family similarity +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + //pair *, float> alignment = ::partViterbi(seq1->GetString(),seq2->GetString()); + //cerr << alignment.second / alignment.first->size(); + //cerr << computeS(seq1->GetString(),seq2->GetString(),alignment.first)<< endl; + pair *, float> alignment = model.ComputeViterbiAlignment(seq1,seq2); +/* + VF* posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + pair *, float> alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); +*/ +/* + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + float N_correct_match = 0; + //float N_match; + //float N_column = 0; + //float N_alignment = 0; + int i = 1;int j = 1; + //bool start = false; bool end = false; + for (SafeVector::iterator iter = alignment.first->begin(); + iter != alignment.first->end(); ++iter){ + if (*iter == 'B'){ + //N_match += 1; + //start = true; + //if(i==seq1->GetLength() || j==seq2->GetLength()) end = true; + unsigned char c1 = (unsigned char) iter1[i++]; + unsigned char c2 = (unsigned char) iter2[j++]; + if(c1==c2) N_correct_match += 1; + } + else if(*iter == 'X') i++; + else if(*iter == 'Y') j++; + //if(start && !end) N_column += 1; + N_alignment += 1; + } + if(i!= seq1->GetLength()+1 || j!= seq2->GetLength() + 1 ) cerr << "similarity error"<< endl; + identity += N_correct_match / N_alignment; + // +*/ + identity += alignment.second / alignment.first->size(); + delete alignment.first; +#ifndef _OPENMP + } +#endif + } + identity /= numPairs; + +FILE *fi = fopen ("accuracy", "a"); +fprintf (fi, " %.10f ", identity); fprintf (fi, "\n"); +fclose (fi); + +/* + //adapative + if(identity <= 0.15) initDistrib[2] = 0.143854; + else if(identity <= 0.2) initDistrib[2] = 0.191948; + else if(identity <= 0.25) initDistrib[2] = 0.170705; + else if(identity <= 0.3) initDistrib[2] = 0.100675; + else if(identity <= 0.35) initDistrib[2] = 0.090755; + else if(identity <= 0.4) initDistrib[2] = 0.146188; + else if(identity <= 0.45) initDistrib[2] = 0.167858; + else if(identity <= 0.5) initDistrib[2] = 0.250769; + //else if(identity <= 0.6) initDistrib[2] = 0.500829; + //else if(identity <= 0.7) initDistrib[2] = 0.259622; +*/ + if( identity<= 0.25 || identity > 0.8 ) return 0; + else if(identity > 0.2 && identity<= 0.4) return 1; + else return 2; + +} diff --git a/binaries/src/GLProbs-1.0/MSAClusterTree.cpp b/binaries/src/GLProbs-1.0/MSAClusterTree.cpp new file mode 100644 index 0000000..3bf34a1 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAClusterTree.cpp @@ -0,0 +1,153 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include "MSAClusterTree.h" +MSAClusterTree::MSAClusterTree(MSA* msa, VVF& distMatrix, int numSeqs) : + MSAGuideTree(msa, distMatrix, numSeqs) { +} +MSAClusterTree::~MSAClusterTree() { +} +void MSAClusterTree::create() { + //generate the neighbor-joining tree + this->generateClusterTree(); + + //calculate sequence weights + this->getSeqsWeights(); + + //construct the alignment orders + this->createAlignmentOrders(); +} +void MSAClusterTree::generateClusterTree() { + int i; + ValidNode* validNodes, *headValidNodes; + ValidNode* miniPtr, *minjPtr, *ivalid, *jvalid; + int mini, minj; + float* joins; + unsigned int* clusterLeafs; + + //initialize the valid nodes link list + validNodes = new ValidNode[leafsNum + 1]; + joins = new float[leafsNum + 1]; + clusterLeafs = new unsigned int[nodesNum + 1]; + if (!validNodes || !joins || !clusterLeafs) { + cerr << "Out of memory of the reconstruction of cluster tree" << endl; + } + //initialize cluster size + for (i = 0; i < this->leafsNum; i++) { + clusterLeafs[i] = 1; + } + + headValidNodes = &validNodes[0]; + headValidNodes->next = &validNodes[1]; + headValidNodes->n = -1; + headValidNodes->node = -1; + headValidNodes->prev = NULL; + + //build an initial link list + ValidNode* curr = &validNodes[1]; + ValidNode* prev = headValidNodes; + ValidNode* next = &validNodes[2]; + for (i = 0; i < leafsNum; i++) { + curr->n = i; + curr->node = i; + curr->prev = prev; + curr->next = next; + prev = curr; + curr = next; + next++; + } + prev->next = NULL; + + //to generate the cluster tree + int nodeIdx; //the index of an internal node + int firstNode = leafsNum; //the index of the first internal node + int lastNode = firstNode + leafsNum - 1;//the index of the last internal node + + for (nodeIdx = firstNode; nodeIdx < lastNode; nodeIdx++) { + //find closest pair of clusters + float minDist = 1.1f; + miniPtr = headValidNodes; + minjPtr = headValidNodes; + + for (ivalid = headValidNodes->next; ivalid != NULL; + ivalid = ivalid->next) { + mini = ivalid->n; + + for (jvalid = headValidNodes->next; + jvalid != NULL && jvalid->n < mini; jvalid = jvalid->next) { + minj = jvalid->n; + float dist = (*distMatrix)[mini][minj]; + if (dist < 0) { + cerr + << "ERROR: It is impossible to have distance value less than zero" + << endl; + dist = 0; + } + if (dist < minDist) { + minDist = dist; + miniPtr = ivalid; + minjPtr = jvalid; + } + //printf("dist %g mini %d minj %d\n", dist, ivalid->node, jvalid->node); + } + } + //printf("**** mini %d minj %d minDist %g *****\n", miniPtr->node, minjPtr->node, minDist); + //check the validity of miniPtr and minjPtr; + if (miniPtr == headValidNodes || minjPtr == headValidNodes) { + cerr << "OOPS: Error occurred while constructing the cluster tree\n" + << endl; + exit(-1); + } + //computing branch length and join the two nodes + float branchLength = minDist * 0.5f; + this->connectNodes(&nodes[nodeIdx], nodeIdx, &nodes[miniPtr->node], + branchLength, &nodes[minjPtr->node], branchLength); + clusterLeafs[nodeIdx] = clusterLeafs[miniPtr->node] + + clusterLeafs[minjPtr->node]; + + //remove the valid node minjPtr from the list + minjPtr->prev->next = minjPtr->next; + if (minjPtr->next != NULL) { + minjPtr->next->prev = minjPtr->prev; + } + minjPtr->prev = minjPtr->next = NULL; + + //compute the distance of each remaining valid node to the new node + for (ivalid = headValidNodes->next; ivalid != NULL; + ivalid = ivalid->next) { + int idx = ivalid->n; + + float idist = (*distMatrix)[miniPtr->n][idx]; + float jdist = (*distMatrix)[minjPtr->n][idx]; + + unsigned int isize = clusterLeafs[miniPtr->node]; + unsigned int jsize = clusterLeafs[minjPtr->node]; + joins[idx] = (idist * isize + jdist * jsize) / (isize + jsize); + //joins[idx] = (idist + jdist )/ 2; + } + //update the distance to the new node + miniPtr->node = nodeIdx; + mini = miniPtr->n; + for (jvalid = headValidNodes->next; jvalid != NULL; + jvalid = jvalid->next) { + minj = jvalid->n; + + float dist = joins[minj]; + (*distMatrix)[mini][minj] = dist; + (*distMatrix)[minj][mini] = dist; + } + } + //add a pseudo root to this unrooted NJ tree + this->root = &nodes[lastNode - 1]; + + delete[] validNodes; + delete[] joins; + delete[] clusterLeafs; +} diff --git a/binaries/src/GLProbs-1.0/MSAClusterTree.h b/binaries/src/GLProbs-1.0/MSAClusterTree.h new file mode 100644 index 0000000..30bce05 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAClusterTree.h @@ -0,0 +1,27 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#ifndef _MSA_CLUSTER_TREE_H +#define _MSA_CLUSTER_TREE_H + +#include "MSAGuideTree.h" + +class MSAClusterTree: public MSAGuideTree { +public: + MSAClusterTree(MSA* msa, VVF& distMatrix, int numSeqs); + ~MSAClusterTree(); + + //construct the cluster tree + void create(); +private: + //generate the cluster tree + void generateClusterTree(); +}; +#endif diff --git a/binaries/src/GLProbs-1.0/MSADef.h b/binaries/src/GLProbs-1.0/MSADef.h new file mode 100644 index 0000000..6a3d178 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSADef.h @@ -0,0 +1,26 @@ +#ifndef _MSA_DEF_H +#define _MSA_DEF_H +#include +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +//maximum number +#define MAX_INT_NUM 0x7FFFFFFF +#define MAX_FLOAT_NUM FLT_MAX +#define INT_MULTIPLY 1000 + +#define SUBMATRIX_INT_SCALE 100 + +//a tree node is a leaf or a node +enum { + NONE, NODE, LEAF +}; + +#endif + diff --git a/binaries/src/GLProbs-1.0/MSAGuideTree.cpp b/binaries/src/GLProbs-1.0/MSAGuideTree.cpp new file mode 100644 index 0000000..ec9a5e8 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAGuideTree.cpp @@ -0,0 +1,327 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ +#include "MSAGuideTree.h" +#include "MSA.h" +MSAGuideTree::MSAGuideTree(MSA* msa, VVF& distances, int numSeqs) { + int i; + TreeNode* node; + //system configuration + this->msa = msa; + this->distMatrix = &distances; + this->numSeqs = numSeqs; + this->seqsWeights = msa->getSeqsWeights(); + + //tree structure + this->nodesSize = this->numSeqs * 2 + 1; + this->nodes = new TreeNode[this->nodesSize]; + if (!this->nodes) { + cerr << "TreeNodes memory allocation failed" << endl; + exit(-1); + } + //initialize all the tree nodes + this->leafs = this->nodes; + this->leafsNum = this->numSeqs; + this->nodesNum = 2 * this->leafsNum - 1; + for (i = 0; i < this->nodesSize; i++) { + node = &nodes[i]; + node->left = 0; + node->right = 0; + node->parent = 0; + node->leftIdx = -1; + node->rightIdx = -1; + node->parentIdx = -1; + node->idx = -1; + node->dist = 0; + node->leaf = NODE; //setted to be NODE, by default + node->order = 0; + node->depth = 0; + } + //initialize the leaf nodes + for (i = 0; i < this->leafsNum; i++) { + node = &this->leafs[i]; + node->idx = i; + node->leaf = LEAF; + } +} +MSAGuideTree::~MSAGuideTree() { + //release tree nodes + delete[] this->nodes; + + //release alignment orders + releaseAlignmentOrders(); + +} +//get the tree nodes +TreeNode* MSAGuideTree::getNodes() { + return nodes; +} +//get the leaf nodes +TreeNode* MSAGuideTree::getLeafs() { + return leafs; +} +//get the number of nodes; +int MSAGuideTree::getNodesNum() { + return nodesNum; +} +//get the number of leaf nodes +int MSAGuideTree::getLeafsNum() { + return leafsNum; +} +//get the alignment orders +AlignmentOrder* MSAGuideTree::getAlignOrders() { + return alignOrders; +} +int MSAGuideTree::getAlignOrdersNum() { + return alignOrdersNum; +} +/**************************************************** + create the evolutionary relationship + ****************************************************/ +void MSAGuideTree::connectNodes(TreeNode* parent, int parentIdx, + TreeNode* leftChild, float leftDist, TreeNode* rightChild, + float rightDist) { + //save the parents index for each child + leftChild->parent = parent; + leftChild->parentIdx = parentIdx; + rightChild->parent = parent; + rightChild->parentIdx = parentIdx; + + //save the branch lengths (i.e. distance) from each child to its parent + leftChild->dist = leftDist; + rightChild->dist = rightDist; + + //save the indices of itself and its children for this new tree node + parent->idx = parentIdx; + parent->left = leftChild; + parent->leftIdx = leftChild->idx; + parent->right = rightChild; + parent->rightIdx = rightChild->idx; +} +/***************************************** + compute the alignment order of the phylogentic tree + *****************************************/ +void MSAGuideTree::createAlignmentOrders() { + int i; + + AlignmentOrder* order; + //allocate memory space for alignment orders vector + this->alignOrdersNum = 0;//for alignment orders, it starts from 1 instead of 0 + this->alignOrdersSize = numSeqs;//the number of internal nodes of the phylogentic tree + 1 + this->alignOrders = new AlignmentOrder[this->alignOrdersSize]; + if (!this->alignOrders) { + cerr << "OOPS: Alignment orders memory allocation failed" << endl; + exit(-1); + } + //initialize the alignment orders vector + for (i = 0; i < this->alignOrdersSize; i++) { + order = &this->alignOrders[i]; + order->leftOrder = 0; + order->rightOrder = 0; + order->leftLeafs = 0; + order->leftNum = 0; + order->rightLeafs = 0; + order->rightNum = 0; + } + //starting out constructing the alignment orders + int subLeafsNum; + int nodeDepth = 1; + int subOrder = recursiveCreateAlignmentOrders(this->root, 0, subLeafsNum, + nodeDepth); + + //check whether the function works well + if (subLeafsNum != numSeqs || this->alignOrdersNum != subOrder) { + fprintf(stderr, + "The alignment orders constructed were wrong (subLeafsNum %d, alignOrdersNum %d, subOrder %d)\n", + subLeafsNum, alignOrdersNum, subOrder); + } + +} +int MSAGuideTree::recursiveCreateAlignmentOrders(TreeNode* subRoot, + int* subLeafs, int& subLeafsNum, int nodeDepth) { + int leftNum, rightNum; + int leftOrder, rightOrder; + int* leftLeafs, *rightLeafs; + + if (subRoot->leaf == LEAF) { + subLeafs[0] = subRoot->idx; + subLeafsNum = 1; + + return 0; //if it is a leaf, return the index 0 + } + leftOrder = rightOrder = 0; + leftNum = rightNum = 0; + leftLeafs = new int[numSeqs]; + rightLeafs = new int[numSeqs]; + + //check the left subtree + if (subRoot->left) { + //recursively tranverse the left subtree + leftOrder = recursiveCreateAlignmentOrders(subRoot->left, leftLeafs, + leftNum, nodeDepth + 1); + } + //check the right subtree + if (subRoot->right) { + rightOrder = recursiveCreateAlignmentOrders(subRoot->right, rightLeafs, + rightNum, nodeDepth + 1); + } + //save the leafs in the left and right subtrees of the current subtree + if (this->alignOrdersNum > this->alignOrdersSize) { + fprintf(stderr, "the alignment order function works bad\n");\ + exit(-1); + } + + AlignmentOrder* order = &this->alignOrders[++this->alignOrdersNum]; + order->nodeDepth = nodeDepth; + order->leftOrder = leftOrder; + order->rightOrder = rightOrder; + order->leftNum = leftNum; + order->rightNum = rightNum; + order->leftLeafs = new int[order->leftNum]; + order->rightLeafs = new int[order->rightNum]; + if (!order->leftLeafs || !order->rightLeafs) { + fprintf(stderr, + "memory allocation failed while recursively constructing alignment orders\n"); + exit(-1); + } + memcpy(order->leftLeafs, leftLeafs, order->leftNum * sizeof(int)); + memcpy(order->rightLeafs, rightLeafs, order->rightNum * sizeof(int)); + + delete[] leftLeafs; + delete[] rightLeafs; + + //for the root of the tree, subLeafs buffer is set to 0 + if (subLeafs) { + //copy the results to the parent tree node + memcpy(subLeafs, order->leftLeafs, order->leftNum * sizeof(int)); + memcpy(subLeafs + order->leftNum, order->rightLeafs, + order->rightNum * sizeof(int)); + } + //compute the total number of leafs in this subtree + subLeafsNum = order->leftNum + order->rightNum; + + return this->alignOrdersNum;//return the index of itself, starting from 1, instead of 0 +} +void MSAGuideTree::releaseAlignmentOrders() { + if (!this->alignOrders) { + return; + } + for (int i = 0; i < this->alignOrdersNum; i++) { + AlignmentOrder* order = &this->alignOrders[i]; + if (order->leftLeafs) { + delete[] order->leftLeafs; + } + if (order->rightLeafs) { + delete[] order->rightLeafs; + } + } + delete[] alignOrders; +} +/******************************** + display the alignment orders + ********************************/ +void MSAGuideTree::displayAlignmentOrders() { + int i, j; + AlignmentOrder* order; + fprintf(stderr, "************DISPLAY ALIGNMENT ORDER***************\n"); + for (i = 1; i <= this->alignOrdersNum; i++) { + order = &this->alignOrders[i]; + + fprintf(stderr, "GROUP (%d depth %d):\n---LEFT ORDER: %d\n", i, + order->nodeDepth, order->leftOrder); + fprintf(stderr, "---LEFT: "); + for (j = 0; j < order->leftNum; j++) { + fprintf(stderr, "%d ", order->leftLeafs[j]); + } + + fprintf(stderr, "\n---RIGHT ORDER: %d\n", order->rightOrder); + fprintf(stderr, "\n---RIGHT: "); + for (j = 0; j < order->rightNum; j++) { + fprintf(stderr, "%d ", order->rightLeafs[j]); + } + fprintf(stderr, "\n"); + } + fprintf(stderr, "*******************************************\n"); +} +/********************************* + display the tree + *********************************/ +void MSAGuideTree::displayTree() { + fprintf(stderr, "**************DISPLAY TREE*********************\n"); + for (int i = 0; i < nodesNum; i++) { + TreeNode* node = &nodes[i]; + + fprintf(stderr, + "%d(%p): left(%p) %d, right(%p) %d, parent(%p) %d, dist %f\n", + (node == &nodes[node->idx]) ? node->idx : -2, node, node->left, + (!node->left || node->left == &nodes[node->leftIdx]) ? + node->leftIdx : -2, node->right, + (!node->right || node->right == &nodes[node->rightIdx]) ? + node->rightIdx : -2, node->parent, + (!node->parent || node->parent == &nodes[node->parentIdx]) ? + node->parentIdx : -2, node->dist); + } + fprintf(stderr, "*******************************************\n"); +} +/********************************* + compute the sequence weights + *********************************/ +void MSAGuideTree::getSeqsWeights() { + int i; + TreeNode* curr; + + //compute the order of each node, which represents the number of leaf nodes in the substree rooting from it. + for (i = 0; i < leafsNum; i++) { + //for each leaf nodes + curr = &this->leafs[i]; + while (curr != 0) { + curr->order++; + + curr = curr->parent; + } + } + //compute the weight of each sequence, which corresponds to a leaf node + for (i = 0; i < numSeqs; i++) { + //compute the weight of each sequence + float weights = 0; + curr = &this->leafs[i]; + while (curr->parent != 0) { + weights += curr->dist / curr->order; + curr = curr->parent; + //printf("order:%d weights: %f\n", curr->order, weights); + } + //save the weight of this sequence + seqsWeights[i] = (int) (100 * weights); + //printf("%d\n", seqsWeights[i]); + } + //normalize the weights + int wsum = 0; + for (i = 0; i < numSeqs; i++) { + wsum += seqsWeights[i]; + } + if (wsum == 0) { + //in this case, every sequence is assumed to have an identical weight + for (i = 0; i < numSeqs; i++) { + seqsWeights[i] = 1; + } + wsum = numSeqs; + } + //printf("wsum:%d \n", wsum); + for (i = 0; i < numSeqs; i++) { + seqsWeights[i] = (seqsWeights[i] * INT_MULTIPLY) / wsum; + if (seqsWeights[i] < 1) { + seqsWeights[i] = 1; + } + //printf("%d \n", seqsWeights[i]); + } +} +void MSAGuideTree::create() { + //do nothing +} + diff --git a/binaries/src/GLProbs-1.0/MSAGuideTree.h b/binaries/src/GLProbs-1.0/MSAGuideTree.h new file mode 100644 index 0000000..97d538a --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAGuideTree.h @@ -0,0 +1,119 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#ifndef _MSA_GUIDE_TREE_H +#define _MSA_GUIDE_TREE_H +#include "MSADef.h" +#include "MSA.h" + +#include "SafeVector.h" +#include "MultiSequence.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "SparseMatrix.h" + +class MSA; +struct ValidNode { + ValidNode* prev; + ValidNode* next; + int n; //the index in the distance matrix + int node; //the index in the tree node entries +}; + +struct TreeNode { + struct TreeNode *left; //the pointer to its left child + struct TreeNode *right; //the pointer to its right child + struct TreeNode *parent; //the pointer to its parent + int leftIdx; //the index of the left child + int rightIdx; //the index of the right child + int parentIdx; //the index of its parent + int idx; //the index of itself + float dist; //the distance to its parent + int leaf; //whether it is a leaf node or not + int order; //the number of generations dating back to its ancestor + int depth; //the depth of the node +}; +struct AlignmentOrder { + int nodeDepth; //the depth of the internal node + int leftOrder; //the order number of the right child + int rightOrder; //the order number of the left child + int* leftLeafs; //the indices of leafs in the left subtree + int leftNum; //the number of leafs in the left subtree + int* rightLeafs; //the indices of leafs in the right subtree + int rightNum; //the number of leafs in the right substree +}; + +class MSAGuideTree { +public: + MSAGuideTree(MSA* msa, VVF& distMatrix, int numSeqs); + virtual ~MSAGuideTree() = 0; //abstract class + + //get the tree nodes + TreeNode* getNodes(); + //get the leaf nodes + TreeNode* getLeafs(); + //get the number of nodes; + int getNodesNum(); + //get the number of leaf nodes + int getLeafsNum(); + //get the root of the tree + TreeNode* getRoot() { + return this->root; + } + //get the alignment orders + AlignmentOrder* getAlignOrders(); + int getAlignOrdersNum(); + //construct the alignment orders + void createAlignmentOrders(); + + //construct the guide tree + virtual void create(); + //calculate the sequence weights + virtual void getSeqsWeights(); + + /**********DEBUGING****************/ + //display the tree + void displayTree(); + //display the alignment orders + void displayAlignmentOrders(); + +protected: + //join two nodes + void connectNodes(TreeNode* parent, int parentIdx, TreeNode* leftChild, + float leftDist, TreeNode* rightChild, float rightDist); + //release the alignment orders vector + void releaseAlignmentOrders(); + //recursive implemenation of constructing the alignment orders + int recursiveCreateAlignmentOrders(TreeNode* subRoot, int* subLeafs, + int& subLeafsNum, int nodeDepth); + + //system configurations + MSA* msa; + VVF* distMatrix; + int numSeqs; + int* seqsWeights; + + //all the tree nodes + TreeNode* nodes; + int nodesNum; + int nodesSize; + //the root tree node + TreeNode* root; + //leaf node + TreeNode* leafs; + int leafsNum; + + //alignment order + AlignmentOrder* alignOrders; + int alignOrdersNum; + int alignOrdersSize; +}; +#endif + diff --git a/binaries/src/GLProbs-1.0/MSAPartProbs.cpp b/binaries/src/GLProbs-1.0/MSAPartProbs.cpp new file mode 100644 index 0000000..b234588 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAPartProbs.cpp @@ -0,0 +1,1023 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ +#include "SafeVector.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "MultiSequence.h" +#include "ScoreType.h" + +#define TRACE 0 // 0: NOTRACE 1: TRACE +//proba like settings +#define endgaps 1 // 1: engap penaties enabled 0: disabled +#define PART_FULL_MEMORY 0 //0: LOW MEM OPTION +#define REVPART_FULL_MEMORY 0 //0: LOW MEM OPTION +using namespace std; + +#ifdef _WIN32 +#define OS_HUGE_VALL HUGE_VAL +#else +#define OS_HUGE_VALL HUGE_VALL +#endif + +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +typedef struct sequence { + char *title; + char *text; + int length; +} fasta; + +typedef struct alignment { + char *title; + char *text; + int length; +} align; + +//////////////////////////////////////////////////////// +//externs related to scoring matrix and input arguments +/////////////////////////////////////////////////////////// +extern float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +extern char aminos[26], matrixtype[20], bases[26]; + +extern double sub_matrix[26][26]; +extern double normalized_matrix[26][26]; // add by YE Yongtao +extern int subst_index[26]; + +extern float TEMPERATURE; +extern int MATRIXTYPE; + +extern float GAPOPEN; +extern float GAPEXT; +extern argument_decl argument; + +////////////////////////////////////////////////////////////////////////////// +//calculates reverse partition function values based on z matrices +//and also simulaneously calculates the propability of each basepair +//or aminoacid residue pair i,j +////////////////////////////////////////////////////////////////////////////// + +VF *revers_partf(fasta sequences[2], const double termgapopen, + const double termgapextend, long double **Zfm, const double d, + const double e) { + // printf("revpart\n"); + //rest of the declarations + int i, j; + long double **Zm = NULL; + long double **Ze = NULL; + long double **Zf = NULL; + int len0, len1; + float probability; + long double tempvar; + int Si, Tj; + double endgapopen, endgapextend; + FILE *fo; + + //Init lengths of sequences + len0 = strlen(sequences[0].text); + len1 = strlen(sequences[1].text); + + //Safe vector declared + VF *posteriorPtr = new VF((len0 + 1) * (len1 + 1)); + VF & posterior = *posteriorPtr; + VF::iterator ptr = posterior.begin(); + + if (TRACE) //open the trace file + fo = fopen("revpartdump", "a"); + + //default: + endgapopen = termgapopen; + endgapextend = termgapextend; + + //instantiate the z matrix + if (REVPART_FULL_MEMORY) { + + Ze = new long double *[sequences[1].length + 1]; + Zf = new long double *[sequences[1].length + 1]; + Zm = new long double *[sequences[1].length + 1]; + + if (TRACE) + printf("\n\n %e %e\n", d, e); + + //DYNAMICALLY GROW 2D Zm Zf Ze MARICES (long double) + for (i = 0; i <= sequences[1].length; i++) { + Ze[i] = new long double[sequences[0].length + 1]; + Zf[i] = new long double[sequences[0].length + 1]; + Zm[i] = new long double[sequences[0].length + 1]; + } + } else { + Zm = new long double *[2]; + Ze = new long double *[2]; + Zf = new long double *[2]; + for (i = 0; i <= 1; i++) { + Zm[i] = new long double[sequences[0].length + 1]; + Ze[i] = new long double[sequences[0].length + 1]; + Zf[i] = new long double[sequences[0].length + 1]; + } + + } + + if (TRACE) { + printf("in rev partf---"); + printf("\n\n"); + } + + if (REVPART_FULL_MEMORY) { + for (i = 0; i <= len1; i++) + for (j = 0; j <= len0; j++) { + Zm[i][j] = 0.0; + Zf[i][j] = 0.0; + Ze[i][j] = 0.0; + } + } else { + + for (j = 0; j <= len0; j++) { + Zm[0][j] = 0; + Zf[0][j] = 0; + Ze[0][j] = 0; + Zf[1][j] = 0; + Ze[1][j] = 0; + Zm[1][j] = 0; + } + } + + //fill the probability matrix with 0s + for (i = 0; i <= len1; i++) + for (j = 0; j <= len0; j++) + ptr[j * (len1 + 1) + i] = 0; + + if (endgaps == 0) { + Zm[len1][len0] = 1; + Ze[len1][len0] = Zf[len1][len0] = 0; + Zf[len1 - 1][len0] = Zm[len1][len0] * d; + Ze[len1][len0 - 1] = Zm[len1][len0] * d; + + //>=2ND ROW INIT + if (REVPART_FULL_MEMORY) { + for (i = len1 - 2; i >= 0; i--) { + Zf[i][len0] = Zf[i + 1][len0] * e; + } + } + + //>=2ND COL INIT + if (REVPART_FULL_MEMORY) { + for (j = len0 - 2; j >= 0; j--) { + Ze[len1][j] = Ze[len1][j + 1] * e; + } + } else { + for (j = len0 - 2; j >= 0; j--) { + Ze[0][j] = Ze[0][j + 1] * e; + } + } + } else { + + if (REVPART_FULL_MEMORY) { + + Zm[len1][len0] = 1; + Ze[len1][len0] = Zf[len1][len0] = 0; + Zf[len1 - 1][len0] = Zm[len1][len0] * endgapopen; + Ze[len1][len0 - 1] = Zm[len1][len0] * endgapopen; + + //>=2ND ROW INIT + for (i = len1 - 2; i >= 0; i--) { + Zf[i][len0] = Zf[i + 1][len0] * endgapextend; + } + + //M Iy= d+j*e + + //>=2ND COL INIT + for (j = len0 - 2; j >= 0; j--) { + Ze[len1][j] = Ze[len1][j + 1] * endgapextend; + } + + } else { + //in Zm + //let: + // Zm(0) be the current row being filled/computed + // Zm(1) be the previous row + + Zm[1][len0] = 1; + Ze[0][len0] = Zf[0][len0] = 0; + Zf[1][len0] = Zm[1][len0] * endgapopen; + Ze[0][len0 - 1] = Zm[1][len0] * endgapopen; + + //>=2ND COL INIT + for (j = len0 - 2; j >= 0; j--) { + Ze[0][j] = Ze[0][j + 1] * endgapextend; + } + + } //END ELSE + + } //END FULL MEMORY and GAP enablement IF STATEMENT + + double scorez, zz = 0; + + for (i = len1 - 1; i >= 0; i--) { + + for (j = len0 - 1; j >= 0; j--) { + Si = subst_index[sequences[1].text[i] - 'A']; + Tj = subst_index[sequences[0].text[j] - 'A']; + scorez = sub_matrix[Si][Tj]; + + //endgaps modification aug 10 + double open0, extend0, open1, extend1; + + open0 = open1 = d; + extend0 = extend1 = e; + + if (endgaps == 1) { + + //check to see if one of the 2 sequences or both reach the end + + if (i == 0) { + open0 = endgapopen; + extend0 = endgapextend; + + } + + if (j == 0) { + open1 = endgapopen; + extend1 = endgapextend; + } + + } + + if (REVPART_FULL_MEMORY) { + //z computation + + Ze[i][j] = Zm[i][j + 1] * open0 + Ze[i][j + 1] * extend0; + Zf[i][j] = Zm[i + 1][j] * open1 + Zf[i + 1][j] * extend1; + Zm[i][j] = (Zm[i + 1][j + 1] + Zf[i + 1][j + 1] + + Ze[i + 1][j + 1]) * scorez; + zz = Zm[i][j] + Zf[i][j] + Ze[i][j]; + + } else { + + //2 ROW zE zF ALGORITHM GOES...: + //Ze[1][j] =Zm[i][j + 1] * exp(beta * open0) + Ze[1][j + 1] *exp(beta * extend0); + //Zf[1][j] = Zm[i + 1][j] * exp(beta * open1) + Zf[0][j] * exp(beta * extend1); + //Zm[i][j] = (Zm[i + 1][j + 1] + Zf[0][j + 1] + Ze[0][j + 1]) * exp(beta * scorez); + //zz = Zm[0][j] + Zf[1][j] + Ze[1][j]; + + //lowmem code for merging probability calculating module + //Here we make use of Zm as a 2 row matrix + + Zf[1][j] = Zm[1][j] * open1 + Zf[0][j] * extend1; + Ze[1][j] = Zm[0][j + 1] * open0 + Ze[1][j + 1] * extend0; + Zm[0][j] = (Zm[1][j + 1] + Zf[0][j + 1] + Ze[0][j + 1]) + * scorez; + + tempvar = Zfm[i + 1][j + 1] * Zm[0][j]; + //divide P(i,j) i.e. pairwise probability by denominator + tempvar /= (scorez * Zfm[0][0]); + probability = (float) tempvar; + + //store only noticable probabilities + //if (probability <= 1 && probability >= 0.001) { + //algorithm goes... + //validprob[i + 1][j + 1] = probability; + ptr[(j + 1) * (len1 + 1) + (i + 1)] = probability; + //} + //lowmem code ends here + + } + + } //end of for + + if (REVPART_FULL_MEMORY == 0) { + for (int t = 0; t <= sequences[0].length; t++) { + Ze[0][t] = Ze[1][t]; + Ze[1][t] = 0; + + Zf[0][t] = Zf[1][t]; + Zf[1][t] = 0; + + Zm[1][t] = Zm[0][t]; + Zm[0][t] = 0; + + } + Zf[0][len0] = 1; + + } + + } //end of for + + if (TRACE) { + printf("\n\nrM:....\n\n"); + if (REVPART_FULL_MEMORY) { + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) + printf("%.2Le ", Zm[i][j]); + printf("\n"); + } + + printf("\n\nrE:....\n\n"); + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) + printf("%.2Le ", Ze[i][j]); + printf("\n"); + + } + + printf("\n\nrF:....\n\n"); + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) + printf("%.2Le ", Zf[i][j]); + printf("\n"); + + } + + } + + } + + if (TRACE) { + fprintf(fo, "\n"); + fclose(fo); + } + + //delete unused memory + + if (REVPART_FULL_MEMORY) { + for (i = 0; i <= len1; i++) { + delete (Zm[i]); + delete (Zf[i]); + delete (Ze[i]); + } + } else { + delete (Zf[0]); + delete (Ze[0]); + delete (Zm[0]); + + delete (Zm[1]); + delete (Zf[1]); + delete (Ze[1]); + } + + for (i = 0; i <= len1; i++) { + delete (Zfm[i]); + } + + if (Zf != NULL) + delete (Zf); + + if (Ze != NULL) + delete (Ze); + + if (Zm != NULL) + delete (Zm); + + if (Zfm != NULL) + delete (Zfm); + + posterior[0] = 0; + return (posteriorPtr); + +} + +////////////////////////////////////////////////////////////// +//forward partition function +///////////////////////////////////////////////////////////// + +long double **partf(fasta sequences[2], const double termgapopen, + const double termgapextend, const double d, const double e) { + //printf("partf\n"); + int i, j, len1, len0; + long double **Zm = NULL, **Zf = NULL, **Ze = NULL, zz = 0; + double endgapopen, endgapextend; + + //default: + endgapopen = termgapopen; + endgapextend = termgapextend; + + //the flag endgaps is set at the #define section + if (PART_FULL_MEMORY) { + + Zf = new long double *[sequences[1].length + 1]; + Ze = new long double *[sequences[1].length + 1]; + Zm = new long double *[sequences[1].length + 1]; + + //comment + if (TRACE) + printf("\nPARTF:====\n"); + + //DYNAMICALLY GROW 2D M,IX,IY,PIX,PIY MARICES + for (i = 0; i <= sequences[1].length; i++) { + Zf[i] = new long double[sequences[0].length + 1]; + Ze[i] = new long double[sequences[0].length + 1]; + Zm[i] = new long double[sequences[0].length + 1]; + } + } else { + Zm = new long double *[sequences[1].length + 1]; + Ze = new long double *[2]; + Zf = new long double *[2]; + for (i = 0; i <= sequences[1].length; i++) { + Zm[i] = new long double[sequences[0].length + 1]; + } + Ze[0] = new long double[sequences[0].length + 1]; + Zf[0] = new long double[sequences[0].length + 1]; + Ze[1] = new long double[sequences[0].length + 1]; + Zf[1] = new long double[sequences[0].length + 1]; + } + + len0 = strlen(sequences[0].text); + len1 = strlen(sequences[1].text); + + if (PART_FULL_MEMORY) { + for (i = 0; i <= sequences[1].length; i++) + for (j = 0; j <= sequences[0].length; j++) { + Zm[i][j] = 0.00; + Zf[i][j] = 0.00; + Ze[i][j] = 0.00; + } + } else { + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) { + Zm[i][j] = 0; + } + } + for (j = 0; j <= len0; j++) { + Zf[0][j] = 0; + Ze[0][j] = 0; + Zf[1][j] = 0; + Ze[1][j] = 0; + } + } + + //INTITIALIZE THE DP + + if (endgaps == 0) { + Zm[0][0] = 1.00; + + Zf[0][0] = Ze[0][0] = 0; + Zf[1][0] = Zm[0][0] * d; + Ze[0][1] = Zm[0][0] * d; + + //>=2ND ROW INIT + if (PART_FULL_MEMORY) { + for (i = 2; i <= sequences[1].length; i++) { + Zf[i][0] = Zf[i - 1][0] * e; + } + } + + //>=2ND COL INIT + for (j = 2; j <= sequences[0].length; j++) { + Ze[0][j] = Ze[0][j - 1] * e; + } + } else { + //init z + Zm[0][0] = 1.00; + Zf[0][0] = Ze[0][0] = 0; + Zf[1][0] = Zm[0][0] * endgapopen; + Ze[0][1] = Zm[0][0] * endgapopen; + + //>=2ND ROW INIT + if (PART_FULL_MEMORY) { + for (i = 2; i <= sequences[1].length; i++) { + Zf[i][0] = Zf[i - 1][0] * endgapextend; + } + } + + //>=2ND COL INIT + for (j = 2; j <= sequences[0].length; j++) { + Ze[0][j] = Ze[0][j - 1] * endgapextend; + } + } + + //1ST ROW/COL INIT + + int Si, Tj; + double score; + + for (i = 1; i <= sequences[1].length; i++) { + + for (j = 1; j <= sequences[0].length; j++) { + + Si = subst_index[sequences[1].text[i - 1] - 'A']; + Tj = subst_index[sequences[0].text[j - 1] - 'A']; + + score = sub_matrix[Si][Tj]; + + double open0, extend0, open1, extend1; + + open0 = open1 = d; + extend0 = extend1 = e; + + if (endgaps == 1) { + //check to see if one of the 2 sequences or both reach the end + + if (i == sequences[1].length) { + open0 = endgapopen; + extend0 = endgapextend; + + } + + if (j == sequences[0].length) { + open1 = endgapopen; + extend1 = endgapextend; + } + } + + // + //z computation using open and extend temp vars + //open0 is gap open in seq0 and open1 is gap open in seq1 + //entend0 is gap extend in seq0 and extend1 is gap extend in seq1 + + if (PART_FULL_MEMORY) { + Ze[i][j] = Zm[i][j - 1] * open0 + Ze[i][j - 1] * extend0; + + if (Ze[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Ze\n"); + exit(1); + } + + Zf[i][j] = Zm[i - 1][j] * open1 + Zf[i - 1][j] * extend1; + + if (Zf[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Zf\n"); + exit(1); + } + + Zm[i][j] = (Zm[i - 1][j - 1] + Ze[i - 1][j - 1] + + Zf[i - 1][j - 1]) * score; + + if (Zm[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Zm\n"); + exit(1); + } + + zz = Zm[i][j] + Ze[i][j] + Zf[i][j]; + } else { + Ze[1][j] = Zm[i][j - 1] * open0 + Ze[1][j - 1] * extend0; + + if (Ze[1][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for zE\n"); + exit(1); + } + + Zf[1][j] = Zm[i - 1][j] * open1 + Zf[0][j] * extend1; + + if (Zf[1][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for zF\n"); + exit(1); + } + + Zm[i][j] = (Zm[i - 1][j - 1] + Ze[0][j - 1] + Zf[0][j - 1]) + * score; + + if (Zm[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for zM\n"); + exit(1); + } + + zz = Zm[i][j] + Ze[1][j] + Zf[1][j]; + } + + } //end for + + if (!PART_FULL_MEMORY) { + for (int t = 0; t <= sequences[0].length; t++) { + Ze[0][t] = Ze[1][t]; + Ze[1][t] = 0; + + Zf[0][t] = Zf[1][t]; + Zf[1][t] = 0; + } + + Zf[1][0] = 1; + + } + + } //end for + + //store the sum of zm zf ze (m,n)s in zm's 0,0 th position + Zm[0][0] = zz; + + if (TRACE) { + //debug code aug 3 + //print the 3 Z matrices namely Zm Zf and Ze + + printf("\n\nFINAL Zm:\n"); + for (i = 0; i <= sequences[1].length; i++) { + for (j = 0; j <= sequences[0].length; j++) + printf("%.2Le ", Zm[i][j]); + printf("\n"); + } + + printf("FINAL Zf \n"); + for (i = 0; i <= sequences[1].length; i++) { + for (j = 0; j <= sequences[0].length; j++) + printf("%.2Le ", Zf[i][j]); + printf("\n"); + } + + printf("FINAL Ze \n"); + for (i = 0; i <= sequences[1].length; i++) { + for (j = 0; j <= sequences[0].length; j++) + printf("%.2Le ", Ze[i][j]); + printf("\n"); + } + + //end debug dump code + + } + + if (PART_FULL_MEMORY) { + for (i = 0; i <= sequences[1].length; i++) { + delete (Zf[i]); + delete (Ze[i]); + } + } else { + delete (Zf[0]); + delete (Ze[0]); + delete (Zf[1]); + delete (Ze[1]); + } + + delete (Zf); + delete (Ze); + + return Zm; + +} //end of forward partition function + +///////////////////////////////////////////////////////////////////////////////////////// +//entry point (was the main function) , returns the posterior probability safe vector +//////////////////////////////////////////////////////////////////////////////////////// +VF *ComputePostProbs(int a, int b, string seq1, string seq2) { + //printf("probamod\n"); + double gap_open = -22, gap_ext = -1, beta = 0.2;//T = 5, beta = 1/T = 0.2, by default + int stock_loop = 1; + int le = 160; + double termgapopen = 1.0f; //exp(0) + double termgapextend = 1.0f; //exp(0) + + //initialize the sequence structure + fasta sequences[2]; + + sequences[0].length = strlen((char *) seq1.c_str()); + sequences[0].text = (char *) seq1.c_str(); + sequences[0].title = new char[10]; + strcpy(sequences[0].title, "seq0"); + sequences[1].length = strlen((char *) seq2.c_str()); + sequences[1].text = (char *) seq2.c_str(); + sequences[1].title = new char[10]; + strcpy(sequences[1].title, "seq1"); + + if (TRACE) + + { + printf("%d %d %s\n%d %d %s\n--\n", a, sequences[0].length, + sequences[0].text, b, sequences[1].length, sequences[1].text); + printf("after init\n"); + + FILE *dump1 = fopen("dump1", "a"); + fprintf(dump1, "%d %d %s\n%d %d %s\n--\n", a, sequences[0].length, + sequences[0].text, b, sequences[1].length, sequences[1].text); + fclose(dump1); + } + + gap_open = argument.gapopen; + gap_ext = argument.gapext; + beta = argument.beta; + + stock_loop = argument.N; + le = argument.matrix; + + //compute the values of exp(beta * ?) + termgapopen = exp(beta * 0.0); + termgapextend = exp(beta * 0.0); + gap_open = exp(beta * gap_open); + gap_ext = exp(beta * gap_ext); + + if (TRACE) + printf("%f %f %f %d\n", gap_open, gap_ext, beta, le); + + //call for calculating the posterior probabilities + // 1. call partition function partf + // 2. calculate revpartition using revers_parf + // 3. calculate probabilities + /// MODIFICATION... POPULATE SAFE VECTOR + + long double **MAT1; + + MAT1 = partf(sequences, termgapopen, termgapextend, gap_open, gap_ext); + + return revers_partf(sequences, termgapopen, termgapextend, MAT1, gap_open, + gap_ext); + +} + +////////////////////////////////////////////////////////////// +//Compute Viterbi Alignment +// Added by YE Yongtao +///////////////////////////////////////////////////////////// + +pair *, float> partViterbi(string seq1, string seq2) { + + + double gap_open = -12, gap_ext = -1, beta = 0.2;//T = 5, beta = 1/T = 0.2, by default + int stock_loop = 1; + int le = 160; + //double termgapopen = 1.0f; //exp(0) + //double termgapextend = 1.0f; //exp(0) + + //initialize the sequence structure + fasta sequences[2]; + sequences[0].length = strlen((char *) seq1.c_str()); + sequences[0].text = (char *) seq1.c_str(); + sequences[0].title = new char[10]; + strcpy(sequences[0].title, "seq0"); + sequences[1].length = strlen((char *) seq2.c_str()); + sequences[1].text = (char *) seq2.c_str(); + sequences[1].title = new char[10]; + strcpy(sequences[1].title, "seq1"); + + gap_open = argument.gapopen; + gap_ext = argument.gapext; + beta = argument.beta; + + stock_loop = argument.N; + le = argument.matrix; + + //compute the values of exp(beta * ?) + double endgapopen = exp(beta * 0.0); + double endgapextend = exp(beta * 0.0); + double d = exp(beta * gap_open); + double e = exp(beta * gap_ext); + + int i, j, len1, len0; + long double **Zm = NULL, **Zf = NULL, **Ze = NULL; + int **traceZm = NULL, **traceZf = NULL, **traceZe = NULL; + + //the flag endgaps is set at the #define section + Zf = new long double *[sequences[1].length + 1]; + Ze = new long double *[sequences[1].length + 1]; + Zm = new long double *[sequences[1].length + 1]; + + traceZf = new int *[sequences[1].length + 1]; + traceZe = new int *[sequences[1].length + 1]; + traceZm = new int *[sequences[1].length + 1]; + + //DYNAMICALLY GROW 2D M,IX,IY,PIX,PIY MARICES + for (i = 0; i <= sequences[1].length; i++) { + Zf[i] = new long double[sequences[0].length + 1]; + Ze[i] = new long double[sequences[0].length + 1]; + Zm[i] = new long double[sequences[0].length + 1]; + + traceZf[i] = new int[sequences[0].length + 1]; + traceZe[i] = new int[sequences[0].length + 1]; + traceZm[i] = new int[sequences[0].length + 1]; + } + + len0 = strlen(sequences[0].text); + len1 = strlen(sequences[1].text); + + + for (i = 0; i <= sequences[1].length; i++) + for (j = 0; j <= sequences[0].length; j++) { + Zm[i][j] = 0.00; + Zf[i][j] = 0.00; + Ze[i][j] = 0.00; + + traceZm[i][j] = -1; + traceZf[i][j] = -1; + traceZe[i][j] = -1; + } + + + //INTITIALIZE THE DP + if (endgaps == 0) { + Zm[0][0] = 1.00; + + Zf[0][0] = Ze[0][0] = 0; + Zf[1][0] = Zm[0][0] * d; + Ze[0][1] = Zm[0][0] * d; + + //>=2ND ROW INIT + + for (i = 2; i <= sequences[1].length; i++) { + Zf[i][0] = Zf[i - 1][0] * e; + traceZf[i][0] = 2; + } + + + //>=2ND COL INIT + for (j = 2; j <= sequences[0].length; j++) { + Ze[0][j] = Ze[0][j - 1] * e; + traceZe[0][j] = 1; + } + } else { + //init z + Zm[0][0] = 1.00; + Zf[0][0] = Ze[0][0] = 0; + Zf[1][0] = Zm[0][0] * endgapopen; + Ze[0][1] = Zm[0][0] * endgapopen; + + //>=2ND ROW INIT + + for (i = 2; i <= sequences[1].length; i++) { + Zf[i][0] = Zf[i - 1][0] * endgapextend; + traceZf[i][0] = 2; + } + //>=2ND COL INIT + for (j = 2; j <= sequences[0].length; j++) { + Ze[0][j] = Ze[0][j - 1] * endgapextend; + traceZe[0][j] = 1; + } + } + + //1ST ROW/COL INIT + + int Si, Tj; + double score; + + for (i = 1; i <= sequences[1].length; i++) { + + for (j = 1; j <= sequences[0].length; j++) { + + Si = subst_index[sequences[1].text[i - 1] - 'A']; + Tj = subst_index[sequences[0].text[j - 1] - 'A']; + + score = sub_matrix[Si][Tj]; + + double open0, extend0, open1, extend1; + + open0 = open1 = d; + extend0 = extend1 = e; + + if (endgaps == 1) { + //check to see if one of the 2 sequences or both reach the end + + if (i == sequences[1].length) { + open0 = endgapopen; + extend0 = endgapextend; + + } + + if (j == sequences[0].length) { + open1 = endgapopen; + extend1 = endgapextend; + } + } + + // + //z computation using open and extend temp vars + //open0 is gap open in seq0 and open1 is gap open in seq1 + //entend0 is gap extend in seq0 and extend1 is gap extend in seq1 + Zf[i][j] = Zf[i - 1][j] * extend1; + traceZf[i][j] = 2; + + if(Zm[i - 1][j] * open1 > Zf[i][j]){ + Zf[i][j] = Zm[i - 1][j] * open1; + traceZf[i][j] = 0; + } + if (Zf[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Zf\n"); + exit(1); + } + Ze[i][j] = Ze[i][j - 1] * extend0; + traceZe[i][j] = 1; + if(Zm[i][j - 1] * open0 > Ze[i][j]){ + Ze[i][j] = Zm[i][j - 1] * open0; + traceZe[i][j] = 0; + } + + if (Ze[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Ze\n"); + exit(1); + } + + Zm[i][j] = Zm[i - 1][j - 1] * score; + traceZm[i][j] = 0; + if(Zf[i - 1][j - 1] * score > Zm[i][j]){ + Zm[i][j] = Zf[i - 1][j - 1] * score; + traceZm[i][j] = 2; + } + if(Ze[i - 1][j - 1] * score > Zm[i][j]){ + Zm[i][j] = Ze[i - 1][j - 1] * score; + traceZm[i][j] = 1; + } + if (Zm[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Zm\n"); + exit(1); + } + + }//end for + }//end for + // figure out best terminating cell + + float bestProb = Zm[sequences[1].length][sequences[0].length]; + int state = 0; + if( bestProb < Zf[sequences[1].length][sequences[0].length]){ + bestProb = Zf[sequences[1].length][sequences[0].length]; + state = 2; + } + if( bestProb < Ze[sequences[1].length][sequences[0].length]){ + bestProb = Ze[sequences[1].length][sequences[0].length]; + state = 1; + } + assert (state != -1); + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int c = sequences[1].length, r = sequences[0].length; + while (r != 0 || c != 0){ + int newState; + if(state == 0){ + newState = traceZm[c][r]; + c--; r--; alignment->push_back ('B'); + } + else if(state == 1){ + newState = traceZe[c][r]; + r--; alignment->push_back ('X'); + } + else{ + newState = traceZf[c][r]; + c--; alignment->push_back ('Y'); + } + state = newState; + } + + reverse (alignment->begin(), alignment->end()); + + for (i = 0; i <= sequences[1].length; i++) { + delete (Zf[i]); + delete (Ze[i]); + delete (Zm[i]); + delete (traceZf[i]); + delete (traceZe[i]); + delete (traceZm[i]); + } + + delete (Zf); + delete (Ze); + delete (Zm); + delete (traceZf); + delete (traceZe); + delete (traceZm); + + return make_pair(alignment, bestProb); +} + +////////////////////////////////////////////////////////////// +// Compute two sequences' similarity defined as the normalized alignment score without gap penalties +// Added by YE Yongtao +///////////////////////////////////////////////////////////// + +float computeSimilarity(string seq1, string seq2, SafeVector * alignment) { + + //initialize the sequence structure + fasta sequences[2]; + sequences[0].length = strlen((char *) seq1.c_str()); + sequences[0].text = (char *) seq1.c_str(); + sequences[0].title = new char[10]; + strcpy(sequences[0].title, "seq0"); + sequences[1].length = strlen((char *) seq2.c_str()); + sequences[1].text = (char *) seq2.c_str(); + sequences[1].title = new char[10]; + strcpy(sequences[1].title, "seq1"); + + float bestProb = 0; + int Si, Tj; + double score; + int i = 1;int j = 1; + for (SafeVector::iterator iter = alignment->begin(); + iter != alignment->end(); ++iter){ + if (*iter == 'B'){ + Si = subst_index[sequences[1].text[j - 1] - 'A']; + Tj = subst_index[sequences[0].text[i - 1] - 'A']; + score = normalized_matrix[Si][Tj]; + bestProb += score; + i++; j++; + } + else if(*iter == 'X') i++; + else if(*iter == 'Y') j++; + } + if(i!= sequences[0].length + 1 || j!= sequences[1].length + 1 ) cerr << "similarity error"<< endl; + bestProb /= alignment->size(); + //bestProb /= min(sequences[0].length, sequences[1].length); + return bestProb; +} +//end of posterior probability module diff --git a/binaries/src/GLProbs-1.0/MSAProbs.vcproj b/binaries/src/GLProbs-1.0/MSAProbs.vcproj new file mode 100644 index 0000000..5212610 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAProbs.vcproj @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/binaries/src/GLProbs-1.0/MSAProbs.vcproj.STUDENT.LIUY0039.user b/binaries/src/GLProbs-1.0/MSAProbs.vcproj.STUDENT.LIUY0039.user new file mode 100644 index 0000000..99168da --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAProbs.vcproj.STUDENT.LIUY0039.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/binaries/src/GLProbs-1.0/MSAReadMatrix.cpp b/binaries/src/GLProbs-1.0/MSAReadMatrix.cpp new file mode 100644 index 0000000..e978eb4 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAReadMatrix.cpp @@ -0,0 +1,215 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include "MSAReadMatrix.h" + +#define TRACE 0 + +//////////////////////////////////////////////////////////// +// extern variables for scoring matrix data +//////////////////////////////////////////////////////////// +extern float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +extern char *aminos, *bases, matrixtype[20]; +extern int subst_index[26]; + +extern double sub_matrix[26][26]; +extern double normalized_matrix[26][26]; + +extern float TEMPERATURE; +extern int MATRIXTYPE; + +extern float GAPOPEN; +extern float GAPEXT; + +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +//argument support +extern argument_decl argument; + +///////////////////////////////////////////////////////// +//sets substitution matrix type +//////////////////////////////////////////////////////// +void setmatrixtype(int le) { + switch (le) { + case 160: + strcpy(matrixtype, "gonnet_160"); + break; + case 4: + strcpy(matrixtype, "nuc_simple"); + break; + default: + strcpy(matrixtype, "CUSTOM"); + break; + + }; + +} + +/////////////////////////////////////////////////////////////////// +//sets matrix flag +/////////////////////////////////////////////////////////////////// +inline int matrixtype_to_int() { + + if (!strcmp(matrixtype, "nuc_simple")) + return 4; + else if (!strcmp(matrixtype, "gonnet_160")) + return 160; + else + return 1000; + +} + +///////////////////////////////////////////////////////////////// +// +// Can read any scoring matrix as long as it is defined in Matrix.h +// AND it is a lower triangular +// AND the order of amino acids/bases is mentioned +///////////////////////////////////////////////////////////////// + +inline void read_matrix(score_matrix matrx) { + int i, j, basecount, position = 0; + + bases = (char *) matrx.monomers; + + basecount = strlen(bases); + + for (i = 0; i < basecount; i++) + subst_index[i] = -1; + + for (i = 0; i < basecount; i++) + subst_index[bases[i] - 'A'] = i; + + if (TRACE == 1) + printf("\nbases read: %d\n", basecount); + + for (i = 0; i < basecount; i++) + for (j = 0; j <= i; j++) { + + double value = exp(argument.beta * matrx.matrix[position++]); + sub_matrix[i][j] = value; + sub_matrix[j][i] = value; + } + + if (TRACE) + for (i = 0; i < basecount; i++) { + for (j = 0; j < basecount; j++) + printf(" %g ", sub_matrix[i][j]); + printf("\n"); + } + +} + +///////////////////////////////////////////////////////////////// +// read normalized residue exchange matrix +// compute sequence similarity +// add by YE Yongtao +///////////////////////////////////////////////////////////////// + +inline void read_normalized_matrix(score_matrix matrx) { + int i, j, basecount, position = 0; + + bases = (char *) matrx.monomers; + + basecount = strlen(bases); + + for (i = 0; i < basecount; i++) + subst_index[i] = -1; + + for (i = 0; i < basecount; i++) + subst_index[bases[i] - 'A'] = i; + + if (TRACE == 1) + printf("\nbases read: %d\n", basecount); + + for (i = 0; i < basecount; i++) + for (j = 0; j <= i; j++) { + + double value = matrx.matrix[position++]; + normalized_matrix[i][j] = value; + normalized_matrix[j][i] = value; + } + + if (TRACE) + for (i = 0; i < basecount; i++) { + for (j = 0; j < basecount; j++) + printf(" %g ", normalized_matrix[i][j]); + printf("\n"); + } + +} +////////////////////////////////////////////////////////////////////////////////// +//intialize the arguments (default values) +////////////////////////////////////////////////////////////////////////////////// +void init_arguments() { + float gap_open = 0, gap_ext = 0; + int le; + + le = matrixtype_to_int(); + + argument.N = 1; + strcpy(argument.input, "tempin"); + argument.matrix = le; + argument.gapopen = GAPOPEN; + argument.gapext = GAPEXT; + argument.T = TEMPERATURE; + argument.beta = 1.0 / TEMPERATURE; + argument.opt = 'P'; + + if (le == 4) //NUC OPTION :default is nuc_simple + { + read_matrix(nuc_simple); + gap_open = -4; + gap_ext = -0.25; + } + + else if (le == 160) //PROT option: default is gonnet_160 + { + if (TRACE) + printf("read matrix\n"); + read_matrix(gonnet_160); + gap_open = -22; + gap_ext = -1; + + read_normalized_matrix(normalized_blosum_30); // add by YE Yongtao + } else if (le == 1000) { //Error handling + printf("Error: enter a valid matrix type\n"); + exit(1); + //additional matrices can only be lower triangular + } + + //now override the gapopen and gapext + if (argument.gapopen != 0.0 || argument.gapext != 0.00) + + { + gap_open = -argument.gapopen; + gap_ext = -argument.gapext; + } + + if (TRACE) + printf("%f %f %f %d\n", argument.T, gap_open, gap_ext, le); + + argument.gapopen = gap_open; + argument.gapext = gap_ext; + argument.opt = 'P'; + +} diff --git a/binaries/src/GLProbs-1.0/MSAReadMatrix.h b/binaries/src/GLProbs-1.0/MSAReadMatrix.h new file mode 100644 index 0000000..0f0ad00 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAReadMatrix.h @@ -0,0 +1,151 @@ +///////////////////////////////////////////////////////////////// +// Matrix.h +// +// Specifies scoring matrices and their structure +// +// +// +///////////////////////////////////////////////////////////////// + +#ifndef _MSA_READ_MATRIX_H +#define _MSA_READ_MATRIX_H + +typedef struct { + char monomers[26]; /* amino or nucleic acid order */ + float matrix[676]; /* entries of the score matix, 26*26=676 */ +} score_matrix; + +//default protein sequence scoring matrix as well as default scoring matrix of the PROBALIGN +//also used when -prot option is used + +score_matrix gonnet_160 = { "ABCDEFGHIKLMNPQRSTVWXYZ", + +{ 4.6, 0.0, 0.0, 0.3, 0.0, 13.5, -1.1, 0.0, -5.3, 7.0, -0.4, 0.0, -5.2, 3.4, + 5.9, -3.8, 0.0, -1.8, -7.0, -6.2, 9.1, 0.2, 0.0, -3.4, -0.7, -2.1, -7.6, + 8.2, -1.8, 0.0, -2.3, -0.1, -0.1, -0.7, -2.7, 9.3, -1.8, 0.0, -2.5, + -6.2, -4.3, 0.3, -7.0, -3.7, 5.9, -1.2, 0.0, -4.8, -0.1, 1.3, -5.3, + -2.4, 0.2, -3.5, 5.5, -2.2, 0.0, -2.9, -6.5, -4.5, 1.9, -6.7, -3.2, 3.0, + -3.4, 5.7, -1.2, 0.0, -1.9, -5.0, -3.1, 1.4, -5.2, -2.1, 2.9, -2.1, 3.4, + 7.6, -1.2, 0.0, -3.1, 2.6, 0.5, -4.7, -0.2, 1.5, -4.4, 0.8, -4.8, -3.6, + 6.5, -0.1, 0.0, -5.2, -1.9, -1.4, -5.8, -3.0, -2.2, -4.3, -1.6, -3.5, + -4.2, -2.2, 9.6, -0.7, 0.0, -4.2, 0.6, 2.3, -4.1, -2.1, 1.7, -3.2, 2.0, + -2.4, -1.2, 0.5, -0.8, 5.6, -1.6, 0.0, -3.5, -1.6, -0.3, -5.3, -2.1, + 0.3, -4.1, 3.5, -3.5, -2.9, -0.4, -2.1, 1.7, 7.1, 1.6, 0.0, -0.2, 0.0, + -0.3, -4.5, -0.1, -0.8, -3.3, -0.4, -3.6, -2.3, 1.1, 0.0, -0.2, -0.9, + 4.4, 0.5, 0.0, -1.4, -0.6, -0.8, -3.6, -2.4, -0.8, -1.2, -0.2, -2.4, + -1.1, 0.3, -0.4, -0.4, -0.9, 2.3, 5.0, 0.1, 0.0, -0.6, -4.9, -3.0, -0.8, + -5.2, -3.5, 4.0, -3.0, 1.7, 1.4, -3.8, -3.2, -2.7, -3.4, -2.0, 0.0, 5.3, + -5.5, 0.0, -2.1, -7.8, -6.4, 3.2, -5.5, -1.9, -3.4, -5.4, -2.0, -2.2, + -5.5, -7.4, -4.0, -2.4, -4.7, -5.4, -4.5, 15.8, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, -3.7, 0.0, -1.3, -4.2, -4.4, 5.6, -6.0, 2.7, -2.0, -3.5, -1.1, + -1.3, -2.2, -4.8, -2.9, -2.9, -2.8, -3.2, -2.4, 3.8, 0.0, 10.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } + +}; + +//normalized blosum_62 scoring matrix for computing protein sequence similarity +score_matrix normalized_blosum_62 = { + +"ABCDEFGHIKLMNPQRSTVWXYZ", +{ +0.533333333, +0.133333333,0.533333333, +0.266666667,0.066666667,0.866666667, +0.133333333,0.533333333,0.066666667,0.666666667, +0.2,0.333333333,0,0.4,0.6, +0.133333333,0.066666667 ,0.133333333,0.066666667,0.066666667,0.666666667, +0.266666667,0.2 ,0.066666667,0.2,0.133333333,0.066666667,0.666666667, +0.133333333,0.266666667 ,0.066666667,0.2,0.266666667,0.2,0.133333333,0.8, +0.2,0.066666667 ,0.2,0.066666667,0.066666667,0.266666667,0,0.066666667,0.533333333, +0.2,0.266666667 ,0.066666667,0.2,0.333333333,0.066666667,0.133333333,0.2,0.066666667,0.6, +0.2,0,0.2,0,0.066666667,0.266666667 ,0,0.066666667 ,0.4,0.133333333,0.533333333, +0.2,0.066666667 ,0.2,0.066666667,0.133333333,0.266666667,0.066666667 ,0.133333333,0.333333333,0.2,0.4,0.6, +0.133333333,0.466666667 ,0.066666667,0.333333333,0.266666667,0.066666667,0.266666667,0.333333333,0.066666667, 0.266666667,0.066666667 ,0.133333333,0.666666667, +0.2,0.133333333 ,0.066666667,0.2,0.2, 0,0.133333333, 0.133333333,0.066666667 ,0.2,0.066666667,0.133333333, 0.133333333,0.733333333 , +0.2,0.266666667 ,0.066666667,0.266666667,0.4,0.066666667,0.133333333, 0.266666667,0.066666667 ,0.333333333, 0.133333333,0.266666667 ,0.266666667,0.2,0.6, +0.2,0.2 ,0.066666667,0.133333333,0.266666667,0.066666667,0.133333333,0.266666667,0.066666667,0.4, 0.133333333,0.2,0.266666667,0.133333333,0.333333333,0.6 , +0.333333333,0.266666667 ,0.2,0.266666667,0.266666667,0.133333333,0.266666667,0.2,0.133333333, 0.266666667,0.133333333 ,0.2,0.333333333,0.2,0.266666667,0.2,0.533333333, +0.266666667, 0.2,0.2,0.2, 0.2, 0.133333333,0.133333333,0.133333333,0.2 ,0.2,0.2,0.2,0.266666667,0.2, 0.2,0.2 ,0.333333333,0.6, +0.266666667,0.066666667 ,0.2,0.066666667,0.133333333,0.2,0.066666667,0.066666667,0.466666667,0.133333333, 0.333333333,0.333333333, 0.066666667,0.133333333,0.133333333 ,0.066666667, 0.133333333, 0.266666667, 0.533333333, +0.066666667,0,0.133333333,0,0.066666667 ,0.333333333 , 0.133333333, 0.133333333,0.066666667 , 0.066666667, 0.133333333 ,0.2 , 0, 0,0.133333333 ,0.066666667 , 0.066666667 , 0.133333333 , 0.066666667 , 1, +0.266666667,0.2 ,0.133333333 , 0.2 , 0.2 , 0.2 , 0.2,0.2 , 0.2,0.2 ,0.2 , 0.2 , 0.2 , 0.133333333, 0.2 ,0.2 , 0.266666667 , 0.266666667,0.2 ,0.133333333, 0.2 , +0.133333333,0.066666667 , 0.133333333 , 0.066666667 , 0.133333333 , 0.466666667, 0.066666667,0.4 ,0.2, 0.133333333 , 0.2 , 0.2, 0.133333333 , 0.066666667, 0.2, 0.133333333,0.133333333 ,0.133333333 , 0.2 , 0.4,0.2 , 0.733333333, +0.2,0.333333333 ,0.066666667 ,0.333333333 , 0.533333333 , 0.066666667, 0.133333333, 0.266666667,0.066666667 ,0.333333333 , 0.066666667, 0.2, 0.266666667, 0.2 , 0.466666667,0.266666667 ,0.266666667, 0.2 , 0.133333333, 0.066666667 , 0.2,0.133333333 ,0.533333333 + +} +}; + +//normalized blosum_30 scoring matrix for computing protein sequence similarity +score_matrix normalized_blosum_30 = { + +"ABCDEFGHIKLMNPQRSTVWXYZ", +{ +0.407407407 , +0.259259259 , 0.444444444 , +0.148148148 , 0.185185185 , 0.888888889 , +0.259259259 , 0.444444444 , 0.148148148 , 0.592592593 , +0.259259259 , 0.259259259 , 0.296296296 , 0.296296296 , 0.481481481 , +0.185185185 , 0.148148148 , 0.148148148 , 0.074074074 , 0.111111111 , 0.62962963 , +0.259259259 , 0.259259259 , 0.111111111 , 0.222222222 , 0.185185185 , 0.148148148 , 0.555555556 , +0.185185185 , 0.185185185 , 0.074074074 , 0.185185185 , 0.259259259 , 0.148148148 , 0.148148148 , 0.777777778 , +0.259259259 , 0.185185185 , 0.185185185 , 0.111111111 , 0.148148148 , 0.259259259 , 0.222222222 , 0.185185185 , 0.481481481 , +0.259259259 , 0.259259259 , 0.148148148 , 0.259259259 , 0.333333333 , 0.222222222 , 0.222222222 , 0.185185185 , 0.185185185 , 0.407407407 , +0.222222222 , 0.222222222 , 0.259259259 , 0.222222222 , 0.222222222 , 0.333333333 , 0.185185185 , 0.222222222 , 0.333333333 , 0.185185185 , 0.407407407 , +0.296296296 , 0.185185185 , 0.185185185 , 0.148148148 , 0.222222222 , 0.185185185 , 0.185185185 , 0.333333333 , 0.296296296 , 0.333333333 , 0.333333333 , 0.481481481 , +0.259259259 , 0.407407407 , 0.222222222 , 0.296296296 , 0.222222222 , 0.222222222 , 0.259259259 , 0.222222222 , 0.259259259 , 0.259259259 , 0.185185185 , 0.259259259 , 0.555555556 , +0.222222222 , 0.185185185 , 0.148148148 , 0.222222222 , 0.296296296 , 0.111111111 , 0.222222222 , 0.296296296 , 0.148148148 , 0.296296296 , 0.148148148 , 0.111111111 , 0.148148148 , 0.666666667 , +0.296296296 , 0.222222222 , 0.185185185 , 0.222222222 , 0.333333333 , 0.148148148 , 0.185185185 , 0.259259259 , 0.185185185 , 0.259259259 , 0.185185185 , 0.222222222 , 0.222222222 , 0.259259259 , 0.555555556 , +0.222222222 , 0.185185185 , 0.185185185 , 0.222222222 , 0.222222222 , 0.222222222 , 0.185185185 , 0.222222222 , 0.148148148 , 0.296296296 , 0.185185185 , 0.259259259 , 0.185185185 , 0.222222222 , 0.37037037 , 0.555555556 , +0.296296296 , 0.259259259 , 0.185185185 , 0.259259259 , 0.259259259 , 0.222222222 , 0.259259259 , 0.222222222 , 0.222222222 , 0.259259259 , 0.185185185 , 0.185185185 , 0.259259259 , 0.222222222 , 0.222222222 , 0.222222222 , 0.407407407 , +0.296296296 , 0.259259259 , 0.185185185 , 0.222222222 , 0.185185185 , 0.185185185 , 0.185185185 , 0.185185185 , 0.259259259 , 0.222222222 , 0.259259259 , 0.259259259 , 0.296296296 , 0.259259259 , 0.259259259 , 0.148148148 , 0.333333333 , 0.444444444 , +0.296296296 , 0.185185185 , 0.185185185 , 0.185185185 , 0.148148148 , 0.296296296 , 0.148148148 , 0.148148148 , 0.407407407 , 0.185185185 , 0.296296296 , 0.259259259 , 0.185185185 , 0.111111111 , 0.148148148 , 0.222222222 , 0.222222222 , 0.296296296 , 0.444444444 , +0.074074074 , 0.074074074 , 0.185185185 , 0.111111111 , 0.222222222 , 0.296296296 , 0.296296296 , 0.074074074 , 0.148148148 , 0.185185185 , 0.185185185 , 0.148148148 , 0 , 0.148148148 , 0.222222222 , 0.259259259 , 0.148148148 , 0.074074074 , 0.148148148 , 1 , +0.259259259 , 0.222222222 , 0.185185185 , 0.222222222 , 0.222222222 , 0.222222222 , 0.222222222 , 0.222222222 , 0.259259259 , 0.259259259 , 0.259259259 , 0.259259259 , 0.259259259 , 0.222222222 , 0.259259259 , 0.222222222 , 0.259259259 , 0.259259259 , 0.259259259 , 0.185185185 , 0.222222222 , +0.111111111 , 0.148148148 , 0.037037037 , 0.222222222 , 0.185185185 , 0.37037037 , 0.148148148 , 0.259259259 , 0.222222222 , 0.222222222 , 0.37037037 , 0.222222222 , 0.111111111 , 0.185185185 , 0.222222222 , 0.259259259 , 0.185185185 , 0.222222222 , 0.296296296 , 0.444444444 , 0.222222222 , 0.592592593 , +0.259259259 , 0.259259259 , 0.259259259 , 0.259259259 , 0.444444444 , 0.111111111 , 0.185185185 , 0.259259259 , 0.148148148 , 0.296296296 , 0.222222222 , 0.222222222 , 0.222222222 , 0.259259259 , 0.407407407 , 0.259259259 , 0.222222222 , 0.222222222 , 0.148148148 , 0.222222222 , 0.259259259 , 0.185185185 , 0.407407407 + +} +}; + +//default nucleotide sequence scoring matrix +//used when -nuc option is used +score_matrix nuc_simple = { + +"ABCDGHKMNRSTUVWXY", + +{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 } + +//Ribosum85-60 + /* + { + 2.22, + 0, 0, + -1.86, 0, 1.16, + 0, 0, 0, 0, + -1.46, 0, -2.48, 0, 1.03, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1.39, 0, -1.05, 0, -1.74, 0, 0, 0, 0, 0, 0, 1.65, + -1.39, 0, -1.05, 0, -1.74, 0, 0, 0, 0, 0, 0, 0, 1.65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + */ + + }; + +#endif diff --git a/binaries/src/GLProbs-1.0/MSAdiv3.cpp b/binaries/src/GLProbs-1.0/MSAdiv3.cpp new file mode 100644 index 0000000..2d0411d --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAdiv3.cpp @@ -0,0 +1,1472 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSA.h" +#include "MSAClusterTree.h" +#include "Defaults.h" + +#ifdef _OPENMP +#include +#endif + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; + +bool enableVerbose = false; +bool enableAnnotation = false; +bool enableClustalWOutput = false; +bool enableAlignOrder = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; + +float cutoff = 0; + +VF initDistrib(NumMatrixTypes); +VF gapOpen(2 * NumInsertStates); +VF gapExtend(2 * NumInsertStates); +VVF emitPairs(256, VF(256, 1e-10)); +VF emitSingle(256, 1e-5); + +string alphabet = alphabetDefault; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +string posteriorProbsFilename = ""; +bool allscores = true; +string infilename; + +int flag_gui = 0; //0: no gui related o/p +//1: gui related o/p generated +int flag_ppscore = 0; //0: no pp score sequence added to o/p fasta alignment +//1: pp score seq added to o/p fasta alignment + +/////////////////////////////// +// global scoring matrix variables +////////////////////////////// +float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +char *aminos, *bases, matrixtype[20] = "gonnet_160"; +int subst_index[26]; + +double sub_matrix[26][26]; +int firstread = 0; //this makes sure that matrices are read only once + +float TEMPERATURE = 5; +int MATRIXTYPE = 160; +int prot_nuc = 0; //0=prot, 1=nucleotide + +float GAPOPEN = 0; +float GAPEXT = 0; +int numThreads = 0; + +//argument support +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +argument_decl argument; + +extern inline void read_sustitution_matrix(char *fileName); +extern void setmatrixtype(int le); +extern inline int matrixtype_to_int(); +extern inline void read_dna_matrix(); +extern inline void read_vtml_la_matrix(); +extern void init_arguments(); + +MSA::MSA(int argc, char* argv[]) { + //parse program parameters + SafeVector sequenceNames = ParseParams(argc, argv); + + //initialize arguments for partition function + init_arguments(); + + ReadParameters(); + //PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + //read the input sequences + MultiSequence *sequences = new MultiSequence(); + assert(sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++) { + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA(sequenceNames[i], true); + } + //allocate space for sequence weights + this->seqsWeights = new int[sequences->GetNumSequences()]; + //initilaize parameters for OPENMP +#ifdef _OPENMP + if(numThreads <= 0) { + numThreads = omp_get_num_procs(); + cerr << "Automatically detected " << numThreads << " CPU cores" << endl; + } + cerr <<"Enabling OpenMP (with "<WriteALN(*alignOutFile); + } else { + alignment->WriteMFA(*alignOutFile); + } + //release resources + delete[] this->seqsWeights; + delete alignment; + delete sequences; +} +MSA::~MSA() { + /*close the output file*/ + if (alignOutFileName.length() > 0) { + ((std::ofstream*) alignOutFile)->close(); + } +} +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints MSAPROBS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void MSA::PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename) { + + // print parameters to the screen + cerr << message << endl << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) + cerr << setprecision(10) << initDistrib[i] << " "; + cerr << "}" << endl << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapOpen[i] << " "; + cerr << "}" << endl << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapExtend[i] << " "; + cerr << "}" << endl << endl; + + /* + for (int i = 0; i < 5; i++){ + for (int j = 0; j <= i; j++){ + cerr << emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]] << " "; + } + cerr << endl; + }*/ + + // if a file name is specified + if (filename) { + + // attempt to open the file for writing + FILE *file = fopen(filename, "w"); + if (!file) { + cerr << "ERROR: Unable to write parameter file: " << filename + << endl; + exit(1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) + fprintf(file, "%.10f ", initDistrib[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapOpen[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapExtend[i]); + fprintf(file, "\n"); + fprintf(file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) + fprintf(file, "%.10f ", + emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf(file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf(file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf(file, "\n"); + fclose(file); + } +} + +///////////////////////////////////////////////////////////////// +// doAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +extern VF *ComputePostProbs(int a, int b, string seq1, string seq2); +MultiSequence* MSA::doAlign(MultiSequence *sequences, + const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, + VF &gapExtend, VVF &emitPairs, VF &emitSingle) { + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + + //create distance matrix + VVF probalign_distances(numSeqs, VF(numSeqs, 0)); + VVF distances(numSeqs, VF(numSeqs, 0));//msa + + float gl_accuracy = 0; + //creat sparseMatrices + SafeVector > probalign_sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + SafeVector > sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); // msa + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + // do all pairwise alignments for posterior probability matrices +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + // verbose output + if (enableVerbose) { + cerr << "Computing posterior matrix: (" << a + 1 << ") " + << seq1->GetHeader() << " vs. " << "(" << b + 1 << ") " + << seq2->GetHeader() << " -- "; + } + +//probcons + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix(seq1, seq2); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2); + assert(backward); + // compute posterior probability matrix from HMM + VF *probcons_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward); + assert(probcons_posterior); + delete forward; + delete backward; + +//probalign + VF *probalign_posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + assert(probalign_posterior); + probalign_sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(),seq2->GetLength(), *probalign_posterior); + probalign_sparseMatrices[b][a] = NULL; + pair *, float> probalign_alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *probalign_posterior); + probalign_distances[a][b] =1.0f - probalign_alignment.second / min(seq1->GetLength(), seq2->GetLength()); + delete probalign_alignment.first; + +//local + forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + VF* local_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + delete forward; + delete backward; + +//GL + //merge probalign + local + probcons + VF::iterator ptr1 = probcons_posterior->begin(); + VF::iterator ptr2 = probalign_posterior->begin(); + VF::iterator ptr3 = local_posterior->begin(); + VF* posterior = new VF((seq1->GetLength()+1) * (seq2->GetLength()+1)); assert (posterior); //msa + VF::iterator ptr = posterior->begin(); + for (int i = 0; i <= seq1->GetLength(); i++) { + for (int j = 0; j <= seq2->GetLength(); j++) { + float v1 = *ptr1; + float v2 = *ptr2; + float v3 = *ptr3; + *ptr = sqrt((v1*v1 + v2*v2 + v3*v3)/3); + ptr1++; + ptr2++; + ptr3++; + ptr++; + } + } + // perform the pairwise sequence alignment + pair *, float> gl_alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); + + //compute expected accuracy + distances[a][b] = distances[b][a] = 1.0f - gl_alignment.second + / min(seq1->GetLength(), seq2->GetLength()); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + // + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + float N_correct_match = 0; + int i = 1;int j = 1; + for (SafeVector::iterator iter = gl_alignment.first->begin(); + iter != gl_alignment.first->end(); ++iter){ + if (*iter == 'B'){ + unsigned char c1 = (unsigned char) iter1[i++]; + unsigned char c2 = (unsigned char) iter2[j++]; + if(c1==c2) N_correct_match += 1; + } + else if(*iter == 'X') i++; + else if(*iter == 'Y') j++; + } + if(i!= seq1->GetLength()+1 || j!= seq2->GetLength() + 1 ) cerr << "GL"<< endl; + gl_accuracy += N_correct_match / min(seq1->GetLength(), seq2->GetLength()); + // + delete probcons_posterior; + delete probalign_posterior; + delete local_posterior; + delete posterior; + +#ifndef _OPENMP + } +#endif + } + +/* +//self-adaptive + gl_accuracy /= numPairs; + if(gl_accuracy > 0.4){ + for (int a = 0; a < numSeqs - 1; a++) + for (int b = a + 1; b < numSeqs; b++) { + distances[a][b] = distances[b][a] = probalign_distances[a][b]; + sparseMatrices[a][b] = probalign_sparseMatrices[a][b]; + sparseMatrices[b][a] = NULL; + } + } +*/ + //create the guide tree + this->tree = new MSAClusterTree(this, distances, numSeqs); + this->tree->create(); + + // perform the consistency transformation the desired number of times + float* fweights = new float[numSeqs]; + for (int r = 0; r < numSeqs; r++) { + fweights[r] = ((float) seqsWeights[r]) / INT_MULTIPLY; + fweights[r] *= 10; + } + for (int r = 0; r < numConsistencyReps; r++) { + SafeVector > newSparseMatrices = + DoRelaxation(fweights, sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + delete[] fweights; +#ifdef _OPENMP + delete [] seqsPairs; +#endif + + //compute the final multiple sequence alignment + MultiSequence *finalAlignment = ComputeFinalAlignment(this->tree, sequences, + sparseMatrices, model); + + // build annotation + if (enableAnnotation) { + WriteAnnotation(finalAlignment, sparseMatrices); + } + //destroy the guide tree + delete this->tree; + this->tree = 0; + + // delete sparse matrices + for (int a = 0; a < numSeqs - 1; a++) { + for (int b = a + 1; b < numSeqs; b++) { + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + + return finalAlignment; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger(char *data, int *val) { + char *endPtr; + long int retVal; + + assert(val); + + errno = 0; + retVal = strtol(data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) + return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) + return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat(char *data, float *val) { + char *endPtr; + double retVal; + + assert(val); + + errno = 0; + retVal = strtod(data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) + return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void MSA::ReadParameters() { + + ifstream data; + + emitPairs = VVF(256, VF(256, 1e-10)); + emitSingle = VF(256, 1e-5); + + // read initial state distribution and transition parameters + if (parametersInputFilename == string("")) { + if (NumInsertStates == 1) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend1Default[i]; + } else if (NumInsertStates == 2) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend2Default[i]; + } else { + cerr + << "ERROR: No default initial distribution/parameter settings exist" + << endl << " for " << NumInsertStates + << " pairs of insert states. Use --paramfile." << endl; + exit(1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++) { + emitSingle[(unsigned char) tolower(alphabet[i])] = + emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = + emitSingleDefault[i]; + for (int j = 0; j <= i; j++) { + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + } + } + } else { + data.open(parametersInputFilename.c_str()); + if (data.fail()) { + cerr << "ERROR: Unable to read parameter file: " + << parametersInputFilename << endl; + exit(1); + } + + string line[3]; + for (int i = 0; i < 3; i++) { + if (!getline(data, line[i])) { + cerr + << "ERROR: Unable to read transition parameters from parameter file: " + << parametersInputFilename << endl; + exit(1); + } + } + istringstream data2; + data2.clear(); + data2.str(line[0]); + for (int i = 0; i < NumMatrixTypes; i++) + data2 >> initDistrib[i]; + data2.clear(); + data2.str(line[1]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapOpen[i]; + data2.clear(); + data2.str(line[2]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapExtend[i]; + + if (!getline(data, line[0])) { + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " + << parametersInputFilename << endl; + exit(1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); + data2.str(line[0]); + while (data2 >> token) + alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) { + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++) { + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// +void MSA::printUsage() { + cerr + << "************************************************************************" + << endl + << "\tMSAPROBS is a open-source protein multiple sequence alignment algorithm" + << endl + << "\tbased on pair hidden markov model and partition function postirior" + << endl + << "\tprobabilities. If any comments or problems, please contact" + << endl + << "\tLiu Yongchao(liuy0039@ntu.edu.sg or nkcslyc@hotmail.com)" + << endl + << "*************************************************************************" + << endl << "Usage:" << endl + << " msaprobs [OPTION]... [infile]..." << endl << endl + << "Description:" << endl + << " Align sequences in multi-FASTA format" << endl << endl + << " -o, --outfile " << endl + << " specify the output file name (STDOUT by default)" + << endl << " -num_threads " << endl + << " specify the number of threads used, and otherwise detect automatically" + << endl << " -clustalw" << endl + << " use CLUSTALW output format instead of FASTA format" + << endl << endl << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " + << MAX_CONSISTENCY_REPS << " (default: " << numConsistencyReps + << ") passes of consistency transformation" << endl << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS + << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS << " (default: " + << numIterativeRefinementReps << ") passes of iterative-refinement" + << endl << endl << " -v, --verbose" << endl + << " report progress while aligning (default: " + << (enableVerbose ? "on" : "off") << ")" << endl << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" + << endl << endl << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << " -version " << endl + << " print out version of MSAPROBS " << endl << endl; +} +SafeVector MSA::ParseParams(int argc, char **argv) { + if (argc < 2) { + printUsage(); + exit(1); + } + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + //help + if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-?")) { + printUsage(); + exit(1); + //output file name + } else if (!strcmp(argv[i], "-o") + || !strcmp(argv[i], "--outfile")) { + if (i < argc - 1) { + alignOutFileName = argv[++i]; //get the file name + } else { + cerr << "ERROR: String expected for option " << argv[i] + << endl; + exit(1); + } + // parameter file + } else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + //number of threads used + } else if (!strcmp(argv[i], "-p") + || !strcmp(argv[i], "-num_threads")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << " ERROR: invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < 0) { + tempInt = 0; + } + numThreads = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + // number of consistency transformations + } else if (!strcmp(argv[i], "-c") + || !strcmp(argv[i], "--consistency")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_CONSISTENCY_REPS + || tempInt > MAX_CONSISTENCY_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " + << MAX_CONSISTENCY_REPS << "." << endl; + exit(1); + } else { + numConsistencyReps = tempInt; + } + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp(argv[i], "-ir") + || !strcmp(argv[i], "--iterative-refinement")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS + || tempInt > MAX_ITERATIVE_REFINEMENT_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " + << MAX_ITERATIVE_REFINEMENT_REPS << "." + << endl; + exit(1); + } else + numIterativeRefinementReps = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // annotation files + else if (!strcmp(argv[i], "-annot")) { + enableAnnotation = true; + if (i < argc - 1) { + annotationFilename = argv[++i]; + } else { + cerr << "ERROR: FILENAME expected for option " << argv[i] + << endl; + exit(1); + } + } + + // clustalw output format + else if (!strcmp(argv[i], "-clustalw")) { + enableClustalWOutput = true; + } + + // cutoff + else if (!strcmp(argv[i], "-co") || !strcmp(argv[i], "--cutoff")) { + if (i < argc - 1) { + if (!GetFloat(argv[++i], &tempFloat)) { + cerr + << "ERROR: Invalid floating-point value following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempFloat < 0 || tempFloat > 1) { + cerr << "ERROR: For option " << argv[i - 1] + << ", floating-point value must be between 0 and 1." + << endl; + exit(1); + } else + cutoff = tempFloat; + } + } else { + cerr << "ERROR: Floating-point value expected for option " + << argv[i] << endl; + exit(1); + } + } + + // verbose reporting + else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + enableVerbose = true; + } + + // alignment order + else if (!strcmp(argv[i], "-a") + || !strcmp(argv[i], "--alignment-order")) { + enableAlignOrder = true; + } + + //print out version + else if (!strcmp(argv[i], "-version")) { + cerr << "MSAPROBS version " << VERSION << endl; + exit(1); + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit(1); + } + } else { + sequenceNames.push_back(string(argv[i])); + } + } + + /*check the output file name*/ + cerr << "-------------------------------------" << endl; + if (alignOutFileName.length() == 0) { + cerr << "The final alignments will be printed out to STDOUT" << endl; + alignOutFile = &std::cout; + } else { + cerr << "Open the output file " << alignOutFileName << endl; + alignOutFile = new ofstream(alignOutFileName.c_str(), + ios::binary | ios::out | ios::trunc); + } + cerr << "-------------------------------------" << endl; + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +MultiSequence* MSA::ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + MultiSequence *result; + + // check if this is a node of the alignment tree + //if (tree->GetSequenceLabel() == -1){ + if (tree->leaf == NODE) { + MultiSequence *alignLeft = ProcessTree(tree->left, sequences, + sparseMatrices, model); + MultiSequence *alignRight = ProcessTree(tree->right, sequences, + sparseMatrices, model); + + assert(alignLeft); + assert(alignRight); + + result = AlignAlignments(alignLeft, alignRight, sparseMatrices, model); + assert(result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); + assert(result); + //result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + result->AddSequence(sequences->GetSequence(tree->idx)->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::ComputeFinalAlignment(MSAGuideTree*tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + MultiSequence *alignment = ProcessTree(tree->getRoot(), sequences, + sparseMatrices, model); + + SafeVector oldOrdering; + if (enableAlignOrder) { + for (int i = 0; i < alignment->GetNumSequences(); i++) + oldOrdering.push_back(alignment->GetSequence(i)->GetSortLabel()); + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree); + /* + int numSeqs = alignment->GetNumSequences(); + //if(numSeqs < numIterativeRefinementReps){ + for(int iter = 0; iter < 5; iter ++){ + for(int i = 0; i < numSeqs - 1; i++){ + DoIterativeRefinementTreeNode(sparseMatrices, model, alignment, i); + } + } + //}*/ + //Refinement return false:no improvement + for (int i = 0; i < numIterativeRefinementReps; i++) { + DoIterativeRefinement(sparseMatrices, model, alignment); + } + cerr << endl; + + if (oldOrdering.size() > 0) { + for (int i = 0; i < (int) oldOrdering.size(); i++) { + alignment->GetSequence(i)->SetSortLabel(oldOrdering[i]); + } + } + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::AlignAlignments(MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + // print some info about the alignment + if (enableVerbose) { + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } +#if 1 + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), align1, align2, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + + pair *, float> alignment; + //perform alignment + alignment = model.ComputeAlignment(align1->GetSequence(0)->GetLength(), + align2->GetSequence(0)->GetLength(), *posterior); + + delete posterior; + + if (enableVerbose) { + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min(align1->GetSequence(i)->GetLength(), + align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence( + align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence( + align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the weighted probabilistic consistency transformation. +// 1 +///////////////////////////////////////////////////////////////// + +SafeVector > MSA::DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + + // for every pair of sequences +#ifdef _OPENMP + int pairIdx; +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int i = seqsPairs[pairIdx].seq1; + int j = seqsPairs[pairIdx].seq2; + float wi = seqsWeights[i]; + float wj = seqsWeights[j]; +#else + for (int i = 0; i < numSeqs; i++) { + float wi = seqsWeights[i]; + for (int j = i + 1; j < numSeqs; j++) { + float wj = seqsWeights[j]; +#endif + Sequence *seq1 = sequences->GetSequence(i); + Sequence *seq2 = sequences->GetSequence(j); + + if (enableVerbose) { +#ifdef _OPENMP +#pragma omp critical +#endif + cerr << "Relaxing (" << i + 1 << ") " << seq1->GetHeader() + << " vs. " << "(" << j + 1 << ") " << seq2->GetHeader() + << ": "; + } + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + float w = wi * wi * wj + wi * wj * wj; + float sumW = w; + for (int k = 0; k < (seq1Length + 1) * (seq2Length + 1); k++) { + //posterior[k] = w*posterior[k]; + posterior[k] += posterior[k]; + } + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) { + if (k != i && k != j) { + float wk = seqsWeights[k]; + float w = wi * wj * wk; + sumW += w; + if (k < i) + Relax1(w, sparseMatrices[k][i], sparseMatrices[k][j], + posterior); + else if (k > i && k < j) + Relax(w, sparseMatrices[i][k], sparseMatrices[k][j], + posterior); + else { + SparseMatrix *temp = + sparseMatrices[j][k]->ComputeTranspose(); + Relax(w, sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + } + //cerr<<"sumW "<::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend) { + + // zero out all cells until the first filled column + while (curr < XYptr->first) { + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length) { + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; +#ifndef _OPENMP + } +#endif + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior) { + + assert(matXZ); + assert(matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert(matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++) { + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * XZval * ZYptr->second; + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax1(float weight, SparseMatrix *matZX, SparseMatrix *matZY, + VF &posterior) { + + assert(matZX); + assert(matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++) { + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * ZXval * ZYptr->second; + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +///////////////////////////////////////////////////////////////// + +void MSA::DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + int index = rand(); + if (index % 2) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); +/* +//start add by Yongtao +#if 0 + VF *posterior = model.BuildPosterior (groupOneSeqs, groupTwoSeqs, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), groupOneSeqs, groupTwoSeqs, + sparseMatrices, cutoff); +#endif + + // compute an "accuracy" measure for the alignment before refinement + SafeVector::iterator> oldOnePtrs(groupOne.size()); + SafeVector::iterator> oldTwoPtrs(groupTwo.size()); + int i=0; + for (set::const_iterator iter = groupOne.begin(); + iter != groupOne.end(); ++iter) { + oldOnePtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + i=0; + for (set::const_iterator iter = groupTwo.begin(); + iter != groupTwo.end(); ++iter) { + oldTwoPtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + + VF &posteriorArr = *posterior; + int oldLength = alignment->GetSequence(0)->GetLength(); + int groupOneindex=0; int groupTwoindex=0; + float accuracy_before = 0; + for (int i = 1; i <= oldLength; i++) { + // check to see if there is a gap in every sequence of the set + bool foundOne = false; + for (int j = 0; !foundOne && j < (int) groupOne.size(); j++) + foundOne = (oldOnePtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundOne) groupOneindex ++; + bool foundTwo = false; + for (int j = 0; !foundTwo && j < (int) groupTwo.size(); j++) + foundTwo = (oldTwoPtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundTwo) groupTwoindex ++; + if(foundOne && foundTwo) accuracy_before += + posteriorArr[groupOneindex * (groupTwoSeqs->GetSequence(0)->GetLength() + 1) + groupTwoindex]; + } + + pair *, float> refinealignment; + //perform alignment + refinealignment = model.ComputeAlignment(groupOneSeqs->GetSequence(0)->GetLength(), + groupTwoSeqs->GetSequence(0)->GetLength(), *posterior); + delete posterior; + // now build final alignment + MultiSequence *result = new MultiSequence(); + //compare accuracy measure before and after refinement + //if (refinealignment.second > accuracy_before) { + //cerr<<"Before:" << accuracy_before<<" after: "<< refinealignment.second<< endl; + for (int i = 0; i < groupOneSeqs->GetNumSequences(); i++) + result->AddSequence( + groupOneSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'X')); + for (int i = 0; i < groupTwoSeqs->GetNumSequences(); i++) + result->AddSequence( + groupTwoSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'Y')); + // free temporary alignment + delete refinealignment.first; + delete alignment; + alignment = result; + + } + else{ + if(numIterativeRefinementReps < 8*numSeqs) numIterativeRefinementReps++; + delete groupOneSeqs; + delete groupTwoSeqs; + return false; + } + */ +//end add by yongtao + + delete alignment; + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, model); //original + delete groupOneSeqs; + delete groupTwoSeqs; + +} + +void MSA::DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + vector inGroup1; + inGroup1.resize(numSeqs); + for (int i = 0; i < numSeqs; i++) { + inGroup1[i] = false; + } + + AlignmentOrder* orders = this->tree->getAlignOrders(); + AlignmentOrder* order = &orders[nodeIndex]; + for (int i = 0; i < order->leftNum; i++) { + int si = order->leftLeafs[i]; + inGroup1[si] = true; + } + for (int i = 0; i < order->rightNum; i++) { + int si = order->rightLeafs[i]; + inGroup1[si] = true; + } + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + if (inGroup1[i]) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void MSA::WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices) { + ofstream outfile(annotationFilename.c_str()); + + if (outfile.fail()) { + cerr << "ERROR: Unable to write annotation file." << endl; + exit(1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position(numSeqs, 0); + SafeVector::iterator> seqs(numSeqs); + for (int i = 0; i < numSeqs; i++) + seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve(numSeqs); + + SafeVector lab; + for (int i = 0; i < numSeqs; i++) + lab.push_back(alignment->GetSequence(i)->GetSortLabel()); + + // for every column + for (int i = 1; i <= alignLength; i++) { + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++) { + if (seqs[j][i] != '-') { + active.push_back(make_pair(lab[j], ++position[j])); + } + } + + sort(active.begin(), active.end()); + outfile << setw(4) << ComputeScore(active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int MSA::ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices) { + + if (active.size() <= 1) + return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++) { + for (int j = i + 1; j < (int) active.size(); j++) { + val += sparseMatrices[active[i].first][active[j].first]->GetValue( + active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} diff --git a/binaries/src/GLProbs-1.0/MSAfull.cpp b/binaries/src/GLProbs-1.0/MSAfull.cpp new file mode 100644 index 0000000..efe4dc5 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAfull.cpp @@ -0,0 +1,1471 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSA.h" +#include "MSAClusterTree.h" +#include "Defaults.h" + +#ifdef _OPENMP +#include +#endif + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; + +bool enableVerbose = false; +bool enableAnnotation = false; +bool enableClustalWOutput = false; +bool enableAlignOrder = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; + +float cutoff = 0; + +VF initDistrib(NumMatrixTypes); +VF gapOpen(2 * NumInsertStates); +VF gapExtend(2 * NumInsertStates); +VVF emitPairs(256, VF(256, 1e-10)); +VF emitSingle(256, 1e-5); + +string alphabet = alphabetDefault; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +string posteriorProbsFilename = ""; +bool allscores = true; +string infilename; + +int flag_gui = 0; //0: no gui related o/p +//1: gui related o/p generated +int flag_ppscore = 0; //0: no pp score sequence added to o/p fasta alignment +//1: pp score seq added to o/p fasta alignment + +/////////////////////////////// +// global scoring matrix variables +////////////////////////////// +float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +char *aminos, *bases, matrixtype[20] = "gonnet_160"; +int subst_index[26]; + +double sub_matrix[26][26]; +int firstread = 0; //this makes sure that matrices are read only once + +float TEMPERATURE = 5; +int MATRIXTYPE = 160; +int prot_nuc = 0; //0=prot, 1=nucleotide + +float GAPOPEN = 0; +float GAPEXT = 0; +int numThreads = 0; + +//argument support +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +argument_decl argument; + +extern inline void read_sustitution_matrix(char *fileName); +extern void setmatrixtype(int le); +extern inline int matrixtype_to_int(); +extern inline void read_dna_matrix(); +extern inline void read_vtml_la_matrix(); +extern void init_arguments(); + +MSA::MSA(int argc, char* argv[]) { + //parse program parameters + SafeVector sequenceNames = ParseParams(argc, argv); + + //initialize arguments for partition function + init_arguments(); + + ReadParameters(); + //PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + //read the input sequences + MultiSequence *sequences = new MultiSequence(); + assert(sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++) { + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA(sequenceNames[i], true); + } + //allocate space for sequence weights + this->seqsWeights = new int[sequences->GetNumSequences()]; + //initilaize parameters for OPENMP +#ifdef _OPENMP + if(numThreads <= 0) { + numThreads = omp_get_num_procs(); + cerr << "Automatically detected " << numThreads << " CPU cores" << endl; + } + cerr <<"Enabling OpenMP (with "<WriteALN(*alignOutFile); + } else { + alignment->WriteMFA(*alignOutFile); + } + //release resources + delete[] this->seqsWeights; + delete alignment; + delete sequences; +} +MSA::~MSA() { + /*close the output file*/ + if (alignOutFileName.length() > 0) { + ((std::ofstream*) alignOutFile)->close(); + } +} +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints MSAPROBS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void MSA::PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename) { + + // print parameters to the screen + cerr << message << endl << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) + cerr << setprecision(10) << initDistrib[i] << " "; + cerr << "}" << endl << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapOpen[i] << " "; + cerr << "}" << endl << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapExtend[i] << " "; + cerr << "}" << endl << endl; + + /* + for (int i = 0; i < 5; i++){ + for (int j = 0; j <= i; j++){ + cerr << emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]] << " "; + } + cerr << endl; + }*/ + + // if a file name is specified + if (filename) { + + // attempt to open the file for writing + FILE *file = fopen(filename, "w"); + if (!file) { + cerr << "ERROR: Unable to write parameter file: " << filename + << endl; + exit(1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) + fprintf(file, "%.10f ", initDistrib[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapOpen[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapExtend[i]); + fprintf(file, "\n"); + fprintf(file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) + fprintf(file, "%.10f ", + emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf(file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf(file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf(file, "\n"); + fclose(file); + } +} + +///////////////////////////////////////////////////////////////// +// doAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +extern VF *ComputePostProbs(int a, int b, string seq1, string seq2); +MultiSequence* MSA::doAlign(MultiSequence *sequences, + const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, + VF &gapExtend, VVF &emitPairs, VF &emitSingle) { + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + + //create distance matrix + VVF probalign_distances(numSeqs, VF(numSeqs, 0)); + VVF distances(numSeqs, VF(numSeqs, 0));//msa + + float gl_accuracy = 0; + //creat sparseMatrices + SafeVector > probalign_sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + SafeVector > sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); // msa + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + // do all pairwise alignments for posterior probability matrices +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + // verbose output + if (enableVerbose) { + cerr << "Computing posterior matrix: (" << a + 1 << ") " + << seq1->GetHeader() << " vs. " << "(" << b + 1 << ") " + << seq2->GetHeader() << " -- "; + } + +//probcons + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix(seq1, seq2); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2); + assert(backward); + // compute posterior probability matrix from HMM + VF *probcons_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward); + assert(probcons_posterior); + delete forward; + delete backward; + +//probalign + VF *probalign_posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + assert(probalign_posterior); + probalign_sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(),seq2->GetLength(), *probalign_posterior); + probalign_sparseMatrices[b][a] = NULL; + pair *, float> probalign_alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *probalign_posterior); + probalign_distances[a][b] =1.0f - probalign_alignment.second / min(seq1->GetLength(), seq2->GetLength()); + delete probalign_alignment.first; + +//local + forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + VF* local_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + delete forward; + delete backward; + +//GL + //merge probalign + local + probcons + VF::iterator ptr1 = probcons_posterior->begin(); + VF::iterator ptr2 = probalign_posterior->begin(); + VF::iterator ptr3 = local_posterior->begin(); + VF* posterior = new VF((seq1->GetLength()+1) * (seq2->GetLength()+1)); assert (posterior); //msa + VF::iterator ptr = posterior->begin(); + for (int i = 0; i <= seq1->GetLength(); i++) { + for (int j = 0; j <= seq2->GetLength(); j++) { + float v1 = *ptr1; + float v2 = *ptr2; + float v3 = *ptr3; + *ptr = sqrt(v1*v1 + v2*v2 + v3*v3); + ptr1++; + ptr2++; + ptr3++; + ptr++; + } + } + // perform the pairwise sequence alignment + pair *, float> gl_alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); + + //compute expected accuracy + distances[a][b] = distances[b][a] = 1.0f - gl_alignment.second + / (3*min(seq1->GetLength(), seq2->GetLength())); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + // + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + float N_correct_match = 0; + int i = 1;int j = 1; + for (SafeVector::iterator iter = gl_alignment.first->begin(); + iter != gl_alignment.first->end(); ++iter){ + if (*iter == 'B'){ + unsigned char c1 = (unsigned char) iter1[i++]; + unsigned char c2 = (unsigned char) iter2[j++]; + if(c1==c2) N_correct_match += 1; + } + else if(*iter == 'X') i++; + else if(*iter == 'Y') j++; + } + if(i!= seq1->GetLength()+1 || j!= seq2->GetLength() + 1 ) cerr << "GL"<< endl; + gl_accuracy += N_correct_match / min(seq1->GetLength(), seq2->GetLength()); + // + delete probcons_posterior; + delete probalign_posterior; + delete local_posterior; + delete posterior; + +#ifndef _OPENMP + } +#endif + } + +//self-adaptive + gl_accuracy /= numPairs; + if(gl_accuracy > 0.4){ + for (int a = 0; a < numSeqs - 1; a++) + for (int b = a + 1; b < numSeqs; b++) { + distances[a][b] = distances[b][a] = probalign_distances[a][b]; + sparseMatrices[a][b] = probalign_sparseMatrices[a][b]; + sparseMatrices[b][a] = NULL; + } + } + + //create the guide tree + this->tree = new MSAClusterTree(this, distances, numSeqs); + this->tree->create(); + + // perform the consistency transformation the desired number of times + float* fweights = new float[numSeqs]; + for (int r = 0; r < numSeqs; r++) { + fweights[r] = ((float) seqsWeights[r]) / INT_MULTIPLY; + fweights[r] *= 10; + } + for (int r = 0; r < numConsistencyReps; r++) { + SafeVector > newSparseMatrices = + DoRelaxation(fweights, sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + delete[] fweights; +#ifdef _OPENMP + delete [] seqsPairs; +#endif + + //compute the final multiple sequence alignment + MultiSequence *finalAlignment = ComputeFinalAlignment(this->tree, sequences, + sparseMatrices, model); + + // build annotation + if (enableAnnotation) { + WriteAnnotation(finalAlignment, sparseMatrices); + } + //destroy the guide tree + delete this->tree; + this->tree = 0; + + // delete sparse matrices + for (int a = 0; a < numSeqs - 1; a++) { + for (int b = a + 1; b < numSeqs; b++) { + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + + return finalAlignment; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger(char *data, int *val) { + char *endPtr; + long int retVal; + + assert(val); + + errno = 0; + retVal = strtol(data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) + return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) + return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat(char *data, float *val) { + char *endPtr; + double retVal; + + assert(val); + + errno = 0; + retVal = strtod(data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) + return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void MSA::ReadParameters() { + + ifstream data; + + emitPairs = VVF(256, VF(256, 1e-10)); + emitSingle = VF(256, 1e-5); + + // read initial state distribution and transition parameters + if (parametersInputFilename == string("")) { + if (NumInsertStates == 1) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend1Default[i]; + } else if (NumInsertStates == 2) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend2Default[i]; + } else { + cerr + << "ERROR: No default initial distribution/parameter settings exist" + << endl << " for " << NumInsertStates + << " pairs of insert states. Use --paramfile." << endl; + exit(1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++) { + emitSingle[(unsigned char) tolower(alphabet[i])] = + emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = + emitSingleDefault[i]; + for (int j = 0; j <= i; j++) { + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + } + } + } else { + data.open(parametersInputFilename.c_str()); + if (data.fail()) { + cerr << "ERROR: Unable to read parameter file: " + << parametersInputFilename << endl; + exit(1); + } + + string line[3]; + for (int i = 0; i < 3; i++) { + if (!getline(data, line[i])) { + cerr + << "ERROR: Unable to read transition parameters from parameter file: " + << parametersInputFilename << endl; + exit(1); + } + } + istringstream data2; + data2.clear(); + data2.str(line[0]); + for (int i = 0; i < NumMatrixTypes; i++) + data2 >> initDistrib[i]; + data2.clear(); + data2.str(line[1]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapOpen[i]; + data2.clear(); + data2.str(line[2]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapExtend[i]; + + if (!getline(data, line[0])) { + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " + << parametersInputFilename << endl; + exit(1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); + data2.str(line[0]); + while (data2 >> token) + alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) { + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++) { + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// +void MSA::printUsage() { + cerr + << "************************************************************************" + << endl + << "\tMSAPROBS is a open-source protein multiple sequence alignment algorithm" + << endl + << "\tbased on pair hidden markov model and partition function postirior" + << endl + << "\tprobabilities. If any comments or problems, please contact" + << endl + << "\tLiu Yongchao(liuy0039@ntu.edu.sg or nkcslyc@hotmail.com)" + << endl + << "*************************************************************************" + << endl << "Usage:" << endl + << " msaprobs [OPTION]... [infile]..." << endl << endl + << "Description:" << endl + << " Align sequences in multi-FASTA format" << endl << endl + << " -o, --outfile " << endl + << " specify the output file name (STDOUT by default)" + << endl << " -num_threads " << endl + << " specify the number of threads used, and otherwise detect automatically" + << endl << " -clustalw" << endl + << " use CLUSTALW output format instead of FASTA format" + << endl << endl << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " + << MAX_CONSISTENCY_REPS << " (default: " << numConsistencyReps + << ") passes of consistency transformation" << endl << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS + << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS << " (default: " + << numIterativeRefinementReps << ") passes of iterative-refinement" + << endl << endl << " -v, --verbose" << endl + << " report progress while aligning (default: " + << (enableVerbose ? "on" : "off") << ")" << endl << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" + << endl << endl << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << " -version " << endl + << " print out version of MSAPROBS " << endl << endl; +} +SafeVector MSA::ParseParams(int argc, char **argv) { + if (argc < 2) { + printUsage(); + exit(1); + } + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + //help + if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-?")) { + printUsage(); + exit(1); + //output file name + } else if (!strcmp(argv[i], "-o") + || !strcmp(argv[i], "--outfile")) { + if (i < argc - 1) { + alignOutFileName = argv[++i]; //get the file name + } else { + cerr << "ERROR: String expected for option " << argv[i] + << endl; + exit(1); + } + // parameter file + } else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + //number of threads used + } else if (!strcmp(argv[i], "-p") + || !strcmp(argv[i], "-num_threads")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << " ERROR: invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < 0) { + tempInt = 0; + } + numThreads = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + // number of consistency transformations + } else if (!strcmp(argv[i], "-c") + || !strcmp(argv[i], "--consistency")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_CONSISTENCY_REPS + || tempInt > MAX_CONSISTENCY_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " + << MAX_CONSISTENCY_REPS << "." << endl; + exit(1); + } else { + numConsistencyReps = tempInt; + } + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp(argv[i], "-ir") + || !strcmp(argv[i], "--iterative-refinement")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS + || tempInt > MAX_ITERATIVE_REFINEMENT_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " + << MAX_ITERATIVE_REFINEMENT_REPS << "." + << endl; + exit(1); + } else + numIterativeRefinementReps = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // annotation files + else if (!strcmp(argv[i], "-annot")) { + enableAnnotation = true; + if (i < argc - 1) { + annotationFilename = argv[++i]; + } else { + cerr << "ERROR: FILENAME expected for option " << argv[i] + << endl; + exit(1); + } + } + + // clustalw output format + else if (!strcmp(argv[i], "-clustalw")) { + enableClustalWOutput = true; + } + + // cutoff + else if (!strcmp(argv[i], "-co") || !strcmp(argv[i], "--cutoff")) { + if (i < argc - 1) { + if (!GetFloat(argv[++i], &tempFloat)) { + cerr + << "ERROR: Invalid floating-point value following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempFloat < 0 || tempFloat > 1) { + cerr << "ERROR: For option " << argv[i - 1] + << ", floating-point value must be between 0 and 1." + << endl; + exit(1); + } else + cutoff = tempFloat; + } + } else { + cerr << "ERROR: Floating-point value expected for option " + << argv[i] << endl; + exit(1); + } + } + + // verbose reporting + else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + enableVerbose = true; + } + + // alignment order + else if (!strcmp(argv[i], "-a") + || !strcmp(argv[i], "--alignment-order")) { + enableAlignOrder = true; + } + + //print out version + else if (!strcmp(argv[i], "-version")) { + cerr << "MSAPROBS version " << VERSION << endl; + exit(1); + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit(1); + } + } else { + sequenceNames.push_back(string(argv[i])); + } + } + + /*check the output file name*/ + cerr << "-------------------------------------" << endl; + if (alignOutFileName.length() == 0) { + cerr << "The final alignments will be printed out to STDOUT" << endl; + alignOutFile = &std::cout; + } else { + cerr << "Open the output file " << alignOutFileName << endl; + alignOutFile = new ofstream(alignOutFileName.c_str(), + ios::binary | ios::out | ios::trunc); + } + cerr << "-------------------------------------" << endl; + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +MultiSequence* MSA::ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + MultiSequence *result; + + // check if this is a node of the alignment tree + //if (tree->GetSequenceLabel() == -1){ + if (tree->leaf == NODE) { + MultiSequence *alignLeft = ProcessTree(tree->left, sequences, + sparseMatrices, model); + MultiSequence *alignRight = ProcessTree(tree->right, sequences, + sparseMatrices, model); + + assert(alignLeft); + assert(alignRight); + + result = AlignAlignments(alignLeft, alignRight, sparseMatrices, model); + assert(result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); + assert(result); + //result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + result->AddSequence(sequences->GetSequence(tree->idx)->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::ComputeFinalAlignment(MSAGuideTree*tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + MultiSequence *alignment = ProcessTree(tree->getRoot(), sequences, + sparseMatrices, model); + + SafeVector oldOrdering; + if (enableAlignOrder) { + for (int i = 0; i < alignment->GetNumSequences(); i++) + oldOrdering.push_back(alignment->GetSequence(i)->GetSortLabel()); + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree); + /* + int numSeqs = alignment->GetNumSequences(); + //if(numSeqs < numIterativeRefinementReps){ + for(int iter = 0; iter < 5; iter ++){ + for(int i = 0; i < numSeqs - 1; i++){ + DoIterativeRefinementTreeNode(sparseMatrices, model, alignment, i); + } + } + //}*/ + //Refinement return false:no improvement + for (int i = 0; i < numIterativeRefinementReps; i++) { + DoIterativeRefinement(sparseMatrices, model, alignment); + } + cerr << endl; + + if (oldOrdering.size() > 0) { + for (int i = 0; i < (int) oldOrdering.size(); i++) { + alignment->GetSequence(i)->SetSortLabel(oldOrdering[i]); + } + } + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::AlignAlignments(MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + // print some info about the alignment + if (enableVerbose) { + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } +#if 0 + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), align1, align2, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + + pair *, float> alignment; + //perform alignment + alignment = model.ComputeAlignment(align1->GetSequence(0)->GetLength(), + align2->GetSequence(0)->GetLength(), *posterior); + + delete posterior; + + if (enableVerbose) { + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min(align1->GetSequence(i)->GetLength(), + align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence( + align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence( + align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the weighted probabilistic consistency transformation. +// 1 +///////////////////////////////////////////////////////////////// + +SafeVector > MSA::DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + + // for every pair of sequences +#ifdef _OPENMP + int pairIdx; +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int i = seqsPairs[pairIdx].seq1; + int j = seqsPairs[pairIdx].seq2; + float wi = seqsWeights[i]; + float wj = seqsWeights[j]; +#else + for (int i = 0; i < numSeqs; i++) { + float wi = seqsWeights[i]; + for (int j = i + 1; j < numSeqs; j++) { + float wj = seqsWeights[j]; +#endif + Sequence *seq1 = sequences->GetSequence(i); + Sequence *seq2 = sequences->GetSequence(j); + + if (enableVerbose) { +#ifdef _OPENMP +#pragma omp critical +#endif + cerr << "Relaxing (" << i + 1 << ") " << seq1->GetHeader() + << " vs. " << "(" << j + 1 << ") " << seq2->GetHeader() + << ": "; + } + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + float w = wi * wi * wj + wi * wj * wj; + float sumW = w; + for (int k = 0; k < (seq1Length + 1) * (seq2Length + 1); k++) { + //posterior[k] = w*posterior[k]; + posterior[k] += posterior[k]; + } + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) { + if (k != i && k != j) { + float wk = seqsWeights[k]; + float w = wi * wj * wk; + sumW += w; + if (k < i) + Relax1(w, sparseMatrices[k][i], sparseMatrices[k][j], + posterior); + else if (k > i && k < j) + Relax(w, sparseMatrices[i][k], sparseMatrices[k][j], + posterior); + else { + SparseMatrix *temp = + sparseMatrices[j][k]->ComputeTranspose(); + Relax(w, sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + } + //cerr<<"sumW "<::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend) { + + // zero out all cells until the first filled column + while (curr < XYptr->first) { + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length) { + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; +#ifndef _OPENMP + } +#endif + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior) { + + assert(matXZ); + assert(matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert(matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++) { + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * XZval * ZYptr->second; + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax1(float weight, SparseMatrix *matZX, SparseMatrix *matZY, + VF &posterior) { + + assert(matZX); + assert(matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++) { + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * ZXval * ZYptr->second; + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +///////////////////////////////////////////////////////////////// + +void MSA::DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + int index = rand(); + if (index % 2) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); +/* +//start add by Yongtao +#if 1 + VF *posterior = model.BuildPosterior (groupOneSeqs, groupTwoSeqs, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), groupOneSeqs, groupTwoSeqs, + sparseMatrices, cutoff); +#endif + + // compute an "accuracy" measure for the alignment before refinement + SafeVector::iterator> oldOnePtrs(groupOne.size()); + SafeVector::iterator> oldTwoPtrs(groupTwo.size()); + int i=0; + for (set::const_iterator iter = groupOne.begin(); + iter != groupOne.end(); ++iter) { + oldOnePtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + i=0; + for (set::const_iterator iter = groupTwo.begin(); + iter != groupTwo.end(); ++iter) { + oldTwoPtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + + VF &posteriorArr = *posterior; + int oldLength = alignment->GetSequence(0)->GetLength(); + int groupOneindex=0; int groupTwoindex=0; + float accuracy_before = 0; + for (int i = 1; i <= oldLength; i++) { + // check to see if there is a gap in every sequence of the set + bool foundOne = false; + for (int j = 0; !foundOne && j < (int) groupOne.size(); j++) + foundOne = (oldOnePtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundOne) groupOneindex ++; + bool foundTwo = false; + for (int j = 0; !foundTwo && j < (int) groupTwo.size(); j++) + foundTwo = (oldTwoPtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundTwo) groupTwoindex ++; + if(foundOne && foundTwo) accuracy_before += + posteriorArr[groupOneindex * (groupTwoSeqs->GetSequence(0)->GetLength() + 1) + groupTwoindex]; + } + + pair *, float> refinealignment; + //perform alignment + refinealignment = model.ComputeAlignment(groupOneSeqs->GetSequence(0)->GetLength(), + groupTwoSeqs->GetSequence(0)->GetLength(), *posterior); + delete posterior; + // now build final alignment + MultiSequence *result = new MultiSequence(); + //compare accuracy measure before and after refinement + //if (refinealignment.second > accuracy_before) { + //cerr<<"Before:" << accuracy_before<<" after: "<< refinealignment.second<< endl; + for (int i = 0; i < groupOneSeqs->GetNumSequences(); i++) + result->AddSequence( + groupOneSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'X')); + for (int i = 0; i < groupTwoSeqs->GetNumSequences(); i++) + result->AddSequence( + groupTwoSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'Y')); + // free temporary alignment + delete refinealignment.first; + delete alignment; + alignment = result; + + } + else{ + if(numIterativeRefinementReps < 8*numSeqs) numIterativeRefinementReps++; + delete groupOneSeqs; + delete groupTwoSeqs; + return false; + } + */ +//end add by yongtao + + //delete alignment; + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, model); //original + delete groupOneSeqs; + delete groupTwoSeqs; + +} + +void MSA::DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + vector inGroup1; + inGroup1.resize(numSeqs); + for (int i = 0; i < numSeqs; i++) { + inGroup1[i] = false; + } + + AlignmentOrder* orders = this->tree->getAlignOrders(); + AlignmentOrder* order = &orders[nodeIndex]; + for (int i = 0; i < order->leftNum; i++) { + int si = order->leftLeafs[i]; + inGroup1[si] = true; + } + for (int i = 0; i < order->rightNum; i++) { + int si = order->rightLeafs[i]; + inGroup1[si] = true; + } + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + if (inGroup1[i]) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void MSA::WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices) { + ofstream outfile(annotationFilename.c_str()); + + if (outfile.fail()) { + cerr << "ERROR: Unable to write annotation file." << endl; + exit(1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position(numSeqs, 0); + SafeVector::iterator> seqs(numSeqs); + for (int i = 0; i < numSeqs; i++) + seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve(numSeqs); + + SafeVector lab; + for (int i = 0; i < numSeqs; i++) + lab.push_back(alignment->GetSequence(i)->GetSortLabel()); + + // for every column + for (int i = 1; i <= alignLength; i++) { + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++) { + if (seqs[j][i] != '-') { + active.push_back(make_pair(lab[j], ++position[j])); + } + } + + sort(active.begin(), active.end()); + outfile << setw(4) << ComputeScore(active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int MSA::ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices) { + + if (active.size() <= 1) + return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++) { + for (int j = i + 1; j < (int) active.size(); j++) { + val += sparseMatrices[active[i].first][active[j].first]->GetValue( + active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} diff --git a/binaries/src/GLProbs-1.0/MSAgl+l+p+gl.cpp b/binaries/src/GLProbs-1.0/MSAgl+l+p+gl.cpp new file mode 100644 index 0000000..713acbe --- /dev/null +++ b/binaries/src/GLProbs-1.0/MSAgl+l+p+gl.cpp @@ -0,0 +1,1512 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSA.h" +#include "MSAClusterTree.h" +#include "Defaults.h" + +#ifdef _OPENMP +#include +#endif + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; + +bool enableVerbose = false; +bool enableAnnotation = false; +bool enableClustalWOutput = false; +bool enableAlignOrder = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 100; + +float cutoff = 0; + +VF initDistrib(NumMatrixTypes); +VF gapOpen(2 * NumInsertStates); +VF gapExtend(2 * NumInsertStates); +VVF emitPairs(256, VF(256, 1e-10)); +VF emitSingle(256, 1e-5); + +string alphabet = alphabetDefault; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +string posteriorProbsFilename = ""; +bool allscores = true; +string infilename; + +int flag_gui = 0; //0: no gui related o/p +//1: gui related o/p generated +int flag_ppscore = 0; //0: no pp score sequence added to o/p fasta alignment +//1: pp score seq added to o/p fasta alignment + +/////////////////////////////// +// global scoring matrix variables +////////////////////////////// +float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +char *aminos, *bases, matrixtype[20] = "gonnet_160"; +int subst_index[26]; + +double sub_matrix[26][26]; +int firstread = 0; //this makes sure that matrices are read only once + +float TEMPERATURE = 5; +int MATRIXTYPE = 160; +int prot_nuc = 0; //0=prot, 1=nucleotide + +float GAPOPEN = 0; +float GAPEXT = 0; +int numThreads = 0; + +//argument support +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +argument_decl argument; + +extern inline void read_sustitution_matrix(char *fileName); +extern void setmatrixtype(int le); +extern inline int matrixtype_to_int(); +extern inline void read_dna_matrix(); +extern inline void read_vtml_la_matrix(); +extern void init_arguments(); + +MSA::MSA(int argc, char* argv[]) { + //parse program parameters + SafeVector sequenceNames = ParseParams(argc, argv); + + //initialize arguments for partition function + init_arguments(); + + ReadParameters(); + //PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + //read the input sequences + MultiSequence *sequences = new MultiSequence(); + assert(sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++) { + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA(sequenceNames[i], true); + } + //allocate space for sequence weights + this->seqsWeights = new int[sequences->GetNumSequences()]; + //initilaize parameters for OPENMP +#ifdef _OPENMP + if(numThreads <= 0) { + numThreads = omp_get_num_procs(); + cerr << "Automatically detected " << numThreads << " CPU cores" << endl; + } + cerr <<"Enabling OpenMP (with "<WriteALN(*alignOutFile); + } else { + alignment->WriteMFA(*alignOutFile); + } + //release resources + delete[] this->seqsWeights; + delete alignment; + delete sequences; +} +MSA::~MSA() { + /*close the output file*/ + if (alignOutFileName.length() > 0) { + ((std::ofstream*) alignOutFile)->close(); + } +} +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints MSAPROBS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void MSA::PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename) { + + // print parameters to the screen + cerr << message << endl << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) + cerr << setprecision(10) << initDistrib[i] << " "; + cerr << "}" << endl << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapOpen[i] << " "; + cerr << "}" << endl << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapExtend[i] << " "; + cerr << "}" << endl << endl; + + // if a file name is specified + if (filename) { + + // attempt to open the file for writing + FILE *file = fopen(filename, "w"); + if (!file) { + cerr << "ERROR: Unable to write parameter file: " << filename + << endl; + exit(1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) + fprintf(file, "%.10f ", initDistrib[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapOpen[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapExtend[i]); + fprintf(file, "\n"); + fprintf(file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) + fprintf(file, "%.10f ", + emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf(file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf(file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf(file, "\n"); + fclose(file); + } +} + +///////////////////////////////////////////////////////////////// +// doAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +extern VF *ComputePostProbs(int a, int b, string seq1, string seq2); +MultiSequence* MSA::doAlign(MultiSequence *sequences, + const ProbabilisticModel &model, int levelid) { + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + //create distance matrix + VVF distances(numSeqs, VF(numSeqs, 0)); + //creat sparseMatrices + SafeVector > sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + // do all pairwise alignments for posterior probability matrices +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + //posterior probability matrix + VF* posterior; + +//high similarity use global model + if(levelid == 2) posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + +//low similarity use local model + else if(levelid == 1){ + VF *forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + delete forward; + delete backward; + } + +//extreme low or extreme high similarity use combined model + else{ +//probcons + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix(seq1, seq2); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2); + assert(backward); + // compute posterior probability matrix from HMM + VF *probcons_posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward); + assert(probcons_posterior); + delete forward; + delete backward; + +//probalign + VF *probalign_posterior = ::ComputePostProbs(a, b, seq1->GetString(),seq2->GetString()); + assert(probalign_posterior); +//local + forward = model.ComputeForwardMatrix(seq1, seq2,false); + assert(forward); + backward = model.ComputeBackwardMatrix(seq1, seq2,false); + assert(backward); + posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward,*backward, false); + assert(posterior); + delete forward; + delete backward; +//combined model + //merge probalign + local + probcons + VF::iterator ptr1 = probcons_posterior->begin(); + VF::iterator ptr2 = probalign_posterior->begin(); + VF::iterator ptr = posterior->begin(); + for (int i = 0; i <= seq1->GetLength(); i++) { + for (int j = 0; j <= seq2->GetLength(); j++) { + float v1 = *ptr1; + float v2 = *ptr2; + float v3 = *ptr; + *ptr = sqrt((v1*v1 + v2*v2 + v3*v3)/3); + ptr1++; + ptr2++; + ptr++; + } + } + delete probcons_posterior; + delete probalign_posterior; + } + assert(posterior); + // perform the pairwise sequence alignment + pair *, float> alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); + + //compute expected accuracy + distances[a][b] = distances[b][a] = 1.0f - alignment.second + / min(seq1->GetLength(), seq2->GetLength()); + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + + delete posterior; + delete alignment.first; +#ifndef _OPENMP + } +#endif + } + + //create the guide tree + this->tree = new MSAClusterTree(this, distances, numSeqs); + this->tree->create(); + + // perform the consistency transformation the desired number of times + float* fweights = new float[numSeqs]; + for (int r = 0; r < numSeqs; r++) { + fweights[r] = ((float) seqsWeights[r]) / INT_MULTIPLY; + fweights[r] *= 10; + } + for (int r = 0; r < numConsistencyReps; r++) { + SafeVector > newSparseMatrices = + DoRelaxation(fweights, sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + delete[] fweights; +#ifdef _OPENMP + delete [] seqsPairs; +#endif + + //compute the final multiple sequence alignment + MultiSequence *finalAlignment = ComputeFinalAlignment(this->tree, sequences, + sparseMatrices, model); + + // build annotation + if (enableAnnotation) { + WriteAnnotation(finalAlignment, sparseMatrices); + } + //destroy the guide tree + delete this->tree; + this->tree = 0; + + // delete sparse matrices + for (int a = 0; a < numSeqs - 1; a++) { + for (int b = a + 1; b < numSeqs; b++) { + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + + return finalAlignment; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger(char *data, int *val) { + char *endPtr; + long int retVal; + + assert(val); + + errno = 0; + retVal = strtol(data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) + return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) + return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat(char *data, float *val) { + char *endPtr; + double retVal; + + assert(val); + + errno = 0; + retVal = strtod(data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) + return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void MSA::ReadParameters() { + + ifstream data; + + emitPairs = VVF(256, VF(256, 1e-10)); + emitSingle = VF(256, 1e-5); + + // read initial state distribution and transition parameters + if (parametersInputFilename == string("")) { + if (NumInsertStates == 1) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend1Default[i]; + } else if (NumInsertStates == 2) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend2Default[i]; + } else { + cerr + << "ERROR: No default initial distribution/parameter settings exist" + << endl << " for " << NumInsertStates + << " pairs of insert states. Use --paramfile." << endl; + exit(1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++) { + emitSingle[(unsigned char) tolower(alphabet[i])] = + emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = + emitSingleDefault[i]; + for (int j = 0; j <= i; j++) { + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + } + } + } else { + data.open(parametersInputFilename.c_str()); + if (data.fail()) { + cerr << "ERROR: Unable to read parameter file: " + << parametersInputFilename << endl; + exit(1); + } + + string line[3]; + for (int i = 0; i < 3; i++) { + if (!getline(data, line[i])) { + cerr + << "ERROR: Unable to read transition parameters from parameter file: " + << parametersInputFilename << endl; + exit(1); + } + } + istringstream data2; + data2.clear(); + data2.str(line[0]); + for (int i = 0; i < NumMatrixTypes; i++) + data2 >> initDistrib[i]; + data2.clear(); + data2.str(line[1]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapOpen[i]; + data2.clear(); + data2.str(line[2]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapExtend[i]; + + if (!getline(data, line[0])) { + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " + << parametersInputFilename << endl; + exit(1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); + data2.str(line[0]); + while (data2 >> token) + alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) { + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++) { + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// +void MSA::printUsage() { + cerr + << "************************************************************************" + << endl + << "\tMSAPROBS is a open-source protein multiple sequence alignment algorithm" + << endl + << "\tbased on pair hidden markov model and partition function postirior" + << endl + << "\tprobabilities. If any comments or problems, please contact" + << endl + << "\tLiu Yongchao(liuy0039@ntu.edu.sg or nkcslyc@hotmail.com)" + << endl + << "*************************************************************************" + << endl << "Usage:" << endl + << " msaprobs [OPTION]... [infile]..." << endl << endl + << "Description:" << endl + << " Align sequences in multi-FASTA format" << endl << endl + << " -o, --outfile " << endl + << " specify the output file name (STDOUT by default)" + << endl << " -num_threads " << endl + << " specify the number of threads used, and otherwise detect automatically" + << endl << " -clustalw" << endl + << " use CLUSTALW output format instead of FASTA format" + << endl << endl << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " + << MAX_CONSISTENCY_REPS << " (default: " << numConsistencyReps + << ") passes of consistency transformation" << endl << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS + << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS << " (default: " + << numIterativeRefinementReps << ") passes of iterative-refinement" + << endl << endl << " -v, --verbose" << endl + << " report progress while aligning (default: " + << (enableVerbose ? "on" : "off") << ")" << endl << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" + << endl << endl << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << " -version " << endl + << " print out version of MSAPROBS " << endl << endl; +} +SafeVector MSA::ParseParams(int argc, char **argv) { + if (argc < 2) { + printUsage(); + exit(1); + } + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + //help + if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-?")) { + printUsage(); + exit(1); + //output file name + } else if (!strcmp(argv[i], "-o") + || !strcmp(argv[i], "--outfile")) { + if (i < argc - 1) { + alignOutFileName = argv[++i]; //get the file name + } else { + cerr << "ERROR: String expected for option " << argv[i] + << endl; + exit(1); + } + // parameter file + } else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--paramfile")){ + if (i < argc - 1) + parametersInputFilename = string (argv[++i]); + else { + cerr << "ERROR: Filename expected for option " << argv[i] << endl; + exit (1); + } + //number of threads used + } else if (!strcmp(argv[i], "-p") + || !strcmp(argv[i], "-num_threads")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << " ERROR: invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < 0) { + tempInt = 0; + } + numThreads = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + // number of consistency transformations + } else if (!strcmp(argv[i], "-c") + || !strcmp(argv[i], "--consistency")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_CONSISTENCY_REPS + || tempInt > MAX_CONSISTENCY_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " + << MAX_CONSISTENCY_REPS << "." << endl; + exit(1); + } else { + numConsistencyReps = tempInt; + } + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp(argv[i], "-ir") + || !strcmp(argv[i], "--iterative-refinement")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS + || tempInt > MAX_ITERATIVE_REFINEMENT_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " + << MAX_ITERATIVE_REFINEMENT_REPS << "." + << endl; + exit(1); + } else + numIterativeRefinementReps = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // annotation files + else if (!strcmp(argv[i], "-annot")) { + enableAnnotation = true; + if (i < argc - 1) { + annotationFilename = argv[++i]; + } else { + cerr << "ERROR: FILENAME expected for option " << argv[i] + << endl; + exit(1); + } + } + + // clustalw output format + else if (!strcmp(argv[i], "-clustalw")) { + enableClustalWOutput = true; + } + + // cutoff + else if (!strcmp(argv[i], "-co") || !strcmp(argv[i], "--cutoff")) { + if (i < argc - 1) { + if (!GetFloat(argv[++i], &tempFloat)) { + cerr + << "ERROR: Invalid floating-point value following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempFloat < 0 || tempFloat > 1) { + cerr << "ERROR: For option " << argv[i - 1] + << ", floating-point value must be between 0 and 1." + << endl; + exit(1); + } else + cutoff = tempFloat; + } + } else { + cerr << "ERROR: Floating-point value expected for option " + << argv[i] << endl; + exit(1); + } + } + + // verbose reporting + else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + enableVerbose = true; + } + + // alignment order + else if (!strcmp(argv[i], "-a") + || !strcmp(argv[i], "--alignment-order")) { + enableAlignOrder = true; + } + + //print out version + else if (!strcmp(argv[i], "-version")) { + cerr << "MSAPROBS version " << VERSION << endl; + exit(1); + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit(1); + } + } else { + sequenceNames.push_back(string(argv[i])); + } + } + + /*check the output file name*/ + cerr << "-------------------------------------" << endl; + if (alignOutFileName.length() == 0) { + cerr << "The final alignments will be printed out to STDOUT" << endl; + alignOutFile = &std::cout; + } else { + cerr << "Open the output file " << alignOutFileName << endl; + alignOutFile = new ofstream(alignOutFileName.c_str(), + ios::binary | ios::out | ios::trunc); + } + cerr << "-------------------------------------" << endl; + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +MultiSequence* MSA::ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + MultiSequence *result; + + // check if this is a node of the alignment tree + //if (tree->GetSequenceLabel() == -1){ + if (tree->leaf == NODE) { + MultiSequence *alignLeft = ProcessTree(tree->left, sequences, + sparseMatrices, model); + MultiSequence *alignRight = ProcessTree(tree->right, sequences, + sparseMatrices, model); + + assert(alignLeft); + assert(alignRight); + + result = AlignAlignments(alignLeft, alignRight, sparseMatrices, model); + assert(result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); + assert(result); + //result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + result->AddSequence(sequences->GetSequence(tree->idx)->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::ComputeFinalAlignment(MSAGuideTree*tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + MultiSequence *alignment = ProcessTree(tree->getRoot(), sequences, + sparseMatrices, model); + + SafeVector oldOrdering; + if (enableAlignOrder) { + for (int i = 0; i < alignment->GetNumSequences(); i++) + oldOrdering.push_back(alignment->GetSequence(i)->GetSortLabel()); + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree); + /* + int numSeqs = alignment->GetNumSequences(); + //if(numSeqs < numIterativeRefinementReps){ + for(int iter = 0; iter < 5; iter ++){ + for(int i = 0; i < numSeqs - 1; i++){ + DoIterativeRefinementTreeNode(sparseMatrices, model, alignment, i); + } + } + //}*/ + //Refinement return false:no improvement + for (int i = 0; i < numIterativeRefinementReps; i++) { + DoIterativeRefinement(sparseMatrices, model, alignment); + } + cerr << endl; + + if (oldOrdering.size() > 0) { + for (int i = 0; i < (int) oldOrdering.size(); i++) { + alignment->GetSequence(i)->SetSortLabel(oldOrdering[i]); + } + } + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::AlignAlignments(MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + // print some info about the alignment + if (enableVerbose) { + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } +#if 0 + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), align1, align2, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + + pair *, float> alignment; + //perform alignment + alignment = model.ComputeAlignment(align1->GetSequence(0)->GetLength(), + align2->GetSequence(0)->GetLength(), *posterior); + + delete posterior; + + if (enableVerbose) { + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min(align1->GetSequence(i)->GetLength(), + align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence( + align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence( + align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the weighted probabilistic consistency transformation. +// 1 +///////////////////////////////////////////////////////////////// + +SafeVector > MSA::DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + + // for every pair of sequences +#ifdef _OPENMP + int pairIdx; +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int i = seqsPairs[pairIdx].seq1; + int j = seqsPairs[pairIdx].seq2; + float wi = seqsWeights[i]; + float wj = seqsWeights[j]; +#else + for (int i = 0; i < numSeqs; i++) { + float wi = seqsWeights[i]; + for (int j = i + 1; j < numSeqs; j++) { + float wj = seqsWeights[j]; +#endif + Sequence *seq1 = sequences->GetSequence(i); + Sequence *seq2 = sequences->GetSequence(j); + + if (enableVerbose) { +#ifdef _OPENMP +#pragma omp critical +#endif + cerr << "Relaxing (" << i + 1 << ") " << seq1->GetHeader() + << " vs. " << "(" << j + 1 << ") " << seq2->GetHeader() + << ": "; + } + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + float w = wi * wi * wj + wi * wj * wj; + float sumW = w; + for (int k = 0; k < (seq1Length + 1) * (seq2Length + 1); k++) { + //posterior[k] = w*posterior[k]; + posterior[k] += posterior[k]; + } + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) { + if (k != i && k != j) { + float wk = seqsWeights[k]; + float w = wi * wj * wk; + sumW += w; + if (k < i) + Relax1(w, sparseMatrices[k][i], sparseMatrices[k][j], + posterior); + else if (k > i && k < j) + Relax(w, sparseMatrices[i][k], sparseMatrices[k][j], + posterior); + else { + SparseMatrix *temp = + sparseMatrices[j][k]->ComputeTranspose(); + Relax(w, sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + } + //cerr<<"sumW "<::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend) { + + // zero out all cells until the first filled column + while (curr < XYptr->first) { + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length) { + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; +#ifndef _OPENMP + } +#endif + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior) { + + assert(matXZ); + assert(matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert(matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++) { + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * XZval * ZYptr->second; + base[ZYptr->first] += XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax1(float weight, SparseMatrix *matZX, SparseMatrix *matZY, + VF &posterior) { + + assert(matZX); + assert(matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++) { + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + //base[ZYptr->first] += weight * ZXval * ZYptr->second; + base[ZYptr->first] += ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +// return 0: successful refinement, 1: ineffective refinement, 2: random problem +///////////////////////////////////////////////////////////////// +int MSA::DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + int i; + // create two separate groups + for (i = 0; i < numSeqs; i++) { + int index = rand(); + if (index % 2) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) return 2; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + +//start add by Yongtao +#if 1 + VF *posterior = model.BuildPosterior (groupOneSeqs, groupTwoSeqs, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), groupOneSeqs, groupTwoSeqs, + sparseMatrices, cutoff); +#endif + // compute an "accuracy" measure for the alignment before refinement + SafeVector::iterator> oldOnePtrs(groupOne.size()); + SafeVector::iterator> oldTwoPtrs(groupTwo.size()); + i=0; + for (set::const_iterator iter = groupOne.begin(); + iter != groupOne.end(); ++iter) { + oldOnePtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + i=0; + for (set::const_iterator iter = groupTwo.begin(); + iter != groupTwo.end(); ++iter) { + oldTwoPtrs[i++] = alignment->GetSequence(*iter)->GetDataPtr(); + } + + VF &posteriorArr = *posterior; + int oldLength = alignment->GetSequence(0)->GetLength(); + int groupOneindex=0; int groupTwoindex=0; + float accuracy_before = 0; + int j; + for (i = 1; i <= oldLength; i++) { + // check to see if there is a gap in every sequence of the set + bool foundOne = false; + for (j = 0; !foundOne && j < (int) groupOne.size(); j++) + foundOne = (oldOnePtrs[j][i] != '-'); + // if not, then this column counts towards the sequence length + if (foundOne) groupOneindex ++; + bool foundTwo = false; + for (j = 0; !foundTwo && j < (int) groupTwo.size(); j++) + foundTwo = (oldTwoPtrs[j][i] != '-'); + if (foundTwo) groupTwoindex ++; + if(foundOne && foundTwo) accuracy_before += + posteriorArr[groupOneindex * (groupTwoSeqs->GetSequence(0)->GetLength() + 1) + groupTwoindex]; + } + + pair *, float> refinealignment; + //perform alignment + refinealignment = model.ComputeAlignment(groupOneSeqs->GetSequence(0)->GetLength(), + groupTwoSeqs->GetSequence(0)->GetLength(), *posterior); + delete posterior; + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < groupOneSeqs->GetNumSequences(); i++) + result->AddSequence( + groupOneSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'X')); + for (int i = 0; i < groupTwoSeqs->GetNumSequences(); i++) + result->AddSequence( + groupTwoSeqs->GetSequence(i)->AddGaps(refinealignment.first, 'Y')); + // free temporary alignment + delete refinealignment.first; + delete alignment; + alignment = result; + delete groupOneSeqs; + delete groupTwoSeqs; + if(accuracy_before == refinealignment.second) return 1; + else return 0; +} + + +void MSA::DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + vector inGroup1; + inGroup1.resize(numSeqs); + for (int i = 0; i < numSeqs; i++) { + inGroup1[i] = false; + } + + AlignmentOrder* orders = this->tree->getAlignOrders(); + AlignmentOrder* order = &orders[nodeIndex]; + for (int i = 0; i < order->leftNum; i++) { + int si = order->leftLeafs[i]; + inGroup1[si] = true; + } + for (int i = 0; i < order->rightNum; i++) { + int si = order->rightLeafs[i]; + inGroup1[si] = true; + } + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + if (inGroup1[i]) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void MSA::WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices) { + ofstream outfile(annotationFilename.c_str()); + + if (outfile.fail()) { + cerr << "ERROR: Unable to write annotation file." << endl; + exit(1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position(numSeqs, 0); + SafeVector::iterator> seqs(numSeqs); + for (int i = 0; i < numSeqs; i++) + seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve(numSeqs); + + SafeVector lab; + for (int i = 0; i < numSeqs; i++) + lab.push_back(alignment->GetSequence(i)->GetSortLabel()); + + // for every column + for (int i = 1; i <= alignLength; i++) { + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++) { + if (seqs[j][i] != '-') { + active.push_back(make_pair(lab[j], ++position[j])); + } + } + + sort(active.begin(), active.end()); + outfile << setw(4) << ComputeScore(active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int MSA::ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices) { + + if (active.size() <= 1) + return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++) { + for (int j = i + 1; j < (int) active.size(); j++) { + val += sparseMatrices[active[i].first][active[j].first]->GetValue( + active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} + +///////////////////////////////////////////////////////////////// +// ComputeSimilarity () +// +// Computes the average similarity for a particular family. +// extreme low or extreme high similarity(<=20% or >80%) return 0 +// low similarity(20%-50%) return 1 +// high similarity(50%-80%) return 2 +///////////////////////////////////////////////////////////////// +int MSA::ComputeSimilarity (MultiSequence *sequences,const ProbabilisticModel &model){ + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + //average identity for all sequences + float identity = 0; + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + + // do all pairwise alignments for family similarity +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + pair *, float> alignment = model.ComputeViterbiAlignment(seq1,seq2); + // + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + float N_correct_match = 0; + //float N_match; + //float N_column = 0; + float N_alignment = 0; + int i = 1;int j = 1; + //bool start = false; bool end = false; + for (SafeVector::iterator iter = alignment.first->begin(); + iter != alignment.first->end(); ++iter){ + if (*iter == 'B'){ + //N_match += 1; + //start = true; + //if(i==seq1->GetLength() || j==seq2->GetLength()) end = true; + unsigned char c1 = (unsigned char) iter1[i++]; + unsigned char c2 = (unsigned char) iter2[j++]; + if(c1==c2) N_correct_match += 1; + } + else if(*iter == 'X') i++; + else if(*iter == 'Y') j++; + //if(start && !end) N_column += 1; + N_alignment += 1; + } + if(i!= seq1->GetLength()+1 || j!= seq2->GetLength() + 1 ) cerr << "similarity error"<< endl; + identity += N_correct_match / N_alignment; + // + delete alignment.first; +#ifndef _OPENMP + } +#endif + } + identity /= numPairs; + //adapative + if(identity <= 0.15) initDistrib[2] = 0.143854; + else if(identity <= 0.2) initDistrib[2] = 0.191948; + else if(identity <= 0.25) initDistrib[2] = 0.170705; + else if(identity <= 0.3) initDistrib[2] = 0.100675; + else if(identity <= 0.35) initDistrib[2] = 0.090755; + else if(identity <= 0.4) initDistrib[2] = 0.146188; + else if(identity <= 0.45) initDistrib[2] = 0.167858; + else if(identity <= 0.5) initDistrib[2] = 0.250769; + else if(identity <= 0.6) initDistrib[2] = 0.500829; + else if(identity <= 0.7) initDistrib[2] = 0.259622; + + if( identity<= 0.2 || identity > 0.8) return 0; + else if(identity > 0.2 && identity<= 0.5) return 1; + else return 2; +} diff --git a/binaries/src/GLProbs-1.0/Makefile b/binaries/src/GLProbs-1.0/Makefile new file mode 100644 index 0000000..9128fbc --- /dev/null +++ b/binaries/src/GLProbs-1.0/Makefile @@ -0,0 +1,16 @@ + +CXXOBJS = MSA.o MSAGuideTree.o MSAClusterTree.o MSAPartProbs.o MSAReadMatrix.o main.o + +OPENMP = -fopenmp +CXX = g++ +COMMON_FLAGS = -O3 $(OPENMP) -Wall -funroll-loops -I . -I /usr/include +CXXFLAGS = $(COMMON_FLAGS) + +EXEC = glprobs + +all: $(CXXOBJS) + $(CXX) $(CXXFLAGS) -o $(EXEC) $(CXXOBJS) $(NVCCOBJS) $(NVCCLIBS) + strip $(EXEC) +clean: + rm -rf *.o $(EXEC) + diff --git a/binaries/src/GLProbs-1.0/MultiSequence.h b/binaries/src/GLProbs-1.0/MultiSequence.h new file mode 100644 index 0000000..96a61f5 --- /dev/null +++ b/binaries/src/GLProbs-1.0/MultiSequence.h @@ -0,0 +1,735 @@ +//////////////////////////////////////////////////////////////// +// MultiSequence.h +// +// Utilities for reading/writing multiple sequence data. +///////////////////////////////////////////////////////////////// + +#ifndef MULTISEQUENCE_H +#define MULTISEQUENCE_H + +#include +#include +#include +#include +#include +#include +#include +#include "SafeVector.h" +#include "Sequence.h" +#include "FileBuffer.h" + +#define VERSION "0.9.7" +///////////////////////////////////////////////////////////////// +// MultiSequence +// +// Class for multiple sequence alignment input/output. +///////////////////////////////////////////////////////////////// + +class MultiSequence { + + SafeVector *sequences; + +public: + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Default constructor. + ///////////////////////////////////////////////////////////////// + + MultiSequence() : + sequences(NULL) { + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Constructor. Load MFA from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + MultiSequence(FileBuffer &infile) : + sequences(NULL) { + LoadMFA(infile); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Constructor. Load MFA from a filename. + ///////////////////////////////////////////////////////////////// + + MultiSequence(const string &filename) : + sequences(NULL) { + LoadMFA(filename); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::~MultiSequence() + // + // Destructor. Gets rid of sequence objects contained in the + // multiple alignment. + ///////////////////////////////////////////////////////////////// + + ~MultiSequence() { + + // if sequences allocated + if (sequences) { + + // free all sequences + for (SafeVector::iterator iter = sequences->begin(); + iter != sequences->end(); ++iter) { + assert(*iter); + delete *iter; + *iter = NULL; + } + + // free sequence vector + delete sequences; + sequences = NULL; + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MFA from a filename. + ///////////////////////////////////////////////////////////////// + + void LoadMFA(const string &filename, bool stripGaps = false) { + + // try opening file + FileBuffer infile(filename.c_str()); + + if (infile.fail()) { + cerr << "ERROR: Could not open file '" << filename + << "' for reading." << endl; + exit(1); + } + + // if successful, then load using other LoadMFA() routine + LoadMFA(infile, stripGaps); + + infile.close(); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MSF from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + void ParseMSF(FileBuffer &infile, string header, bool stripGaps = false) { + + SafeVector *> seqData; + SafeVector seqNames; + SafeVector seqLengths; + + istringstream in; + bool valid = true; + bool missingHeader = false; + bool clustalW = false; + + // read until data starts + while (!infile.eof() && header.find("..", 0) == string::npos) { + if (header.find("CLUSTAL", 0) == 0 + || header.find("MSAPROBS", 0) == 0) { + clustalW = true; + break; + } + infile.GetLine(header); + if (header.find("//", 0) != string::npos) { + missingHeader = true; + break; + } + } + + // read until end-of-file + while (valid) { + infile.GetLine(header); + if (infile.eof()) + break; + + string word; + in.clear(); + in.str(header); + + // check if there's anything on this line + if (in >> word) { + + // clustalw name parsing + if (clustalW) { + if (!isspace(header[0]) + && find(seqNames.begin(), seqNames.end(), word) + == seqNames.end()) { + seqNames.push_back(word); + seqData.push_back(new SafeVector()); + seqLengths.push_back(0); + seqData[(int) seqData.size() - 1]->push_back('@'); + } + } + + // look for new sequence label + if (word == string("Name:")) { + if (in >> word) { + seqNames.push_back(word); + seqData.push_back(new SafeVector()); + seqLengths.push_back(0); + seqData[(int) seqData.size() - 1]->push_back('@'); + } else + valid = false; + } + + // check if this is sequence data + else if (find(seqNames.begin(), seqNames.end(), word) + != seqNames.end()) { + int index = find(seqNames.begin(), seqNames.end(), word) + - seqNames.begin(); + + // read all remaining characters on the line + char ch; + while (in >> ch) { + if (isspace(ch)) + continue; + if (ch >= 'a' && ch <= 'z') + ch = ch - 'a' + 'A'; + if (ch == '.') + ch = '-'; + if (stripGaps && ch == '-') + continue; + if (!((ch >= 'A' && ch <= 'Z') || ch == '*' || ch == '-')) { + cerr << "ERROR: Unknown character encountered: " + << ch << endl; + exit(1); + } + + // everything's ok so far, so just store this character. + seqData[index]->push_back(ch); + seqLengths[index]++; + } + } else if (missingHeader) { + seqNames.push_back(word); + seqData.push_back(new SafeVector()); + seqLengths.push_back(0); + seqData[(int) seqData.size() - 1]->push_back('@'); + + int index = (int) seqNames.size() - 1; + + // read all remaining characters on the line + char ch; + while (in >> ch) { + if (isspace(ch)) + continue; + if (ch >= 'a' && ch <= 'z') + ch = ch - 'a' + 'A'; + if (ch == '.') + ch = '-'; + if (stripGaps && ch == '-') + continue; + if (!((ch >= 'A' && ch <= 'Z') || ch == '*' || ch == '-')) { + cerr << "ERROR: Unknown character encountered: " + << ch << endl; + exit(1); + } + + // everything's ok so far, so just store this character. + seqData[index]->push_back(ch); + seqLengths[index]++; + } + } + } + } + + // check for errors + if (seqNames.size() == 0) { + cerr << "ERROR: No sequences read!" << endl; + exit(1); + } + + assert(!sequences); + sequences = new SafeVector; + for (int i = 0; i < (int) seqNames.size(); i++) { + if (seqLengths[i] == 0) { + cerr << "ERROR: Sequence of zero length!" << endl; + exit(1); + } + Sequence *seq = new Sequence(seqData[i], seqNames[i], seqLengths[i], + i, i); + sequences->push_back(seq); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MFA from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + void LoadMFA(FileBuffer &infile, bool stripGaps = false) { + + // check to make sure that file reading is ok + if (infile.fail()) { + cerr << "ERROR: Error reading file." << endl; + exit(1); + } + + // read all sequences + while (true) { + + // get the sequence label as being the current # of sequences + // NOTE: sequence labels here are zero-based + int index = (!sequences) ? 0 : sequences->size(); + + // read the sequence + Sequence *seq = new Sequence(infile, stripGaps); + if (seq->Fail()) { + + // check if alternative file format (i.e. not MFA) + if (index == 0) { + string header = seq->GetHeader(); + if (header.length() > 0 && header[0] != '>') { + + // try MSF format + ParseMSF(infile, header); + break; + } + } + + delete seq; + break; + } + seq->SetLabel(index); + + // add the sequence to the list of current sequences + if (!sequences) + sequences = new SafeVector; + sequences->push_back(seq); + } + + // make sure at least one sequence was read + if (!sequences) { + cerr << "ERROR: No sequences read." << endl; + exit(1); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::AddSequence() + // + // Add another sequence to an existing sequence list + ///////////////////////////////////////////////////////////////// + + void AddSequence(Sequence *sequence) { + assert(sequence); + assert(!sequence->Fail()); + + // add sequence + if (!sequences) + sequences = new SafeVector; + sequences->push_back(sequence); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::RemoveSequence() + // + // Remove a sequence from the MultiSequence + ///////////////////////////////////////////////////////////////// + + void RemoveSequence(int index) { + assert(sequences); + + assert(index >= 0 && index < (int) sequences->size()); + delete (*sequences)[index]; + + sequences->erase(sequences->begin() + index); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::WriteMFA() + // + // Write MFA to the outfile. Allows the user to specify the + // number of columns for the output. Also, useIndices determines + // whether or not the actual sequence comments will be printed + // out or whether the artificially assigned sequence labels will + // be used instead. + ///////////////////////////////////////////////////////////////// + + void WriteMFA(ostream &outfile, int numColumns = 60, + bool useIndices = false) { + if (!sequences) + return; + + // loop through all sequences and write them out + for (SafeVector::iterator iter = sequences->begin(); + iter != sequences->end(); ++iter) { + (*iter)->WriteMFA(outfile, numColumns, useIndices); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetAnnotationChar() + // + // Return CLUSTALW annotation for column. + ///////////////////////////////////////////////////////////////// + + char GetAnnotationChar(SafeVector &column) { + SafeVector counts(256, 0); + int allChars = (int) column.size(); + + for (int i = 0; i < allChars; i++) { + counts[(unsigned char) toupper(column[i])]++; + } + + allChars -= counts[(unsigned char) '-']; + if (allChars == 1) + return ' '; + + for (int i = 0; i < 256; i++) + if ((char) i != '-' && counts[i] == allChars) + return '*'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'A'] == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + counts[(unsigned char) 'K'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'Q'] + counts[(unsigned char) 'K'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + counts[(unsigned char) 'Q'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'Q'] + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'R'] + counts[(unsigned char) 'K'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'M'] + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'L'] + counts[(unsigned char) 'V'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'M'] + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'L'] + counts[(unsigned char) 'F'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'H'] + counts[(unsigned char) 'Y'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'F'] + counts[(unsigned char) 'Y'] + + counts[(unsigned char) 'W'] == allChars) + return ':'; + + if (counts[(unsigned char) 'C'] + counts[(unsigned char) 'S'] + + counts[(unsigned char) 'A'] == allChars) + return '.'; + + if (counts[(unsigned char) 'A'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'V'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'A'] + + counts[(unsigned char) 'G'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'N'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'P'] + counts[(unsigned char) 'A'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'G'] + + counts[(unsigned char) 'N'] + counts[(unsigned char) 'D'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'N'] + + counts[(unsigned char) 'D'] + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'H'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'H'] + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'R'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'F'] + counts[(unsigned char) 'V'] + + counts[(unsigned char) 'L'] + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'M'] == allChars) + return '.'; + + if (counts[(unsigned char) 'H'] + counts[(unsigned char) 'F'] + + counts[(unsigned char) 'Y'] == allChars) + return '.'; + + return ' '; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::WriteALN() + // + // Write ALN to the outfile. Allows the user to specify the + // number of columns for the output. + ///////////////////////////////////////////////////////////////// + + void WriteALN(ostream &outfile, int numColumns = 60) { + if (!sequences) + return; + + outfile << "CLUSTAL for GLPROBS version " << VERSION << " multiple sequence alignment" << endl; +// +// outfile << "//"<::iterator> ptrs(GetNumSequences()); + SafeVector lengths(GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++) { + ptrs[i] = GetSequence(i)->GetDataPtr(); + lengths[i] = GetSequence(i)->GetLength(); + longestComment = max(longestComment, + (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone) { + outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++) { + + if (writtenChars < lengths[i]) { + outfile << GetSequence(i)->GetName(); + for (int j = 0; + j + < longestComment + - (int) GetSequence(i)->GetName().length(); + j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + if (writtenChars + j < lengths[i]) + outfile << ptrs[i][writtenChars + j + 1]; + else + break; + } + + outfile << endl; + + if (writtenChars + numColumns < lengths[i]) + allDone = false; + } + } + + // write annotation line +/* + for (int j = 0; j < longestComment; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + SafeVector column; + + for (int i = 0; i < GetNumSequences(); i++) + if (writtenChars + j < lengths[i]) + column.push_back(ptrs[i][writtenChars + j + 1]); + + if (column.size() > 0) + outfile << GetAnnotationChar(column); + } +*/ + outfile << endl; + writtenChars += numColumns; + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetSequence() + // + // Retrieve a sequence from the MultiSequence object. + ///////////////////////////////////////////////////////////////// + + Sequence* GetSequence(int i) { + assert(sequences); + assert(0 <= i && i < (int) sequences->size()); + + return (*sequences)[i]; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetSequence() + // + // Retrieve a sequence from the MultiSequence object + // (const version). + ///////////////////////////////////////////////////////////////// + + const Sequence* GetSequence(int i) const { + assert(sequences); + assert(0 <= i && i < (int) sequences->size()); + + return (*sequences)[i]; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetNumSequences() + // + // Returns the number of sequences in the MultiSequence. + ///////////////////////////////////////////////////////////////// + + int GetNumSequences() const { + if (!sequences) + return 0; + return (int) sequences->size(); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SortByHeader() + // + // Organizes the sequences according to their sequence headers + // in ascending order. + ///////////////////////////////////////////////////////////////// + + void SortByHeader() { + assert(sequences); + + // a quick and easy O(n^2) sort + for (int i = 0; i < (int) sequences->size() - 1; i++) { + for (int j = i + 1; j < (int) sequences->size(); j++) { + if ((*sequences)[i]->GetHeader() > (*sequences)[j]->GetHeader()) + swap((*sequences)[i], (*sequences)[j]); + } + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SortByLabel() + // + // Organizes the sequences according to their sequence labels + // in ascending order. + ///////////////////////////////////////////////////////////////// + + void SortByLabel() { + assert(sequences); + + // a quick and easy O(n^2) sort + for (int i = 0; i < (int) sequences->size() - 1; i++) { + for (int j = i + 1; j < (int) sequences->size(); j++) { + if ((*sequences)[i]->GetSortLabel() + > (*sequences)[j]->GetSortLabel()) + swap((*sequences)[i], (*sequences)[j]); + } + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SaveOrdering() + // + // Relabels sequences so as to preserve the current ordering. + ///////////////////////////////////////////////////////////////// + + void SaveOrdering() { + assert(sequences); + + for (int i = 0; i < (int) sequences->size(); i++) + (*sequences)[i]->SetSortLabel(i); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::Project() + // + // Given a set of indices, extract all sequences from the current + // MultiSequence object whose index is included in the set. + // Then, project the multiple alignments down to the desired + // subset, and return the projection as a new MultiSequence + // object. + ///////////////////////////////////////////////////////////////// + + MultiSequence *Project(const set &indices) { + SafeVector::iterator> oldPtrs(indices.size()); + SafeVector *> newPtrs(indices.size()); + + assert(indices.size() != 0); + + // grab old data + int i = 0; + for (set::const_iterator iter = indices.begin(); + iter != indices.end(); ++iter) { + oldPtrs[i++] = GetSequence(*iter)->GetDataPtr(); + } + + // compute new length + int oldLength = GetSequence(*indices.begin())->GetLength(); + int newLength = 0; + for (i = 1; i <= oldLength; i++) { + + // check to see if there is a gap in every sequence of the set + bool found = false; + for (int j = 0; !found && j < (int) indices.size(); j++) + found = (oldPtrs[j][i] != '-'); + + // if not, then this column counts towards the sequence length + if (found) + newLength++; + } + + // build new alignments + for (i = 0; i < (int) indices.size(); i++) { + newPtrs[i] = new SafeVector(); + assert(newPtrs[i]); + newPtrs[i]->push_back('@'); + } + + // add all needed columns + for (i = 1; i <= oldLength; i++) { + + // make sure column is not gapped in all sequences in the set + bool found = false; + for (int j = 0; !found && j < (int) indices.size(); j++) + found = (oldPtrs[j][i] != '-'); + + // if not, then add it + if (found) { + for (int j = 0; j < (int) indices.size(); j++) + newPtrs[j]->push_back(oldPtrs[j][i]); + } + } + + // wrap sequences in MultiSequence object + MultiSequence *ret = new MultiSequence(); + i = 0; + for (set::const_iterator iter = indices.begin(); + iter != indices.end(); ++iter) { + ret->AddSequence( + new Sequence(newPtrs[i++], GetSequence(*iter)->GetHeader(), + newLength, GetSequence(*iter)->GetSortLabel(), + GetSequence(*iter)->GetLabel())); + } + + return ret; + } +}; + +#endif diff --git a/binaries/src/GLProbs-1.0/ProbabilisticModel.h b/binaries/src/GLProbs-1.0/ProbabilisticModel.h new file mode 100644 index 0000000..6c7ab1b --- /dev/null +++ b/binaries/src/GLProbs-1.0/ProbabilisticModel.h @@ -0,0 +1,1338 @@ +///////////////////////////////////////////////////////////////// +// ProbabilisticModel.h +// +// Routines for (1) posterior probability computations +// (2) chained anchoring +// (3) maximum weight trace alignment +///////////////////////////////////////////////////////////////// + +#ifndef PROBABILISTICMODEL_H +#define PROBABILISTICMODEL_H + +#include +#include +#include +#include "SafeVector.h" +#include "ScoreType.h" +#include "SparseMatrix.h" +#include "MultiSequence.h" + +using namespace std; + +const int NumMatchStates = 1; // note that in this version the number + // of match states is fixed at 1...will +const int NumInsertStates = 2; // change in future versions +const int NumMatrixTypes = NumMatchStates + NumInsertStates * 2; + +///////////////////////////////////////////////////////////////// +// ProbabilisticModel +// +// Class for storing the parameters of a probabilistic model and +// performing different computations based on those parameters. +// In particular, this class handles the computation of +// posterior probabilities that may be used in alignment. +///////////////////////////////////////////////////////////////// + +class ProbabilisticModel { + + float initialDistribution[NumMatrixTypes]; // holds the initial probabilities for each state + float transProb[NumMatrixTypes][NumMatrixTypes]; // holds all state-to-state transition probabilities + float matchProb[256][256]; // emission probabilities for match states + float insProb[256][NumMatrixTypes]; // emission probabilities for insert states + float local_transProb[3][3]; + float random_transProb[2]; + + public: + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ProbabilisticModel() + // + // Constructor. Builds a new probabilistic model using the + // given parameters. + ///////////////////////////////////////////////////////////////// + + ProbabilisticModel (const VF &initDistribMat, const VF &gapOpen, const VF &gapExtend, + const VVF &emitPairs, const VF &emitSingle){ + +//Probcons model + // build transition matrix + VVF transMat (NumMatrixTypes, VF (NumMatrixTypes, 0.0f)); + transMat[0][0] = 1; + for (int i = 0; i < NumInsertStates; i++){ + transMat[0][2*i+1] = gapOpen[2*i]; + transMat[0][2*i+2] = gapOpen[2*i]; + transMat[0][0] -= (gapOpen[2*i] + gapOpen[2*i]); + assert (transMat[0][0] > 0); + transMat[2*i+1][2*i+1] = gapExtend[2*i]; + transMat[2*i+2][2*i+2] = gapExtend[2*i]; + transMat[2*i+1][2*i+2] = 0; + transMat[2*i+2][2*i+1] = 0; + transMat[2*i+1][0] = 1 - gapExtend[2*i]; + transMat[2*i+2][0] = 1 - gapExtend[2*i]; + } + + // create initial and transition probability matrices + for (int i = 0; i < NumMatrixTypes; i++){ + initialDistribution[i] = LOG (initDistribMat[i]); + for (int j = 0; j < NumMatrixTypes; j++) + transProb[i][j] = LOG (transMat[i][j]); + } +//due to Local model parameters' initilization, need to correct initialDistribution[2] + initialDistribution[2] = LOG (initDistribMat[1]); + + // create insertion and match probability matrices + for (int i = 0; i < 256; i++){ + for (int j = 0; j < NumMatrixTypes; j++) + insProb[i][j] = LOG (emitSingle[i]); + for (int j = 0; j < 256; j++) + matchProb[i][j] = LOG (emitPairs[i][j]); + } + +//Local model + // build transition matrix + VVF ltransMat (3, VF (3, 0.0f)); + ltransMat[0][0] = 1; + + ltransMat[0][1] = gapOpen[1]; + ltransMat[0][2] = gapOpen[1]; + ltransMat[0][0] -= (gapOpen[1] + gapOpen[1]); + assert (ltransMat[0][0] > 0); + ltransMat[1][1] = gapExtend[1]; + ltransMat[2][2] = gapExtend[1]; + ltransMat[1][2] = 0; + ltransMat[2][1] = 0; + ltransMat[1][0] = 1 - gapExtend[1]; + ltransMat[2][0] = 1 - gapExtend[1]; + + // create initial and transition probability matrices + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 3; j++) + local_transProb[i][j] = LOG (ltransMat[i][j]); + } + + // create initial and transition probability matrices + random_transProb[0] = LOG (initDistribMat[2]);//sigma + random_transProb[1] = LOG (1-initDistribMat[2]);//1-sigma + + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeForwardMatrix() + // + // Computes a set of forward probability matrices for aligning + // seq1 and seq2. + // + // For efficiency reasons, a single-dimensional floating-point + // array is used here, with the following indexing scheme: + // + // forward[i + NumMatrixTypes * (j * (seq2Length+1) + k)] + // refers to the probability of aligning through j characters + // of the first sequence, k characters of the second sequence, + // and ending in state i. + // flag: 1 probcons, 0 local + ///////////////////////////////////////////////////////////////// + + VF *ComputeForwardMatrix (Sequence *seq1, Sequence *seq2, bool flag=true) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // retrieve the points to the beginning of each sequence + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create matrix + VF *forwardPtr; + if(flag) forwardPtr = new VF (NumMatrixTypes * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + else forwardPtr = new VF (3 * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + assert (forwardPtr); + VF &forward = *forwardPtr; + + // initialization condition + if(flag){ + forward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)] = + initialDistribution[0] + matchProb[(unsigned char) iter1[1]][(unsigned char) iter2[1]]; + + for (int k = 0; k < NumInsertStates; k++){ + forward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)] = + initialDistribution[2*k+1] + insProb[(unsigned char) iter1[1]][k]; + forward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)] = + initialDistribution[2*k+2] + insProb[(unsigned char) iter2[1]][k]; + } + } + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + if(flag){ + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + } + else{ + ij *= 3; + i1j *= 3; + ij1 *= 3; + i1j1 *= 3; + } + + // compute forward scores + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + //local + if(i == 1 && j == 1 && !flag) forward[0 + ij] = + matchProb[c1][c2] - insProb[c1][0] - insProb[c2][0] - 2*random_transProb[1]; + + if (i > 1 || j > 1){ + if (i > 0 && j > 0){ + if(flag){ + forward[0 + ij] = forward[0 + i1j1] + transProb[0][0]; + for (int k = 1; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (forward[0 + ij], forward[k + i1j1] + transProb[k][0]); + forward[0 + ij] += matchProb[c1][c2]; + } + //local + else{ + forward[0 + ij] = matchProb[c1][c2] - insProb[c1][0] - insProb[c2][0] - 2*random_transProb[1]; + for (int k = 0; k < 3; k++) + LOG_PLUS_EQUALS (forward[0 + ij], matchProb[c1][c2] - insProb[c1][0] - insProb[c2][0] + + forward[k + i1j1] + local_transProb[k][0] - 2*random_transProb[1]); + } + } + if (i > 0){ + if(flag){ + for (int k = 0; k < NumInsertStates; k++) + forward[2*k+1 + ij] = insProb[c1][k] + + LOG_ADD (forward[0 + i1j] + transProb[0][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1]); + } + + + + + + + //local + else{ + forward[1 + ij] = LOG_ADD (forward[0 + i1j] + local_transProb[0][1] - random_transProb[1], + forward[1 + i1j] + local_transProb[1][1] - random_transProb[1]); + } + + } + if (j > 0){ + if(flag){ + for (int k = 0; k < NumInsertStates; k++) + forward[2*k+2 + ij] = insProb[c2][k] + + LOG_ADD (forward[0 + ij1] + transProb[0][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2]); + } + //local + else{ + forward[2 + ij] = LOG_ADD (forward[0 + ij1] + local_transProb[0][2] - random_transProb[1], + forward[2 + ij1] + local_transProb[2][2] - random_transProb[1]); + } + } + } + if(flag){ + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + else{ + ij += 3; + i1j += 3; + ij1 += 3; + i1j1 += 3; + } + } + } + + return forwardPtr; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeBackwardMatrix() + // + // Computes a set of backward probability matrices for aligning + // seq1 and seq2. + // + // For efficiency reasons, a single-dimensional floating-point + // array is used here, with the following indexing scheme: + // + // backward[i + NumMatrixTypes * (j * (seq2Length+1) + k)] + // refers to the probability of starting in state i and + // aligning from character j+1 to the end of the first + // sequence and from character k+1 to the end of the second + // sequence. + ///////////////////////////////////////////////////////////////// + + VF *ComputeBackwardMatrix (Sequence *seq1, Sequence *seq2, bool flag=true) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create matrix + VF *backwardPtr; + if(flag) backwardPtr = new VF (NumMatrixTypes * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + else backwardPtr = new VF (3 * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + assert (backwardPtr); + VF &backward = *backwardPtr; + + // initialization condition + if(flag){ + for (int k = 0; k < NumMatrixTypes; k++) + backward[NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1) + k] = initialDistribution[k]; + } + // remember offset for each index combination + int ij = (seq1Length+1) * (seq2Length+1) - 1; + int i1j = ij + seq2Length + 1; + int ij1 = ij + 1; + int i1j1 = ij + seq2Length + 2; + + if(flag){ + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + } + else{ + ij *= 3; + i1j *= 3; + ij1 *= 3; + i1j1 *= 3; + } + + // compute backward scores + for (int i = seq1Length; i >= 0; i--){ + unsigned char c1 = (i == seq1Length) ? '~' : (unsigned char) iter1[i+1]; + for (int j = seq2Length; j >= 0; j--){ + unsigned char c2 = (j == seq2Length) ? '~' : (unsigned char) iter2[j+1]; + + if(!flag) backward[0 + ij] = LOG_ONE;//local + if (i < seq1Length && j < seq2Length){ + if(flag){ + const float ProbXY = backward[0 + i1j1] + matchProb[c1][c2]; + for (int k = 0; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (backward[k + ij], ProbXY + transProb[k][0]); + } + //local + else{ + const float ProbXY = backward[0 + i1j1] + matchProb[c1][c2] - insProb[c1][0] - insProb[c2][0]; + for (int k = 0; k < 3; k++) + LOG_PLUS_EQUALS (backward[k + ij], ProbXY + local_transProb[k][0] - 2*random_transProb[1] ); + } + } + if (i < seq1Length){ + if(flag){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (backward[0 + ij], backward[2*k+1 + i1j] + insProb[c1][k] + transProb[0][2*k+1]); + LOG_PLUS_EQUALS (backward[2*k+1 + ij], backward[2*k+1 + i1j] + insProb[c1][k] + transProb[2*k+1][2*k+1]); + } + } + //local + else{ + LOG_PLUS_EQUALS (backward[0 + ij], backward[1 + i1j] + local_transProb[0][1] - random_transProb[1]); + LOG_PLUS_EQUALS (backward[1 + ij], backward[1 + i1j] + local_transProb[1][1] - random_transProb[1]); + } + } + if (j < seq2Length){ + if(flag){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (backward[0 + ij], backward[2*k+2 + ij1] + insProb[c2][k] + transProb[0][2*k+2]); + LOG_PLUS_EQUALS (backward[2*k+2 + ij], backward[2*k+2 + ij1] + insProb[c2][k] + transProb[2*k+2][2*k+2]); + } + } + //local + else{ + LOG_PLUS_EQUALS (backward[0 + ij], backward[2 + ij1] + local_transProb[0][2] - random_transProb[1]); + LOG_PLUS_EQUALS (backward[2 + ij], backward[2 + ij1] + local_transProb[2][2] - random_transProb[1]); + } + } + if(flag){ + ij -= NumMatrixTypes; + i1j -= NumMatrixTypes; + ij1 -= NumMatrixTypes; + i1j1 -= NumMatrixTypes; + } + else{ + ij -= 3; + i1j -= 3; + ij1 -= 3; + i1j1 -= 3; + } + } + } + + return backwardPtr; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeTotalProbability() + // + // Computes the total probability of an alignment given + // the forward and backward matrices. + // flag: 1 probcons, 0 local + ///////////////////////////////////////////////////////////////// + + float ComputeTotalProbability (Sequence *seq1, Sequence *seq2, + const VF &forward, const VF &backward, bool flag=true) const { + + // compute total probability + float totalForwardProb = LOG_ZERO; + float totalBackwardProb = LOG_ZERO; + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + if(flag){ + for (int k = 0; k < NumMatrixTypes; k++){ + LOG_PLUS_EQUALS (totalForwardProb, + forward[k + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[k + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + } + + totalBackwardProb = + forward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)] + + backward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)]; + + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (totalBackwardProb, + forward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)] + + backward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)]); + LOG_PLUS_EQUALS (totalBackwardProb, + forward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)] + + backward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)]); + } + } + else{ + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + int ij = 0; + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + if(i>0&&j>0) { + LOG_PLUS_EQUALS (totalForwardProb,forward[ij]); + LOG_PLUS_EQUALS (totalBackwardProb,backward[ij] + matchProb[c1][c2] + - insProb[c1][0] - insProb[c2][0] - 2*random_transProb[1]); + } + ij += 3; + } + } + + } + + return (totalForwardProb + totalBackwardProb) / 2; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputePosteriorMatrix() + // + // Computes the posterior probability matrix based on + // the forward and backward matrices. + // flag: 1 probcons, 0 local + ///////////////////////////////////////////////////////////////// + + VF *ComputePosteriorMatrix (Sequence *seq1, Sequence *seq2, + const VF &forward, const VF &backward, bool flag=true) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + float totalProb = ComputeTotalProbability (seq1, seq2,forward, backward, flag); + + // compute posterior matrices + VF *posteriorPtr = new VF((seq1Length+1) * (seq2Length+1)); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + + int ij = 0; + VF::iterator ptr = posterior.begin(); + + for (int i = 0; i <= seq1Length; i++){ + for (int j = 0; j <= seq2Length; j++){ + *(ptr++) = EXP (min (LOG_ONE, forward[ij] + backward[ij] - totalProb)); + if(flag) ij += NumMatrixTypes; + else ij += 3; + } + } + + posterior[0] = 0; + + return posteriorPtr; + } + + /* + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeExpectedCounts() + // + // Computes the expected counts for the various transitions. + ///////////////////////////////////////////////////////////////// + + VVF *ComputeExpectedCounts () const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // compute total probability + float totalProb = ComputeTotalProbability (seq1Length, seq2Length, + forward, backward); + + // initialize expected counts + VVF *countsPtr = new VVF(NumMatrixTypes + 1, VF(NumMatrixTypes, LOG_ZERO)); assert (countsPtr); + VVF &counts = *countsPtr; + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute expected counts + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 0 && j > 0){ + for (int k = 0; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (counts[k][0], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (counts[0][2*k+1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (counts[2*k+1][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + } + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (counts[0][2*k+2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (counts[2*k+2][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // scale all expected counts appropriately + for (int i = 0; i < NumMatrixTypes; i++) + for (int j = 0; j < NumMatrixTypes; j++) + counts[i][j] -= totalProb; + + } + */ + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeNewParameters() + // + // Computes a new parameter set based on the expected counts + // given. + ///////////////////////////////////////////////////////////////// + + void ComputeNewParameters (Sequence *seq1, Sequence *seq2, + const VF &forward, const VF &backward, + VF &initDistribMat, VF &gapOpen, + VF &gapExtend, VVF &emitPairs, VF &emitSingle, bool enableTrainEmissions) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // compute total probability + float totalProb = ComputeTotalProbability (seq1, seq2, + forward, backward); + + // initialize expected counts + VVF transCounts (NumMatrixTypes, VF (NumMatrixTypes, LOG_ZERO)); + VF initCounts (NumMatrixTypes, LOG_ZERO); + VVF pairCounts (256, VF (256, LOG_ZERO)); + VF singleCounts (256, LOG_ZERO); + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute initial distribution posteriors + initCounts[0] = LOG_ADD (forward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)] + + backward[0 + NumMatrixTypes * (1 * (seq2Length+1) + 1)], + forward[0 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[0 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + for (int k = 0; k < NumInsertStates; k++){ + initCounts[2*k+1] = LOG_ADD (forward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)] + + backward[2*k+1 + NumMatrixTypes * (1 * (seq2Length+1) + 0)], + forward[2*k+1 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[2*k+1 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + initCounts[2*k+2] = LOG_ADD (forward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)] + + backward[2*k+2 + NumMatrixTypes * (0 * (seq2Length+1) + 1)], + forward[2*k+2 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)] + + backward[2*k+2 + NumMatrixTypes * ((seq1Length+1) * (seq2Length+1) - 1)]); + } + + // compute expected counts + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) toupper(iter1[i]); + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) toupper(iter2[j]); + + if (i > 0 && j > 0){ + if (enableTrainEmissions && i == 1 && j == 1){ + LOG_PLUS_EQUALS (pairCounts[c1][c2], + initialDistribution[0] + matchProb[c1][c2] + backward[0 + ij]); + LOG_PLUS_EQUALS (pairCounts[c2][c1], + initialDistribution[0] + matchProb[c2][c1] + backward[0 + ij]); + } + + for (int k = 0; k < NumMatrixTypes; k++){ + LOG_PLUS_EQUALS (transCounts[k][0], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + if (enableTrainEmissions && i != 1 || j != 1){ + LOG_PLUS_EQUALS (pairCounts[c1][c2], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + LOG_PLUS_EQUALS (pairCounts[c2][c1], + forward[k + i1j1] + transProb[k][0] + + matchProb[c2][c1] + backward[0 + ij]); + } + } + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (transCounts[0][2*k+1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (transCounts[2*k+1][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + if (enableTrainEmissions){ + if (i == 1 && j == 0){ + LOG_PLUS_EQUALS (singleCounts[c1], + initialDistribution[2*k+1] + insProb[c1][k] + backward[2*k+1 + ij]); + } + else { + LOG_PLUS_EQUALS (singleCounts[c1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (singleCounts[c1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + } + } + } + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (transCounts[0][2*k+2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (transCounts[2*k+2][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + if (enableTrainEmissions){ + if (i == 0 && j == 1){ + LOG_PLUS_EQUALS (singleCounts[c2], + initialDistribution[2*k+2] + insProb[c2][k] + backward[2*k+2 + ij]); + } + else { + LOG_PLUS_EQUALS (singleCounts[c2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (singleCounts[c2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + } + } + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // scale all expected counts appropriately + for (int i = 0; i < NumMatrixTypes; i++){ + initCounts[i] -= totalProb; + for (int j = 0; j < NumMatrixTypes; j++) + transCounts[i][j] -= totalProb; + } + if (enableTrainEmissions){ + for (int i = 0; i < 256; i++){ + for (int j = 0; j < 256; j++) + pairCounts[i][j] -= totalProb; + singleCounts[i] -= totalProb; + } + } + + // compute new initial distribution + float totalInitDistribCounts = 0; + for (int i = 0; i < NumMatrixTypes; i++) + totalInitDistribCounts += exp (initCounts[i]); // should be 2 + initDistribMat[0] = min (1.0f, max (0.0f, (float) exp (initCounts[0]) / totalInitDistribCounts)); + for (int k = 0; k < NumInsertStates; k++){ + float val = (exp (initCounts[2*k+1]) + exp (initCounts[2*k+2])) / 2; + initDistribMat[2*k+1] = initDistribMat[2*k+2] = min (1.0f, max (0.0f, val / totalInitDistribCounts)); + } + + // compute total counts for match state + float inMatchStateCounts = 0; + for (int i = 0; i < NumMatrixTypes; i++) + inMatchStateCounts += exp (transCounts[0][i]); + for (int i = 0; i < NumInsertStates; i++){ + + // compute total counts for gap state + float inGapStateCounts = + exp (transCounts[2*i+1][0]) + + exp (transCounts[2*i+1][2*i+1]) + + exp (transCounts[2*i+2][0]) + + exp (transCounts[2*i+2][2*i+2]); + + gapOpen[2*i] = gapOpen[2*i+1] = + (exp (transCounts[0][2*i+1]) + + exp (transCounts[0][2*i+2])) / + (2 * inMatchStateCounts); + + gapExtend[2*i] = gapExtend[2*i+1] = + (exp (transCounts[2*i+1][2*i+1]) + + exp (transCounts[2*i+2][2*i+2])) / + inGapStateCounts; + } + + if (enableTrainEmissions){ + float totalPairCounts = 0; + float totalSingleCounts = 0; + for (int i = 0; i < 256; i++){ + for (int j = 0; j <= i; j++) + totalPairCounts += exp (pairCounts[j][i]); + totalSingleCounts += exp (singleCounts[i]); + } + + for (int i = 0; i < 256; i++) if (!islower ((char) i)){ + int li = (int)((unsigned char) tolower ((char) i)); + for (int j = 0; j <= i; j++) if (!islower ((char) j)){ + int lj = (int)((unsigned char) tolower ((char) j)); + emitPairs[i][j] = emitPairs[i][lj] = emitPairs[li][j] = emitPairs[li][lj] = + emitPairs[j][i] = emitPairs[j][li] = emitPairs[lj][i] = emitPairs[lj][li] = exp(pairCounts[j][i]) / totalPairCounts; + } + emitSingle[i] = emitSingle[li] = exp(singleCounts[i]) / totalSingleCounts; + } + } + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignment() + // + // Computes an alignment based on the given posterior matrix. + // This is done by finding the maximum summing path (or + // maximum weight trace) through the posterior matrix. The + // final alignment is returned as a pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float indicating the sum achieved + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignment (int seq1Length, int seq2Length, + const VF &posterior) const { + + float *twoRows = new float[(seq2Length+1)*2]; assert (twoRows); + float *oldRow = twoRows; + float *newRow = twoRows + seq2Length + 1; + + char *tracebackMatrix = new char[(seq1Length+1)*(seq2Length+1)]; assert (tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++){ + oldRow[i] = 0; + *(tracebackPtr++) = 'L'; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++){ + + // initialize left column + newRow[0] = 0; + posteriorPtr++; + *(tracebackPtr++) = 'U'; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++){ + ChooseBestOfThree (*(posteriorPtr++) + oldRow[j-1], newRow[j-1], oldRow[j], + 'D', 'L', 'U', &newRow[j], tracebackPtr++); + } + + // swap rows + float *temp = oldRow; + oldRow = newRow; + newRow = temp; + } + + // store best score + float total = oldRow[seq2Length]; + delete [] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + char ch = tracebackMatrix[r*(seq2Length+1) + c]; + switch (ch){ + case 'L': c--; alignment->push_back ('Y'); break; + case 'U': r--; alignment->push_back ('X'); break; + case 'D': c--; r--; alignment->push_back ('B'); break; + default: assert (false); + } + } + + delete [] tracebackMatrix; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, total); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignmentWithGapPenalties() + // + // Similar to ComputeAlignment() except with gap penalties. + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignmentWithGapPenalties (MultiSequence *align1, + MultiSequence *align2, + const VF &posterior, int numSeqs1, + int numSeqs2, + float gapOpenPenalty, + float gapContinuePenalty) const { + int seq1Length = align1->GetSequence(0)->GetLength(); + int seq2Length = align2->GetSequence(0)->GetLength(); + SafeVector::iterator > dataPtrs1 (align1->GetNumSequences()); + SafeVector::iterator > dataPtrs2 (align2->GetNumSequences()); + + // grab character data + for (int i = 0; i < align1->GetNumSequences(); i++) + dataPtrs1[i] = align1->GetSequence(i)->GetDataPtr(); + for (int i = 0; i < align2->GetNumSequences(); i++) + dataPtrs2[i] = align2->GetSequence(i)->GetDataPtr(); + + // the number of active sequences at any given column is defined to be the + // number of non-gap characters in that column; the number of gap opens at + // any given column is defined to be the number of gap characters in that + // column where the previous character in the respective sequence was not + // a gap + SafeVector numActive1 (seq1Length+1), numGapOpens1 (seq1Length+1); + SafeVector numActive2 (seq2Length+1), numGapOpens2 (seq2Length+1); + + // compute number of active sequences and gap opens for each group + for (int i = 0; i < align1->GetNumSequences(); i++){ + SafeVector::iterator dataPtr = align1->GetSequence(i)->GetDataPtr(); + numActive1[0] = numGapOpens1[0] = 0; + for (int j = 1; j <= seq1Length; j++){ + if (dataPtr[j] != '-'){ + numActive1[j]++; + numGapOpens1[j] += (j != 1 && dataPtr[j-1] != '-'); + } + } + } + for (int i = 0; i < align2->GetNumSequences(); i++){ + SafeVector::iterator dataPtr = align2->GetSequence(i)->GetDataPtr(); + numActive2[0] = numGapOpens2[0] = 0; + for (int j = 1; j <= seq2Length; j++){ + if (dataPtr[j] != '-'){ + numActive2[j]++; + numGapOpens2[j] += (j != 1 && dataPtr[j-1] != '-'); + } + } + } + + VVF openingPenalty1 (numSeqs1+1, VF (numSeqs2+1)); + VF continuingPenalty1 (numSeqs1+1); + VVF openingPenalty2 (numSeqs1+1, VF (numSeqs2+1)); + VF continuingPenalty2 (numSeqs2+1); + + // precompute penalties + for (int i = 0; i <= numSeqs1; i++) + for (int j = 0; j <= numSeqs2; j++) + openingPenalty1[i][j] = i * (gapOpenPenalty * j + gapContinuePenalty * (numSeqs2 - j)); + for (int i = 0; i <= numSeqs1; i++) + continuingPenalty1[i] = i * gapContinuePenalty * numSeqs2; + for (int i = 0; i <= numSeqs2; i++) + for (int j = 0; j <= numSeqs1; j++) + openingPenalty2[i][j] = i * (gapOpenPenalty * j + gapContinuePenalty * (numSeqs1 - j)); + for (int i = 0; i <= numSeqs2; i++) + continuingPenalty2[i] = i * gapContinuePenalty * numSeqs1; + + float *twoRows = new float[6*(seq2Length+1)]; assert (twoRows); + float *oldRowMatch = twoRows; + float *newRowMatch = twoRows + (seq2Length+1); + float *oldRowInsertX = twoRows + 2*(seq2Length+1); + float *newRowInsertX = twoRows + 3*(seq2Length+1); + float *oldRowInsertY = twoRows + 4*(seq2Length+1); + float *newRowInsertY = twoRows + 5*(seq2Length+1); + + char *tracebackMatrix = new char[3*(seq1Length+1)*(seq2Length+1)]; assert (tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++){ + oldRowMatch[i] = oldRowInsertX[i] = (i == 0) ? 0 : LOG_ZERO; + oldRowInsertY[i] = (i == 0) ? 0 : oldRowInsertY[i-1] + continuingPenalty2[numActive2[i]]; + *(tracebackPtr) = *(tracebackPtr+1) = *(tracebackPtr+2) = 'Y'; + tracebackPtr += 3; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++){ + + // initialize left column + newRowMatch[0] = newRowInsertY[0] = LOG_ZERO; + newRowInsertX[0] = oldRowInsertX[0] + continuingPenalty1[numActive1[i]]; + posteriorPtr++; + *(tracebackPtr) = *(tracebackPtr+1) = *(tracebackPtr+2) = 'X'; + tracebackPtr += 3; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++){ + + // going to MATCH state + ChooseBestOfThree (oldRowMatch[j-1], + oldRowInsertX[j-1], + oldRowInsertY[j-1], + 'M', 'X', 'Y', &newRowMatch[j], tracebackPtr++); + newRowMatch[j] += *(posteriorPtr++); + + // going to INSERT X state + ChooseBestOfThree (oldRowMatch[j] + openingPenalty1[numActive1[i]][numGapOpens2[j]], + oldRowInsertX[j] + continuingPenalty1[numActive1[i]], + oldRowInsertY[j] + openingPenalty1[numActive1[i]][numGapOpens2[j]], + 'M', 'X', 'Y', &newRowInsertX[j], tracebackPtr++); + + // going to INSERT Y state + ChooseBestOfThree (newRowMatch[j-1] + openingPenalty2[numActive2[j]][numGapOpens1[i]], + newRowInsertX[j-1] + openingPenalty2[numActive2[j]][numGapOpens1[i]], + newRowInsertY[j-1] + continuingPenalty2[numActive2[j]], + 'M', 'X', 'Y', &newRowInsertY[j], tracebackPtr++); + } + + // swap rows + float *temp; + temp = oldRowMatch; oldRowMatch = newRowMatch; newRowMatch = temp; + temp = oldRowInsertX; oldRowInsertX = newRowInsertX; newRowInsertX = temp; + temp = oldRowInsertY; oldRowInsertY = newRowInsertY; newRowInsertY = temp; + } + + // store best score + float total; + char matrix; + ChooseBestOfThree (oldRowMatch[seq2Length], oldRowInsertX[seq2Length], oldRowInsertY[seq2Length], + 'M', 'X', 'Y', &total, &matrix); + + delete [] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + + int offset = (matrix == 'M') ? 0 : (matrix == 'X') ? 1 : 2; + char ch = tracebackMatrix[(r*(seq2Length+1) + c) * 3 + offset]; + switch (matrix){ + case 'Y': c--; alignment->push_back ('Y'); break; + case 'X': r--; alignment->push_back ('X'); break; + case 'M': c--; r--; alignment->push_back ('B'); break; + default: assert (false); + } + matrix = ch; + } + + delete [] tracebackMatrix; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, 1.0f); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeViterbiAlignment() + // + // Computes the highest probability pairwise alignment using the + // probabilistic model. The final alignment is returned as a + // pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float containing the log probability of the best + // alignment (not used) + ///////////////////////////////////////////////////////////////// + + + pair *, float> ComputeViterbiAlignment (Sequence *seq1, Sequence *seq2) const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // retrieve the points to the beginning of each sequence + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create viterbi matrix + VF *viterbiPtr = new VF (3 * (seq1Length+1) * (seq2Length+1), LOG_ZERO); + assert (viterbiPtr); + VF &viterbi = *viterbiPtr; + + // create traceback matrix + VI *tracebackPtr = new VI (3 * (seq1Length+1) * (seq2Length+1), -1); + assert (tracebackPtr); + VI &traceback = *tracebackPtr; + + // initialization condition +/* + for (int k = 0; k < NumMatrixTypes; k++) + viterbi[k] = initialDistribution[k]; +*/ + viterbi[0] = LOG(0.6080327034); + viterbi[1] = LOG(0.1959836632); + viterbi[2] = LOG(0.1959836632); + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= 3; + i1j *= 3; + ij1 *= 3; + i1j1 *= 3; + + // compute viterbi scores + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 0 && j > 0){ + for (int k = 0; k < 3; k++){ + float newVal = viterbi[k + i1j1] + local_transProb[k][0] + matchProb[c1][c2]; + if (viterbi[0 + ij] < newVal){ + viterbi[0 + ij] = newVal; + traceback[0 + ij] = k; + } + } + } + if (i > 0){ + for (int k = 0; k < 1; k++){ + float valFromMatch = insProb[c1][k] + viterbi[0 + i1j] + local_transProb[0][2*k+1]; + float valFromIns = insProb[c1][k] + viterbi[2*k+1 + i1j] + local_transProb[2*k+1][2*k+1]; + if (valFromMatch >= valFromIns){ + viterbi[2*k+1 + ij] = valFromMatch; + traceback[2*k+1 + ij] = 0; + } + else { + viterbi[2*k+1 + ij] = valFromIns; + traceback[2*k+1 + ij] = 2*k+1; + } + } + } + if (j > 0){ + for (int k = 0; k < 1; k++){ + float valFromMatch = insProb[c2][k] + viterbi[0 + ij1] + local_transProb[0][2*k+2]; + float valFromIns = insProb[c2][k] + viterbi[2*k+2 + ij1] + local_transProb[2*k+2][2*k+2]; + if (valFromMatch >= valFromIns){ + viterbi[2*k+2 + ij] = valFromMatch; + traceback[2*k+2 + ij] = 0; + } + else { + viterbi[2*k+2 + ij] = valFromIns; + traceback[2*k+2 + ij] = 2*k+2; + } + } + } + + ij += 3; + i1j += 3; + ij1 += 3; + i1j1 += 3; + } + } + + // figure out best terminating cell + float bestProb = LOG_ZERO; + int state = -1; + viterbi[0] = LOG(0.6080327034); + viterbi[1] = LOG(0.1959836632); + viterbi[2] = LOG(0.1959836632); + + for (int k = 0; k < 3; k++){ + float thisProb = viterbi[k + 3 * ((seq1Length+1)*(seq2Length+1) - 1)] + viterbi[k]; + if (bestProb < thisProb){ + bestProb = thisProb; + state = k; + } + } + assert (state != -1); + + delete viterbiPtr; + + // compute traceback + SafeVector *alignment = new SafeVector; assert (alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0){ + int newState = traceback[state + 3 * (r * (seq2Length+1) + c)]; + if (state == 0){ c--; r--; alignment->push_back ('B');} + else if (state % 2 == 1){ r--; alignment->push_back ('X'); } + else { c--; alignment->push_back ('Y'); } + state = newState; + } + + delete tracebackPtr; + + reverse (alignment->begin(), alignment->end()); + + return make_pair(alignment, bestProb); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::BuildPosterior() + // + // Builds a posterior probability matrix needed to align a pair + // of alignments. Mathematically, the returned matrix M is + // defined as follows: + // M[i,j] = sum sum f(s,t,i,j) + // s in align1 t in align2 + // where + // [ P(s[i'] <--> t[j']) + // [ if s[i'] is a letter in the ith column of align1 and + // [ t[j'] it a letter in the jth column of align2 + // f(s,t,i,j) = [ + // [ 0 otherwise + // + ///////////////////////////////////////////////////////////////// + + VF *BuildPosterior (MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + float cutoff = 0.0f) const { + const int seq1Length = align1->GetSequence(0)->GetLength(); + const int seq2Length = align2->GetSequence(0)->GetLength(); + + VF *posteriorPtr = new VF((seq1Length+1) * (seq2Length+1), 0); assert (posteriorPtr); + VF &posterior = *posteriorPtr; + VF::iterator postPtr = posterior.begin(); + + // for each s in align1 + for (int i = 0; i < align1->GetNumSequences(); i++){ + int first = align1->GetSequence(i)->GetLabel(); + SafeVector *mapping1 = align1->GetSequence(i)->GetMapping(); + + // for each t in align2 + for (int j = 0; j < align2->GetNumSequences(); j++){ + int second = align2->GetSequence(j)->GetLabel(); + SafeVector *mapping2 = align2->GetSequence(j)->GetMapping(); + + if (first < second){ + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[first][second]; + + for (int ii = 1; ii <= matrix->GetSeq1Length(); ii++){ + SafeVector::iterator row = matrix->GetRowPtr(ii); + int base = (*mapping1)[ii] * (seq2Length+1); + int rowSize = matrix->GetRowSize(ii); + + // add in all relevant values + for (int jj = 0; jj < rowSize; jj++) + posterior[base + (*mapping2)[row[jj].first]] += row[jj].second; + + // subtract cutoff + for (int jj = 0; jj < matrix->GetSeq2Length(); jj++) + posterior[base + (*mapping2)[jj]] -= cutoff; + } + + } else { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[second][first]; + + for (int jj = 1; jj <= matrix->GetSeq1Length(); jj++){ + SafeVector::iterator row = matrix->GetRowPtr(jj); + int base = (*mapping2)[jj]; + int rowSize = matrix->GetRowSize(jj); + + // add in all relevant values + for (int ii = 0; ii < rowSize; ii++) + posterior[base + (*mapping1)[row[ii].first] * (seq2Length + 1)] += row[ii].second; + + // subtract cutoff + for (int ii = 0; ii < matrix->GetSeq2Length(); ii++) + posterior[base + (*mapping1)[ii] * (seq2Length + 1)] -= cutoff; + } + + } + + + delete mapping2; + } + + delete mapping1; + } + + return posteriorPtr; + } + + //added by Liu Yongchao.Feb 23, 2010 + VF *BuildPosterior(int* seqsWeights, MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + float cutoff = 0.0f) const { + const int seq1Length = align1->GetSequence(0)->GetLength(); + const int seq2Length = align2->GetSequence(0)->GetLength(); + + VF *posteriorPtr = new VF((seq1Length + 1) * (seq2Length + 1), 0); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + VF::iterator postPtr = posterior.begin(); + + //compute the total sum of all weights + float totalWeights = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) { + int first = align1->GetSequence(i)->GetLabel(); + int w1 = seqsWeights[first]; + for (int j = 0; j < align2->GetNumSequences(); j++) { + int second = align2->GetSequence(j)->GetLabel(); + int w2 = seqsWeights[second]; + + totalWeights += w1 * w2; + } + } + // for each s in align1 + for (int i = 0; i < align1->GetNumSequences(); i++) { + int first = align1->GetSequence(i)->GetLabel(); + int w1 = seqsWeights[first]; + SafeVector *mapping1 = align1->GetSequence(i)->GetMapping(); + // for each t in align2 + for (int j = 0; j < align2->GetNumSequences(); j++) { + int second = align2->GetSequence(j)->GetLabel(); + int w2 = seqsWeights[second]; + SafeVector *mapping2 = + align2->GetSequence(j)->GetMapping(); + + float w = (float) (w1 * w2) / totalWeights; + if (first < second) { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[first][second]; + + for (int ii = 1; ii <= matrix->GetSeq1Length(); ii++) { + SafeVector::iterator row = matrix->GetRowPtr(ii); + int base = (*mapping1)[ii] * (seq2Length + 1); + int rowSize = matrix->GetRowSize(ii); + + // add in all relevant values + for (int jj = 0; jj < rowSize; jj++) + posterior[base + (*mapping2)[row[jj].first]] += w + * row[jj].second; + + // subtract cutoff + for (int jj = 0; jj < matrix->GetSeq2Length(); jj++) + posterior[base + (*mapping2)[jj]] -= w * cutoff; + } + + } else { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[second][first]; + + for (int jj = 1; jj <= matrix->GetSeq1Length(); jj++) { + SafeVector::iterator row = matrix->GetRowPtr(jj); + int base = (*mapping2)[jj]; + int rowSize = matrix->GetRowSize(jj); + + // add in all relevant values + for (int ii = 0; ii < rowSize; ii++) + posterior[base + + (*mapping1)[row[ii].first] + * (seq2Length + 1)] += w + * row[ii].second; + + // subtract cutoff + for (int ii = 0; ii < matrix->GetSeq2Length(); ii++) + posterior[base + (*mapping1)[ii] * (seq2Length + 1)] -= + w * cutoff; + } + + } + + delete mapping2; + } + + delete mapping1; + } + + return posteriorPtr; + } +}; + +#endif diff --git a/binaries/src/GLProbs-1.0/SafeVector.h b/binaries/src/GLProbs-1.0/SafeVector.h new file mode 100644 index 0000000..f42c2da --- /dev/null +++ b/binaries/src/GLProbs-1.0/SafeVector.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////// +// SafeVector.h +// +// STL vector with array bounds checking. To enable bounds +// checking, #define ENABLE_CHECKS. +///////////////////////////////////////////////////////////////// + +#ifndef SAFEVECTOR_H +#define SAFEVECTOR_H + +#include +#include +using namespace std; + +///////////////////////////////////////////////////////////////// +// SafeVector +// +// Class derived from the STL std::vector for bounds checking. +///////////////////////////////////////////////////////////////// + +template +class SafeVector: public std::vector { +public: + + // miscellaneous constructors + SafeVector() : + std::vector() { + } + SafeVector(size_t size) : + std::vector(size) { + } + SafeVector(size_t size, const TYPE &value) : + std::vector(size, value) { + } + SafeVector(const SafeVector &source) : + std::vector(source) { + } + +#ifdef ENABLE_CHECKS + + // [] array bounds checking + TYPE &operator[](int index) { + assert (index >= 0 && index < (int) size()); + return std::vector::operator[] ((size_t) index); + } + + // [] const array bounds checking + const TYPE &operator[] (int index) const { + assert (index >= 0 && index < (int) size()); + return std::vector::operator[] ((size_t) index); + } + +#endif + +}; + +// some commonly used vector types +typedef SafeVector VI; +typedef SafeVector VVI; +typedef SafeVector VVVI; +typedef SafeVector VF; +typedef SafeVector VVF; +typedef SafeVector VVVF; + +#endif diff --git a/binaries/src/GLProbs-1.0/ScoreType.h b/binaries/src/GLProbs-1.0/ScoreType.h new file mode 100644 index 0000000..47de13d --- /dev/null +++ b/binaries/src/GLProbs-1.0/ScoreType.h @@ -0,0 +1,368 @@ +///////////////////////////////////////////////////////////////// +// ScoreType.h +// +// Routines for doing math operations in MSAPROBS +///////////////////////////////////////////////////////////////// + +#ifndef SCORETYPE_H +#define SCORETYPE_H + +#include +#include +#include +#include + +typedef float ScoreType; + +const float LOG_ZERO = -2e20; +const float LOG_ONE = 0.0; + +///////////////////////////////////////////////////////////////// +// LOG() +// +// Compute the logarithm of x. +///////////////////////////////////////////////////////////////// + +inline ScoreType LOG(ScoreType x) { + return log(x); +} + +///////////////////////////////////////////////////////////////// +// EXP() +// +// Computes exp(x). +///////////////////////////////////////////////////////////////// + +inline ScoreType EXP(ScoreType x) { + //return exp(x); + if (x > -2) { + if (x > -0.5) { + if (x > 0) + return exp(x); + return (((0.03254409303190190000 * x + 0.16280432765779600000) * x + + 0.49929760485974900000) * x + 0.99995149601363700000) * x + + 0.99999925508501600000; + } + if (x > -1) + return (((0.01973899026052090000 * x + 0.13822379685007000000) * x + + 0.48056651562365000000) * x + 0.99326940370383500000) * x + + 0.99906756856399500000; + return (((0.00940528203591384000 * x + 0.09414963667859410000) * x + + 0.40825793595877300000) * x + 0.93933625499130400000) * x + + 0.98369508190545300000; + } + if (x > -8) { + if (x > -4) + return (((0.00217245711583303000 * x + 0.03484829428350620000) * x + + 0.22118199801337800000) * x + 0.67049462206469500000) * x + + 0.83556950223398500000; + return (((0.00012398771025456900 * x + 0.00349155785951272000) * x + + 0.03727721426017900000) * x + 0.17974997741536900000) * x + + 0.33249299994217400000; + } + if (x > -16) + return (((0.00000051741713416603 * x + 0.00002721456879608080) * x + + 0.00053418601865636800) * x + 0.00464101989351936000) * x + + 0.01507447981459420000; + return 0; +} + +/* + ///////////////////////////////////////////////////////////////// + // LOOKUP() + // + // Computes log (exp (x) + 1), for 0 <= x <= 7.5. + ///////////////////////////////////////////////////////////////// + + inline ScoreType LOOKUP (ScoreType x){ + //return log (exp(x) + 1); + if (x < 2){ + if (x < 0.5){ + if (x < 0) + return log (exp(x) + 1); + return (((-0.00486373205785640000*x - 0.00020245408813934800)*x + 0.12504222666029800000)*x + 0.49999685320563000000)*x + 0.69314723138948900000; + } + if (x < 1) + return (((-0.00278634205460548000*x - 0.00458097251248546000)*x + 0.12865849880472500000)*x + 0.49862228499205200000)*x + 0.69334810088688000000; + return (((0.00059633755154209200*x - 0.01918996666063320000)*x + 0.15288232492093800000)*x + 0.48039958825756900000)*x + 0.69857578503189200000; + } + if (x < 8){ + if (x < 4) + return (((0.00135958539181047000*x - 0.02329807659316430000)*x + 0.15885799609532100000)*x + 0.48167498563270800000)*x + 0.69276185058669200000; + return (((0.00011992394456683500*x - 0.00338464503306568000)*x + 0.03622746366545470000)*x + 0.82481250248383700000)*x + 0.32507892994863100000; + } + if (x < 16) + return (((0.00000051726300753785*x - 0.00002720671238876090)*x + 0.00053403733818413500)*x + 0.99536021775747900000)*x + 0.01507065715532010000; + return x; + } + + ///////////////////////////////////////////////////////////////// + // LOOKUP_SLOW() + // + // Computes log (exp (x) + 1). + ///////////////////////////////////////////////////////////////// + + inline ScoreType LOOKUP_SLOW (ScoreType x){ + return log (exp (x) + 1); + } + + ///////////////////////////////////////////////////////////////// + // MAX() + // + // Compute max of three numbers + ///////////////////////////////////////////////////////////////// + + inline ScoreType MAX (ScoreType x, ScoreType y, ScoreType z){ + if (x >= y){ + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; + } + + ///////////////////////////////////////////////////////////////// + // LOG_PLUS_EQUALS() + // + // Add two log probabilities and store in the first argument + ///////////////////////////////////////////////////////////////// + + inline void LOG_PLUS_EQUALS (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; + } + + ///////////////////////////////////////////////////////////////// + // LOG_PLUS_EQUALS_SLOW() + // + // Add two log probabilities and store in the first argument + ///////////////////////////////////////////////////////////////// + + inline void LOG_PLUS_EQUALS_SLOW (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP_SLOW(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP_SLOW(x-y) + y; + } + + ///////////////////////////////////////////////////////////////// + // LOG_ADD() + // + // Add two log probabilities + ///////////////////////////////////////////////////////////////// + + inline ScoreType LOG_ADD (ScoreType x, ScoreType y){ + if (x < y) return (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + return (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; + } + */ + +/* + ///////////////////////////////////////////////////////////////// + // LOG() + // + // Compute the logarithm of x. + ///////////////////////////////////////////////////////////////// + + inline float LOG (float x){ + return log (x); + } + + ///////////////////////////////////////////////////////////////// + // EXP() + // + // Computes exp(x), fr -4.6 <= x <= 0. + ///////////////////////////////////////////////////////////////// + + inline float EXP (float x){ + assert (x <= 0.00f); + if (x < EXP_UNDERFLOW_THRESHOLD) return 0.0f; + return (((0.006349841068584 * x + 0.080775412572352) * x + 0.397982026296272) * x + 0.95279335963787f) * x + 0.995176455837312f; + //return (((0.00681169825657f * x + 0.08386267698832f) * x + 0.40413983195844f) * x + 0.95656674979767f) * x + 0.99556744049130f; + } + */ + +const float EXP_UNDERFLOW_THRESHOLD = -4.6; +const float LOG_UNDERFLOW_THRESHOLD = 7.5; + +///////////////////////////////////////////////////////////////// +// LOOKUP() +// +// Computes log (exp (x) + 1), for 0 <= x <= 7.5. +///////////////////////////////////////////////////////////////// + +inline float LOOKUP(float x) { + assert(x >= 0.00f); + assert(x <= LOG_UNDERFLOW_THRESHOLD); + //return ((-0.00653779113685f * x + 0.09537236626558f) * x + 0.55317574459331f) * x + 0.68672959851568f; + if (x <= 1.00f) + return ((-0.009350833524763f * x + 0.130659527668286f) * x + + 0.498799810682272f) * x + 0.693203116424741f; + if (x <= 2.50f) + return ((-0.014532321752540f * x + 0.139942324101744f) * x + + 0.495635523139337f) * x + 0.692140569840976f; + if (x <= 4.50f) + return ((-0.004605031767994f * x + 0.063427417320019f) * x + + 0.695956496475118f) * x + 0.514272634594009f; + assert(x <= LOG_UNDERFLOW_THRESHOLD); + return ((-0.000458661602210f * x + 0.009695946122598f) * x + + 0.930734667215156f) * x + 0.168037164329057f; + + //return (((0.00089738532761f * x - 0.01859488697982f) * x + 0.14415772028626f) * x + 0.49515490689159f) * x + 0.69311928966454f; +} + +///////////////////////////////////////////////////////////////// +// LOOKUP_SLOW() +// +// Computes log (exp (x) + 1). +///////////////////////////////////////////////////////////////// + +inline float LOOKUP_SLOW(float x) { + return log(exp(x) + 1); +} + +///////////////////////////////////////////////////////////////// +// MAX() +// +// Compute max of three numbers +///////////////////////////////////////////////////////////////// + +inline float MAX(float x, float y, float z) { + if (x >= y) { + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS(float &x, float y) { + if (x < y) + x = (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? + y : LOOKUP(y - x) + x; + else + x = (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? + x : LOOKUP(x - y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS_SLOW() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS_SLOW(float &x, float y) { + if (x < y) + x = (x == LOG_ZERO) ? y : LOOKUP_SLOW(y - x) + x; + else + x = (y == LOG_ZERO) ? x : LOOKUP_SLOW(x - y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add two log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x, float y) { + if (x < y) + return (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? + y : LOOKUP(y - x) + x; + return (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? + x : LOOKUP(x - y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add three log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3) { + return LOG_ADD(x1, LOG_ADD(x2, x3)); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add four log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4) { + return LOG_ADD(x1, LOG_ADD(x2, LOG_ADD(x3, x4))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add five log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4, float x5) { + return LOG_ADD(x1, LOG_ADD(x2, LOG_ADD(x3, LOG_ADD(x4, x5)))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add siz log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4, float x5, + float x6) { + return LOG_ADD(x1, LOG_ADD(x2, LOG_ADD(x3, LOG_ADD(x4, LOG_ADD(x5, x6))))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add seven log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4, float x5, float x6, + float x7) { + return LOG_ADD(x1, + LOG_ADD(x2, LOG_ADD(x3, LOG_ADD(x4, LOG_ADD(x5, LOG_ADD(x6, x7)))))); +} + +///////////////////////////////////////////////////////////////// +// ChooseBestOfThree() +// +// Store the largest of three values x1, x2, and x3 in *x. Also +// if xi is the largest value, then store bi in *b. +///////////////////////////////////////////////////////////////// + +inline void ChooseBestOfThree(float x1, float x2, float x3, char b1, char b2, + char b3, float *x, char *b) { + if (x1 >= x2) { + if (x1 >= x3) { + *x = x1; + *b = b1; + return; + } + *x = x3; + *b = b3; + return; + } + if (x2 >= x3) { + *x = x2; + *b = b2; + return; + } + *x = x3; + *b = b3; +} + +#endif diff --git a/binaries/src/GLProbs-1.0/Sequence.h b/binaries/src/GLProbs-1.0/Sequence.h new file mode 100644 index 0000000..5bd1ef9 --- /dev/null +++ b/binaries/src/GLProbs-1.0/Sequence.h @@ -0,0 +1,444 @@ +///////////////////////////////////////////////////////////////// +// Sequence.h +// +// Class for reading/manipulating single sequence character data. +///////////////////////////////////////////////////////////////// + +#ifndef SEQUENCE_H +#define SEQUENCE_H + +#include +#include +#include +#include +#include +#include "SafeVector.h" +#include "FileBuffer.h" + +///////////////////////////////////////////////////////////////// +// Sequence +// +// Class for storing sequence information. +///////////////////////////////////////////////////////////////// + +class Sequence { + + bool isValid; // a boolean indicating whether the sequence data is valid or not + string header; // string containing the comment line of the FASTA file + SafeVector *data; // pointer to character data + int length; // length of the sequence + int sequenceLabel; // integer sequence label, typically to indicate the ordering of sequences + // in a Multi-FASTA file + int inputLabel; // position of sequence in original input + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Default constructor. Does nothing. + ///////////////////////////////////////////////////////////////// + + Sequence() : + isValid(false), header(""), data(NULL), length(0), sequenceLabel(0), inputLabel( + 0) { + } + +public: + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Constructor. Reads the sequence from a FileBuffer. + ///////////////////////////////////////////////////////////////// + + Sequence(FileBuffer &infile, bool stripGaps = false) : + isValid(false), header("~"), data(NULL), length(0), sequenceLabel( + 0), inputLabel(0) { + + // read until the first non-blank line + while (!infile.eof()) { + infile.GetLine(header); + if (header.length() != 0) + break; + } + + // check to make sure that it is a correct header line + if (header[0] == '>') { + + // if so, remove the leading ">" + header = header.substr(1); + + // remove any leading or trailing white space in the header comment + while (header.length() > 0 && isspace(header[0])) + header = header.substr(1); + while (header.length() > 0 && isspace(header[header.length() - 1])) + header = header.substr(0, header.length() - 1); + + // get ready to read the data[] array; note that data[0] is always '@' + char ch; + data = new SafeVector; + assert(data); + data->push_back('@'); + + // get a character from the file + while (infile.Get(ch)) { + + // if we've reached a new comment line, put the character back and stop + if (ch == '>') { + infile.UnGet(); + break; + } + + // skip whitespace + if (isspace(ch)) + continue; + + // substitute gap character + if (ch == '.') + ch = '-'; + if (stripGaps && ch == '-') + continue; + + // check for known characters + if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))) { + cerr << "ERROR: Unknown character encountered: " << ch + << endl; + exit(1); + } + + // everything's ok so far, so just store this character. + if (ch >= 'a' && ch <= 'z') { + ch = ch - 'a' + 'A'; + } //change to upper case. fixed by Liu Yongchao, May 21, 2010 + + data->push_back(ch); + ++length; + } + + // sequence must contain data in order to be valid + isValid = length > 0; + if (!isValid) { + delete data; + data = NULL; + } + } + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Constructor. Builds a sequence from existing data. Note + // that the data must use one-based indexing where data[0] should + // be set to '@'. + ///////////////////////////////////////////////////////////////// + + Sequence(SafeVector *data, string header, int length, + int sequenceLabel, int inputLabel) : + isValid(data != NULL), header(header), data(data), length(length), sequenceLabel( + sequenceLabel), inputLabel(inputLabel) { + assert(data); + assert((*data)[0] == '@'); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Destructor. Release allocated memory. + ///////////////////////////////////////////////////////////////// + + ~Sequence() { + if (data) { + assert(isValid); + delete data; + data = NULL; + isValid = false; + } + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetHeader() + // + // Return the string comment associated with this sequence. + ///////////////////////////////////////////////////////////////// + + string GetHeader() const { + return header; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetName() + // + // Return the first word of the string comment associated with this sequence. + ///////////////////////////////////////////////////////////////// + + string GetName() const { + char name[1024]; + sscanf(header.c_str(), "%s", name); + return string(name); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetDataPtr() + // + // Return the iterator to data associated with this sequence. + ///////////////////////////////////////////////////////////////// + + SafeVector::iterator GetDataPtr() { + assert(isValid); + assert(data); + return data->begin(); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetPosition() + // + // Return the character at position i. Recall that the character + // data is stored with one-based indexing. + ///////////////////////////////////////////////////////////////// + + char GetPosition(int i) const { + assert(isValid); + assert(data); + assert(i >= 1 && i <= length); + return (*data)[i]; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::SetLabel() + // + // Sets the sequence label to i. + ///////////////////////////////////////////////////////////////// + + void SetLabel(int i) { + assert(isValid); + sequenceLabel = i; + inputLabel = i; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::SetSortLabel() + // + // Sets the sequence sorting label to i. + ///////////////////////////////////////////////////////////////// + + void SetSortLabel(int i) { + assert(isValid); + sequenceLabel = i; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetLabel() + // + // Retrieves the input label. + ///////////////////////////////////////////////////////////////// + + int GetLabel() const { + assert(isValid); + return inputLabel; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetSortLabel() + // + // Retrieves the sorting label. + ///////////////////////////////////////////////////////////////// + + int GetSortLabel() const { + assert(isValid); + return sequenceLabel; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Fail() + // + // Checks to see if the sequence successfully loaded. + ///////////////////////////////////////////////////////////////// + + bool Fail() const { + return !isValid; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Length() + // + // Returns the length of the sequence. + ///////////////////////////////////////////////////////////////// + + int GetLength() const { + assert(isValid); + assert(data); + return length; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::WriteMFA() + // + // Writes the sequence to outfile in MFA format. Uses numColumns + // columns per line. If useIndex is set to false, then the + // header is printed as normal, but if useIndex is true, then + // ">S###" is printed where ### represents the sequence label. + ///////////////////////////////////////////////////////////////// + + void WriteMFA(ostream &outfile, int numColumns, + bool useIndex = false) const { + assert(isValid); + assert(data); + assert(!outfile.fail()); + + // print out heading + if (useIndex) + outfile << ">S" << GetLabel() << endl; + else + outfile << ">" << header << endl; + + // print out character data + int ct = 1; + for (; ct <= length; ct++) { + outfile << (*data)[ct]; + if (ct % numColumns == 0) + outfile << endl; + } + if ((ct - 1) % numColumns != 0) + outfile << endl; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Clone() + // + // Returns a new deep copy of the seqeuence. + ///////////////////////////////////////////////////////////////// + + Sequence *Clone() const { + Sequence *ret = new Sequence(); + assert(ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; + assert(ret->data); + *(ret->data) = *data; + ret->length = length; + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetRange() + // + // Returns a new sequence object consisting of a range of + // characters from the current seuquence. + ///////////////////////////////////////////////////////////////// + + Sequence *GetRange(int start, int end) const { + Sequence *ret = new Sequence(); + assert(ret); + + assert(start >= 1 && start <= length); + assert(end >= 1 && end <= length); + assert(start <= end); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; + assert(ret->data); + ret->data->push_back('@'); + for (int i = start; i <= end; i++) + ret->data->push_back((*data)[i]); + ret->length = end - start + 1; + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::AddGaps() + // + // Given an SafeVector containing the skeleton for an + // alignment and the identity of the current character, this + // routine will create a new sequence with all necesssary gaps added. + // For instance, + // alignment = "XXXBBYYYBBYYXX" + // id = 'X' + // will perform the transformation + // "ATGCAGTCA" --> "ATGCC---GT--CA" + // (XXXBBYYYBBYYXX) + ///////////////////////////////////////////////////////////////// + + Sequence *AddGaps(SafeVector *alignment, char id) { + Sequence *ret = new Sequence(); + assert(ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; + assert(ret->data); + ret->length = (int) alignment->size(); + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + ret->data->push_back('@'); + + SafeVector::iterator dataIter = data->begin() + 1; + for (SafeVector::iterator iter = alignment->begin(); + iter != alignment->end(); ++iter) { + if (*iter == 'B' || *iter == id) { + ret->data->push_back(*dataIter); + ++dataIter; + } else + ret->data->push_back('-'); + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetString() + // + // Returns the sequence as a string with gaps removed. + ///////////////////////////////////////////////////////////////// + + string GetString() { + string s = ""; + for (int i = 1; i <= length; i++) { + if ((*data)[i] != '-') + s += (*data)[i]; + } + return s; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetMapping() + // + // Returns a SafeVector containing the indices of every + // character in the sequence. For instance, if the data is + // "ATGCC---GT--CA", the method returns {1,2,3,4,5,9,10,13,14}. + ///////////////////////////////////////////////////////////////// + + SafeVector *GetMapping() const { + SafeVector *ret = new SafeVector(1, 0); + for (int i = 1; i <= length; i++) { + if ((*data)[i] != '-') + ret->push_back(i); + } + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Highlight() + // + // Changes all positions with score >= cutoff to upper case and + // all positions with score < cutoff to lower case. + ///////////////////////////////////////////////////////////////// + + void Highlight(const SafeVector &scores, const float cutoff) { + for (int i = 1; i <= length; i++) { + if (scores[i - 1] >= cutoff) + (*data)[i] = toupper((*data)[i]); + else + (*data)[i] = tolower((*data)[i]); + } + } +}; + +#endif diff --git a/binaries/src/GLProbs-1.0/SparseMatrix.h b/binaries/src/GLProbs-1.0/SparseMatrix.h new file mode 100644 index 0000000..51b273d --- /dev/null +++ b/binaries/src/GLProbs-1.0/SparseMatrix.h @@ -0,0 +1,266 @@ +///////////////////////////////////////////////////////////////// +// SparseMatrix.h +// +// Sparse matrix computations +///////////////////////////////////////////////////////////////// + +#ifndef SPARSEMATRIX_H +#define SPARSEMATRIX_H + +#include + +using namespace std; + +const float POSTERIOR_CUTOFF = 0.01; // minimum posterior probability +// value that is maintained in the +// sparse matrix representation + +typedef pair PIF; // Sparse matrix entry type +// first --> column +// second --> value + +///////////////////////////////////////////////////////////////// +// SparseMatrix +// +// Class for sparse matrix computations +///////////////////////////////////////////////////////////////// + +class SparseMatrix { + + int seq1Length, seq2Length; // dimensions of matrix + VI rowSize; // rowSize[i] = # of cells in row i + SafeVector data; // data values + SafeVector::iterator> rowPtrs; // pointers to the beginning of each row + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::SparseMatrix() + // + // Private constructor. + ///////////////////////////////////////////////////////////////// + + SparseMatrix() { + } + +public: + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::SparseMatrix() + // + // Constructor. Builds a sparse matrix from a posterior matrix. + // Note that the expected format for the posterior matrix is as + // a (seq1Length+1) x (seq2Length+1) matrix where the 0th row + // and 0th column are ignored (they should contain all zeroes). + ///////////////////////////////////////////////////////////////// + + SparseMatrix(int seq1Length, int seq2Length, const VF &posterior) : + seq1Length(seq1Length), seq2Length(seq2Length) { + + int numCells = 0; + + assert(seq1Length > 0); + assert(seq2Length > 0); + + // calculate memory required; count the number of cells in the + // posterior matrix above the threshold + VF::const_iterator postPtr = posterior.begin(); + for (int i = 0; i <= seq1Length; i++) { + for (int j = 0; j <= seq2Length; j++) { + if (*(postPtr++) >= POSTERIOR_CUTOFF) { + assert(i != 0 && j != 0); + numCells++; + } + } + } + + // allocate memory + data.resize(numCells); + rowSize.resize(seq1Length + 1); + rowSize[0] = -1; + rowPtrs.resize(seq1Length + 1); + rowPtrs[0] = data.end(); + + // build sparse matrix + postPtr = posterior.begin() + seq2Length + 1; // note that we're skipping the first row here + SafeVector::iterator dataPtr = data.begin(); + for (int i = 1; i <= seq1Length; i++) { + postPtr++; // and skipping the first column of each row + rowPtrs[i] = dataPtr; + for (int j = 1; j <= seq2Length; j++) { + if (*postPtr >= POSTERIOR_CUTOFF) { + dataPtr->first = j; + dataPtr->second = *postPtr; + dataPtr++; + } + postPtr++; + } + rowSize[i] = dataPtr - rowPtrs[i]; + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowPtr() + // + // Returns the pointer to a particular row in the sparse matrix. + ///////////////////////////////////////////////////////////////// + + SafeVector::iterator GetRowPtr(int row) const { + assert(row >= 1 && row <= seq1Length); + return rowPtrs[row]; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetValue() + // + // Returns value at a particular row, column. + ///////////////////////////////////////////////////////////////// + + float GetValue(int row, int col) { + assert(row >= 1 && row <= seq1Length); + assert(col >= 1 && col <= seq2Length); + for (int i = 0; i < rowSize[row]; i++) { + if (rowPtrs[row][i].first == col) + return rowPtrs[row][i].second; + } + return 0; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowSize() + // + // Returns the number of entries in a particular row. + ///////////////////////////////////////////////////////////////// + + int GetRowSize(int row) const { + assert(row >= 1 && row <= seq1Length); + return rowSize[row]; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetSeq1Length() + // + // Returns the first dimension of the matrix. + ///////////////////////////////////////////////////////////////// + + int GetSeq1Length() const { + return seq1Length; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetSeq2Length() + // + // Returns the second dimension of the matrix. + ///////////////////////////////////////////////////////////////// + + int GetSeq2Length() const { + return seq2Length; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowPtr + // + // Returns the pointer to a particular row in the sparse matrix. + ///////////////////////////////////////////////////////////////// + + int GetNumCells() const { + return data.size(); + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::Print() + // + // Prints out a sparse matrix. + ///////////////////////////////////////////////////////////////// + + void Print(ostream &outfile) const { + outfile << "Sparse Matrix:" << endl; + for (int i = 1; i <= seq1Length; i++) { + outfile << " " << i << ":"; + for (int j = 0; j < rowSize[i]; j++) { + outfile << " (" << rowPtrs[i][j].first << "," + << rowPtrs[i][j].second << ")"; + } + outfile << endl; + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::ComputeTranspose() + // + // Returns a new sparse matrix containing the transpose of the + // current matrix. + ///////////////////////////////////////////////////////////////// + + SparseMatrix *ComputeTranspose() const { + + // create a new sparse matrix + SparseMatrix *ret = new SparseMatrix(); + int numCells = data.size(); + + ret->seq1Length = seq2Length; + ret->seq2Length = seq1Length; + + // allocate memory + ret->data.resize(numCells); + ret->rowSize.resize(seq2Length + 1); + ret->rowSize[0] = -1; + ret->rowPtrs.resize(seq2Length + 1); + ret->rowPtrs[0] = ret->data.end(); + + // compute row sizes + for (int i = 1; i <= seq2Length; i++) + ret->rowSize[i] = 0; + for (int i = 0; i < numCells; i++) + ret->rowSize[data[i].first]++; + + // compute row ptrs + for (int i = 1; i <= seq2Length; i++) { + ret->rowPtrs[i] = + (i == 1) ? + ret->data.begin() : + ret->rowPtrs[i - 1] + ret->rowSize[i - 1]; + } + + // now fill in data + SafeVector::iterator> currPtrs = ret->rowPtrs; + + for (int i = 1; i <= seq1Length; i++) { + SafeVector::iterator row = rowPtrs[i]; + for (int j = 0; j < rowSize[i]; j++) { + currPtrs[row[j].first]->first = i; + currPtrs[row[j].first]->second = row[j].second; + currPtrs[row[j].first]++; + } + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetPosterior() + // + // Return the posterior representation of the sparse matrix. + ///////////////////////////////////////////////////////////////// + + VF *GetPosterior() const { + + // create a new posterior matrix + VF *posteriorPtr = new VF((seq1Length + 1) * (seq2Length + 1)); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + // build the posterior matrix + for (int i = 0; i < (seq1Length + 1) * (seq2Length + 1); i++) + posterior[i] = 0; + for (int i = 1; i <= seq1Length; i++) { + VF::iterator postPtr = posterior.begin() + i * (seq2Length + 1); + for (int j = 0; j < rowSize[i]; j++) { + postPtr[rowPtrs[i][j].first] = rowPtrs[i][j].second; + } + } + + return posteriorPtr; + } + +}; + +#endif diff --git a/binaries/src/GLProbs-1.0/glprobs b/binaries/src/GLProbs-1.0/glprobs new file mode 100755 index 0000000000000000000000000000000000000000..238ac42d2bb2adb762bd43c7e9bee408a885a095 GIT binary patch literal 237120 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ℜ$*J*the7#*AK&%J#a{;1@~!hKj<|1A%5?H`v8s$ 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 C#gj$= literal 0 HcmV?d00001 diff --git a/binaries/src/GLProbs-1.0/main.cpp b/binaries/src/GLProbs-1.0/main.cpp new file mode 100644 index 0000000..6fd1934 --- /dev/null +++ b/binaries/src/GLProbs-1.0/main.cpp @@ -0,0 +1,16 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ +#include "MSA.h" + +int main(int argc, char* argv[]) { + MSA msa(argc, argv); + + return 0; +} diff --git a/binaries/src/MSAProbs-0.9.7/ChangeLog b/binaries/src/MSAProbs-0.9.7/ChangeLog new file mode 100644 index 0000000..c34e041 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/ChangeLog @@ -0,0 +1,9 @@ +(1) 23 Aug, 2010 + Add an option "-num_threads" to allow uses to specify the number of + threads useda +(2) 12 April, 2012 + GCC 4.6 can successfully compile it. + +(3) 3 July, 2012 + Add a new option "-o" (or "--outfile") to allow users to specify the output file name. + By default, it will output to STDOUT diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs.ncb b/binaries/src/MSAProbs-0.9.7/MSAProbs.ncb new file mode 100644 index 0000000000000000000000000000000000000000..248d35657a403c71b80f61384fdfc7033b49d103 GIT binary patch literal 2960384 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%0Domb+yfq1S} zVltYT$XxGME5e1XX;*{lz)>HYniw8MXTe-nhQ|Ru_Rb06(Q5dL>GxBgK5y}9SLU4$ zj*o5kchl|(pLXYk#Krm}$J0j@4#&XZBA@+aUZ!Asq)keK^PADj1Rq~c``Eg|r_ab9 z-p9s`Xkim5dB1mFR3iFQeeC%$#2%|#sVhyDTpK~I$(;Y9v4HP^|K$#qU*X`g;X$4& zB0L4yvF~LL5V9fCnOuBBh`+XP$(i4Be1ZGJbvt+p^m~ zu(sELWL%Pq^KJQ5sg?T)5#KRaG%%KTJ>+BGQhbv!jXl=c?gDui$**}p3FmM8kk7O2 z633@tfh9M7$jGOb`82mRUUzVxrx2_ytMyAp>ko(6Wc?RChvo7fXN9?S%6@9x%6ZhM zje_V*thenNW4UgZ$629pz5>qAo0=`}58n54IFNbEf_;+hk}nsHPNK2fZkPS-@iuT> zlxwR#_U`oACi6yyYDoHR;*M=|I`1j5A4lvbDaVqk)W8>f`b@+Z?|6$hHrB1UqeP!qx7+iW z4?;Mzwn@&FSKF4{ZtlFK_`DjQWzH+B`#??vTK>u8#TA9i32<4%hp&#xv0^jv*#g}8 zw8T-C;C_EJ{eBtZZ?Hz{`1CtL(Q6g-xpb( zjGnvlB*7njY&*f5<(|Bo#}a;V7qKiJ$kx1oiPZQUj~TrI6Vf?yZ$?Xy0ou9GDe=t{*&IiI^04=^A$;Amr@ga5Id*R+V)H_5wVX(9 z?N@YM4ISqX@!#&3&VKTIBGGYx*PHiJd>)p@V_pN-*s3$0UlPKzy}lviXnUM4#tDYR z!nSYEYwzZ-(R|`i!6{xwo`odb$Rh8vdHk*EYo(8meUx}iAs+H9EHBP;7|zRJTYmb? z&Cfp;n4JsAm0c!`<6K3aSJ@~eu9gR> zGc%N0{Ux=!Ih=TDP(FuP=flS?CI25GCXa$mKKmw>^1c=$ckFHP*{_X{kMdkNulUCj z1Ie{6uyj=!XN;rXb@t)m5g(hzE4sKH{&x86C(nZN(oA+&Gt5VdJ+fUEn;%kt&zSoA zoKM?Fl{|ioxD4>&@Fm(54sA`a>&lF^s+;kaJg>>iuG7Y@c?us>;X|H37QC;`zf&gv z{#5Enb?S&b$4&ONx(;w6^+W0!b3ZDYs*R=&`*0=mvj*E_+x^D)BhQfY(p9wEYd}}G z`EV-F>kGEq`W)rj-Nk+Gnpgi{nf~un_?!lxKbSbi>< zUb%O-5%sMb@0Gc2y}0_)aJ9&%|Hl;`r_nGh<-!^KG5{o;D#g!1wtc@~alV=SE_ifLOzA$~~;>z7tAKPnf@YZ$>ytq!kVzXWB zSkaCz3c;srxAxfgJqe#X0FRsVysj9-Ut_UP?&J{#b%P0+&)D`A;3mM&2@~J@6#iDY z{DnFFl^mTwj(((YJA=OCa^KX1*dORsMyt%%iA~<)fI7~didNIm>PtR+%bd<$etvHJ z%;#fI4WnOcqviW4xc*M@@h*HU8PcYWS5dB{%3S7Rk8M-dqRYna5A&`1_#)49@bcxj z@uh4?zqSwIcD=%1UHE%liS=?f)?mV1a2oX-qLX(7JYw&i?Bp4*z8_uGA?rb%p~iH$sqUe3uH zv+hh?Z5Yx{FxRV<+?YsiH1*lUF`Y(&AV2My7f=)U2Mgxlk_ci+vVnQw7%1uzPlSf ztv~jC*{D{_jPB)c!P{%e(WuowbtoDWpFSdn9|N)HhEE*7^|g!o|KvZ<=WYLTo>fAL zVJ0z@XHtd6Ni?v`)b#J^H@N=Vc4agX8PccC8@Vno&p)-=l6~Yy{CxpGcL6!GoT(hU zo|$s)Yian$?RD&wfu{5_tw z?R(^XH?J>AEtE>gH3hyV9DFU%eupWBY)t0cag`Zybae)1ujpe-hQjF_INd|8S>4+B zi7j=oxHgbyA9(5GUBh`n>!ZWiuK?RUR1ag8y96Jw# z3L!RHtq9Kn73>#H-ymO}o<-d*@^C56YM= zja+(Ose9Sc!3RnWe*t~%0!@ARE2-$d0XmXrp?LZ7w(+H{PrJEJdY=>BM$McI7Aia} zfQK$V+{?4ay=*#cY?|T|oBNbL7t*IZ@7|6v2{Cmk+C3u0%6vuCk0$1GlMehQ&p;2h zK{PE#uOrwX_4y|y9xoD$-C#KW+5Ooq=(7hIT{U!O`uNaFiC077CC_7zrajTQ{gLDS zL2No?_!$`zvzz%?-`S?{a}WHC^NGm8+=JRUGSPWG|&8O7E`*ecJD z7an909_;aRziF4v&Id}pJ4L-)>*LQX!-KT@&xPwjy}W&WiI{IveBEbkdR_5nG5*Li z@1^e8KJEEWwk&N1?g`l*(nml8j?rb|&w{p!&G=5E~F|pK`4kx{Rn?f#+ zQ#9EKO+Mzs&2qWNaJfP0U&dX5{znY_La~1-_O~~AA@8>Fkk|E4>uWxC9Z>9g)!6kg zb_Lflxq>Q6jWAki%(}ffS1y?6<~5&S8*&iu#}xlMi;*tB1G^pZvGb^6=WE8!9~5qu z!A%n-k6x9SDRyHcqepr6m#w{lm@zjp@@UsT z5)FyR9_+ULimCP*qHx)QIfAY!e5`+*6{zO4Jrjhk2HOT8c9IyC=IQ)AD7pF(W6 z`TrcY%W*VzNni{X>i4~HGEmXTYiQ(0AD?F`$D{gW$nT0h&l-E=`Ru{=30i^HpbhvUMA!EEbu8}=Xr#SUP~l@GeB21J-P-ny z(ZRRIc59Q=OIZTZedSquR{H_F0=(@swq3-O zXk(acv9`rK#o@9z-)Uw3D5aL~A>OZp3JN!?;O0}M9<+t`UlseK-767t94X~o#lGM? zv3iy~c!ioEzS+MSH=H}D2~$Bn#rLO;?@2qnb5PDv9#yoO4nyJD{%KQy(ZJ^n4HPa` z!$m2@o~MjG#eM9F8ud?GZ~9!{xlhT*y~HL7TXR@qSliFg_aQ5 z_-eV3nEvxP+12@le3M+XdYAXeGL2lTqWF5w_}Wpi`Eg@&hL6qFuuE!`?bp`lFz)0E zjE6cn;}pK`gRgpuZD);bI}}YOp~*gq-H#c&d;8ekFoaKATLU&bnMaja>?amKDcWd= zHfAZluEW>Xim%@pU(1yCzSh=(JdtP0+V~6Cfgft2@pXicukC&EWRlYEBc|P6ip}2| zo9|WpU5~%tDI6Yz!zn)Y4pRC&WBN?_##`&t(Yibj*Ndm^#-E`+TpUxhmJ_Yz+7#yA z0i4sl=S(syurwm(jX@L86f^_PK?~3lv;wU`8_*VHfOeog=m0u`TNQs#8-M4*l^q92 zul72nd@3OKHuvNx`;Zcc`-#IU&Gu6Xi z884o)n)0z}of6-NO?+Qacz6{aru*8(vADOlt`5V~-PjyF*0J?Y&S7TzXljY#>o>;N z8;a&~p}E6~FIVv8F&~bW`PkD_$(=jNopdzr74J@HRGts+l~>yg?WU8E5*;de*NMD)g#NtigpAka+fjjM zyL#YajEwiuh<^|7gy!qwYwwcDr9s(HP&F5e>D zulV_u@$)Oi-p$6|g-VXiAjb-P;9XPCQB(K(*!#H;2iFuW{ehMa`?UG3Pn$m|K0auC z?62heJMjK4_*miaOT*z$K7H?2G~OAF&rvki1&v)*Y<|GloNuW&_t)U*ijO^C!eNYC zapWi^Z3N~QEa+xbed>%HhaKlT51-}zUl^Yw+IZKRO~$^SiYDcbedj6d9J9SMNr}aK z#NjA7>!X366q`>No4@zj_p-9@=Vsp|#ovv_-&d48xr;nW4Dr_suoz)9z_vW~& zy_0UX*?0>Fvcyn_O8RiHQ_=oMaQiXntHk9xacQA&wAOI+qms)r$>jvT%mWo!*9cr= z`L8Rwuc~nLuHmSPk3U@$o7Ned9#!-yGylJ#=}@Hso{e=KrDH%Rc+I@!?{$;?FAM&oD)& z+0p3j*%z^!f9+9dp~ zR$}Ue@p+4)hqsL$`eBpY<7w~Vvh9od!?|)0&6!H1dxfAqzt?wClo-#&_hw2Sbt8{n zQtI3H)VFva-#$}vM80i0PvLB};p~zU!_SDt93}R##6Gu=J;^@Xiui0>so1*G*m{Q& zr%z0r!uoh0_mAPranK9yy~YLI;l2lWPSHph8cD@&89!RB+G~w6iVWOMWA6J_Vt9cV zKA`w_ukmkzhkv5Ak8K?d;m+D3J#SWGm4jI2ffva)n-9{aET6+kCq=9C(CT$XSIOw= zNyV2H#+P~_w%WcW7n}HO`#_07I5F7Z!H?AKj|@NSO^vjD$y&B2ay6le<7B?1*u31> z{HqeXpNL&K!y(Q6gU1ta*v7}7SCzQL5tn<@Q|Hf>^3{c z;Lq41T99W<$me%?xO&+Sv$aIUKyQTSM5_~;d~ukBA__>4y^#J&$rEY2%&j3AD8 zD4M$)%{5W9`UT#U%jd1*0_gEm#g}Eqm&6af&l@ii+hHMo26MDu@$&=Y=dB_826J>u zv1zHXDQuayO_6ZaUE$$NcsQ+SDjrQu_OWN0&$f>|{FK~z-}re^@#P-lO9h4BU*LDP zPrt7yInaw77^!gZ6&x(^Y4e6+>tbW;8GPkm)?#Cpoxd#gX}6FPuPEZxN6}_Mw7Dvz zO{*`-)u)wQm`^VJ=n)e!`lyM?_tXfvR%nk!vQ3sS_fw3vZ0qXW35QdwCBE!}C5Zf(RQUh8mF~3aAJ&!x*c}1>$-=gsQJN)LxPKm4a->%;?+Nc^7SFyv| zB=Z}jaxc?-MX!a>>lcb97of@7LG4PPmiL9OUbvr2iF+b(e?sB!G~As5Z^By%@zPzaHk$EUXN8NqgSgnI)ZK51(GtbatN2+L`{Z*T+n@ce`w{Gu@yI{F z?JhbDJiqGZU3ENh0^8+&8e1bp3sP&s+)ri2gC@L^d4Af!hG6@db-~&yVMXV8a9Onj0Gomy~ zv2`|f&dIVhr}Mdz-`}B|v*2O0lSI3rb97aqziOZcs0HePV{qFwtT}V5mtYQ2zW>JS zX?!L)5cI&sNs5p4iAQFZ zkB+lk(Mhc6M9Gb7_|PAlg=5>dti|Ry*Jj6=s`NjTzGnsXKb!Y?)v~*?-qXstq~z~8 zVo(uHiXAq;Tmty-9++PQay=NRRq}Uxe3sXF*dq^mD}vtc39-TE(~K+|9A_MzSbfX> zwpP87rAe7{w5s!n!e<cNqo(LbDYc-hEM5R7W@4`JAa`(Lr=aN z@Fp=6J7uxQNO}DyFOc=)#D;MJ zUz|+}-**P_y+`3O9v-)u{R5f{9J8g?Ok@A)ZX2bYFBR?n4G)X(&x`B*M!TaG`^Osl zYoaL`Q(5hcZ?fb=Q#-It+O~_0fsNBjrSE;F@9yZ?tL?>Txv0YV_i%n2HhYcp(2ldl z)I)1;fH%jviyG9N?Joq`EZgiD=nli>T|RB^QgoCH9lffwd%J0Oi^9cT!^H#G9jZg& z^=;Q`xue2ya^?5tOTIP#xuT&2G&CQd@uW!L26V2aMjNZ+V}s4^vz} zWW41#4|{Md@9*JqT*6tRXlj_-2V)H-wm%Tto$w@M2y3H!Ctqsq>n=~CtU}bW!1zO+ zxgvGo9fkYJhWnV00_O#`O?GjY>r&eledk9RyRb!gv-{catnA6MMV@w4nxj-VXN}_X z5ZC84XNIEnC20LKh4b5jINwD3q7Pg9txf%Ce~{b9u93eh8c0L~ubSg$!1J3viLTlc z4_tNqwC&3KE)b6!;6R9WZO*)Ac=%f3f0E(@;G zk74#a?N!(2JVZ@K7u}q9eEJ`t==4W8d0vS}A7U}Ujfdl0R^mD#D6XIQ^xu|zmsw9k z?|Cdnz8422KuJ&vq=3?(3`hlKK{-$!Q~(u0B~Teu0S_p8T#6oZF89utBy@DE!pTKA zsj1}I4J=)#9t zp~p4h>}8iTnO%yf(xaOIuQIX;TEa@W=P}nj{FXLm1Y(|96yI#Fi~Yj8v~(-JjdA^x zXMj4{>%)DZhVsRkpheEcvY|0KXFBEM%T7hZ1?X)mxhic--@!{&)LR|Y1gn+Y`4tYo z_vtsDhP`z6lF?oEG2V4jYI`|_o00G`Du|m)KK&>7w0}a;+)6Zel{N!>2jXhA)eb#( zGMdio({?RIv%_7xOFNG%d|rmnVsspf|F%!5DWaL(tRq3-d4)26pUiK@?4>?-IAy*0 zmGNdec_Xn2&5gX|O+L^>@!=NZLn?M!?a~Zw1?G@?(T%MgNvArceC&(CJ};iz!f^+e z=QO9h&;E(*?=?Pb$-a$2Q_$M9b4TpV+1OaMCv@ZW0$ecD4~|iXXu_DV~bH zUNC;7C^2aWkIh{!nZ4Yn|A9tVR=>9WdQM}0Iy;%vvf%y$j62Rkj{d2RlNo=;`&?la ztbC^MdIe6ef=Y_*Y1p0a+P-UKTOZqRRdg^24GcCq=p4eIwf}jSKgStmjz_}1ECD4s zuJ20}-;-S5b2?poY;!hy^HPW&#u?57J>IP4X5OOA9<&?ExxDv9&d#LP-lp2z#aX4; zydV%SXIhZnZ0?Aj1{l8TC^4x`Jn9)eHCEnJmF+dnd-^Lr>%;x7w|W84gLsUcCmFa zkeOYa89s5^sQBC0_`5!&Z9A5-^M(z>ZaG%kzuVeamROYm<=vQ7cPcA6UYHzzK;sN=klRhp)Yg-Mx(6dwlp@h+T;=5bKUWZ}L+dyAnVW$OZC% zd>|PV1VuqfAU}^Qwm)rbe?+M}512ast-{@G!`(ZIe?5(VM|}KSg?|!vt05czIBYL$ z?4PRCr!~~4{z`rpr^Oc)zn?OGzu>1AADde!`Qe0d-xWyu*!!AC1bKg4;i`w>>SZMs zGt4pIiV}-V6N^ng`BzQJKY420m-ri8i)~#D$G)=+pP%8I*EzPt+}(nJ@3m@ zv{(WyURF5hW;poyKlo8a(Ns1x^^(F-wg5-Y=RP|B8vpp`*u0atOWl0}|K!|OuBlx6 z54PPG%@@xWMAv6 zjI$%23Dh56x{G{1DT|$Jxi@zhJfqZ~wbY-VLbNY-34f2f`pD@-(|&MX*)fi7KdxOs zf6}MeW%uu5xEpM8)^3-zEOp7*50$w81#faa;TIpj=P5DCMoe-koZMuExpYGO7Td+| z$6UYpTxYZQvA!f87EpZdY<&L9$L?B6tnYGTozp3Z?b_JnYej2U;p=yB&E+l3>8s>g zWLOC&a_m3b57ts?#jj4ruTnm?ty7LEk;Eek#QF4_lLQK_krInXO)T0doXs%#aZ%CH zWuv2tK6dB!v8#r{M@PfQ0<=(Rb!=EV7Uy0+LCXSKV z=EcV^ZXDB`OhwmG=(@SWl|v;=RNB4hwp+rfXf$AR!P*{;&FvMR+Z&(T(Qj~lv|6y| zX~{l(*A3y@)}ZZ1_nnot#iuTO8a7ekGtuyQP|-mQI_RtT)z0`;61%;QYZu_`d+?LX z9p5!ka-ad)ZwMNJ9~G^ppp!vL+{DB9Z@tgs){#5w!5qc^1mk~u9Pk<&JnZr-pH_2i zP2nNK@KD(&e(e<9#Gsq6m3o*R?qk8@ik73%a!cSbGz*feShcnziZ^k5N+F9@{p+|cPsX_G4|!!;(h!r zO|K&r-m}B|RfYE)a2^L9@$u^ZR^NZQ%BOtBZ;MrleP1Ha;TpY%dfEO zq-$F#=R-xSF=%yzkKOYWyS5m+UQzOQdLVx@w<>pog~ zRN?YL!{r%;uc_u(@UEhz=0;0z`t*IT!ex7xOFrkqHvVPhm%T^y0oS&i+@mFTv=?%k zDx4?5`9;P4I|BA+4pHi1S+w|}kL`06zBj@57fLLf1;uhdj>QG}Ci6nd*nE@gTi_GG z!gy$(t|s>=cjNcuPrR=o#iF5F=-w;0+MxRk@THGG*A<>_H*tPksb?RO*Poi)emg`< z_Sm%1^@(|E6#d4b-#$vs$w>@zfgco|H8nar>*HJYd%e$t;*AEL#W%SJ-rjd^>-jtQ zwF~S9FN0UX9;8%R zvvMGC@1uNcr4l|gM*HlN^*K2&-6bCF=Kyga0Yta=zIM{s@H2cbB6g+AAS*pY!4>2h6 z>_2s6kGXOV5W~ewFP*M)?F&33zOj#cNTFXBVqQdoEK(v45?xznQ{K1H(;Y|Mr~$KKd)8=r0kwhba2G&FJd|B_{cZNmK|Q zmUF4S2|nA}_~<8(&wgJjdai(;7b&_+LU*0vHn`T?+?I3Dx=LKun7DNHu{G>F@A2za za-@ilAHDxWET{X#@_A*v-VuGK&}V3lh#oh(x=(XvDzTnqVm-vi*9x>PHPCWrW4(^H z?>BkX4lX4J?KXRV{%V&?8G{DCCm>J1{oLqE?6dEe*ZI*^J4LTa=yg1?^s2=T-S7Jb z&Ut!ZMDTm0CP=MVg&p$UNvYW5e0)t)cwB3ETfc{#NQx0rb)h-h%Vn?k{y{s=~>=hLh5~r=gO^50S?kjNW*gYnSD; zp37H2Z-agMucGLo5_;IDa5CO-vR#Q)T@$N&lvw2=R?9;CwmGmOOADo)(@M?E8CJr1 zREb9t@yJd*#`^d?(P!Hfwt3Z&W$1gQt8vG9PT`!pHTVf|o>`VQ5M9J9unm_M(?wS0j4 z%wH7l;^8h1?na_lY2O~ddFd{N&}%EORnf)6=;E{z*Cob3si6lI`{o&KOrn3uds%EQ z$?MkiT^I}lWqkPmLE$bh+zlf3Uir|En8rPKGZ$@qq~ADriHDcp@y(0(#jbCT(^k=3 zZZwytgZIAKQKD$EsuI&NCZ=1JT&O~n<|*~17(9LI!L?{*qP?Go?E$XC#nmib%J*qx z;Y!WORBZRsv)FwUEqG~VJ6d=IByb_Zi?c8CR{wH56n3%^sTd%2UA|5GkivU$cwedG}6!}x#=PP&i% z>55KspwmQn>#y)O+VECJiOD@CCM^{IBWOK3$p77n|0P6sie9V2WKsq1bPS%IWJ_MEX9ryCPsf6{qfeUnkKKS5$&%P z9!kMO4lB}c8=s~r@r@zAIf-v` zAAQZHU#Y{g2&dAo90zI}PRpGQ)Ny;lC;it#CcxaQ%?N$1R4Bc1kS95QoV|OG_2MIWqCXoMh-#v=%(h;8$lf9^4AX zfF4Reqv>Ok>E{{6)?vohhVbi^`@(I^K<_b0X*ik*N5SJo`yIo(U5@1QtiY9$57C_0 zaX25E%MUgvJXAM4G*{xkAQ1n|Aqod0@qdEhpu$5pHDvW8T-HEq)j=j2^0KiwIw=V@ zDf$ja-?`BD>k7w14aX1TqgUOi>G~L$|6-A%xp_u&w<>-P!N=jQpSwoxP`IpSxO`i& zGtSs~yVA!X+8<`PETw3o44UXita8AsXh9as^)zC2C%6mD26MsPKs5HO!fgcH=7!rG zg}gO57X5EhIGbxYds*S5hT$Vq@wX4Y4lw>+RrH&Tb_;+}KKb(ne0$}V948JcwpBK^ zjZ<_#%jK<@vskgc7k2kEwm+umn!Eh?W_ojHX9$0`_RcXm+>5*s`)wR~=`J<4T6( z*$T&ZxE$wms-wLm+P0q)yUz39IJ7q&Oazm_ZD2B(0&WL)fT>^_m=3n$Yp@RNu{DkF zh8+osf%Rdw(eN3?hbqR0qMvzRPbe71w+&W#pW{RZ_{r?0#HTFrc~pr{TVm6}=<97| zOqqhV*1)aT=b01X_BJrZ<+zx0UWsueG0rP7R{Sq-{C`2Qvne*VG&)LzhhYANV_75* zw_>N%W*ZZ`&V_yXTpOD^e=0UqG&Y=6Vwh=SxL>g`9s3#@F2^geC>O>YizW}nW^22= zu7%ZweSC}T=smV7XYB5))Yb`THpQpi^Ge)H6ZiM=)$15g89%Fn>Y%px4C=|6J6>8T z8ZLx}EBM%v@VxhRk?d$EAKJ;S_+P>Je^rUwEEBiS@Wo3va$fYhQai@GnsJ=PN<7OG zZlHsEuC=60S8Bi9aF=8#I_)^CBQs0NC=n3A}Bgzo3vb5_pHYw}28yK5>gs)ya z$niUgV9Wkim-d`!rpsaAdTBW&PEo`uKXGb>?J{DpZOB?Obcm_rRTSS#8{bDN`Y9Y% z!g){+)*Sa*fUm%(KHjI?MlDBO}~px9K=qs+a4Q>x!MZEp@tI6 z4koWUVPEk0)cT)?V@q*!d^x4$$1HLq6D(D@D+qTx6d!t-Sg%&{qo~P`=R&x(_NC(U zG(`)Q&_QJ|Q1LAneie0n+ck2d(ti=t|8B+po+btfgS<6WnH-#}#CNKRZ);-XRX3#m zA6IgqSXc?CvZCX<==gQT-X4bUhl6rgxRksPr@un@TiEz~(1-KwN~{YJ>#^`1I?kYJ zC&}ojdx#co&8g*Tk$W2yzV0x5y`}ip-Na(263YU{uhr@Qk9>sxUS!#CDrU zHQE1X#r96d_RkdF@)_PXVw+b@lCjL}kbZ3~mU>lL$)CC8&OGp`qQ4?2Vy_ab$tG66 zD?W8JK5bR_{0lx}44(^pY`?Cw-@&wh7S4h>v3$$;Z8`0F)x6}u@ijAYwfDJKd((Ex zG4JbZCD8agiUz8of$tSQi^Ate3ZJ(bKJO%Fxio>@V)@M_gPdyzki81X%* z==~ack1~4yLD9e@qk(8_&@}zF59iPN`1OOL*Xrms&hQyvI&eKyuEErE&lyTPWr<0! zJ@$Pv&MU9Pt4&tCaz=dUWAknwn>UdQUe^ygqx&wPosyp=$S!*ldRZ_U;q{$-7CH196|%%_UZ3?-iykV^|eGar4lP1WHIYCR8!Nn(gtxd#{~SlyzS9`xRX`_RIad>% z)B^27@<93&oz`~qz;QM!TDb?EECQnxznW+HRXwT(+)M1NKla>tyvuz~cb=`>AwJmm zN*)(tn^){h6Zdj%?0M7qfAVklk8}Ai;!IZTlxH9Xjze)#eH1Qg87_J%F(^e0&MEro zhJKnT+8bxIw?@%z3c78s#IH87s{=k6M%ILTZb|*W zzQ^_zyq^RYz)x-ruE+FH{2XiiEKH1o<7jmnMT}xio=j0}u3>DRsKg+J7`%&C<+x^J z&r5e%j82;<8u|j;zjy6-oLx#BN)v}o3Rg|CxH^+9;bHIoyQ6_QieJ@TzoO!XD{+?Z z^3?^mD%_4S+_qQz`xM_kH~y_uY^Y|qtsfE}%VPwwiE-oOj9RAfUmE_WD>mM0Y7P-+%(GK=5WLch2PPJ-(JMeOaI}-?nxzXsl@F$#qTP{@1GS; z%fjiMif`}W*Zan|P4MnzS2~<;S9}^}e5#@7p(c8G1G}Z3*yZNfUY-I}nrk8XoRjdX zjdf2coHxwkyhFqd#rN{~enjD|vf*v1!p$LgdCPEfNQp~X;!>=LcRZJ(x4w$rdZM@I zLpYT>E64PaE~llPj}*Hr8N2VtZZFQ#XyZY}r#JBDi0jj?k*_K7Za}=>2(e9SjMz59 z#5?)8_c?k+_&#auw(-6>u1)1Ux{h-yXnUaDK-+oU>n)CRQsKHBTwhnT&>%|-DG^U7 zzVE^B{U)9(lpKsC2L~!zu7#E_DYi3f4?m96Leau9wD5vr*Q?mH*R?CnIj-Jsy?EI<3r#xHv0=zqpmDmTz zHn-uY&>HXat#sm-%06!@9PPxmU9NqO^OM5SErz4AN+0zDePkvmHs&%mexz``grXQ1Y`8F&L}pY&km1yUV+d zS0Fw`72k6j-T(dCR8O%(zAYp*q9=BE)os!L zWW~Rl_*Z0-_c@|GRj?T-sc<*caQC*NwLWNVm7=E==qakQ_j%nq{C&Xn*>MIcv8|I8 z+jUVH3NONn@X}i0zY_fKF}mb!CZFV$5|uCt@-@jiV_Qh2GI#mkhabR}*>Ox*e@yu};dnku?ziYDaeXC>}^iTg%{yEM2P zti+=V@yJyCs+Hwem#Ej!l-D(ld(qTNaI4~1objuQqPr!;WThLIT_bxa+zmF|EyGT+ z!7g^57r7I)tJA}op!ir7AMaIsteNFwnW&u#fA!#RI{ta(xoG`oMbByIc@XiG{Q}1g zYdK>JVmZgB%}m9YYWT8Q@ufzVFQobR-s9LDXuP!&i}}Q1ksAx1F}K}&|9{I-xmgUEeY}<{Eva@hx&uwzJxt;1fr0`S&o<=Gh%*6jWMr#F!cz;)`9{E!j z)CYCYqgVauk2M3pQz16mSjL+Avqs@@fZ_4I5PjL}WKvnCC_c=<{!HV;`yu;VO^H4S zD!CX>F78(Bjxl!cQn;-Nw~0l)b96PjKd!{JYF1p!WSgz{bvr&yH-2qVG}H#|WPtXf zA;pI%2sUn*EoEdWMX?ziAz5dm(%p& zWp_dPNK>@82JIbEG}9KXv;!T$N+l-}$%(Uy-*xaidad_)Smi7&q(|&he7_aHCm7#n zDVi9BCXOk*^fkQvrtmTlUVc|>=c$cOvSNFsEZd7j99C?<1-nNX+t0wSS1s%aubsdT z*e`Y8)*$=YPaoHQ`GlW&B)fRWb_hNURARf9*hanRJ)WtHe`WB`>sTu_aJrHM4akA= z3NID2c)1q-rxKIiCMG8o-iE^22$#2ABe$EFV~)F6e&kx%enpQt(PKWv=lb|uSFyc9 zmhEf9iz-}?fNSSAZ$3K{$ESSk{Skjd$1dX3V55;Tip}ZR{Gy_L;UgC&g|;jF^fEkW zDE^ku@^@)eHO1f2_xgk5_Otr3`^f&KKz2S6YN7Di!|-{F z;`dAVJydDCByGpi_B@3bxmp?cJUTh*xT3R0=dy<;d5*dU%`Ioz^*Qe ze!IhSksrLr4tdeQG=+;d;9{-fYnd!xFGLPjxbAMXtN7I0`1CPxmhY(EJP+p=mi5H> zey{;-1a}$VgZ-BG#o_xsiVq*+!=w0MwIc7A{iPPkOd)biDe#E*c|$DkiUSE?lEQ5d zxLvN;6^~ufL%n%#j1KNnc6kmVA*B*+U1+lZf61yZ~mJ9F% zKxc}=L-zm=nJbmp_9V7Dm3+&IU+b0lbv5yOMe(T==j6u}PD*BRayg>5qMasa=L!0@ zybIrUPDYtgF)%A>s&ho?KZX7$!Kqy5w4b|58?qFF)54$#kSE(01BVq3a>2nOh1;%% z+Y-gRb9)P|Zx#K3ZQ#7ZM~N&x?u_WK#5x}_P6h?Rvq~&`5z9{$K1##KCdH4ACRhGY z>?@vSU)6{=6g_k{dRV0BxHuf2R%|PSZC@+(B{%%X+!w5aKxLEKRxHb|oDt6`zGb++ zm2fU8eW%j*Ooj8paLp{%PH}Kiv5zY*&X)=&oeU?V6pc3x%j0xXwDT}MZwHTnN5M7v zxAi^v*iaB2@?ygc#lN!ncLZ)Ek8JI-`?r9bHYWBZ6^@H$ar|TWMa9pK#?KtPy=^Q( z-}$idBDxLu5YAt2F1^vMj46`3dY@;N!-ofz7?mV8DWDA4t7xwT+N*_s(zji1Ugwj~ z<{jrNg`;Nh)5>sEN8zYQ7DuDQiz_~q$A{wZW6$|)48)%Na1)#8ef;iVxSgr!3jL?he+vDl(0>a3r_jH!DYFlx(0>a1rO z3jL?hTME9X(0>X&q|ko~J*41!3U;JmM+$bNU`GnQreH@3u}UFUDeg~c{x1VkL0M1^ zlm`_+MNkP;230^+Pz_WEH9$>J3)BX605g4XuVxDOVMyC$(Lq`KY>A&O@v|jJdrPh zeKO!C18y?lCIfCV;3flZGT@Lk0WzN?tQ6^IO{31|wM0lA{z0@MzvMYblkgAEybc2H_r z0k##OrykS_uQ96pEpW6b=2pgRd;)cv+9~zd9>;mWNA1nlmz!IbSn`8u_^5TmCHH!kyFT)k|m3pwS*m9~Ef7is5g$!c9K7DGWFFE90S( zRJ$bJllo{NU#-qn z48N}{+~o`6ZX3P@w{Pu8qB2&)ui$OAZ}Dl1!dYIn6@jyH3h$-hJk`YZ3HtWBRwgs# zh0%WmpEHMZ4@-R?JDybR$b%j7r04UBu3Mq&KImHXck>*9Us&XbS{kH+HHy9m5t|&v zy}wiYEImI5o(C_0UEoE~(#Mb8iXXYLrx<>GuEa8LRxEk0o1%x-Mh|x@F)2bkcv1jA zJPXyw#>3bse2EUMPWY8$y~A<4K5f)@dim_X!*D74SS`ux!EiZQsWD}UK|>{fT81%~ zvrm5)70&VmakgIJq!4TrGo0l8!uwd+HmroRU*Wu!;e3>jeKm`F*M;3^<&>g_obXi= zo^SJMH`_Yz>nOQ{{C-05J1;&LFn&+<>0_-Dud>AJeI;jx66cFbEo~4Mm`x(nr_Wmz z9kf9QCy9gArfAB3zAGc#?2JB3^S66^+Wt$iE8W;tRN*vN7N_-{Lkg$4;WNL>>8_D0 zLu{~lRE4V#Pb-|3gVXHYywAz&8~d6n8f}k8BVW3Co*SHZa_lOFmez;ZWZxro{%0kY z!-(Z&Mf)v`_J=C^ehGb7Rrt)A#b;PzKE>y{#^*<{+g|IjJYq7nNuCtZ%K2J}M?A5} zX*6C?;Re?@4%BzvRAN$|n5uaWSS z-EcL^r~lU!{bZn@D+*T?;i`vXSE8|Nhr-7z@G-^5o<<5EO${IYeRMO#XInEx6T{KO zZ0zyNli?x0iryuY67W^7KqdU>eGIJxPh&#%6>Z7BISfzLmH34dyJ!=?u|f4g^l00N zW~P*mj+1#^(QOpEUGBs6+9auj6l+umn2uY@HE`4o0AZ#n|OlQ=}$+UEDjyucGHid~E7Ue5K7m z)Olf+Fk)L*@v{nk-l6c@*zmgoUxRJ6HCVh{>*L3Ih5P?Q+j~G~ReWEd^ASQ4dI*FX zNPqyL_uhL4sY>s?Nk;@hu%UveSU^QoETD*>SP&7g_udf2E+Y0`-#+)wA=mqxJ^#1X zTko;E#&nU_Vqplb0c7W3_J+`y6JO%3ScEv8Y}afm=Av^ zJRSg#>qyQWY|c&Za%+$RpO>5Leytz;wvK2%4Vv#D`4+VK-WI97sD=f>a}qptiqyzp z)W|;DxALL)W61iVH?9OdL}Djw>>FczXnnR1_$Y4P0^go-Yt<3b|34VB#M3j0mW`q1 z5t4Tj@-B$H?*TSft+flVh0lQe%u^TZNnI2~UAzq3QEw~ng1LH*Tj$5%pS?uq>CpKN z!o{DKi|;*Hdk}B+hqn&KG}5uGt@Z5tByKaS@fxB*6KF7-_&pVV|M#@^;hIi43h$S~ zdoMg3enPY@0Bw_@ZT7K{f9+HKI~1Ni8OujK*)+(fu1UMzt(~mPt|hrPN3L%X9@|(R zi=*Gr>+XEtAllD>_PyH1NE3Gx1^?yx5QUWjOqj39PJ^e}!hE zsm@)Zk8Crc*(|iPi7t;rmsTFEl^=1>xwxgkboA_(h5<(KsPE;wxUH4ty(Z!PH_Lku z^z9js%@*Q^f$+me(9Fd}OK8>#ZI}mlTZ=1>yNMlRvKG7fm<^5#Gs=FQ1ZB6W7V=;_Rt0UGaCWb%8v+GYfyy8-H~j(fSayp5V#-b>hpy z@MU+xOJmDRU-Eh*`})Pi*Jr`kvptv&6P?e1&cjH|hBjs=!g&kJdGa^z`L8uRau$5= z@^2Bm`(Pl}8=c?-m&fM72XoQJ6KoAEw$+}TC&gmx7@LO3IHPN3kiP5Nz7G-o4@3XU z5!Y8&i%8$~Y~O8&#|y*bqY2;5E#HN9xcM#ue=Q|Br`nva_waR!cw`VfvXbOe*XC0j z9&qW{1|DdOc7XVHBz${|2h$Ydk9jf{qumkPSI2ERmpzy8*v#^HG2tr3aW(>B6!6U*^252hKUhT22B4rq^&d<)uqzwq?^BEenL;@(YkSO6Wm z5bcLR`&S62B#Y^L52mfeH+aXOIY@YHYJUCsz(-G_{dj0Uk!brAw9OdCj~o6ZJT$aC{7&YvMbKa|+F`;&XYf!7 zadoW`eQjt;V!oP9RYbs}^fM)FKUo>vgfpN8gHOWemIOQ2bI zt4lo3pR6wR2oLow4?Rdeqk??qFE~haI}^J7K{)IR4nHPyZb>MRj<%3+Q5akdC74DA zn2L-XPrUe}&ABt->m2a)0C;wdCC`B8XVH2RzUo=N>Njy~Q5xQuLU4}=aL<`q?pybq z-VJ=M2Olz*sE&Hy%L}*)oPpNBWY^wJyfqo#I!Sao3p!ngzGZEteW%)^)92BzoP$or zT_O^rACeER?x>daI52hu5%^5<>2;4v{gi#AFMXZ2}fs1CuYj{k~`fTl>!5| zA`gun)^m8y>p5VT_hTL-HS`>Gy%YQDF}duk=ir~U9F)R$xz68=Xw)4VT}H5<8DL*L zem7#c&glrYrG(cyme-ZUvn#;qew(-Ir{DM4yeAS*X2O$OJ!9lnlF#rUpE*+>M_fGa z?(`PkQ77l6l5noO6s}!VHaWQCr5f(~ZHzm4o8!(vc~VR1scsENz>80!Px-6^-So3o z)rVo9qJ=zpx`%l##;JNvKF{`Q!f9>G=?PLVQ&BI4s<|;fkDNvj5A=WsUX9^VEkxrz zgilC-ZEUx>}e6R$n$(eYN|ot5C|xCif3=rca%NJZraYs`wc z4;$ypWBcdx-^1)C{O4Kz+Yuj(gb%JHo-GH@zDRhKtChxdn)M^a)X%(YbCSOlZS-EF z?}PCt%&9)n{sm~inrPn>+P_6`^_O5~{H))B%cZZ5Etwy>*T>W0$K${)bl2p2YYz65}=E;q&0(?p819O)<#NFG8>LNzIf+%}gc!8wLM;03Kc5 zuL&NL(dwZ8zkplyl(^wPJOebqjeE1f3mfl`5Pw&Izwaa->jhoTM6NPd%NBjl?90gY z>EN9c&GGxL_-x&-rXBIq%tVeckGhXr`UX9>Z(Yr58vGYubiE;WogrXhYnHqrbQ@KA>2)<-&n->Q(lzYh9NGf7L` zYq(Y5wWCMVO~g;5;ingfroEx*UgFVm@Mu@U(~Fj;Vz|lJr9-ae`CH<%O7K}d@Sx`> zgkv2G*W;c`d5=~m*ji0^eib~|COr2Jc%Cw)IpO)F)o?g+i`JOVcYBdrxZ-SJJ}11% zyMs0nY_9>^ImG+3;r&{KGkNEj)YkYI=faI_djigJUB>36zYqP1dwcD8XMI>(bAnvldyMf!KtE`hZdHTJQ^xG}ycj1ESce}k<5kCEn==K(L+d}&7 z8uUAB;jJD_7ZVP1EQjwCPn-=;TtIxb20nWN9J!9K_u*qj>=~$x2X`A7@ zD89=0e;$wtu6sQk)|}?nZ5(`dKf%=*@yh~Nl?bl4fJ@g$cp1l%;n8G)(|qLsQHbYJ z;E{1nwr~s&vpHeM(vsD~&jHWBJ|F&Vef)Jpw8m&n(VC;Z4G;Z03|~0o zNPInN4)OKCZ|)?%%C^3Gobb{KFf+jm-a&_-LcJ2l!+KM_!c6eEwnUD3j$r=6V!oSr zbS*r30{Q596X{dA(rm)BCdNEZuy({gWq>j3G}a0eU$b}=Yp9Je8M?NN#nkgv8dDiu zN$TJXs5Xg=6P4hN#|ZCLEbm)M4avK=-y>Xp9&nj#8o^UC?rCoLG1%UPT5l1KI^Zu# zgQH5PIWp!?aG>6m4s?AkX9{}Y`qDAdS9|+wr6a<7JJlCky_!Sb=iQVe~_xT9P6bavr090}!YQ$zIC1S5`| zZ<5bG`i5X^i%v=cWBCZiH{o^RHNMul0R3EumVx+D-gV7dD#)RMIZC`!*?Q-9lHaE` zzfAPc=Ed?Pc9?rL^9RYZ4f07xp5-EWCU8-Uh_8-&{1gxYg)oQ2w}jMn+Md#qZ7u`2n1`?yukMHw?^Y96q; z#v`34Lv+Thgr^0A<{s>hFB9PD*=Vnl8n1!eiWBZWvD}paM%O&r3jLRW4rL=c{6_qe zW&P3!`9%FL&mECX=l&`I=W@nI-Co(0CHOwD_*z>1R9E%zM)W1;faKh1MUq2H#4e5; zG9x*(Lw`}vYVAl>S0z}ETP!Kd+{Yak0Yf+Rs~(k{^T#;p*_b@^9gVB`$gx3*(&4`P zyHIC&Pk1=v)*wD=A%V<<@i&t(Zz82KoYTJZ8P;ESJE6b7agXo+5{1<1PL|1C()&G1@L!RnpGG2aYg)=IR82VM0(6doLgwvzBw&hm8)Fzb0)^_V;j zFco{(65#kgj?_q9)X1C1-M(55UmZZsdQL<7*7f^t%rv35@~<3={&Gg61w3{u$@x9Y zbLr{sx|;_7T}0Lxm%%%?kz7-dV@;dulh&W1Yx38_qcQ4;2U^_YjxA68x`*I?!{XjT zv?yz}*hjouBfvJc(|*$byFvfO%q%h<4Tle&#J(9e{@*&|?o-8Qye>wCk<6FEQN7#CNpLk_Gyz;9j&mqLO$Kl&&h{qbjW9^8?&V$Fy zW1QDi+|(4$BZ0iK?X{83@Q`a9uK^F$L`%p1F3qHV*AQK1LYGn=OyxX%HY2>BVR=uK zapzOo>h>h@(Fph`*AqA89QXQl1N6KCtp@UO&sTEJTDHNa55YdbVsA{ec-@ZEe-i!W zT*qa^Hy^<_JBSXmphJt84tm^d%pg;ZaG7Db9ObF4E+m&K)>r2ezpjQ~JH;?*jR}jB z5L0=U|Lb{!F5pnlfBi_-9;2Y~7_@iExL6B*?&XQy2p$lxNAU=TjnIFPXTJr&96e@G z%)NkFo>JK_g1rslyp-j9gymJ@%BFKdI?gJf(#=^O9OnRs9NFnUs&!|??}pX`O^&y# zHFxLP6h3WTN*4zkDTtAWXNZmBY^ zsN~-_7B$3qARl z-{t02t}U*Q`A+dAgPUc9b9q9t@U~cFO*|n_HGB^I%9y5_>iID_E7an& zuk+87Ri5GY$=UGUmBb4rtQU4$jSw!_bgWK?59Au$E>GTjBR-0b4KJL|)0po_-CdB# zF%Lyz%l_d%TsO7#{h%lIdxWDZV67QAlH=;|nrL``KyTEN%WHB6K^?S%z{1AyImCyP z;KMJ0L$p_|bd0Z#DrjPH$bAb@EYEuK+C%gzZuQzjJbE=edM)u(Yk2DQ2-hNXzRvRW zT09fBhTB75N*xk^&4<6<_3-u!87Instww>5!?RuQfDh3|^p{P2P&xQtr&*tPVyq|H zOo29^cz8~}$$gC?ysjv7GTuvtK4ebL{W$c7;tOEm%SDMC^BU1ho}Mpb?J_ck*G2zD zfkEb0^^SgT5JV5Zo{HtJeTe#(Y zy$#*94$^v-hed66s;P?+uE|myR^}thA@F-e+=FmYhDPnan2l+8+p%Lyi&U2A* zYy_!~6R3~-hzF;^KZQJTiy*G}UN+H5HF`D}|2mlBo_#aOzRy_94GCv;z*ZT{*&hzh z#3O|*XXRosv@V|x@ZpG!)Ws#Jiw}u^+QUEPJb7I~{Id}LNzTk)!wP3|U0Co+rKO@3 z2d+%qRip1TmKkgaUeAu@p*%ljxyp^bu6aIb^W0o@>u8F*R2S%7jKbyqM>*U`9{ZE^7T)jgiGPOYwS|N)x$;oi@-^JE|7d@1tCD|o zuXW}?jV{Ck1+520d*bF1&vu4q*N~iKU6^EZnuxx2K8R`}&&M5vU-T!~k}S4q9&EG0 ziPXGq;RqnUN(ZNS#%^%;n4Isx^F~N*e~rI9g?60O!D7_Gouu|IN9`?$`B=RrXKLno zuy3^7DfWCXhIe1dd7^9W-)Nue=LX17MiN{L7`xOHVJuD%OzMelWcrV;A%{FvYL z9D&S6G8b(Hwy3W9dU%xF(ya90st>Qa#@TuB>O!=&o_%j8oTPvcIYzH$vd0b}p6v=w zFOB3Syz0Dp#Lk=RJh2xMKEpF~IIaXX*O(^va$XgSE3svsKWxYMD?D-2X1aA+0&niK zI;cnVyR7!*Z0@VXyBpx$Eip{W#UabZH6BclkhsCQPt?;Ia3#k9ibuRF`AWsgeA^U1 z-QekeTMV1@Bl|yY`TB*dUB8jo7{A3|qHc7%4kLj)A2O5hxfFap5z9;GrL2I@M&>pT z=2oPh8l#?ec=me%F{AU6p1Z1KW6IfHdGF~aa2h?&tJmC9uy>JQrC2&xE6Ug>HJXPr zUwgn~)RU@*j898QopeW?j3o2Pd?>fulgk^(C91oQ3l)Q0x?yeE-_#=fp9B7HK#ozo z%D-gzF!97e>xq3HT#tHQI~LPiIjRs~Hl`WDyBv5Ad-}bD`0#q`!)HC(d=cYO$Nuub zB=6nqhOhT|xO$mz^_b=Ac@OUEi7$G>7qx4;$D(ghcRdJCE5OqV;-|&%)6azea+d!$ zJXoiq=3H}06VzN&wBsI*hZ4Lif%hX%%%rXVdkg|Oa6hn&xyHQU(Ixwn(BJAY*-y4B z6FKG!VAa}@*TwrXg53$t4xq{Tk>|Y`(*-lt6>Z=<~TSO-F4Hyk#V9uetA3b+fumVR}UATdbIn; zvtQE4d_1b1%vTQu^;Xm5#5mS*P1Xid&nG-_N0XZS4mDSd#C_EIr8ePGo&zJJh;aFX zC-y4n>#DEwq3=4h!jJQFP&bkJuo>#|SC4+RfaxbYb}CQ!Rj_S^KW;|*-GjMtjBBkm zx&KtyE)CAqU-DY0moblkv;BcyxbNJPSB8B}`?b(8+u|NF5pnWyi*IWM z*LC+z%K|>v94OD5JBy4Tn=pP{NosK|bo!jsVqer^Dloa?38ojwTKyc<(Ya`yWBICH zC4+qN37Lc|`9#1xnrBT@9GHCd-G{_2VdG|aa=OKOTD4a#E(A}Ppq2eUVpsIM4)3lS z62qoGDQ-QG?ZH;*T=zXP+u-?I(As%8+lX<(Rjc1)ocIB)EzzPr2*~wd8bk7tPq~$P zs_oggJE^sOsIv!ct$jnr>Xq=;`fW7;dFwzXn?t(NpI;s7uO&4(4TUQ zPo(qYIu!e-+||A|tO9!FO5L4JA4?z-w2c{^dHVo-e?U!FB`c z{~EMw(XL0^jCLbh2M^w*grg!>*O4Tjy*8hhNF7}U{%=If~2D_-sC$zd`u%5%+i%RsNP$$b)X9!QRe!uw!y?fVJkE*O1} z6~_6W-0Rs@@ZJoP{~nwFMTEb?mcQvl$A-Z71ew!+1lpmVeCHEP_gPFWh_462*Pju+ zE{9e(plu@gq}hDN0GEqvnbAZ~`D|+W)Mxq3V|q9&#Rs{q?>k z(MaEGo{HZV0sbs|+}b3#PCvvvK<2vZ;OiBHhuxNkal}uz!A~oQE{%ZcCc;6g<)HX( zw_jRdJeuawtuFD|`S96=B$s<_E`Ji;)B~Sl_ZXkn!*y^ewe{HPN9l{-y@uSw1m#Eb;gtc)Tm&c`bO}54_QJj*c~g^%h`_ zzNYIKS#$kHYV{Y?>IKAS+u^gro_LwF!ns=K2|x(84bXEl+Kw1^;oli^x7Fo2Pv1KT zuT2o41L3t5c)iY}^{bwE`(jvC=bcvPu|$&#p~<_Re(MpAt^hyRqg_CJFa$n06vL$a z?XdiP?1}pX;ZM$4?(%SS5Ank7@WKefdu#B15?Ey25cfg?*HE%iNiW56QGV}2E^tU+e2~{_k9(%f-;82jPArc)t$qZBM^P@tW)S>ULng!}5R3 za;#Vt*BSW5C$W4(UhvtvcHifqf%LDNu7$#RBrBLb?jhb725;ni8gimBwVy2sd`>vg zsSR{Wz1gi(CFms2D>xCutvcNb+@jMp;9GFZ?`4zk^3$tW1s%aUNY+BHBe&?9Nv~;z zx#^t%au+})^D^<<9q`+?F)YgAEtbOxMBgi+?X_rMKJGrQ7k!QbV--ojZq0-BYk0mr ze4dT02MS|;m%A6_9n!K2D~o#v%j0~GYs?l-|X^ptLMy1u1`u%S*E}!_wmEcHm425n{CnW4&)pYIw9pEEmBl zGv$rQMaJf?H@j<~Cu*PuY9Mt*zAuzt>~8LYLb)DHuX{ME2TakqS^1MS=i{W-+o9IC zlROg`X`9CSRID=Jzwg1)$dkh-M3eot0$O?Y?Ha=q&2c>8Jb@f*f%8+bxVmrIAZ|ZX zq?P-e!3cQ!JTk}Ml*ln%Ja~WbaMUN}A>md$bc3yjzMg*n^7K0t{kqmmo6+wU+xHMp z-vxfoU;hD)MPpcDZOYo84~ z8sNJYO~&9Bu^gkdu>?4y=ZEFEMsiGm|Kvacc|LfK$-d7$&vk$wzaTaH2WqyxC-z9< z;W6;={WrV)pN)8R!Q2MRS?DGJwp%jZpICVI|E^0Vr$Scq)x>jY)^oY|+Z$urhuq@* z?3UB>FeV7^>Ngu6=b7-iUTC|}x_fdj1B|XZl$tn3=8>(59MeD6r{*u?P5D^f>epoC zoq=|j^@?DX{j}DuLQdl6miYaZ;0BjDPjBH_HTnDh9)rleKlv+8ISvU|n{tGee|#m! zRt<1e)xjP?ja|447+iUaPe;abi~6*BEH~AopsjdDvtAd?fK@4tx#cio}k;-Vr0Uya!^fr|*6Qm%PIPb-n6? zSYBG68*TkP0c@_?5M1Ry3tv-Q_*Jmo0-rq<+fVDJFh=e>h_5HW*PnX)v(A&}`-CHT zmxypQobd1zMj^RUR&bl!*QGGVG=#68A>P~#Z+->LGVaPIT<92f1vm`fr*6!K7nMl9_x&n_&%nO>?gk4V0|}%uu;DTIr_m4G+B?UKfm!`rO0l*ua|ka_ zSYAGk`BU`}t_qBH*ZSp_^Sfhlbzjl4D)CWOxS}z9^fltTYB|N$`U&E*`@ny}!};$a z2z?MnZesZ#OUAjsFwUJz_&8$uC>qOI$AQa`v&_Q}cyfM&)bk|N^KUj^^`Fis^0{Y& z@ypV&xM5xf&p`{IuOH@@6{Hj6yZv|CqBP~@NwAkv6Iwf7t~}Gi&=G7%oXi> zv!0FN(!UdbWLaGLJKeWkfGc4-5dYw;D9!;_GuIN_hb-CSpVKlayV#n$VLvb{?JXI2Oukt@J@i*(7lIAYVAJ9 zGX*$D5zi!W&7nCw^9Ax0oSL70e+7BIVRLOyeAzb06?f5lH0%=NSv`HB<={FpF8z&h zX&>R|G0V?49)ILn&xS{r%AhfO;a7QoLvMm>jm6c2=-bHV+z2^G=QF(q6|UdqDLFN9 z-b3!vFy?0u&iBb!(iLOLA4HqF(50!><_O{FfaR#AN1MSh4zva?00%Ozn_t|=d@@!I zCHyqAbv*)oyVi!X>Uo}Ee$--4MqKf|dQsTnv+OpbA_b#T7*+c;8VZ2~@vo4%f0-X(nQw|r)J z^65+Jl2Waph?d)&vH-B9m05kK#S zpIgJvZ;`R`AB>gf5&yKd`TXM1slF$l#|ejbfWvj*NRMqqU%kgb-~TArpa+nen1P!3 zi|F^T)o*T$OC6sI1YDLdO@KS@FTt_Pj*b2B^F`n#TCb|3tn=D<@?J#h;sIM1h35Qs z9MFEn_se6r)dO;@BgYWeTHeCnhhOC!=qh-Awe@|c7&aYer=x+zHbGp4o<)lv-A=C{NFTqb7uheU^tK$W=I&P4-s}R-)cytuvcwPzV}4 zivHITPtJuW4}vQlhr)crRcAenz4e3fH(~AtFVXd)p8rS<*7D)mkMKRIt<4L->gw-Y z;9OzHhZEpR{zlhEL1OsQ2|RU0>yFl*aPolVW)Cm zn)s}&6jSVT_j$e@@cpYXUW9WQ=km~h?I6Zb^Il9B#c+*V^HD!7{BT{d47h>ji1}xC1=_6^$Nkc zf-Lhqa7V{l{k$phj9kl*D~27g?`N?%%3;kQ4z5!W4)1?Og8TP_{W1Gc})ITBmKxMBMw_?wm%~!t5_8j;v42(MV$nSI<3t2F$t|N8V6Lq(jc%mpgaTt9k zANlXNrk<*9Jyi;^wXTF8y{@yw@)NR?WztDMayDGFevf!$5j=9Shr7Rs#wx$`@#tJvP7R3!OPj;SL#Fak=U}`4^AIKdy>>g zFVx3Qf?e*(m6n08mt)L!^4R1LT8fyf=K>* z2~K^IYKED-pd*Qs9mGjDc^-{_LJqF=Vrk@XfW%G#Kk^jU3^R9ndK-8BEQ7uciFPl6 zo4&y8ngisRa}anD-gW!$xR-98BDe~j#x-Hl74U{DuSejE#i%D&T@FS)4MCGn4;n7t zfl>V(Y8S3qE90-K1l%UfXrkf#h=yIjzr+jG57!6cgIn=inXl3@lF7NyS4dvTr}Jvv zdOXp(Qh=v`sYCQw4n5vM|FXVT9D1(26#AFnhWDdqn2va&R-YJV9sh5!nDcNPEbl+; zNi=>L8XrTvXx=*ir3LY%#w1dbnL&82fSf8?o`(RBctWx3e6)E_=w-|z zqHVc=gIx19@`!VQ-7phMJ!Y5(i02{aFa(SQp}%74Xb=G46COD~yQhms-EN z$B;4@LsrIeQr*f1ISn;Gk^W0Z`oDl^GcTgeZ?S%K%t#Hmk+EuO&uPS~ufVGp5}cV9 zXW6~(9Q(ju^Pqk7xK*!nBnQ=91ip}!O5NaorRJ6^(M`P)YS`E$&2`VGWlrZXd-@W@ zDi+zd1bUaTWGj3oqf@Afj4JYOnS75m#A@>jl4BX0+27qfjYBb-zKCtW@LJ`~GG#~qoQZzMci03P18z6)zKpXXU%d3NBv zT(h5e;B|Q5am0;s5%weRa}aM&p8Y1tx46x>KXMYCb<3~4aGc99v*vze`If&?F9_c= zEWQs(j3PG1vmS1S#XO{SBTUGQlJ$jqjrkaA?hC@*G~k+Uv27rFR)n6TW4Y@&rErXw z=snCbQa}ArKd&P%7k8<_Sut5{8uKmTZi>a%4da67r(-F847OB^3u$Qkh<7f6cU~jD zcmuxphGsV`B2yeBA`E&IjXzxYev!cMIb4aw###ugAc`*G%xZWIay)bV-;W7(crW4Gm7IP-yYixwCbunz}XL;Yv zhlH<7!Pi}+zWQUo^`1Vn2v=h)SLKnD%a?NOdu6QOsAp5~23WZ^s=t%#BQn-q4<2Qm z6TVM6JTE5a-jY_ikImnLo;3+?qa(as=fP4Vri)+_EGdC5Ma)DpHXcmmnDfZEQW#@O z5wzEdALJ=N4G6cREVs9KFgNz_-kR_+-1aNuWj6SC=_d2&J)XE#i4Jc=hYp0tLIICB zm*wfV8{uN4#r!qlu?l#61KxIx?Xr%NXTwe*W7J5DQ3pJjO0{+02YET_X#-k+%X8?L z{58c{z&yg@?&Hy^l}Cf8W4NMq-im1O4m3Cmn4-GsesZ7F^XStxkID)}#*ZH0D)F0p z{hSS+hk9~(nd0qXM%w+f))6My67WS2a1cMQBDHs&9S4d7cRT$5VY03-iW++tv2{F` zj&*G#PrJ&%nVnhITN+zTlP9hZA$q+F zy+(RG@D<5R&bx?OUVgKZ$T7>dd*VqXC8{*uOoPdT0DOuX4JciOV&8$?hiHA-^q80RRQ|Sdor33 z{;Pujr=YJZ&%+7at3fcy(U;UrVjjn|i0Jwrbgk;Z3%GdVhv0?3N!-CUZZS{Xo5;R{ z?7nqK>@qg?T94;`Bz0B{b=He;jCcE*o9);i*QYR)7wr#`F?bZTyPf27hRvr5@^Se> zcr5SX>2A{RK-=#|@F3%%V%GKPHGzNSYWu=Ttz)ruJZ*@3eHW4W;VRV6CbW&jA4g@b zBpMYBG)gk}6YK*l_FaVUG|P8Q4=+7DIXy`FO|ktx23%1sln<$usl*@E;g5c?n98|m zc#ygX%t z_c8E$2jt@#w`E+#9K7lkl2bpM(@O+%A&Yq;$vHW!|5bJCy65=fQsabc!M2L%n+tu9 z63l%q<~IrEB#U`FnTxJP9Sw?MQVnHZm`idk801>Yd`fWjvA8}WxC&ZaFUH0QJ@>aM z7$fAW^bj+`gKtR;pL#b5_zc?f#9znYudfOA-WGd}FWvLn5zK32J(xBT9cw_xlZ1}~ zmXBWurd}4)4`ly@-G43NBVqZN;lX_g_I1tUDcHBdZEh~cqTbB7{B@FeM>LSNLr;tO zFM_$1J#Ja#!Bp_c|DK1C{-y6^yYDH_81WLBKdy)8x1bdzxO-UKr-*kxfOqaE8rOuz z#R%qt7V{L053coa35*XV(bmTJP)}!=My4#m+}&c%B(alh?7N7@Y0!8*i7WHKvn1bI z$TtfyUA`%SnAI&_9aB`lvca(do>PICa(tqj-jgS166L5#K8K_ielA|gy_UE-7$@Wo znuOWn!QY4YcO3lNaGcw}-2zT)ng%4l^2qNt5;Fr=@O~p>?v3zXnbpV%N$Y*9n*SH@ z)`w`v(LO@^80{0ZPtiU@`yA~{v=50MdC;SEBp>Nlk6UC7QPcD;a5upm=uG@k1pc@m z`^kDvxA<|I%&uL><#Q>2_utsKPY60j*Ei}5@jxfSv&;d#(XYe~{S$tb^ABC1QP)5x zW8Nm%ivjyqGAE~_-VVh0P)sua)q_s1T0McNC((W(I@E>^gMitUtGwrBFv+zRa(xDP zT#0y`+2VbKt^6dKs zVn%D{zt<_`Jj(PrNe{R&mjI88k*n;lJji$Pe-7?IYK(Vx561UXp1iuiGp;fER`{hB z;i@irJ{NIa`ZWq-;=W+ytQv*dhDvv`HTjbV(=^Xm@Ghy>QmEHi*e`l-lFS*hCb-hB z8N)j$PLY$6;q2slWXhwS_*fE17XJP~!6NAk=> zp2cIisDEXyxp|yhn>N7I*5beV&8;(WL{T1GUiF0ZnSlp72M~PFpmMFOUD-KfqL$7F#}`4BLrVzJ3ie? zbo>@N4kkL5hmI{hc|A?=Hn(`6_GopVN8{uZ;h3O&fvRA88sp5%?1|P3|LYIG4K@df2fl*`o{VA8@k!oCILL$H({XM+n%LZ)jrFUVNcct3jje~0M(J@oEJ#*)$)OFr=A`qwzO-i<7Wvpw1zB6H17WTRSyde3i#{{Qr zKfnt=qLuLMyVj#=DbId?dwet)W4sH`Gl?AYELuh6srm@F;XfRQTJA6RV9N4fx))=n z^s9PlznM6v)Cj-7I;M?YoByA{{m*DyJo!9g zF{7IZ69%96BbZZ6ZBM@2V*RTA8NhoX83W2-3@Dowu303eYB+%bw!8kd@j0gWZ4(r&2 zm(5ggzZ&g&v@WDR>)QH!*b~24dv`6|2T$%rdz<84%I4jN#I9pwAMnKP=HaZ5=e0kG z&*fPVgJXWv8k6&kEx|P&^?!P+fhXF_CbL5--jyKlxR&?m%4}X56)kt7RS2G0sGrkO z4W9!MeojaDDIKzsl~3kqiTC7(pU3f$+CH#{EsfnY9b`J6^D=UL20J$(-ZmolCxS9&biEZ|btD8}?9n*9O2{zPkx8gg;| z0DLir;Hzcv9VFv^CdU20N$y2#?$cwOs@LVb+oztq&m)4z9X#b)uFA&xSN&7bzd^ge z!`C1(?mr06K8&`2c;u2GzwrwzA+{b92|hjUO|h}%8rd0mcjQLoAvx-%7=!Wn5BE8g zCKy#O^RDRW|c>HdX6JF}M&LLX<4J{uc-kb?< z)*<~Cw3sf04$h7lY2-^8BgwwNSq{#e>-y5v0eR^K%Z5u*M2AC zR9TEu+lU^OphpW5H(~R;!um`#)Hy}&XOzz&sO-sU0U3Aq!@s+ckE?#FAfIfTQ#)W& zZ>kprM+soNn&|lt^t_Mcn}vL9dhotUd@u_>sE7TOf5D)~Ix@G)dFgGW9xo1jV9Wuc zUyjYSFUhqea%~pFtTife|0Uz&i-{cb3}PyOf>}9~W2_^Dqik@rf#`Msy6q&q{|nyR z#c*moIZoM2>ZEbNk9^{^tla7bbux-@kq$1pcw&4{^qY;|A3=Qen{c7?L8BnPL>@oC zho|qih<rWHdo10HXZv@gSD|d z!F#BgW9we~4F6JmEn7b`*wg>V9$X)jT&p72;hsM4CZ0P8&wXjRS3e2n1W;xsg!^3c z96Twt8PCNex|#%9vD@8i?m6(qo8T&1Bie_Y%bn=K`yW8PX**r(dJU{Y4`dm7aZjgP3A(Al{T+vPLh{ggDZu&Iu2`G;ijC8 zIlaDn%~B5Y;2+3K_SJp`vFv+Mz-u{kfYfj^)bKIF*AejbC*isvcuq#kBACls%#{dF zHNewG!bKr)aj&gm%}2gVKCc09V;o7>AaOHo+#;3Td^EItjQz@8H!mgdTp==kgrDZs z!t{W?!nM{DehjvG(D!V#48$&q-zfItIJy_?`1Dfz3y0q@dkOxJ&_;jlh-84}wYkTpC=Jv3yk|d|en|9%7mi9py>-3ka95fXfa< zr&2cVcyK9WlyVgii7)fP<35s;JfEQ!_;Br)3NGp)7tL4t({ZSNkc(7!!W8e|-v4QE z-G}fc&%~2+G%_yVNNTY>YOxpLsus9vNqD}%^85_RISo0VMYt41f+_K*dwgh)idjN< zUI3mq5&d3+epLxi&w{7XB+oqL*@ftn27M+Y57)dTIrJvl)jO@-{ITy4jtYaL%SoOK zk>^mt{aVX?3zF;e$n|eB9=(Y7Wi)}umUwbnNO-CZo<@_pE)1TEq7{BHT$^is==bMr z+*gSYE5L`}5uS>Gr^$rpH31j$UX+Bn$dl8Zgy%)z`APVx5IBjCkFUc|Z=jV&PEq|e zC*g4c(dc}u|2o2D9dNmbc&-R|EVRH~8%4pzNTU0T(7he0Dfy)6nw~sv@NjpSaJLxT zHSzR$8_B&ca<4@4D~9~8Ae^oaI88ULJTdQ%<)K>1alr{PZoCPNJD^YTfd0LHf71H) zYU2B1(5eJlY6G`k72)g6v3#U&nO|20`4lt{1GB`IEqpC}y;v|#8uK3Ee+l^C9_w4z zQRTsLD%t^}K|!4N9N^)x8PTUW^jSyz_cHvqGloZVJuk@Bn5RAZyg+y;YI%6gv+r{F zUO0@`a4Yy;KB44(qF-@nR}yWahl`$sixS}CXQItgXmiYicL(9{RiJ$i9J5L-zltezcC*A9tw-PyKDXEdeVU4VMk&I{Q;P({K zwusfX*d6Y;%fRDX;KMck%5m8Wg6T0^w?84S{GIwj&lNSmIkQG+avxnc9Aoz)oYl0P zts!w9vAO?7;?zd}_0UWZsh|0PXuIOHw(VR0Wx0y#C*wt#;20b4=_2~2L%+XK?{V#A z-$HoG;c$FkPx9Dj`5Fcu;>Ww#4JwFt!Ygj4^tovzu?iLr&ILBXC)X}Z2Uje!Og2^y z@~P^zgL@f=n$?6`dB)$Hq-I}7&E7nV)$3Zgpw}x&dp9zm2B))8_*D$zZJHfugV*dwxx;(X9w8oRYD-vAtv`d+H%OiGl ze~B%66hLf=pH22pvHLG1o-6}yN(ZiNhEIXOnyHE#=Q#n+8hN`&p10dPI}%?mhc64R zb^ER?{8k37JX$Wvqma$x8{(fg;h)-M-( z*wy1V1=yRL4ah(0Lmi*ek-5x^&&2lE*EieT+akVe9ukkYwe_X@;8($x1nlF8ug-<9 zsuN$8gP$_dDxh^Gc^9yGKSaDy2C5eA=ss`oHazzh$@dzYZy%d)JSRCLbQ9sSnB}q` z;iDk57*E{>CGoXsDa6A0!@LGHK}7H8!lZ8m=a_kRi1|^j!&kf3W;Z+$ay_!2jyl zcqgxiYqen*@93-th!O+ZABgdf2hiI2uFA09xbYIDHNlY891JR~7o;_WK zXtUb-^ctc~d2sX<@kA;-Q9Z^()JqQ#P0s_=_(QPU4rrO!|Do?(}7Up|c z`@rsaYHxmf5;!OJ1LA@h&E{ z{1H5{i{LE^ysr@c&j3gEqa%nPcE)Wi*h^K5Y5%jPfo z$)@8<6Wrw}-oDLKGXn^Bvn+Rad-knFI4BGbo+7*!1ES$1<^&saFJijZl1l<_hhuv# z^7@A8vj+O?A$;Y4ukj@QSR20w(WoLcYDjV}f}FR(XHt{OKYk3hPvEo9(7r&Mj@Yhs zhiF{(Yxntwqo|J$Nqtm9eat5LjIjB9NVF&pEnXlzRTZ8r59&jk4n8{|!~96_)CZoD zce?Xf3tisz_^B7+wkWv$k>pSUIb1~YA7b&lDYP9#%g(m%D+q6u!CQd~ z+}u=$UX=-N>ENw8!P^;l?*|@Muf?Ll&~A-d#3m!?FQQqbiY;)S->3l9)4 zR7I}c2v-xq)$63+=CK12>T|*SvAzK1V;}(CVQzF@LANM?6vkoKCe`qN`xjwRao*Z&0?| z*9%YkI${1IoaY9yjX8sGUK5-@NjxTJz!nf*mV=l1z^uoJnzw+*Bdl;d*2bJ5`PM|f z*T91=4_yooUV^rVX#EkiPJY;ZY?>YBx~d1fAmd~dli>Ol9{81Dss&6Lq~8j*--`(s z=Yfk^gx^}=_i2*LC&=Y9aGxsRu&IaSXZhUOY_#fVwb0HaIsJ~DmS*#@ztAFgJ>?Tjt8p&FvKCaCUMy9Jgx%@(WS|0pd zg#BD&|ANysVoYgp;hL9fgNr(7b;YGoP~eCrf#=29QWO4I3v-Va9!Mb zYX{+M6F8ekwEq*@e@49ZDZKRx(dbfWlm{+c^;ZuZ)JNMwc&H5?N;GnNsseQAgFId1 zVKVYeK}$m`66BmP2T9J?Bj;8GUjtxkh;|Rrd;V#?aR#1nULc5%=XMZY{|2uo33r!) zyVO(eHSy=*{8f_EcI32&a9RhP<`GUSg46R*hc2x;q7FNu^&~ak2s}*!2d=R&0S=B6 ztPcR|cEZiS;HC}1S_xRsBDysOmL_P`33p$DyAz~-K1cl&xy#M@<u8BlTv&MQz=VN2Hg2*Nntsmhc3tY@5Tr>p_&Cvd}n54_-nDH7gwIMv6 z08c03Bk_aW2^!t%!bksNTS5HL95HJX9@h(xgoh;XFpcDicbJ>sv-$k9jqq0p+!aPU zNW9${zV3o{oM1`@CQ#u#9+LTVJ>j4QI7r2QuDN1f;1_v<{Os)H3*8*ovmEyzJZ=Dw zbtb#L`WJMq^_+Wc@&!D86T#dPm>(f^TofGsL^w(TM{9|0Inb>w!TC3ERwnt^xB1^o zu(kr$sf3#=z|B^Irz-HIcXo4=hCB|Ec&!nyxyJ{CNsj*_$B(QxrG}#QT@0L-M{5oa zTw`Yg;ef1-@Qz-SL-HtsJURiZ)UIxNeooHq<1GN@Ws+wbCa{q_CL%jj!S$XhR0qAg&=+_qd-A~5!uP~6MKH{FIOCYO> z!0H;W=AIs}jOjsmEdgG)5k0Pi9+!|@l90;>MB^IJ_-~SDJLI{5@ZJQxclgJhXE*3~ zBf*jkER#rn>BujAvAfUq!16xf{A+N2i12b1c-crepA&E{=aLq--$n2i0^S0R-I(&g z-Iau&rr@U=@j*%WU?t%o102+`9E3HW2nz^bJAi`&#LETX<-;V0ROFCFa;S|QJ}2B= z4er_zJvsu*9^@`wmiMMcw`RzF5SpxCUMHB+fayHqpYHI_0ca+3zix8%QMT~vuso4N zMvETiF#axC{|Mi8?3eqq1`zC>fc;j&e;M$f`Hg$dKLww)B0MJHdi9qi*P_VvMGwwr ziHBN%!)3%n>F`kD9d4YPpxXqJduQbSRt$@-SB2raB=>KS`!6KFV#x1!tk0+p^9hzN zz>+k@okL0V`7AVY9pjgUM&;2eqMbn8=p3x)T||GmYv6Ostyo0!l%HFI+XBzK*91xO zevMeaI=6@Y;xjr4?sVY(Iks;UQ)!^8PjtHmx?M=P>I$y@jP)DGgegC$63tWZm79&< zO5KF_${ACMV3*HK+CltQO2#aBU%1x(<$D7EuYq$ta$c)9$?IC=Rs141*R7$$FQgW; zpzkHN-b6FmG4P0I6+3$JesGd=uO5bu+TLrBac#MuI8dK_H3*jIq-~jJ6 z?BdR|3UZl2__+@J{7S~c9vBNBCwX=U;!8-qew)ZK%{_TEB6_re9)oRN2q&^>{(1QM zZV#^=5zpn1A%XwqXOHmoyVvp>1jHBhb}iEp*Z<6_uZb_qK(7^q*DW#*!s{+fgRnZ4 z_31;AxRPi1&zS5$&ulZngSj5jItN<6Pc-WR&E^1;_)B@!oMpv4!xL`@(fa#Djyc=z z7w@wZ^c+sKZj0Am^62@R=d~?_^BchVyPo}iCcN|nFEc%UZTPQy4b~I&F$ep(*3`2C z-^r*qe*OSx<(f;XL91M}nrKz`yJKX+V<$a1Jw&*;QO3O`?ml}V-=92v9wS=+0ImBI zE_#8Bi-^|kp!Hv#csq%II%B^al0$FgP^d|mpL$sRC*$*8QhQHhzYM&-l+;fiw77<7 zI_R{fwI+T8j^y6vus20u%;W+&<|pvXj13x@OEsvihHTfxs3qHi7OdkFeQbCG^!Eip6D z*DPp8;uZ+wn&ZT;U69Y2gonQ1VL9Qx9Juch(Npsj9+D6mk=hXw8VOzd+Xyh&CONOM$6wo^DN)hUR$pfaOWBL}RA{a~j$L!bLxDae`=Y zMyP?=OU9W#@I_IJD;iTUB!DUbKI(!m*Bo~XUb}&4P!Sr;AsQ4$E|-y9`XiSY2-d#9 z`X%vU1L#ulV)uHjBe?HEa<~;a7oqo{yuEu zhQ5*N54STAcPH^dG342n@H8;wY0?P9Esn0VhQoJiNgdbpPUnC}4Qr-=@~Lx)d^uSx;0S?XS^;S+ms z?#-=xf9PK0QTKk8!R-x1uL3p`vx_-hCLc9HS0Cv@qB_A=t80K3ka^1T55e+Y3~C35jK*K{Pf z&jjvV!bK*yc!bo`wA1x8aqfA3okn;zGug5K4w-Qb|fRmX-+p5s^43g_v z$hFFM?)Af8(6%k%LGG>^Z~GLFMEx=Xeg0tc(AVU38FL=7d6d4}9djo*c!y})8@l#E z>rXJ11ExO_H_hUah;m*|bRUPf52Gc+&6$YN62Ci0xa8V_R}r1?6cjUtj~8M} z9mys+%A6`X?n6vr5_gcAW<<-o@mdzye{W>}`8Ma!Awj6%O9kZoG0~_CG%9e3d!FbE zk5ngI?Xg^4NB9^GK8jU$&zDnA*LT;+bxHsC1^pK{4-t*4L*olbz7>&gQ_}Cf7WW^7 zk8a>&9?|h1=s1*UbPqJT2VCg!VN`=L;9@sgdxB}V#nc_Ii$}s5$bZh-J$QXr@Hgem zX5#Bg$oX|}Jpv%LFZqH=g)xW2LM;9wUc1ebM!lbDSXnrJhj`H$4UNU zk^8-9&EN;+N4g91lqYJ+x&BFw%6D`7um?057UM?tmGS5KqbvfbVUhuKN(`PfHLoetslz6B=JoGuqbv*LiiB{l%d(BxN z94-SMnQvqh4a5;LK5hpCa-A~tSv4GS3^U_mJ`z6UZ>I!%6*sHUS5!~+*=^`cSgo6I z`)m-rew6T81$G0S(^8i;q%uWQVignqZ83Ge4YbHS#*3wFkr0nmIP+O`-r z<>jUTn=!vwPNR8AA63EWrsxsBKVdMuIRs7aPk1aATfMLau|=;2 zgttlH>`t_&V*9IJn=NmHNu4%=U+yIJe+GQ8f$%*5e1B>E9rw^f;NxMm)bHKv*d%cM zD#3fb<+=vpvmnNeu7r!p;NcFmqonWaY~M#>V~uh(Iq=EY!T*xH9zjm~(Y_%4Uu*jx zPVh|uw%gHm5>C$mr{9ylud#iD|v7pcCv0&QxGKe2tzw5c5 zs}Mgt7Q%TT_)y1i8Q;_^sW@kshr1jb5#A1fx1X(6x}SWPZ78(LLTonw&yU5_`br>T zX|xR__vy%c8`@B!S2FbaoNzi6oYt^>ggJ&^Wj%HU_}FMQd5GvK??yWxxKr`>vZrji zrc43m@G}VoJ)W41IIg+;N*m)+Tl+yL_@e#EzIT$`XCUvJ(KcA_!hOT_w)`w(tVC~% z*o^njQ9q&9l6C$jpB^pykA&8)IrA}SeGo0VyL$~XT)4&L6ZMgf?~?*Q=9(2mvqI3U zH!w%%bKye}UIxA{x18OAy!CGcxvn`2A?NVU+&uFb;cg~)+bX{Ca8r@wb{2B`jCi6c zJhAJv9-$}H%c{pxQa_J_&(S3BOOW$AoA;X}r&-A7CbX&O!{xP$?EVKWKJ}RDk{oz8 z&)iCMNr5hn2`3}L$y|c{0>r)0#vUB=gkTVsdIz4EH@U!L;hIA9RDAMtGw^y1;q4H3 zTTXIb6U5ClFO!@LB4??QlZ4aR;PXbbt|af#$h%GfcMT1tWi_y!Z+STy^Ni*$ zo)I@sUB~LIt2sjSN`+n5p-i$V!(x0zTLpiz|O49$FD_S=_849-A0=tnS3S$o}UB`x`Tx3@xr88lH){@d04cu`J9d9PiEnrsWpbtAwv3;Ok&4C)If=_7$C* z5!~~D`8u?xWBV(oi*4-ngp-NjWH;fvSHSn=g=Z2iTSCj%NZchh?zbf8Cy?{Gr0&kN zbyxBS_xi2~v^W~$TlkXsWg_A(LKDtzCOJ<=&ijd$XFgzK}x^R;N7kk}ItbD@oW zlJK$suV>;4Yq4GK+@1n2KgRY|FU+@nPa*i`1KTxd=M%kJL9YXZld0h350ck-#68=_ zK2E$cA@EAVG$oo9g=UEvd>!){(PISkNW*@v`EV{U$$69-gv+PF85!i9Su^~67tyLUw92;o>v$sH#pAQF z_Z&3Iy*T@Gi+W@SzeH$ogL&SgF6nIn2MLW=hBhz%30te9e*e1?PMz)e4@N?Um5p#$eAAb zG`7azu{l-^&CM3Plj~u$%DD1T6~Awa-^shDa2JMYPjZ}UG43M#E&{h#p^X6+^{rsh z`*I~xQ#j*WcvJilKgTixI7V83_Kaark4*sv8RI5;W8hwn9&WB?Lx*YDw=m+1cCw|} zGoO`!&jfrl4Y+87Gvod7o3+Fb#o>p6F`Vj$$(F0xh?Ois?4~g#(jmg*VsLmRS~KF) z@qx+<$B(qJwNH(G(8gZsiTw?!zjpB18wA%9VA_bb7X7AaLin!yDR-fhguD5sH}UK! zc(xJIXf8BbhZv!g!$9h5jUir@2-}G^C7{hlPyR~?caH_!rI{}X2TPIv6=-9KHr)el zvTI-KiQSpxeKzvWOLEu7DAdJhTN^ie`rht&?b3)>g;lLf8IwC;bSQh!eO|OZJh2}8 zx_m5S@xO$tW#DN8+A~C>bZB%B@ap<8im7-|i&deqF;_-#i^p{=7#nC+(~KZ|E&!j` z$M)448DneYLByA_Dq2G!j;cUV)vP4`9S#3(BYlsyeIK-1Xy4MWYzg#Rdb#`f3jFSbB zM@h7T@MS@anENq%bRr(=01wq7IWI@Pm!myQFpmf@r;Nmj0Q$&Y!Fpz;(2JIAdD1;nK zp{0O_6zFgOI&32PE`h$w36Ep3|6cemUXL#~Sd9<3tUx8O4s zSW2U%fsZusc@TW&{uqvbnsZnYcpm{g@~y=!ugO2*L)NQ9fP1LLzJ+i;4l&NNd`X|t z{yTxM-v}pzf_~+5N%34GpC#fM=o+GiN1^CUv#U6xbpnUnrId9PP==c&yQ$@ky|;mV&HEY zjwp&jrz6nmC8Gaw=wHm@2vy40sXuTG2(aXuMuf{Eh?Pn5=o`sn8}WV@Xn6=8D1qb( z2T!rg&vHC+n20tBZ8F*fv?*v)(WaqIN1K5r=hQACT%QM?FG0&982dyp4kcbL4KJsn z$l~*%)IUDa3I8U}&5iZ1=dODP{fD2F+lg>k3>?jU?=sN)7w|25gd-Myu-hDP zJqv9h>Ay>)|Jfw>bmZQY_-RbwCu5!U-~Kd)a^^$A&sy*^pY%}# z`?ovYhcP>e{+ZDK9Ku7}$o`{=hFt;;7c5MD-2Gg=?$DqoT5q(?go`rZVl~O5Ffg=< z;HXRZo@e>~g>ZENxVjiIT;oowp#NNRtcAPAl5nbDh2Z;qGFDDO-P}gBXle7EPU?0I>h==i#nA!t39}1*%UG$K zj%%`VtwQi#1iWp)p=*pC1nx$Hf7hHeAN(({8azOBY>b?m*t}jNJeLR04G6X^z;>AM z)ztQTA^38QQx|}*i_rcd+Lwp+^GI$Bk=G)d+lwTALmU4D@+twsi^SG7dGLH4w0dZj zPzCqG|39NuK)xl=_YADtO2Fk$q7L>DT{{Q5PM&=q@zYfJ=`Dh%O z4@}CgNOG=>oSz^$Uy7X1COqB>9t+HJ&kJ=erjN)PU>bZk9qk^H_c_RUxy`!>iBa3e zxZZjs>JRb5PBeFM+sk-gRdjVNyZa7LW*wZ+I(6N9jZWw zED|@*#!ac^KECK=XU<&gFJoUQ6^Np34_Zt0i1$I=~F$hw#E4^;c%tpuph~_GWM@x`@ zx1x>R3BGfUt+U{{RfMZta5XcMlW3{BX5xOwT>Srio0ICSV@xUhq7mWhDj72){mMRi zoLtW0y_;xI1sZ&Yn7Y=MxQa=R=}RHY9B?Tfj348#0+*{TpUW+0vcJUFZOkO%vyOq!7G|#@97wfFy}nE8wJ+Y4BL99SJe0zn z|8i_UfbhQw{Qph%4e{gowuB$KHmb+{%?Z!vgX1-p=TAuvoq`OEIh*)$Hhg(6;lC#M zzlLyEI>47}Qdfj)i9i&5iTd(k^efuw@6teN_ua5|7A>F(RP2`%d_L*X<>k;H7_YgG2 zT0Xpg0QaTDa40_oz|Vsuhjg1m3E))iL*2qvNIT%H5@1E$5`8YP`ZS2eSIol0&BV`h z;O9dGTS<%ULQ=0=pj}f>%nF42%9i^VN!$`PZdJlbTkM}@IcevKpYpSNO`ikpPC?gj zttUqw`R4&24r&dbxk7Tj5jn3QI$UUV=mAW89x&z|l6P^NcRic8;1UgW4ya^#lWW71 z$vAK(#(@DeeyL#mZ$@}+gZ?W9G4@T{PV(Q1{GW=|Oz2mGb8m7MXnx%xF-^1%B>HDI zclD;$+X0*VNYB0VDRIjN?P+St3Gi(reddoG49>#R1T2)C_(t*qsCSqz_YC*#}8gtuG4 zTQQ4I@X9`lPd=kl)-!87{Z6yEbYH#hlNn&@h9ifbrVQyn#rFSetX?$!SwX$znhy!~ z?Z7^d@Pa1_;X1g?kGPgVe1D1Mwlcw2$l|-)lmEYD-Z&fea+PPlPQ>RATA$Y-n364~ z<;1I{gPgmYy=43w2|sQIuITuy$Bm-Ati&ghI;sY2^$4zl7S|f0M+@MRPtvJt_D$R7 z;iW0*Kgst0C%oWVE8PJv>_q#B)Y7HU`f{uHdcs{P%Uv6SLGDtOde|AmFMgFx#(|MU z*L_yk+&uSK(AKV}I+NH58~Yl|9T9QVi(Un zN^)+BxW#PFM`Qa(bIL5_K8LZv*2`Ryvs|_MgN!qyFwR_#oKnH7#?oW$`%i1y9B25; zn_;L4UE7Nmx}G~Ts0sPpg(9_{CfpXa+bTHaGM?5PxBTJZy>d~5ViRd_;S^S@RZWptyi+uD-SVMPyBf> zrpfnk4lZRLAzXF@m!;6RdRDz4D~yKdyP)M_D*PbzUGP5$4c^CsXGfx4k9M8)#L-wD z%A4FXU*E&cEznJJP`-4(p@D9h<~aHda|~-r|4zO17x7Xpc&WLUpVFoh;h+KXPYO8L zH|=@CVK;F2r578XlIh8NBk|G$GR}h&mnUTWIE9#n@m&~`P4ANyK6DM!?DYF-a6XLW zSReTnusU~(;ZzO8M=Rk0*Ky-!=)T2jKZVrg7}RASuLfq-`-IcUJtkv7W*GD z->E;OevWu}9O%bo9wRlo2sQh!SN9~-3b^y@GORAqN;HzQX2W89D`puhs{Z0$H|N36 zS3!%gR{nc!^aiWL*M!T#;PPb;7q2;LP~0^*sKHz_HikFqkEKNWanQcl9=DH0o9>n) z&0SgQXmy?JiJ9T)cR#7C2T@luXrDO$O}Lu|?#g@OU2OA5N~gy#`FT9@AMEu3o>4*c zywU18--Gv@*lWt8c&HZeO3mt~YvOQxXo2-G#u4K0#qjq8qD=>@O^G>fkIn*D-HCr| z!@sLNm>&ffu65o`;9@J<&6bm+MBj&@Z?l+A>Qmf3VlMH-o`-y+J8!dT%v7ztL^okeqSSg z-Db5Z;fXtm_@WMcabql|@-OED`hbfx;MN@U+Rv+r{9|^x`h!pKn%;=$u?l)@i^b6X zN}=!Vp4ZmJyrKKaI{Z)K#r^Q&dct#U%X4K9S6Lg}$M8!~n_vDvti1<(7FGH^ev?1~ zBqRhv4J83WP3XP%-g{9I=^dm9iV^`u#NH89L`4)`3pT`p1+imY*S2fjRd?65uXX*M zXXbgxFgxe&_y76)htDN}dFMXoIp;k0-kEpad5H$QRfB$ngU#UJUgTLeFO~Vu-q+nu zFgI7sbG^Ro7>p|qBSyGhC|mo3Dy$*p-S?`9k5xr1chkE9uAXcrJ}H4uZX)=a1o()su(E~oN?3*6 z2p^AwkF_MHi;+_SxJX*t+^oL7DwdO7PnN58QvF{KlcD1N$c)C$oCfI|jbDRp9(bFNRxK7+ zUMF#7-Ov*4FX&tHx6M8eAmh8#NqAm3z}-ajU#I#nA>O+Uee6}P>kur0L)xdnBJ;Ln zBb#|#{3V;rpTDT43&xM{zW9b5D`TH?`!uu)B2O&FUe~T}kCF9rNz>@_nx{>^vX?_*= zC(j3YV5mRtY(1UeTnL;m5wD!CUilg|7p+;Vg_d~7Sib9OAi>sDvE=|;R6l!f_YKug z?(5k}{CEfS*{2%KCLXE;4;>)-9f5u$WB3ez6W}YsT>2XsQ{|#i#G{} z&w;}q)SnYSvL{> zmVm!bvHopt2*)2he~GNM&w#&=5N`jV-1gAE1($55&Fg`8@jOi8$xL{1t%sBSnveAv zbdJB4BA>5`4lh85;lLx~zu~d<**(BxYczSvPBq-nEj25faVi9VVl&=M&-9>w%qwJndEK8=A$g5^ukt$|`pCFw+(`c6Rtr4fi%T%3 zrv{&dYVTSSe;kEBh7la8ien43i1K9P&z*s<<=h3|E$HESH2P0kLsUTj6NnFRhco^x zTlxj@P-S?i7s=^Wz-Ur)?9>V(^Y=2h+O6(muS7%{3!2v z?j{`WQ$LHFpCDfAh}SHQ^=+|bto*=(cO2p9b#SzXaNk&Kus-2v1voktJS3f`WP*n* zw907NXg!Gz_o)tFda%zV*xv;9M+u*|E1&Ja=efu)Goq7xzEb80JgpsnvT>y*e8;+F zaQ4v~?_A?~B&Er|$cEp3^6M%ze>#) zU^OrhR}cP3`tBC=UC`n>;;jeOTl0vCHp$@?#wciemOcC*SZ|x1SJ^q0T*bN! z-WI(qPkSw%SnFPZCQ17aK$9~NH>u|8h3EIBnYf^z%PZXZUodqL_4Bd*-d zYFGR^x$2&N9wof21uwsln*10#e2SKjek*C-lDoY>C*Ss515NH7l54y29kzqzMLC@{Qj2vWobiJABa4!^N|Ni_^hH!%LIL$13;)!XV_=!qaa{ z9GkRWNW~bF0^g_LDOB^3Uy{~RDUXyU`zsIJcJRb~PxFcMeFpN`OZaZ6eE&*(`v|m} zM8?Eae0nJ#>%%%DlRf`8cxH`P$L8qWeB0dh@#J<2!5~l5%ZKaELL8|R+hpY`o7IO! z85)aW^FVO!L44E$K3b<$&+y@^MX7zMc6z#J6!n`ZT|vfn%>i6J3|Y`mlAALk8Wk ze;M{Cc_JVCo+A3;6BPL4TbDRoc0SRGzm>%n^k z_=t~n2&k>LG zMEq_mlIj;j|^S0z`xo-mE&1mNY*i+pDB*uEgkojvTc(L(Y zw2)_ar{HHDoO#LnM)Its+IXeRCNj@uot-=m;f_)_lhpj*;hD1&IF@)D1DyD7b)wbqNshPBbpdFVf>PGrux2s{c`!jb%uI+b^&DnY+A?2#Et-cQF61m! zVmue)(l|dYz=->NNsea)IpUc*#0!su-77p=-|NXcy=U_Jp@Dj{*WqNn&cyhC6~TMD z;(dsCqZZgm@jUMZf$U5Qvz z)pVjoGyMAta2S7`y#Cu1yY??v$=bWd@JqB#42!&Hdv6S<`CIzEifH>aw7u8E*_$5k zHYeV#uiic2!SfyRP0B;w)0{~>e-`pT;KBMX@k(`YEF+<;VWVT=ArHQvV)%?pne(@j zao|aKUS+v3>uIzcSBL#H%w1>mO{-gEDO*EaYmU$h7=U(=I_SvUg<-0b{ z!I~qF4(M$o@#6;g@m-IHMrwTsK8X|lk+|Xd?j28lwV_|MJ`AV$Zx8X`Q(!%1#qr14 z_#orVN3nRe&tatcTWp`jllixTr_cVxgMHw^nI!)TntuyVjyZ@K^`KxCk5vggR@=P} z|H}Td9Pkfp-^0H@p?wEkqT{KZ^LGtAoUK>COWZ#_dAA`o^!Jo-?Z27$x;A{hi+H9K zo>>H5%)7#Kxc(DAmq2q_$>4i;J-D7B`acc*8xY=d0$^R${Sz>bu2$+ z+XUXKdh$D;@Fw?8fU?r@z$0ETjP~rgu8Mfcdp2j+dNO)5*!yD zTf}oRwrmO3&Gp^bn17<4+(R&>DW)Ze8|~Zl{3y^8=k4g*YG3%Yaj85qu8$dKB(9#W zAbq^2eRTBHT1S%Gxq418g>asQ_%cWIM&EJ#!cFHu_j;~;rDUz2foD$A+>9?9*D}#> zcpi%9+junV>)H1@@pwKwzJt_lf7IgmZ_@c0*?<$i06NS=SO<<`JRlw=U^Ne z<-xkms)wY zZ)^-Od~XF~0Ir8AZ`P+>Gn1Cd#RofM~ zFA2w4;CK_!FdZ81)jTXe`6=T~MxcM1yMX8;3U?y>Z2^DJgFn&E`Za!z2K>o$0IRyR zUdjAd2Ihi|$@}WzxcxC6EQWA&0^#;WaJ!a_8Nb614|@81i+JJ1AQ!9^iPi(5bv2S> zHgbFdG2SH=14iiyoT_Y zhMHgAM~3vE=iv&hz1RyLAg^yZt=1JiEtoz z((zRJT4)8}KB?bAyk;8VHW%C;CER6zyQ&(~^s<=Q8nZRg`(R3VUil;8w-WdrLA)>+ zUf4yry#U<)O!TY>J)b7L9|i9#2?tfd!N-Jyir}Cz;k}}Aa5u1Ki743YeLea8LSVfV z?Mk%mXxE|Lh;|FwZD`wx)&Y<3|@DV9P^Ol0uPqQi5`W}V+_%wg63au zbn<K0a~Ik@X#3Ib zM>~Kf*G+GX;kP+M-fMi9V5|v@x8S(wTG_70+C4V%%!1{F@5bFC z!@3XNxij#Oa}Sc(l{NMb=q&G7n2*QY&z~AKw$4cJ!=&=I`-nzh>^`K~9w#K$PdJX)F=ielH z=Roh~za-BCBXR5o!rxBtcb(ReV3f`LD|am(BwnZqFZ}4?Z!3v+1LEBli)UVt`&cG} zn`r*FHtd6Y#`Dmoll{GQ|6Q@Zqq)pb-h(9Zm&L{HmhSJwC$->{`(u6Daf0_O;)5pe zL6w!sYiIHNY?4PW&7%Z9NIEy#i*Y2JGs1gH4|=f8Coy_zj9o;dUC?MW@zN-GX))=y zhxYq~2h(zLYsr!pSM9fA>*Tts0)?7FWAUqO zVXcPl$kg$CJ?XoP_I(tXqkcDU?bWej5PXpIKEs}4KInkiE_@%kl*H<+v2w0Ro-gGb zdvomAFc+CggYU<2Zxft11~?1d7~qt-*fy&>`E10^q(+*eMz)c-9X0L*Prv_xSA;u@ zWwGnQD}`v?RU6~fa;g+)Q^9>4%gOqwj+}(kDY4krkBq}dh@WnTpH3sSGX}NudCa30 zQ{r6}<3jey8moiqS3-Q43m<;t>Gy_Mzs3VT`G-Gvp1dc|w@IG2BG2)}`x)x}j>Kx+=QAa#4Pa~@mn+aEyL6A12Ig-Q(NV!*_h<| zX#lTf$NDv|bVdU6V?MN8tKk}XU9?@qFJs}C#|Wl2ifI(_L{)g=N21+cXjk2X_b`ds zI*eI*YD9O@$LvxoZy1wM7|EfQCrFd}t1i1@7${C2K~$96GH z(b{>Ecx@cK_CXAf`Lq~lWbL(rc&!?|))_J5H7R4)lR7_K8u3h6SE2Idb*%V90#|bU ztH34WZ6VS24ru##f?HS=+_S)A(mYWF9-E`>BG}Rt+jpe@7TSM_VgpQ!*Md6S?gX|? z#CHwgyAd&+>{uBy4yoT|c9YHa*^^U*lj@t3{oVq;93Si3JP@oD`XsNhn`=II6FyRv zk14Uf4V&P8iRk!>>i9YF-+1glk$C6{^-w0k-Ar*`NBo%we-0!5xeFRqBmFkjexD+I z$TzRbxV6~B$E`&F0_cAMsqd!n1M6VL)RUceL=RC<%j(;iOqKmsT z7Tb7`XJTANYGFTgn+{ykuWX{3^;-vc1k?UlzfoPkCBCcyU(QCqb`4sNG0)5A@xyGL z`v%%4U1x3x?Hi#rMk_*Vg7%mPN4uE645Q3jTZqmj(0LTmc``U%8pCgT)dGIg>qrcf zaW1uY2jToaaJ~k8Cvjd=Id8P;c&#NL(Yh7xnXHGOpAnz5hEHCOVKOeH4hIqsy{H~~ z({pTYo8+;!CbVu%@RkI4v)yKrZ;ikUE!_da)q~*b!q~CKMRgpDF}d_Z59S`gl{A(M zhkqcxXa!$fPGZWK(h~1}tR=pg0v-#lOg?XG3J-tb!Fm$3iC%k=_hCiz7tp7DK1i;` z$=x#B3BGCpzC8Cj;qxKznKd>UUt4%*SFB$f3#y`D84E^v`25L}+Y;m!-W!&NjQ)Fl zDeKHaj25?%__-RtEAe10^!_o)`5-B;#p#ojJU|D4(vHLbR?ePI@l+T;vgG z{XD^#qZk{+G>K}xF2=3t*)rhPx$UaAI9N72HuNvPAA)c=2K-G>4qqquvK3z@$?b9E zwwd5-q4HYo|@Ow+NVzd&p zR%r6g=I?_mTc-*RyKgsKh2ZXHf+qvL$(VA4;AyOQKKcKk#Tvp(I(TVJaHK1a`-zTq zq2p@=Vh;DHi?N#1V|ZbpzX3!h+eKY^EMotYQpd}aah&NJ}N z<77N*11+}^{%|$beL^^>t{ilUA_Pjch=s)YL);JyluO}cJy1p7ko)^k62a1AHLRC#tIN0!wGCgDskpu*ITa$O z{e+7waM4mVw3wo=teg%9`QZ8O#5XacL@K#g2H<21Sf*MI_n_ROEk;}6r zmu%!xh?r5YT2A8QUdS_PpVaF#;?tAC!8(#-1LU}q%po12b0@T+v6xmnGMBbiehj1h z6y6&uKRH(=p96M;PpT7snt-482|rcA&-o;m0^~A|_~2>vK^KCzQ1Si@pCrwvz2TF- zX#Hcyo6k~$#zYP~b`|1@Cqs(AuKOIChlqR|Nk4PJAk# z>#Fj6^10b_@ac^)-iSz4{hG@%Xd-#r z|J(B>HmWAIf~yg-BF1y)WBS|JQYFy8sq0ESR|EV`CN(e=dVZ#SB1Etm7QufH@F#hu zDe#BaNy77_YY4U+#rAb9hH=;e>#MWi8Q~!MzK#Ha+gw+)ZfM=ndZ679)55UI_;-+C zO+AKH&gurZ65@jw;DdLFw`alITS(2H4XrZV;yFLXax`qh<0zs{O(428#+@7|b7Z#G zb@g+TecKhDUP*Kv4qacQp6=kTAi0zVxy6a5R^P3Es+zcP`1b7IJ+jhROPs zy53DNZ3r-}nqS?6=_B+TUI#%(*z7)X8PjAPB2UKoooG87+TH;VCY_J=gy(vp^+xN1 z))%cG+Dn9kEal+y7@jh3mj{}T_$)5wb)suG=sJ~n^hJ2|e!|mP0Z+vFCZJ71n}&7*+KFfi6*#Pdivf#bgvEFzxU|gD%PiAlK1A`B|KMB zp06kV9|`~e;)(e*;qc6W!*Z^(2h%46Q$@v;`tb4dMbzVcV*T1a86*Bl`mLb-R`T@w z8p&sUkk7oOP5u*NvUms=Z1dp#SIC^*A3lG8@H-m(?jU;Cf!;rmTrxD5s>mg2-h4Ok znR6pzJeeotIXDYQ-E>FYyayhlbG79wW5XuYl+0zeW(*mSxfjnz0%n_sh-z_i1Ql&*^IBCdKkHe4>B(H6bVXHJAZp zpUea40cW}H1kbTKI5sJ7nHOirj*D`6fM}QxKE5TMIz8~zDKp!~{Am5knrSrg+kE)# zed4LH@Khbbfp9IkEcN8lm3ZnIs3h}CYP;h-CwPV5bwNIz+{MIKJ>aX~NsSCZjhq(4 z6xFn`N0SFJJP4t6a(eY`>Rs|)?UCOnS^&zn4$+Yt@QsRpBC zx?8@&aSg)pTIF~J@x=o8;u+Lud`u91&d1!{0eoBx%<=ugU8b(JPm19x^J7QXUvo07 z@>BY5pgEj6a6eo}+hKz+q*4 z*0DOCR)9_z6$x;C`6nA~9`<99~{ zzlQj7A$(aWCt0id;P*lGhVf>3q$7vsgrBM4XCp90YhTVFWD`swyYjAwbHj;G24U}c zo}8C@#*7b$XM4f36To}YJR;~WLcAnD;3^-O7~obB&1K}4vHMw~xjdz}BHHE3iFv~O zHU=t9L6djpB+hg)#$;lpo`F_K^lE^kx04)%cloZ<{zS9s(CiJObtPcmg?^dG(t@5( zZ8qP-?W4qhi{QV!7yf(Pldpjx4X&P`$A?dQ!P(WSJw%JtK#N>An(&P) zo$h?iQ83G9=f0A;JoU6So_Fvb@z-K-a1r5X6^?&QIXV*4#`qKlRuTSZfd7}tak56- zkDM!qkb}Q-@oX;H=(ZuVAVqOrgrQY)cFEn+nNiFmN zZ@a-u(!7!ZK5;hynCyjTpW%K}^}O&co4ubd-_g(+tp7&*vIN|2BYMw--k*5%e$K;r zeZqMaaK4XdeJZqmM73T;xNn4PCU|`CT8wKMbA;&FZ z!PFR-zKih`9qXXbTQ)el{GkKNlQUMSF~RcLcoq0pUTO zjVg2ZuQ9yVzr2V23^+(yudaYT8NqpsJ@r}csKMt(2&b0@oYr@L^Y~;k@qS-qm~k+< z#ZD<#wU5q9*b}!+04mf@d`NYpN#1qSddRrt??}4t$y&<>x9R} z;BhD6aifkA?PA)Rc4r3s3~;qQcvIT{w=cwt%K|U1D!4;qlT ztc9CN{ILT5c$oCPL^Wyc;Uy28Cyi%I!MWU-9NsBdh|h(D&x^c?_(ta0@iFbq`zw{Z zi`9?z|CVD-PXV6jKI2x#ir0ykY)w#1ytpLr;>uOc ziPoc`^hnVj{8_YKQ^V?XSn1MrK#R<2WSqE8xi%cOZx)VQ zgeGgKuZiCW$_N?j+xn5Q-H7lt1kFD80*(~mhpTe8IQ+-i9KZes0BP7W7-*3@x?QUm&9F< zfZIB5JmIGV{M0@#`Mi1%{PG9jiT5jB&Bs*$!IU~6`Ph2kpoii$oOpS#r9jV@fH!*m z$6h1X&AJ7com)%BycT#xH^}of(RDR+JwR|b3~=YUO{DMU+IJ0-SAFDlYi#VW_lGjX z!;z~YiwNhf!1-1ZzgZaH-A+6*9v=BCxRYA6HKkpTZ4ch$*@t-A5dMVMWbY;(UKDtE z#-JC$ljvalTc72@lYEC!Gwi#BU~Q^c`x5`i69P|)c-CTw2~y#Kt4P01wBJ8^Y9R-R zZM_ujcMY^}NwjMK?RJuwMH+J>(M+zS?;^)G4v#JUvj^{gV&j2fmT_he>9>*g`ZH=9BL@ zl)K6BxjDjn8@%E^f>lNe83%F@Cuxj&3SJO?-ypR#0g>O1)raIM_4RYGZEkFR^pmpWiHuIJkS;%I7)EU3vrdUMBJo)MgQ-iane2+_x?!w zt*iOYBV0BFmp^;@{SEu#-Ca(3$y*5oj-u?k0Cw6ReqvwV3cL3cf@5Z3cd~672F0vtYk9hTSmM4X_VzqY17`ifbA1

=F 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 )*Yu|I9glE(I z4eid)xbu|a0sc{sD|eD9PZ@`%_*F~3^UG?A2G5oF9ShISE^Wep($9s5#=-NlKH()e zQ}L8Puj2lA#V=SF;P?3Wvx@(~u1u7lK0ZP5AK3|xekvb-PVtMZe@Hvb$DddHC+jEp z6(66d_|MkQaKAq%!3$YmSu*}2?E~@s|`o!yb3oQ$9Xb@w2S$nA)Gy;3e1xc2@Y{lPWXFu}s70>^|=P3R@YtHh?+{foC{(&XqZaVt-JjFk>K7^0; z@z)eT%<7obr#?Pk@sC(-H?=<(z$>s0?*aHht)Ga07ApRZ^$z@ok1tYuH+vJ3UVicX zFZzoW-@~f%gtLz?QGBnp7ygWoFI9Y>CF6|V^zmhi?`PMR)c#x!ucr2Nq1~qSv+~^6 z72jlSLjRVJzoGbMb~+=AUiJJb`fn<}h20hD|M&3~if?5f3RaBv@s)~iv$nw}`uHlv zw_Drc{&-&vuWh|)t%I-7`gwTn8pT(#PaWlnkH4k(Dpu~Lp8VDGr|7R$e6_V2ey@+O zQ+y43xKTd%_B5M)+gpY4l zd@(za@O{q5wto}~>!pFBMzKr#s=^ys-?TRnAmc#ww`8K?n z^{Vw6e5}?liTgVgS38{ETE86b?^FB*>jn5bKE7Y^7p)iJXMFsC;JP#kD^(*84`-+dX z#=;l+_y>xQV`ozAT_68Y@$syd&HM}>Kdkt(*0b=uzkB`{_dim6f+gcCYy0>S#h+uh zfYko{7~X|FQDyw*BU-;E?i^M8G3zn-Y#;wb@sZX@_$%e&^zk!__p)R>Z`waSe~SBO6@P>s zZs|Ah@pFpzX4Uo7{`?L;*lKHafj8Cqt#Rjj#oMz|JL4dH{Ji2FtPb$mK7K**j#fwb z9v}ZfaoHyf|NHolig#iM3)&esJ^#ydFDl;I>I{$N_lGPi^b`Cst0{XIrEswWFTqD@ zUP8Om5qB;te!q1;`t5xDisCKU2bl4nKK_g1E!jzzej6XZs`vxe1MuTM{;T4xtXA;9 zeEgc?t=Tm-#h*R!|8MZoR&915PT}JJ-{DVdUig+54&Cwp4aMtO_0VtT<9{e#->MHE z=;MDX-oR=ApW)*-6>rE+u6%#-@mq>FV!r_T9ew;S#T#3V;Wy!8Z}-Rl!k@J&S~cOv z*Lz(2FW(&}XrAdW&;R}KzomE;s|xzneLSFeRo23%yz%j%;?=Bb@aKHoR=hgL*A{|kSPHTds=r!!174ri!kmiKsBt1SGG@4e*v>+@QF zcM1;)pJ)|luLW7{#&c%`?s&Wedr7iy23(#yisuTSYGt>I!YAO4jQ<&_^`}~SIryHL z;(nQQ=ugx7?}_`kGm`L3R6M_xAN|Z`3Qwc(Gh3PA zFZ+0s;#sUL@O^N3uPMBj@P*dzY~z>mUXyq)kKZzHp}O4nUNR0~k=Fk~yFUs46jq!D zEbbHxdj1q%L~&YB@YX(FRPlfnfKT@EVu}Z?Abhuv7gwB3s^OP?yoBP8<-qgX-g~{u zdkKHT`p*0f6ibKGc`uLu#ER>LkMF(8qW`AW?}IzZgwJ&RUrzDM=4JE`_;`86Wp5$o zg)qr5rhkv(znH(khxz!uieF{76~4ducm>6OW#>ww#7%LhqT<)gYw#g(1OLqDy@ao| zj;VQ3v2-|(_wx9c=9j3-UVEZ1eQSOTU+Lqu6+g|MB=pz#cpb&hu!9Tr$hzD940&Ak9K^2v z8~>2qJ}LM9#t*R%DCPX$_&)Ohd|@14Z|ySozzcsWt-n(1Z?LwT+u^diq2YzI^8ZF_qqzm%N$aoH`WvlH>{?6z#^3Z;nQPz={f)0> zpHu9LwYS}O>*CLi)@*Y&Ty_RD^m9Ev)Eo|%y;V~45^8st_J8Bv`aL!O#`7BmaU$#A zcy8vL)Bm+5-u>*%rKg|wZ#(EOZZbh-dOP#2`%7-x2L!-6ehbAf*_n%l=)D}L4%yEW0rA5{FLE%x}*%_;78 zRQzLG+AFfh8u6>bt+V1sY-!(&^6_qpf5d)Zq$?lqq4;52+D~qE$y=eA0Mpv`?j>_Zfr{N&oIT`W8Y%NBl!4m#WUHN;H!LmgyM;IqPXwlk12jC zAmc-;dig@V??}bRnqx`l>3sZ2#qTrkga5iV#XnCg-q>smm)+@O;WkF`a;#3qI=w#r zjN+x$`dC9BPthN%cx-*CppkmLQ(3!I)-6p$WQ|f;x0KZ3 z%NUFdMVNugO30SMOi@-!wq!=9!7NRKnU}^mIgXV6j+b-C}hIi$fU#v+UqF(x34=r9BTK&a$rn6E!&r?8p9WQ!X4pDhNsdLhIL{1u3mCX~`HP5Ly;ug^R^%VBHy5LdG&=Ir2L42J#lN8d-_F ziL6D|A?uM1$VOxnvKiTeY(=&qB}o%^Bc+kDNO`0JQVFSoR6}YYHIaHq1EdMk47nd^ ziL^r6AZ?NMNN1!g(hcc>^g?*Afs8~(Ax|Qskuk_vWIQqfc^;XB zOhH~mrXnvRuOKrFleHp=dt@H+8ZsYQfGk87A&ZeE$Wmk(vK)CGc>{S9nT4!CR^irL zoYx`ikqyX3WD~L(*@A3EwjtY*w~-ylPGlGI4ze5BgD}(4*vI(*au7L$yoId62wF5|SS&h!jF@^88!KUx>lIiQM2i$~gy;4=I2YMv5ZE zk&?*WNNJ=jQXaV%sfbiYsv^~qWTXyK3#pIPMH(RukS0iDq#1HQ(h_Nfv_aY;?U9a1 zC!`DVFw!0Ai9CYzLHZ#Bkb%fxWGFHmc?@|Rc>;L~c^Y{J8HYTJJcmp~CL=E(Q;`>u z>Bux>2J#9r8<~mBL*^h0kk^pK$U`I2tU}fxYmxQHMr1Rx9eEqsf$T)K zBD;}2$S!0*asb(jyo($}K0w|>K14o7K0-c4jv}8U$B^U5N#q3b4e}Lo8aaiWLCzuP zkspx@$WO>+_{Epl}{zPsfw~)UO3RjW`X%z_~HsT;I5<((K6iGnR zAZd|wNO~j#k`c*-WJakf+CS|Sf1t&ldzgGgJX9nv1@fOJASBVCZL$iqlCgx*wo+$pn>N08n~AEYnR z9T|W;iVQ>sA%l@2NI%OohH<8sjhj*q|prL26N=SUpw;OtKmlJ*_OrrpWySUhFt_xQiLlm6rANw|%> zgZ`bK5ntBDyBYKIkvRA6W%o{cM(TlB9a#_>-dV*fpstQ9UF=N8}Vm< z_R)ME`W0e*8O%+cDkFSN|R+@oxW{ZQ+l@54C%K zze$Mbj4zmuQ-oA->xV^zj|#rygH>v)V0Lw`KV zxV3oy$o;2B82g1>Y3`$pR}!6koV)7l z=QxXBMOXarA@?!=(S>unJyV|RJ|gIdUQB-;O#CbN;`UMQPa`*x{C~1$88QLcg2?Z? zIG@wkGJYp3B3#@Q9XaQN$+@{cKfyWXr=|aai9e3;dx-HT{_EJY#cz_n%JO>?qzCde z68rt1{Br~y@sEsmk@H#3G5=IztjIqx@xu%JF5^l3*YZ5MuSYN0AmlYf!r(Gzi?J2| zfBG#W{`n_=-p6mfk)g-}MBd>DXKBNo;%w6@u7bqk_fLH-I;9x%&=Q%1?9lQnXBqR* z3X#9*zUGx3Bf@iIJ4wb8{_! zFa9dVwLJ3y-|t=Y@8YKc`uAAa$@62s&x-qP1^4m(?VXOV0>}bn86wY$?LBuy-%Gi2 zf$MaM-tV#d{Big9#@*N9UjFV;eSSrs*XZ+JeLknp7JHho9n{HH#rWx;Ocu0Ge&=WhBuQlFpK=jHmmOP|l_vy;(tr>H*H(dP&CxraWF z(&tH>cgr;*;VS$2$$cbKN;u1Xao@e@^yU6g9J|SVrp%_%9`VP~3*0Y_V;AG@MMwT# zo;5cM`5TF3_1uv(EAHjwz62uar!nUTk=}^>7E9M-xqlgXL-Y4IpF}Pp$t-@}7>Vf% zYt6m?IWfJS@K@q={MHefhRpNnz3IFDjBEM3-#OnY3?-Z@4AAaCm53voX} zv)4GULf%H+M=m1qzX>mt^!NAe2zwNnK|KXD40)H3u1=B>f&>fg#fi2bAGK3Geno&N0> zb!bc;fsH_()xSx78Iy8%F?I?*P5<@{_c0m3^M+pv8|_2bM%!=L9@ z(J!q<_5uBX-#*iS_Z{b${K~bR-!w8K@^=L|$D|b3)sUC5$>q0CKBZ4oi|i-bnBQ6; z@>@I3G3n0rAmk}T(uQhx5RbAisqC{VG7FKu(xsgLNk{e^U8jGSw7rGv6Ua4T1x%wp z(g~5je@vg{SyInU;eI|MT+)<0dp*}8Vrz=s8GEi@|9{clid+BW?kRo~zla?y_ORH+ zS7A8{{%?QtPx?if)K#Db^G%Uv$U}%l*(qm+ju;M-fFvTBkSa*2>V{F1^AuzzBIVB- zeU`8|&GmVtHf~?#>}Rp-_}^k&{%%oG(^!u9S^T}|_tvypt8 zZh>L6fyJ&X7dMUj5&8QbjG3xmiSmfooyZu2IegoH&p5D^&(VRI zH+tAT?4I`19AoUc_B{JFd#k<8-fqkOwHf*S*T5gFQSnzG5Dc>BMK~B?1&wsUMAqZT z9Ly37*)T6d$njbqGO+F-B|gurBTk?HU(S^2|4Hyu2So6XJc=5_PAMciU;DYuMU z!L8)haBI5t-G=TMv>3Ezqz$DFJrn9P!eA5#?KH-4JjrBMmL9>%gyf=bc?$s-Lh_Zx3XK+t>xBn8@cznUEPP>sqV|}tL{wRZV8o(##%A4vy~CS2|6y>U-QQTC5sWz@06=ymINt3aS&piH1_U_ju}z@@H!QE91&!hrdyT z=Ch1@nZfv#w+YWyW;?SNYkR)rOeb{aI~$yB&Ms%a^MP}ekowm7-nr=f;#?=hg6>0v zM^Cq}JIEd3KIx8gClWTV>X_fN)kDX2igQPFtso)72T}JmI8s6Ws?`$+w25vQnA)|r^l zh*Tq5qZ8hp>%C2oRrzHNjV#c1tW+VZUi9M_KzU~bPZE2}h@S(*!FSOB;aZ4rt3ntZ zB|%AOup4!PthtcHb>2Y9!1++#@WbI*;bY+w;p~w-k%5spk=Kav)wr?~cMjvy6=F=> z%0#S)d*yJkHg3vZBjUSP!&M32^jzIzWVI8WJWdZMYbbx{y-=<2lJIxo(vfPBMvmO?eqz@Dx500N-*arIEX|55vTyTB#+0pMEZADch3!$tUPgZ% zWrUX;pHd8krp_ zOWLhPnjKD=C8d7Xgl-9=6NXc2VYnLJuG=>#+Y>3%i&2)>Ft1q>NAm;A18V}C1G@r; zc&FomuwBwFi~nok|5kPf%80)9FiMCC_EgG;CH5*xhduT!l584MYY9?n4N_`zQfXIb zFljWA8Yv&OQ5kBYn$$uMg?ffog|>zcgieOeg?z-e!;gdq zg`W&h4!;^+5MCeNA3hR39sVsGj%13Yym7ZkfAzL6L}pSREsv~@Y@|dw7&#m{5&4c> za4V8P`p+FL5iJ|75p5pr6dg|8F`hbOPIPf}MRa|1dvtH~{pcs;kh9T?(Oc1U2}ud1 z6DlSoCp1VHPDv&?I805MDRfupUTUN|p?aYfthz6I`$^iq$Y1Q5#o8NOPf(@$K~=7Q zs><~Xs$~DwX|GE2(W*S3tV;A1svQ49mE`ACS#E?ftCGAFWqAc^z9F|u@?F$O5_gG& z`2<^b&yiBy3!i5Qp%=q5!yiVEMP+|KNgtm?U#D=9tELIX=FpeL)q?Qy@SEWk;gy8t z=J3|=_VC+;=^;Y(Q}W@l@Nx3u2}1Zn_^0sC;Y)<{AK{zfzrsc&97!O|vqiFVcYG$;MF(cIN@W@C~;y9faXObG{aO8>Ri{|Gj z5G@of5-k}m6)hjF5Umug9IY9x6Rj7mAH6^NK(sYSn`ql;`)KFr!^Dh~ccG()eyt`8R~qRYJ%nY|;}pLwVDuc+*MbxmQVv&3J={@b{CXwaKKl zgoJbnx$$9jQdK?DmCSpR65@ne!fNd`Z+H(^aspxkUfSZ20MpkmrY4& zrTObK6jeeaYFA*--btfs{ntWgv@4Pym#h4^-!HnV_%+emo%=Z^rO<*xAG;FqZvp&Z$ z>lEebPuNYjY*{~isoO-Cg0HX|mdve?cg)C)3b8t5&p)}(9le`;*fn}=w)a*RJH+gy z{VKmzHfl2Bzp>g^QG7ioDl_6FWPW5GTyExMmbS`S6L=GO^UR^URX%ALx}UO5^xG!9 zG*9+QXS5QfRZYsOTJ{5!R;}#zlvo|?KIEUi_7Gxqm_432onXI2={40}O!>9MUO||x zvfm+o_t-&d-Y6wmUCOZf&Om1nW!PY6sPi}_*%QtRO0HF*&6HkSL;EPf4upj|yhSGCerzNkow=$|k!VF!oQK@8#5E@VvqR3FV z3;*|Lt^Mt+x)1l`|2+TU_xm~fb)CKT=ezdWYp=bAYhBm1uBDYRx=;It51|KC@7XG~ z4e`(AIlAftr@q###L-g^Vo`h@bGkCjE$+xT54?PxA9HlAhX+oEKgc*2A+^3Hlk0C&hemjji#CcZO;2Z_?hi zwodt4MxRh4C_%l~>~II`62E564(zWWn9gd(mhGcPRjEp`3di2CFM7)5*546_ z-(n_RgtRqV5Ans74?kcf!ZKlHW}R~=O?~llNfqd!=1^vO<3_34MOUGX8IRVmp>~H@-O44Fnuk-T-rGut;SxA8kP3Nt26b@S? z)k^M>yoR2m2K~fy^bLtVVJvO`GwQwSr*>J`$;|XOW~3o=_%$gnrgW!72J_oPY4hO6 z9)XW|Hf=d=d_~#|a1tBRHqq8Mr)^Dp2aaM}+WToAQD&df?mvf@_$lou?f>Vr<8Tv6 z>8XsG8aE3tau!TKJ-ryEdM3vea1iY&-D^4e!q@dT(Gui^MQ;~<>EA!dF*WgKI^_dAErY%i0UULKD8%=3yf$IId@vUC9Bd}!kXDeaPl|9voB4`mE1h} zx0ES-b5j?>o5GB^H+hG-@f5=Pw)K*yP@Y8zt%4gn#&IRw(|8Wc9l3mw<%%p%WVxY& z=h&WbcWVB$c4<@7Hm0Sd_eh_fo{@3yc{cso8Co;0+I7gU5&V{N1^q+;uB?>Gi~e0o zRg9h^A*EVd%GS2`!tHSWyF;xS{h8yprbtsrax`3sVf)_UrK$M(Qs?(d#T$Q z5BD${ewBK_9N(q>0N3$L>haXyQh$fnPfbf>Of1BRSR$>YInGS0lvbIs@!YgpjEzmw zS~Cmi#5|xob449}()z-y3{JZ_Z5Z={v1yj`odxeZ*BlRISoy*HjD-APQHGTutjI`6 z5MIo%GK7s82^qqh8CHt$KK!$lB7B*#mJuUA?|CfcciLOX9%Mk3I2nGaS!BGlDtzjarN^uJyqlJljnuj(rz#K4PZd9FHGu@mg|4 z%C^+zX|>^do51sKuA$w#@eJnA@wX=}NM4z`Bh^pKlXiC6v>y>G z7D{iM-Zgzx`jqrz>8TmtWq6tSGD~Mph`;;H4EeBC-VcP|avToDBZ${4Y4`$hdUMkf zbL`F3LDj}W8B2@U(Ee~hbz5`Ai)o#<#?{K6cnxtD@*JT%as~34nnCEE@Zs=@aA~+Q zd^y|@ZVBHAzf5`}c>ujxL4MWDsc>o;qlcwclvw$uNYmwf#YTE z3O+FMSKFvk(b#iP+N#>V3e^#Mn9=ESv`6CdDuPhXY3hB8}EnY{^D`VoBTJ~-3E%;bMzE*~P#%0u}TrhGo7e7?-s zAD4sV7z^TZcr;uVK9#Js_$rmQtjuqpxs{SsKI(hZxkEMcR@N;}GV<=ZtU7#(V-YI} zSF&<%J96)@SSi-ezl&X$rt^*}>GH@|w-TnIc#Gh~H^GPNTOVRJbu{%?IQ_h|vodhw z7r=|F23*J7Y9Os6BtwuF9mH z$Rcpa(6n;GvS z*?2$W!}#eRXLLQ?=A%<)7B8YNwVj^2Ox(iOu>)Xl14HEO5!H(QXRebS1N>h0`;W_2$2vwznvqhHC3 zK1$lLqDUi4Baf_vM6w1l$vQ|S8zPr%nR1M~Ri`3!R%_zcKb9VD4R0ho7kyA;&MGNv z&uBL^D(_$L3OZQQX!wQvXk$92US+t3o`!1}0M{_oa19evZ)e_6n!Ac56;0ACFd_LV zg?6S)QrV<4(b1G=UhoF~DRx(L=JF#?l>F`FOWKr2(jHHH0vVr` z?ghF%B=4g1dPbJlD!ui;N%JJh8+nQ>uXsil zQoQo;;Adx?lTj<9c1Hb-MsPEiX0%0i*BO4iyOG-+H8Q&t_;1biC8w(h*IfgiyABeq zhRDNOW=7OO)fPzs>txh5Qov>z%`^JZtEilFd;PAo^=o1BqU5E?&nC;qi@5J1_-g3M zE_;vq!x;ajBeh-?9-{YBU2MVn@FJ;YQy0gh#56Q=@*%CSSeqI7Su1T_{K9Zb{pcq& znw6&ft*rYfA69iW-DpRiKQV$m-__RIy3FZcN?i}P`vGdl3^>=?aIJ09E`d88&%8)7 z*7x~hA2IWhB=vN@T(R`S89y>V@!4V_i5bah%t^}7e#&Pa9bW%bzwdhsJ0_(AJ*1f718%rN1?SZ86FPdKKb7trI_E!2LId1V-E^9RelFD9|(ay+P zC25srRT@?IYbCzYP+Dtoa_~74i6o>E(nTHb@F&?oS|x(1K7 zZ{sC+AKDh}3b-cuNhB8XsHX2(A~+gD$dHDt035~rMiTd!k;JVrlDJolByK01#%FLEpHhQb zk)J(iOls3ZU4TEldO>~sTptOJ(igQ4yM$LWN4z$aZtR9wJ9bkzlJWeuaBMi4x;Z1f zo3UN8(Ffs~=YxQd@X@a^c74R`YiD>c=H%sbXFtbJ zNk=$-L)Y?q(uK(vp=Z(l@@fmxooMc)c~f`Bk0tc`y&te8ep%{Q)F+kw@YLS)K9cp$ zV-~;M%-=ULZ`YjtGiK{Y%{)Do`MKui(xd)lbf-y1Us}lMNXut_MH^E)YKEVQ3Y1PE z!ky@c2H@9W9{wD}Ppvbun1mc=8=5p(6}0y|Ba7)xO<<70L&r~kgvRqsJPEd7UUW5{ zGY8|1bRr&JAHZwwGk7B2hgm=FR%D&ogFCo-l6u~6MkdzSMhkZ zKjVAaukx7gP0g%MIebXCMp8}q^}1-WTA_!t+(0%zAR7d(h1JWDcSv z+@W}glQ{@+b8SxW5$?=c+{DSe#N0H?P0WV}f09ESg?NgkhNlo$vC?oA39kGN`0}@r z^L>PVZ7;m}m&p4P+peRO^VAUU-Kti^4OF3Trp5c>s(&d~%x?9rU z;CP!E$ou9^cc`=TCIo}56&F`h`Oxct2C3ZN6*iU*VrETO~)K*D%B-i;0p7tTQ%O3P3 z1$p9smVnnaGVn5tVe09NozOOa4kE5{tN%+_nBA1hMpnyVwHmGIA~Xhe%)B!5Dm2$q zi`X_VJB6v4t*IU28j8UQmV^^54<}d!K2UzT)HCeCJJ*3wUcpp{ior|CGZ{&EXTnWA zoBAePd4;q_aM_Q;BUMkoD7_WD^+M|Y>hvtMl(o=HHbN)a7JcNKlk$e?o zr!?F6!!xy8V_m}REEIXzen}Eex_$K@}Pr@hmL--kAhVS;x z_`~0cbl|%{JM}(?Ez(oer;B)JmHro4=^W+wopDCxT|4H|nxLx{mo|~URb?Zc%;Z#g zCzQ@^jlUkAzH;)F$?a28DEIter}Dd}^10%1C-PL4ZB1+lQh1^yAl5#>N(@V+y~I35 z{=)U9oig*1MaeOmnX#z(zey?Xgk@2BeKK#zlqWk$;yz{+&B+R-aEAP8E8Rhvzfyv_ z?+aTp z-Wgbf%|nv>1g$hZB{w!a`BLO@P${&}l#f2Ox-TgA7Z{t5r=1Sx=)*CV$y`XO=qGWOC;hv`$+qW^E%41+tu>Ei(3zJ`_U-$~aZV8TBa3I~0(azym zjSg@-9B5&<&(7Ee48$Vfevb7VA+v|Gu>q*cY@s{+XAkDB>RBFV-YWj(dFHM9-kX`X z%EsXXECIepa~Lq2D8O8zEHeq&xX8*yb}lV5AEb2j-L|C_Oz(A$Ezj|py?ASVk?h%m z_8yuDS2l~inC3cC%q>QO`9$(l^q@{-W{J|*JQ^B?btolu_=t0?LNWy z(DB53NcLZf7CVKfB<75+Wk_P?_<@7= z$wpWv*%{@(TZrUjA7W>f3G0yTxn-SrcG)bRUnZ|* zQ}U%qJgzcUoBbI>A4z#MC3{?66pzf$VA;Bkk@aYbe0!=^+<-0Wpp411chw;I1C_7P z$&9D!XI_LC|0Atf`cD|779zLl)Rf%drz5w>LT*t3xkWYP7PXOE)JJa79Jxh0DXTVV z{#@7e%gr;=<97dhMpkBl^K842Wd9z%ziI8J$1XtIP>Yc+Uwg%=$DPNUTl+8j&ij+@ zArH!HO{{VIW91@mo*K)`7<;y!QZFsW&6Z!cn-6&H^Kw)UE9N@$p@$dDyIkN!=Ht_5?6H{{L{LWKJ*Hb$5>5i zLQlHN(UV#&X||3up&>oyXh^MoG@%`pZuCl{8VQ)14gvHSr86`L>VNF#fqYc(a z*8Zq#tP#!Dhh}R-vvr{fO{nys2@9nk?zjCWHW>721$mq2@gy9gzwUvR;v6gzizQ!{ zybe|Fd03mQ!NQ~>RwW~`C)stnEx|OeT2iOX$(i!$s}e15^x}KNU0kbH$kIoWE=jqh z8SNaG^em*xbHmQmWsQT2GUijrs#DgYuWW5QDt5vusS9((Yv5)o8heMTQ7-CqEn@y% zoAn~d`AVgfMHW~ESzt|MffpbPY>X_hb;>o=_1;*X|C!afJRBF{nbnYc%K}_B;Iabm zhnK|J%z{@M`|sC`o#myz?7*)?uP_9?LN3~zTC3Vzq8tkKwk@g_a=1&=>(GX05=-2% zv=#HPO&HMgcFYz8|n!U2TWeV0f2B zJ8E#XhoHK?JHFQpzB0xmFQ_3r3E#DMa~?~NPx|spZ1B8{YWD!`j?+&jeesxi(T|85 zIOL?S@h@MD{~E_nCBCd;^0B^QJm<8f{L8ZWQLV}!;{^>~pR@zNkikddL6=#V6TdLm z1@Nycyt<7~?gIY|gAc;?0^UCRy{ebwx}azA266n{#4ls;>ybO**WHOlwTSUX0n7+~DdjgX#^rEr0|bvd}1Vg z-MPN(kRCwRX_x=CrH}`$o zlTWRk)>>)dw{Tt%hu`45I}RV>{0Ee8zm1pht5KEfi=jjsD!c1+4UK}7rq-3}tbTD8 z?KI+Cn(x~ezs(vCe6ELkTA5(RQ#?njHLEv1owiz>xD`3-dKbWlHHH^xjZI}ce5QB7 z7j#dP%8gi94vSMN<|Sn5srWXR^^H=^ryd_kXI{d&v6#yPG7_syt$!QKF%f^zcQ8gx z=TKWAyTmygZmBwH5Ap5-bMt*UzboI7S(T(Gq~SGMqnN_FOYGZUw8nqD?rVon>@L`i_k?p(zHY&{ z^;p(J-hnUc>G-gglvCxbk}JluOY_V+rtBJ;(i1P$8oMHuU}sZ?JxnRyKsoAr3?|hZ zjXq0n=X(h&{!~x$OyzhcrK(;-Vf6^o4@<(6cu)EJuW9n#CeCw0Gn(m%@71WO($7z> zR2q$VyH;_`D|oxBc)M%=q#T37^!@jgw5GK zp6sAiK7}ZsqNaRmGP0;{iOX+nti)S0_NjcXH09IXl+X2X`3y4UGw+{y)Iam6|D)zn zJL}VEa^U|n#eAHEC!4;r=q;z>DMpgpd%&r9s+nWgopCCjW@Hx29yT~>1}SRS$ist= zY1Zz1L3llS_HV(TbmFV^*YkD-;>gTIDO&+|$-cpigq3ATV2c5scI_1IzU zRq(tHp3mT$&HlfkgKM5u&)aDB3qFFC1ogyxNAaEYybWgG;V&IrvYUF|IxLa-$_{>- z!CylA2!H3`;t=Y2YlF4mZ#p;~Ke*lJccX(BHn`mvc(sEwuo2(xBmBIB7d5!uclaB< z7X<)!n#bY`(THNnnjOD7${Vjf`(y}DooD02#pbcN-6!`ZCw>-D8nEBSlf*9<$A{a^ zV{yAbZ%-$F8R9p@-}nOJH;&_%C%(lW4ITyW;KVOS{6_dH7v3$7Uy=A0f7tBL+t`V( z`DSB$oIgzb$#MM3#J9NJhqsy&|7_wn!AJW2#9tA|Ka2PlpM}<#(cXz)gZNF^Yee`b zar~;px47L8H`9r)d0jL7v)@Df=n*a`|LVlIxZR)kC_G(Uud1ILlXVBiIt3^4j!p_^pWF2LJiDlFkg_lqdaa9*f(3cz4F>)IWjSeS60{>0HdM zm*9_I`o{x`pH-iF8TguCUxH8n8^K4!@f$HOZV!HGj9;6bP7UGh*{5KLlTH)T>0ymQd)l;>(_>d4*%!henP*@F1}4SreB5&T9cp98@= zvEPC4MEq97zuDl;v9Uin{&4Us*=I+1B0js=__rCnKDMDJ#~%aU*|T`sqg-Uwr@R7x zoWW}bb%@_8yL_sT2fvCv9)y=M@ny3d1FrHG&P7#CS8#~_dJ9_*h{1iY~GUiW}s8{@r*ulHhCpp<(J zUN|UB{Pl4G-o?W-Etlyn=kQ9sG9iprA=7FH=q8=L&KW-^JCX^<~eHOz>4s{CNhq`<#9UuJ7wVuhd7uZ)abZi1^*W>(j1#d45fc&-7>d^e4(( zR(AaHNMlt_!xSI9H|3xr8IROe<^6Ds_W~zt;IsYNq_fJw34+gI9T2wp4*s~o=lXNO zzjyE_3~u*Z%ta(USLr`#@CW<{h+omcpECG^{)6Dnz#CSpulRYF7<@k~lupK%8T?`F zYbggO{__T(?>_;4vxBcT_*4EO@M#YIvcZ>_{UV=q@C^ok-d|1p4G#XQ!C&+@fbVqh zw+z0~?5BCe!QVCbTmHMm&qbjm-s?kyzt3tPfoOn z{4iR1{DwOCmj*w=3L@%*gC8*XF;XlpH4uLZ`#_YUdQ&+@#{eBW;^5E4S{Ck5}!0!P% zBM1M%;1%(PK!5AtKN`FezO#^8fUBIzPu^b)KG+|63Vz(+RnRa|4o-ZJ>j&7&t|sSq z96U03Ej&uGUxI_D8N9CFfO7_wIPu&}gE#VjcxA;B;6J956x z!Ot-GmHsuHZ+Gxg2Jhxy$N3QlS2;d_7H%Nt^$xCbd4Rp~Msohb!Ot@It^R1v=}%|p zzq-N4vgVyV2ORtygWrK?F!&<}uVwIQ_?)3X2KTa9uZ!GX_%ik!#LeA_`onH(H7$NW zyRLcO>)HKP_1eT+9>>3xbn27NZ0eQDeK~81HB{X1;B^cxdm;KO2d``Jhw-sYf92p8 z7<`^L5BvuQztG^1pc_SgxX_jZ&&}J=;Kx}*e=^?G;E%Bz96nZ@_$>|oB4Yczx2Eb+4UjS;*xkWuKpW7-mIYNmW`*3G3iLk3;*cg zV+}qA2{2Z1Jhx>QGVVXTeB%s00=>BBtpoSKpNFpyz6o8#P@pw)EiS%dJox4q-=_Fw z=|8BSYA2hKNmc~<3S9al@Vt`^Uft+%Tzs0rtFY@R`EcT^{cJYUQj0f_)4AK=wUA#T z?_JE?C&uqJczx!6^q&^@_1u{TZ^9f2KGebI7`z)Y<&$xZ$D5h)Tns*p_~hTD^RU4$ zF{@K&I{2doZwGJ2e9%dMfx$b&JE4zv@Fxv^9lRQr5Dvc3;C+ogRNo~X{)+tP(>T4^ z8_dDDDJB4ZO!#7hOK#0P+QF9?{3dpU#IL=BFE#iOr02+s_>QUYOMJ)Z8H1PhN`pV9 z?;GRK8oZQO3TSrrcTZVnaH}_*?%>M}ZuN|fZGAKPwdV|eo6#dzaqyJ}AB7~Jd^q?T zgG)z2KcjzHcAw%G4W7``CG>34(WODs(`7)?)8&GstIGqSQAX-+_tY)G84WO6XS=uV z>73EnA``cJ>`K>$h85k*$$B~IOie#Z#sw>|G({%%dD7MnZ4KNMTD7AQX{kX z_+$pcY|id~3)e0VRNS3LXpIu|itIlMErXUrv_Mu6pS;&)7T3}hN>5l0lHRcrR0TR4 zss`17YC^T3+E5+n0;nF;0Al8f6oY;6AZCZm*zI1VjX5`knnNw2)=(Sha)?FRzqu`7ooM#OVG>EI%qw#0eS`62yKEkL$5+xpy#}C zZ+PCz&~fPeHyLlBH=xpQp=*TRgwnPmzkF=I=|KGj-yU+Wp_|nnVfjUAjbij&>v-S{slJl#O?$w?n zImNjW{ATE{;{5y{e*b^sIi23O`*9@ll{nuIUTAxEe$OP_D!$gY?CJbAiSQEVTK=SW zK%YZ>+rbZgfNciU3hEANKN#u8Z|5vO)Vf#q+)r3OvtQu61^N)$3;9g?RLm56A&v@uwNNGF==^Zw4{t+s@)BdJ1Qk+D5`2m;z@0Og8 zbv(J8`hndIDPL}tvcOkol^o%Z?bv-SIYn9Wp;GaWEC+R+0PN(fgcGn4c z3u!eaocKN0&}?k5gFiYO--%r7KBcpq^Iquh+^=^mz@)w@)D==16FBP~=5T%!VjE`j zo61RX67f}sRY$eQj(oSf^{F;keMtFg!?`1*`ZSF5cxVo!XDpAeH|KDza{2=N7^HOa zern6jXdPWbQ~h$wTZ1_{;v0<0ouue`c3%&u0mg zpZ7u9Eiv*TEtZZ?DQpgg_qL%I{9otV-|NF~{2D(m6NzWOKpINLemmF@hxP}RTUuN?}mu0LGD0=R;w;R2Sj({};mp}RUBEo=F;{c-+y{GL7H&-WkqpYj*7 zGVB-s8=j}UW$--d(L%ycqNUs&$g{QHs|xy|TFjK{!_l=g)-s*p!{q5&tAv!huY741 z6?!>%JWgYI@C7Rxr4bQ6A`p+S=M=(1L~`he@M%E_*8Nruq)*XvZ)H8pn}M{Wy64qE z^G$`udRnhigU~X#nN@Hyuj1!@D<%FRyQd$(Liq>$@72YRdrQBKf0^Ij@8Ea$d-<}F z9^fzWm-}m3i?-2!&41nBj_04<#_Mv!pb2Z&FJ{eg2W-i^20dAMJb<;w(%R~&TY{FQ zY@Ty@-v_Ugf2stWc@4PQ%iywaH1d?{U~`e%-RGBJ)$(nu>>ST3_$k43*67@aAE*ae zHG+-*B38e8>@OqrXFN5X9ZC=a!Ka#&BV(3fV0`Gd8SAa58j-RB&*0cM3b-ugS zeWZaE!bf3o{|=aly?(yt-Nhz1^GdC@sj>Q>7}x6ylSvNzDh?IkS~x&Iu}uk;}_-0RVbZ^A-gJ5~idf+TXI)Dpi-8?4k8@HKV?nsXN5>NMtUC7B0RF}1!m zElhS|s`-65ZiF+hh-`gHoHNxe)v6_NTF>F5hEQ&5a>?L9qbRIbjR|IrqO2S(_WYO&r^>#`fpK(cT?iu zP~!3o=>;9mvt?b1{C22o-);=^hDu2JKjeK>FH~=9<3D1Ek=6*2jo!mv1$-gSic7E< z&my(>9Ui5A?hIzdSI?NbD9Z@7jjh4F2KJeS{onj`JVW2H;)(vD3+2?q^bvdbO{IGl zbFUFzeOk22Uh{Iz+2wWU46YwCrICyB(B2G%DU)KRhL(>@VVo(4X=p#}TOT#=?FC)Q zc?$Qd4^Vqo+wL7Cd=aTt9;j_|+{~NQ(3V6AWDeEo&2I7z@O0(PmV!JbtB;WvDD^R0 z=wseCefk%qf9Rxs-R)} z>cdCy#fy=uTBUl3WAPJgJ?YF7^kw#Y-Kk%LgOOb8`5Dy0!~UB1S)T`u!IXZs6=S9+ zd5o~zj5nMagyt}deazH*)qK_c<<$Q5)c;p0SL>Hkt5|m8YimEp7ks~il<^O=i{tb% z9{Y5p(mu}g%h5X2KGZ_gMr^uwet2@GLHxBK=kr?5}o-)E8VT4cEY+@u_DGR}-wvLMmb3`Vi`rVIo=W|}!*QA#vo%`F?~7tC3o0Oo zR84)4{$BD#h1DO+pNUdV=G%Vb%ko55QyEv^31p|HyLSf(YvoMuhd@$3-7UM?XXEkd zYJVGPCi=yOjOaIc@(@ypc&exCshOWJ-tD0_dVWaH+?0O#YE!44_g~SMk)yyH*sk3Ydb z{!B}Nf%GqcvuOoq)5gD?a#B8ez}@unucyRR%a_98yab1{-rvMHq`ZAVPq@SXm=Q@M z^PlxXvI9|@x7^QwKz2DQ%}MYnZwIU6cUv7uZmSYh&soOlK|QLg zp5Zy-we*Iiue4gqh;#6D@EM)A@U>neMt<2S z>1wnYhd+yBeG|yGMR+Ynny!H?9hLug0{MtdCA8Vw=e5A|@r(ZZe%qjbAX`7hSR2S% zQlV|Zg)#r2apyvElL9LKTD-LQ=8FS)M6C;&66A*G(%vK$g39K7YMM8yPyeAFqzOm! zxF5L~@58n)=@4{|`;)HZu}9pi^bY#QJ&XMP{1xXsf&3|_-v*N8D|Cy|UFlog;gzD# z>J=oDL-8PwF$X)s%Lv7Gg@q&MX zi)XJ5A6AO9n}2bxIpL@O39gw$ZTRWZr=(NlPjJS?3Rz-Gbdd6%L!LLYQx!;J0%^Zn-i{hIpO6E zUY=R_$@!`9CwRp_!7CZO0^0bK(-B`&8}w8hF?Wu*`it7|t9p)GK4m zRh1{FBY9{}xFjn%;jpRTl?{L9=7;HDjyP<5jyRJp@G2Z9=Lgm?M;x)x3A~H#Z;d_4 z`36tefrQL&A}9$;hEkwZC=E)7GN4Q-7nB?NpRftZBArrDX{ZcT7CI9u2bG5^Koy}% zP-UnJbQW|rR27naMs-Lw8s|W=(>NEBt%ht!YD2OkspGxA3OQ0=&-;M$E@&Tg5IO?= z4yC++ZUrg~m4VKJ&V}kjEugm0HBcXD5OfPP5xNVyA9?~>4!s0zf!>97L0>|Lp2YyFlFq-48tmErwP?>!CNH4ZpwCa=b zQPC(Ea!D_}toj}Q7D*QTRU*l%F)SKPO1Uuy7s@zIJsZJd4q(r<6@d!l>5`#R}&1joiN8;{ec z%K*QNo!78wa?__Sym@zt*+ z@-NmV^ro=q8~Qm1A7k)I(PVJ-f{FOI8~hIZ(qe;^{oE8fa?+W=?s1I4^pMm~eU}tf z)zBLsjR!9f=f5QRpKS0E>^O&Z&(>$fuRaw#@*F(Q|6K+j9t|h{(~2MC_ZoayGz|P+ z2cKo|A<+=E5{zlpu>C{E|O4}d3m4j!jJ&)_#kHxhr8lm24{9~2D&KR-?% z&dYz?-~;jBi$4}8{U^bbJqM4|Uu5tB(E#H2a?)RJ@P1K0aE;=L_k|@QoxV|D@YeBj z;qLsk2EQK9!K`O-p8GO*is#_*b2l2iPt=F_ZJqRAHF$6K1B7>r(}!F1-!OQus26ya zlm1)ash)$!>A!36o>5QYS8>wcZt!cPYr!@8$Mqytcs}p)=qm8RJhwg*2sqPx9~itX zyA)#o;ou({{EFxb@H-s*BZIfYk23Ya!FL$EebgR&o`df+c!#J1_(BKYW$=zsNAQ&n zzT4oPqE6tiIQYi~zcRWK{A~yS#NeITV-bE=?;DrTUV~3VJBZzbgMV&tyFU632j6e- zDd-ciU2yQP3_cl6BkO$}{E)%#KnIC!t%Lty@QG+AS;y?)KO5Yxo38KR#|=IneJ0v( z2lst_uiMdd(!Lx#+2D3PbrA#yH;aIJI87q7Ek>)=%kJ}ekU zI?Elrn!#_zXFK)B!L>dspEooZ3jTDnS+S5)OWi!OsfL z0%(2k&n1YGyrnHwW)w@ajQz(i!aF*BZPAd$(ez?BG2O zeok->_)G`yW$>CoP4H)&@)2IaD~7*zxS%-x4ZN?`A6D?rVBb{A)4_Wiym(L?e5-@^ zF?b2=7O)w0@aqj;lD(9%&3ACEQ>)-*1zF(f4BqOW_1wM&x9iG_J9s~Xmp1Fut2=mq zgO_0+J?8HYKEU8*(H*ib&%p;8{7f{8?6K?MS|3-zE5{x)SY|opBm5lJgKIte?Qwio zaO4|oaJ%k%mV@7D@H{~t;y>-+T4#5Tmp8}@{*r?aF}PhP{+@#mHF$or{{0IF*SfrO zyaIUYMxNo|!wg;!Z7KD3iY-s&bGX4zWA_~Vo;dgjgBQY6Ke}88A8GK@gVVuVIruFG zx9jxhIprh#BJY@=Lj10A{Bb<@R)ZgB|6S~=9ek9*f5VCkD@_N#&EUVA^~-lS_-KRw z;s3#TmV=KmxQ7aYUG5xwtidsY1%KAT#~EC@d#pws{C0zfW_|Qq4nE%CQ4kS-w}VeG zxHe;Cy|9B%Gy@r?Dqs8=-|^0{sT6Zc=31e z83zB+u0wb5I}QF5yXhbobMU(iegsQF1;4=;Wk^d3rpT?f(|5Iie{9Ut7|B!>vHu&5A+nnbMkH@Kp z41SwgH$B(EA2awUU-kD+2Y<@ow_vq~EYiWXZn1?o(yYtA#lcq?d;~Tn^ydz~+Tg=| zwb$MbzRuvous(u+cJR#xzu8xR(9Xf%F!&I&F21#c>pfd|H~H#^E^_eq4L;aczg5e@ zRgNvZLB9IGDh~d!!3Uak=w%%IGlLJn7LI!B;9nZNKbAv`=MJuV-@@yMcWU^kG1=v> z`r5*~*4Oy9&B0Y~T6mrOPMlwN@M8w=Xx7)C@8D|ZEwCtQ!|&xrWv8$9$u9C(V8A~( zxcr9Tr5Zaw7Jdux!cKhoC28R`_nU+N?8H}p+QMsQ`~z%p@S+B9id`4$ z^~YqVuW_^m7B`K+pQF8qzhb4FpJnidenaqail1fW38leXdJZ1fTa8;Sy#~f#!3f2V zaq%}Tz4};mAv1Sy@hdI8dVW3dMNU4&XSDP#@-G6v$HB!vwe&9ZF9dJoq;tN(FTiFD zIl6;iXmHt2QvMF!z~FW8{|z7N;7tsEzVX9wd~|mHn;X1_UxWBRIe06B%T5y=f`iMC zPfM?wUk!YhgSR!f^*gc6!8;n<`l;CB;NmY^Vyjq=bQU{!SA!Qc>)#)B@M{g8-_K9{ z*$#f4!Si8fjMbon-(c{(SRi8=?cn_lp2yDvKE%OqGAvPqtsH!;!PAT%fQAmPd0I;^6>B)=&kipCSuL@WO9rp#;8P8r zWL!#MaKw|OV(^IU_=N|Bv}9sEIqdp?Kv zwSzxm@ISmiNMf&p&o}t*-tXYs9sEgy|0bJY?@b3^XmD8zBc*ikr3OFd9RpwK;L8mD zFXL}vp@Tnf@LyR!;(3oc_zMRAMQeDx`y70&!DXAt4k`}5&frJAqu{qW_(p>tk*|Gk zsDr<1aM^h>uXpe_46Zdq`0;S?tp@)A3u(p|2Y=V#-(xF=yvV_~8~iYP@OoZ-2j5}v z@9^o5oY28{8~j`ETkz%C{c7~F!Qb)T0iU0Z`=1(ImfZB8;H>wTd@tH#a9Oy*w`9kU z_8NShw+?)0Htv6J@RwMLjGqMcZ&@atRNC(zWv4;Xy3H=1->IQbObp0(w} zz&pqBStXP2YlB4T0t-*&HzZnM{{5yl+ z%&K<2uai&VSK$v}0JuNhmP5pryN3;~H7(5R9sGNPUvK`4ye%is07`(sNAN==Q_!ob7;oXfFYUF8g{0#DW)ZkZRNy&W8!GAXR zHO3FdP6z+R;9b40#6RlbzZ$%o*9|=13|kIL|6d00&a)XG9sHQVdtkrmd3&<+nR49V z9aynMI+B0d{3rir@G;St2>poUT`~T=v++L+K9h9=R*sY!$M-^&gZ0xW zc~JuQ4SqMP4UmgEcwq3mScia?#KA*@-^mIE&%4ZdZe;LoK{xOkxwz>HKaqu*QYo!76I0sKRcnkIbrJr~341+hv zsu+2!gJ&9Cdt=eA9Xyx8zwp2Cnct1gey`jH{}@YN`V9xqWAOK}j>d}L!Sfn?v%eYK zbMSlypJ4no?HH4tetv_?Dj)rZgBLJ(7rzVm%F)^J3mUwp@qblb{c!xTl!pix_;5w+HBegBLaUr>uFPd>p)( z!L>#K?V*F8VesAFZt&L~ytu)4VPDPna_|xc*NPw7g@czg_zw1kMV{l}Sq9&NwYKMV zb?{OKUyUaV9slC@Eo1O!%v#<9+3h#Etik87Qi;{P+5KelnFhZP z?;NaGaqw~mzt{Npd&I%Z8{GQ$o9N&b41TxShvjAmuW0Z)@d(1W@8FdTJ_DHp`FHYJ z+29?`ej=M3yo$lC-P9TfKg;0qc8^@q!Ou4M>F5@vSCp+%ey9*s0+OAPY>Q+|B>SP9 z?S-uGnG5*+LZ~Cu73v0chk8KQLOr2g&~;F6s1I~K)EDXp^@j#Pf8~>97{3pP{>&fC zXnq?5jfHN9#zPaJiO?O;Bxo`;1)2&?gQi1&?T5wsOPNEwxsZIM{0#j9{R;gHItH<_ z04_CvgAHhM0V{M6dO;zS1SLZ$P%4xLr9+ueE+{vY2g(cO^DCZ3AN4ePg|6tdsfc?~ zcIJfj?u1ToA^KIQBvb>E&jiI4E=>2!zrx>%tF`bKI`_+eLsinf6fBXa?t~R@D(87| zcq!*q(97}lJDev^u|5q-UQ55uwbm;f;heI_=BYO4Ui{XabKgilTPn`@A1lBUv7`77-vOKjS|qB~E!!@i5~dt-cogKY$pUk;UT%NEvG zhr-IkK)J>eZtPI=L9zd_26!sVXHzONSHrch4z>G{3+P4_80gRsi) zKat8jQD+sF4+{6(?{@s5&?c3R-c#>*@_|CKnW-s4_BNSVvm%c*6WC_}egRn9rpxfP_b0dl{w>ZRJ& zSNf(RzD38IkV!v_+yhEnUrzX1=XyNhSdKFt6C`{R^?H;;e--yv z;{R9UDqWWKouL1eZU%7^^q=Co>B^sp=y%muNbe|G@fgpB7urKP<|pmyP;2N^{N5a} z|7zTg+^hPq`;;{PySSU@beKBjIe}e#%C++PS8)<~8A5wXr1O6VQ{5fLvnN31;&!M! zJ;?P!Xf^aMq`H~Fh5ZDnAI!HR8&~|&T-SmW{~FFWLDQY7uU-7bk2!!VFBS&#|8ba_NH+``PszvUg-QQv)@PUJdxMm`0e!Pv!AW& zYFsDYy&Ylgo|?E;J=C?zL1i=Ml;7R!^#g66qI+`+>wWIx{&}P`ihg?TX#0*iVTm{o z#Cci5c@^}kbFDs5d%Nm+`dz$CBK%jsDINWudu4X~MB3{2lvd*Y#I@2+gmd~$&mA|% z-q$EjSJ&bX5_$Ts<}Z={Klj;h+J*8IX&ma$c{KG%q-*t?ZojU+dm?d8#b<&gaJLV3 zS=Q6~t12uq}Lam@n zp>|Lw=+(PuTQ}IWx^S(u&V9(9`*A%2x&xXGJq4|T6lZT+A3 zdxu{$327~KPwWT#V52wy`^X!y!5ohL=R0XgulRj__yT)quL)lakA=U7)1r6ao=M1? z8cqunt1&)~UTA33z1(}@68n3L@TyQVamAg&{QCuQ)`S;Di=!pc(&*#p(`a8LOX#um zRm#(^;SH^1mC7o1<6G&5z7{_%x`{-T&Pwmt{nvBk3)5_kHLqr9;!R>iDvbQ)ryo6h)y6ygc13_H-y6rS7>G-Q?cJ*4s@vzdZid z<@@P%@~1tGzQkA70pm01Abt{l41NlZ1Wm#l!v5i)aAY_+oD!;(_FipM?HBIl3o6wx zY8*+6qIdn>n~5KYy>V{ZN0Q3q1K;J{g&&-m{w)6?y!bzcFQFy=GGeaq*Z42{>saA0 z{jE~F9Ifqpr`u;d6up;aL(hfpjkBTp!HX?z==nf096mg9n|2d@!(@L%v*@HsxS_6McIGU1u*_gy!< zFl-UF3|ocLMyQ-tdF#9lUjO*{-!pwLfPaRn!Oh+6vsP0}C9zRXCn7PB_C)u6=iTqG z@?}e+t8efJ&?%55rM~$1pdvLcBJ>KLTs8$!SaGzCm&6VU8~wy8qDhfttxEZTe|aE# zOWl2YQ0#mgy3i{|3G4Sc!L_06>=bT-b)9Un6?a0E*gfzJZ(kdWRSfshmh|iN@U2Gn zo;LpZ;ahRZe-peF*B3u(6ulLPRQ71msz5Al3+jv0xa2)x$6>B}QOfaSIk1xA~9a^QI1Ee*vZ6ID9%> z6fO=|gwKV~hb!p;?uc{qOZaPe#~@p7J&+6C?2R@uZN2kgB-yf$Rd|ZR6Kq($%3Z~5 z-FY~ABzi1b8NC+WRm$dmZFpBVTkiI0iPc2Ego*V+M?-1j^``axM$|`zehM1JWs*0N zE?w9Kew8?vpM_t9Rj3d8y4{ds4Z(j&m9aL~Kwq{qioeg76|_RvM&~w$A072*2d}g@oS-w}$6OvXam*Q}Oq4xRfm+TkHN@sSAE$F!$xu2dNSG(zt;!BjyQ)mgndIvR&Ac{^CT@-xGOU99dT~j zMUTdH^sC@eI4PCdP2rGmXn1otEF2!*8QvA%9o`d4GpjfK#k?akPiyfEh=m*VWUG zdUxXq1HbujltT5U6v6*{w6y<^+*BEFc~^T&J#|5A;l^lAQdh_i`lMR$b66!hE0S(S-*hi^;$dpVi@vmA`c93}eaXT>asTih zV?>qxl4km;SI1|YUEGn9;I@`Pr|13 zOze_p#mG@VnO&dCVUeu$3d+?~w2WP2e&ABSYn&Ig{H|SWDmP*0KAANRb0XBXm$E%$7_N?9iQbIfiaw0$Hepst{O^qCEcsmh6&d|+dc&0HIbq#+Y-kbP9`~_ZgNU|)FvI(nH$Tj~%j>Ls&K{)%exVHh zMJdRS-tV%r!8RwLG$L$(kUS&n6f zTNJ;z!heqAd5*tRmh!OIE^Hqzf?NMM`popO()8&&%Nt-s{Z#lobfo=yTb^|%eGiOb zq+X{8rBaM?N%S&}=x16+hsN64@HUpYzxjEvf3FKMXUe0r~m< zpT=Xvn&6r^clp9k+u3w>de<;2D1BQ~uHo&K{>^@3{dJA70(C-9(%j}*`jRq)tKtdZ zR@T^zVSUd8)(VMJemPiYc+@Rs?9k4s@{1~Ov!BGgvwW8xq%La~k`H!J zp`KjV*D6otXp#A%a~mUH;_7Br&0KvrP-E{DAt zv}oDP>FPLp*)8*1$9cQSmyLye8`AuHv7!8gcKO;7*cdw`x-c73|~&3lv*l$Eqf zY>0mm4_6!1=>IIW>7@qtmj>QTaf|&rc{t&W~P>-isz?+57K_Qev+EaFD`R&*Y9yVW$%uz%|r>t{mb3CU&=P zvW7W}bo+X%Noe#Z#?Kt-%c@3ir19$hC@+s!9L;O;mejgT}4Bph#P#CV>!nL z^My9je$;}tAU6=FC)t6d2ZP}A#OaCG6SpURZv|gQGML}PG{en_pUVyBCf?2E-o(F& zgBxx*w>#q+_D*nT{4K_XcaF91bBnJv0s5M|d|4~$&2EHy7+%qOZ)AVAuwOVZyfM^F z{t#ScE=IiqjCq4t!8<%od267RkGgj<_DUNN8g(Q5pT~BM>l)KFo@*@EIR5|E82aVqF>h!QZMeaHkKe+EG5^pqYB<_rss6&; zHgsz!Z}MvUweSsd10EUWwRRz6jlSg>kt}6Zzkl`SQMOwDD12zJf@ULJ{m|@aMg0BV z3s%H6V{%wCe*V6&X8io-QO(iz{$#&+mJKZm6CO^M1;rUY^zAh}DITYDb6C8)jkzo= zPQPMCU`pj^sP|6zMA;J-C&#)smAC)m4BMK{N7kVkNuoqrMqkAF{4n?;uB{CM+2ZNW z>#)Gn`fR;lzvyjVE}c+Gd_zCsU5dZaT+F>oM_)$YMQ=B-u^M>^A1M_=SsdxkXN>KR z(rb@>%q2WUInL%#I>!C=(?Q3WzpE2=q@+}qhs|v3qqyv|qL1S7^;71hpGBppLz1E% z3+)UmF}r#se)D4RM6yfLvnS(ov=m=XIofAdrwSdyp3ezSDlZ3<;oy~CVs@s{MdQlk zxa7x%vNBV?J~!Na!pq9+s6YuM%iwkBhZ-Ui5@#bRo8~B*^Gh-@2#!5_mMJO3awGp) z6|N1phaWPUe8PBgkP+nvdZOd>M1L^0Xl9vdIO2Ttm*RACk|%2psd4l^>YhfQb&OaA z;xD@{C=i!x)v&;cI*}G><%G&$5-TQ-7eS&&$k*1ah%$3MJea=ig`aqo#8#jNxyEm z$v1Jg{OsD;imkKK(E}KHP5@^eC+mijkZrLLrHZWV^h44RlipA z+5*`)vBzS6!QFpH!!aLOlHTvNs4VQOaxMOOMl`>HeO?`S`T23FEoX0%`EkwrS2&-% zsSLJy?|SojvQoLt&sEljo)4!nx7Y8B(dtf%dE8QAF76j94nJ2s^J^64ir@Qcr1gVY zyC)ApN^f*9v$Tz$7g<1|xSWQDh2mU%8qSRCc+p6!e3bGY*7p2Cnd|~3N35PXd5o&m-CyGAJvP4_|(XaUzSRN{OBm=#ppQX`zo36<#@uW)U+BUPgjQ!opaq7hKtH;o)u8zNcnXnG!r}RdkU#!#B#-ESQe^t1erz+2F{5o;( z&?_1jf7`;*xHwOmQT8Q)3yInqx%)b^55+tGV|or*-c)0adJWdKC#)MT!oHzCb6M^2 zA}a^m*0Qy1*ZxOqhjD&Fvo!#}OoQ>|B)!;Bd`A7XEZl0}pENrIEesaL^GaE@EDxST zQuOb#a!L69o@`vQ{DfxeClo44VbOn+ic2CcX?Q}ne__}F&3}nrD{{ac;Z9_MR_82T^N)_SOS0qN zsObqEkd=I8M7fX-#>Ba1#&JM`~TAGN>UMy@HD$si<}L+~az91n-mOHVV} zXvx%P<6H6(BT?v!B)KGY^@0QIh1OALBDT2??0Wg?@P}k^n$Q2ZAD|j7y}ESj4;yW|H0jc!=PZ3468DZju)APE zyhK$C z*!!&=T{Ftw9ISuW7mw0WxB5}IAgE`&oH_W!9D#Ey@^d%YAdS8WaLTWCbd@AKJLBccjk72?e z^^E8Z7!}nyX&q#N@&>XnJ8r2xJ8{3_E)YrAX{P8J|!-KV@Y~4ClHz(QKXIP

@+f-c^7Nc+XU?!-w{NM~R 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
hyNF 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%0AFtL zW9|7CCkFTmi@S3s#s>IGi@S3vdItEJ7I)`ZGzsvtEbh*|__=^iD{{8QN1{8y&d2~i z$KoTbw&d0TKiA^Jtq$n30e+sv4=@K1&z%9j%HsXmWkS6K_-c!H#=<%E65!`sypy#^ z(>A~_uy{v!S7Yh~_=OhlU^;-82=I$6-rlqa|E7TcEON2M+rjH%t2V$dvH0G0|M2qx zeyPRV!il5X8{n5&d@r*X_^kncxy4(<!THm zxYG4U{;LQhXTQPk3%D+bHI$d^U8V2k-+A^a&vxT*B$Y`?e#7_5aKEc(O@8NDx8Heo z5YGzx){(ow=YVJRvvc~E{m!#B!Lu+=x9E$K4oJnR=;BeQCUsKl}Y=2ohhI^$NJ%ai8~cc4Xh?y&bq8 z{qJs1IJ^|URdDrineE!<_}k$2!F9%kab@v!2R{%u0yhyi8>cu!o44V6nJwF{%v+)> zQ^UDKP?N7_S@=uZ}N>FGFAGiug*b4anB1v_sa%ccMFVkJSiy*xGJ-8Y@XJV!i2K@hjGP)0@~o z%_P*Hu%`G;{A2txiV;PUlI*RhnCzZZPHHB#*#FreX~;fC>3OuoR?gm7JZO)e-oDtt z>W&qM{n;nb4|^AblEJL_4^KuWJQw$fxRP4?1$VWrcwjt;OJ`{f;ra*HFs_5SbT0a# zT*J9^cKRr;v0UT0#&b>Nn#47kYYNv?u4!C4CthdB&*qw#OiX0YSgr1$NGlhm@$H*- zM~kIjdO&(0R(MCTu09RDep&H3K0OBEQbHJ6f;%{t)IfJhGz^Pek`1aJ_liElx{5)+ zYh)Wvngw|&s)_bRJv9FsqubH~{lB*HJ~nU4m-3|iC@;!~@-RL=JU${mGM->_p&Tgn z(j(7yM$b!6NJr8p^u=Yg`^(uU@IgG1^r^;+Mu*0t$(6ItmTQvl3@cYt%gIF(bs@V^ zN5Zt}-u0))qt|_VtB_tb$h|!)ZV0cWx93}~Sh2rjO2iFmwQ6&cn@Of7`xeq$C_|f5 z=zp5!_*&w76HfST-gy^}`vbUi+1rz~J=xm(7AXY{&90pni;Kr4;*#u0DHE4NU!@|J zKehX!E+r?e$wri36UwhSCD@8G+>26dM>#Gh5BlQW(W+T4_fd3EEKXGDc~;h^TB=SO zhb5BuDi7_VQmL#-GrVB$s$dk7WI@kAG?nAbl5>~%g{lrU)Z+`)T& zi}?q;yzU})eRZEGhl(kQ?@q3#;JsfmFR&ALGnY%6Ag_|#jh_O5=*9|ln+nI0tSXwoj8cXV|5G|u8l1;OnzeF@D78fGCJiLcEA-%bm=?X0+-!W29w7xte zxubGhAv!WHmvr^5Wp*qpC2B`|F$VT#+-p4C#dt8fTN8O(&%~*VijZ<}JVM6l!?YMqJ1B0^+V6vN0rlG zh*|CLV{~hNLc69oy=r%CJl3NZwV>ymPKz$Z^IYWZb*&Cq3vbt9A8b}jcUM-dwf1yZ z^u#V^iXF@nIlGu0UPvCzbE&BmO^PLVRUT4C&HG}lX6UYYbbE47B1;`gwMuDFFZbkM z@tbJ)WY#zK&bPi%1=|*q2`c<2rbaCJxMHdpO^B-{gUIu4+|5M4^n~c-=yc}B^U%h- z0*c`|N>*j{Ia-e~`w=rc8#U0j>M+{HD2gQ0`%{ebe4WiUJ?N@sdHcXXbJQ5 z1?;-NCUVrxJ$}Sbe7o0J(_@y4wPZ9p?m_-r^L{u-QoRx;OZn2ylagF#^Q5HbS$%}F z-_Uqyd=OVQ17@?|NHn@fb4^MnCD!@}-x?YXvwKA*Kv&F0%l0PP+eY;79*cUQ0e=!! zS+kMnCi-DG`fMw7{27*vMmz5Wb}QU~9g5rSSo92|(L3l)mqH7zGJ2x5(|Xu)%B(f0 zpH88MDv%njH)t(F>l9kU*e5#N&T*RMG|x@I-p8!?Izp>%caJ8FIr%?WEO2iA=XFItSoE>JIvSmETh#* z#nB}qR}3}kPrDkK-=E~dsxKbNkg0FnX|5(cilGlyjU^M8|8vtI)_RiKtw!Zu$<;nh z4@7&=N`>zmca6KnS97N~9)VhXAHU+Pn6_kOQMw(S;wTi+CbGSt(4qikT|s`0xGhIJ zzs77?PEapU7*U9l3o6zTMv_wb7TPsAg{ecESwb7v8m!{#7}ZX-t}Fk((H?14W*$)= z=R$95{<=1W?a|tp?$l>HC98e<*Cm(J5t@Sk|3wwm^|RwoW^gRIs&X~k zXk|&MDHaW9hSfT&^3fuCC>cx2cE`U6-eENy!&-QS_0ax5Lid-1;;#jz-yHhBD>VIJ zX!-HU<-T4-%S$q;FSNI7?HYY9!s6XttQMGK zlHMPSxEiOlilAp(Oirv79r?dA?P5vu74BK+h}WPUI_J->W0IeIxwcFfR(0QK5oz^W z?xS1J};eF25I5;{$5IP!mK8pTJE&g%Gg?yVV>_uF2Z(S7Q@Eqq$K z#@|+9Et`0LZ9`eR>qYxJo5>mnME#5M7u7F1GS|*V_2{RaB2niW&!lOkv2!#!m51BX zz1+@(Ytek@#CY~Vbh_pIR#}ekTE;SQc@JO@;Yqu9*70|*W1IKQeBQ1iT-+ha*d*&i zqthcTeSa)v(TQ)p2G6uJ-TDbDQajVGKQg!ef_C*E(Xcg`d22&E{t+#^!Pmumrd+Hw z2i4X|b~RaTSNw3BWIlaRcN^Kmy*-*wnX7G_gaynMaG25}&gK3zcw$)zzK@a+Rrw;V z{>JeN*LGS}eV|dc)yp1Q`vNqY}`Lq~p0xNToYmk9ex1NmiS_x|y8*L{1^BxQcKU z=PJonhO0c+?p#&43gdP5^sVq`GbGm9rqchT8N>{v6?)xi9v+=YPeW~SpQv2A4hmKI ze>ho3snDSEIf#sN*qKwPm5#>3U(IBWdyW2}=a*B2aax0~ z=zG_g5#INbU2j$C{$K_&UrtOiI|awu6$XXg+i1;5zC5EUGc->gP$g@vc$DB7rry^ENvF0s8#e#Qkr(B z`EXnG4XvUG?Vvn$p9`PX6y9u~_&i_Z8gGXYzuqewjknhD<^L$^6mJ^pfi{lrUFYaFJ#(Ha;sT*&hR`umjt`JHBq)VY%5DhUqu9rwRNAI@AQn=Qm zR9Bs>29!o?jVg`Nfe~eM60)j=$f~rOs8FZd^;^CBCSANZIo7=UG5u~E)cRNSzHgw} zrIl&r21r9LG~=Qp+41ynbX+`xeGJ#4gZ^pKEtM4oahjnNYj97Ou5wU9<$YIl+Zh+dUIXL#dk?Yc)&0w&qOV2ItrnI$`}yN8gIC3v@Mmj&|{g zE797bLe8??LNUg1W!` zAFQ(QykPW~G)R&lNr5B*`n@@zR+Q^!fyU@EHD@l^3w}hifwT~mhObPMSeg^+yPDE5@`C_Xe=VJ@Y?`F`qI8JLpOi>1 zO0B9v^e?RHe-V9+4eE~Q@pp@R#F>?ZO4zMxMY$^rkr8PH~s`3+hEr>Zh_FubkbBWKa5W@^^@;r`3FjjSp`t2^Wsa{mnX~TPhc1SJuKn>%rdk>Y1G#$wPGDq@gLq#70lwKcwn@>e<^j-)FlT+)RBi7b!{KRTB7 zx5kO;&=^gT5O+Z;JP=9nidimBNs8tYx#AxPk0u>H`I|+zB(m5|=PHDQy(L;7xjFvf z@_;6ZR?3C9G}6@) zp2ObH$KoSsqbfZoGiyNqcd}sFlUAr2P$kV$>Ak>^nHQ0(ZAP*tsoJ}dPPbJGH^OJDAG|Q6FC@n+)ZWyOKxlN)DOXgD%fHL4DQ-+OjIJA1eX7 zQ5x#oS)aH)=oP9*>7pn_^R1Q)J!)CGnaNJG8+_Y%l#2OV8goeg zTEzc*(wP4#8O(&EXqLay|KHv6@;^=68SlkzJ1C_#^oCrG9dQ|MnMtQ{79I02c-OKT zC8E7DTv6<~Q}|*?ey4z6b*!=BQy*S9Ou1Rmj(@pU55F}&Xo1eG()|`M#mt`vKFohN zHE~&uZl$n4K4B+Zv|uR?|2>l5X$oIn>5j{)N0!1GG|T>GVSf5!9iah!9M`XL(Ws@c zn>~-;wLTu$xw2#%{CF;8KHypT2rq}^>JWaj{FWxa8Qur{Ise_##8bhBKgik?3Gqr6 zA8MGG%vS$hg|A}qVeFN}X2neYxpFHbye7M(+VlIZ4_|@sh+x5+TG>(Qy&|)JSrZ9I zJOJ+Y9W)5=T#Glyni0b>9@P-z5`dWttcq5BD{jQ_IA(<3UxyBZ6 zW7_b0YJl%)ai>3azVM1Rd|4(o(%IJPo89PeoBoy-clv1$fyX|)8e&aWaMYw;4RGDp zWS84M{BCGX{BGYzs{5MI-AeBT!d-b56JDEHQ~BFLJYD%<9n!Dzt<4OmIj{_y8#26u z#T(ew;yy#Tp?{%`*0H0-_qBU+LtOHb+MxULdt$+Ni*&ZQ(`SpAyJMueF>_E%Ym1;W zL*2HRRK$ESR?D^*Ee)G&F`0{Lg)wVWF$EdZyJPqcG$e3Ua8+^DaMf{~T15%O(DZ0q z;p*b*S)G<^P~yE0C;gGv_+3P2l3(W*>lfoZrZ!Ig%2y!^-068Yo(=QQr}Mk>bH#HF z9pX%$U5yL<(!a}a>FwRc^Y3u-+wb#UnZw<;vv5_p&-@D4fctj1;W+90ox<-5+$A{a zdHOej8D&75@ImFLMxiq`60#O zYIN!c#XjAfNo?YAn$fdb@J=fmZy(0LX-3qii*xL;&Zb^}^f`uNVRjVb*9 zrRFkZF1K;g-O+^7m(PW2JTpH%&wF1B(-(IFcews&8QhX#RskX?A`kMnO<)Ms|!zhEnoN8w+jq1~Em@JgS-ApNF+;|nU(7)AFH10!1{Q#hgNaHox}LV#;bj8UC|y*CR2yr{)jGP0p(8Q@B2 z%&4z%U%&7oR(Jo2J7V)ZuEk}n4EoODR@y}4t$;|AzYeqErt_VDI&(@N zW(MIC;a(<|cVqLZ(#7HX!u7pu=1+}QXjKZ8EI(7+`YJl%1riDgyzo0#GvBTQwPN?6`=1lW~Tec3@7!dOp2;-sU}s+4_@HXGL!f;!|NLdn{oMHSY$@R5-8?M zb{T z-lRSJY7c0h0|+mk?O?7E)X!*AGR|mq(Z#12>sdP#`c`qM46PW-uht>kx}p&euvCF! zI@lb_yselHg|=24r$A3FCXJ8#@>Kq`=BIuj>lp2kF^?lhCz(8RsIRpeW)ePqMRg(R zwEU~c!-c*L=_|{QK37Y~8AEb~nQFkg~S0jf}Z+f%3xxtsbT1eY`I=e05hVh2NjQgAarxeQBw)8ju|2O~t-^>5g zwEq74y9E9&fxk=O?-KaC1pY38|Hn$8=RVNbh4B9e`E`o|yI@5u|M}bX!lIViU)x>r zbcHX8BT@g-G5VhWp}atNF?ie`_zlBrU9A|a>Ywww-p9lGVzj%(U$=HfF0;7!p12jv z1N@T19}T`+%i=F#L)e%QZ(#AKIKv5j2Opl5l!#>o;?YSxoWc>rul26oJbq{gZgTB+ z%Ls1>S9K@9?-IT%IMi6t78ZAQ8NLnhmKJw*97^^m2#-LOc)C~}omv5o&;Z=61GNJ0 zUe?B67RDC5yOmXhct?vn`(k~9@Leq40}c#rvjEq9L%4QWOLM%w+p??DUv@u>4}??u zHQv|az0ClAmj~hdTl`RXJ!7s2@PQT|g*@Jv+rjtu@ej865pa^60UY4}u=r$T&#Wm0 z_(2w*ZV-x?&jVcPYlxHpM%BbU3*tZ2;`2D!35h{~kFfYjIx5;U32@j};yJ}E=eJ9M zkGA+qRw%GT6yRemeyO>F-y;KD`D|!4z&R5kz>l!_wbq{9nc!MXqMXYeY4O`waX`)$ z;1evq-mK^MmH=0IH8dNzjCnA?Ct3UsgQy5OK|%bJExwVJ3-m3!f#9w{C~4&e2PlV5PvyKvQ0 zQ{+qPH(kJ04&deHTHLJ%w|C=@l@HFdcqqTq8fR$3BU}F@7Dgl4^w3&p%u1HzjlW*& zWQF-JuXpD1P92^@3!AaatQ~!*6Euq(^`a8iV{ZxIY8` zMYx^AORjo7_^r4e!|0RTKZHMA^VNG{n1jbfb}jccaINWX_rIku;-vff{R0L4^S*>v+@Vu?hJnw-$-ji(Pv^UI>YWR?&wt*>#iKQ1g&jm2Ey@@l^V&CFQa{@T@l})QKq?)Ucw9@ zd937b)mVG3&ls?WS2RXmwY2N%7Z@!7{-6y=ggSRJlcJi|0O%vkR_XhH< zQOM7F;#a%{a@yUD_G*)Kvk5)HmpBFYL*{GAWlMtH3%ZFf-NzjJ2A3>uZRI+JG%zLc zOlffXg`0W)4$nR^ACr#l=zD%=#&>mjpN^!qzAuMU*cUaPbSWK|TB&bEe7loFX;3ub z1o(l-H%FNxI6JOD*1VFiSF&gG`nE0yTdh1;ag;G5+dJ$w)69QkB@)epin#jtSi7Su zJ1OvP=uNaUJNDLS=xU({Wg>a8V*0@}B)!G)X$GHc?x$W}He0BbZ_I3;lWW;2(~#6F zRBu-CwW2-LmhKqJ_aI;1i&$-4!YIDnr)-@ag;k>EZBAWY>rL*9=3^RDZ}(>{eXRL{uc<_u7*SioUAyR8$F-Fbv<_)N+{Io4(M9D6A!&Da zdV;8mtPU5UjS!ZiWZ5ct>4|Pd7hdvfA{_@@(Qc z&kUgsloruTv&_k)OliC$-)gc_^Naapx~t8x<~71A#Aegqhn;6e;8P0DMb5pNZ%T5l zIP378^YW$FDus9b+uxbpc}G3CCpD~{j`Aj!}h2g^PVBQJCzef07;hHNdPmD|>oYn~Y`rq;VDlJ{e zd8PsM>y?SWR}KqXIjppcl|zOBqn=YR5B*QB7fMfFsc~9AYU%$kt{k588~#7FBjx=v zI$DTaV9N0n)UR+S7wE^_;q@pZjTExeAo_ow0M`hw)!SqEuQ@vluNe{x*<8?h0bbhT z(;0DCiw$tmAe{8c1sxFJq9`<0PT+q|fQyfTbF=!t-*qkcE+i0thcgdxid%r!wfK0; z$7(*v(%IPJ+V2Lx8sIH0E)6|nUI=gq4*o`1KKbzgXPD*B={w&S;2LMJ;=qM2WPtaw z_%N$SthpgePk)O`4~~6J0WKO94%YmG|7Qib!fADRF#neZ_;8DJDjL711i13)w9?rB z9pK|F?(A7=4$RV{a+Ho^KmLmb%y88Qqbe7<4sh|Y(pqDva#+{tUs2ypSkMeH00 z4-nvLXGJXi0bdi~YL`X4yhb!+_Fdt{V0QQ6_g){q9^X~_E@t)qp#1~o6@hL#2^$**wHcG<6JGu?l9gLAzJb1-h_`xdL% zi{;(jb&$6ZW;X7tn}7YDzI{9Rqqr>m%lIXa5xtjT*{_~u@)V^>-(7-yWfkt9Ue2QT z^t~4fx!3nT1^*EznS`9;l#EC3WmxvBXOhv}zQR50Ng=mB7(3Wt2hb4|F2r6aB%I=H zOea-XeLqX@I{!_T=XU)1{n7sxIojRdIM3Bn_FD#A@n!clxo?B(gBy;Uj$4RZjk^IS zJF@rj`vC4C+}qUgll;Dndk6Ok?jx{o`27)=Ak*3nR}NPNR~y$5*8=w%;Y4R^oRtlh zh~EOq%E4xg?Hxj^8Cf%o@##!h&3QtH7|rVP9d79a`HnK(8DU+>nO5UXR7pRysYV#J zZ9S2kM&p3|b&=<3Y>{7Q0ey^L@iem|tb8qvXdL;DH7`;_@>Mba=;*LLY|j=}-Dr%J zuen+1IXsPx3u#sE?e~y8C^hAfe9y7choanRzUaeTeu&kSKZ?Pp zNC)gNGaB0DaI5v+qO0S~_C|Km(^5nF#ssUkCLa4h-Wd(eHPdKB(z6<71Mk4lBJWq( zj6^nY3{#K-_D16YY!`3kguPmP30S( zFHumvY2+5VyU|=+3||x4aKWCE)^^TPh+1|Qmyb^CQ`#b5$}rS?=+jX-UqUd8V6qw@ck@4 ziBpH690I(r#ohks5dl8H;!e&oB)|t*+{sz?5AdNDKf=mcx&}DpE`Nt}v345ZBP{OZ zFU_mIY5{(P#YN#DCkk-o)0oj*tmOr`Qg} z)vJN(I*k8c1-ROiY_N>v|D9^jx$ay{wLjV$HX}J-DZr1lxXy5gj}36~)yxWMB~6$2l1S2@v+fZ@MQtM(BfmFG2pB6 zxbg9vZt+pkDDe3KF8-5ph;+`69Upx7B^DnUjRd#jgU6Ryd_*(?+>Q?(Utw|CJoe** z$IrC5J4eip10Fxy;_kdK+uuEYuEpJXVYdHze6__ZVHwZ&Q;%P0aoPDozNUKj_$3yX zO-)va0{n7|%RZPfwtxBXS6W=QIDJ3z_&+T!%YRU-K|E_ME^FPatpxZD7B7P>C*S^k zJg~C-$;!8H=N`Y+;-w;;XJy;7$Jbk27Ec*OU+}X5e!ss!iDmfX79U{smBh7V_!Aa)@=Ea`8UCcj-T6D>8#4SU zi#s{y=Aay&ws?8F?kQgRWExuEK5jkg&-%LzM{j@%EA0K>d$z0Z{N6i%KP$YPS4@hG z%I182vw9HLXfg6Ae(%RUiTf9B3vTm7=84J3FL0T^Rp1{M_)qZui~R51{`WQi`vbov zIN+=tPQOk3ZzunIfd8G!@2tRoS>S&$@P8NhD^GQC>fN@1e^B5*D)282{A&aMW8U8d zxs2laoV}7tYj)ptqdOO9+e)|ITWJtXY)NXA`-Qga6gk3@t=%n#E83jMz+CXd=sOIkt9H(*fj5IP9DWPE~)II7E^^AH&y`%l2K2hJOU(`Q3AQ}+KLiV6&a5N;EhQM?>wh-G> z4$8f(*UG+G6a10^jU~rNz)?>kr_-P&wX$|BIn%DdrQ}5VFz1ki)ujF+(tQPKzM8aN zM_LO1Vs}V2)rZcy(>%~U&(+lBW-a5L>Y`}W1hP=6sfMKM<9|rLB0J6Zm`&8-t9HM$ zG={dAx4gc``{)*ZY;~NzK%?brY-jy|#>QIa1=aLf*w`Hqi5gOzM?nMWJPAFiXYR%h zsPvRda94PG_sVmry42F$dTRzcCf}R)YPfu4C3plyrud687m7kr9#5dXO@|hf#RlD1 zLSv*Z7MpKe;KJ6zvYcjF#X1`6gkvJn7>eZ>EU<}Ql7Fok6-7)$N87hP}JOD7*nCq|caK(-p4^;(}xXTdh)(pj;MxOA4R&Y5k(rE_R?My<}T z)tR?C4_9a9w&BuQx;kffZ?1M+`*7*}UY+eLI&1_qnl90Bhe6-z68$#@+EABh$8pe= zx-@g|My`gS1@s0QL))-Ex(D%hrIps{L=&Dd|MZ%yO+PPL}bO7aH1< zX-fW; zK6U}cqQ_qvDK59;ghmRD6&fwVk>an71Z^l2rK}d(a_hXm6R8q6QW>26!hfOfiDy$? zAem&05@)TtJk|{Hy-=1$#kc5->LJJXa9@9xapOY1uF&nQq*Xn$AFV(wUgw9FqV2X~ zjO!bTf71JhaWaHxVfiP}g2Xq=e>B!*#S^IJkH>bgdcJ7alHAM6b*VyZoa)4nDLmJ> z|35kE7t~|nBmG~i+oAd6{JXwv2byX4R73TV*fuxf`BhF+=?mM<$Vfb#>R?RNj`pi3 zr!#VNqDQay?fGmh@^+7g<+-|AV@4BS4&mw&V?)OEp;1@=<|58A=|i92ZA)3KNO`F}b;%8s)5BaKhlCH_jhm-sUAY~ts{>xE}BWHzMx*!fj+x@L9F z>zdg$w`+FS{H_^ZbNrC#RiCQ?=G6txn(kj2)w8iX8@DCzQB6!{mif|3B~-#QkVW+5 zS7lV%q|8?r;QQaxk8XfwdY?d8c?z0XZ{(#!#7BlD&D zZ3k8)UB8vgpaIB1mOct+bk%t{qnGqEdObg*xAZf5CqJY2@iV%leERkn=A93$Ojj*? zmKoQ>m2y8LK3}twbb3XJsYR8Bs%lN^=od+vqkK#;HcO$*1Ey&I%g{ zMLCQ3M6F!SoFkf5^r~o8N40gZ{qeV4kR-!O#dzxPVsfk=F^Za(WfR#ZaXj5zyPC>l zq(Y*wGn!E&hI)?1iSpJ?S7V#!y)C8K-Hr(d+R<1NM}23msT%D;A6LmfX7(TtLKmQ2 zKb-{zp>-pj4kKT6D@WJ!Nv2#RnW)PBMCNFXxYN0B$o3ijn zLP^G}RE&)-_vL=3X~c+kd7ex2b!L1dIl01*g*MZgh{Dgd(m?ee&2lB8#s2LTW)H^9 z61=Tv7n){_l>NBVJ6Bjqo63HG-4CMixEyV$E#DguRU`(58fq#MUTf`S`G6fvP9K~w}30RxCAf(guG&e?6& zt=s$iuj*!MX5%^gob%lKocn!y`dQQ6|9AE3>dLih)vB`~>7KHC>7FuO)Sv14{tW-` z>iHz^&*uL&GY_B5e<(fGOB>DqH344Ma6ezQAi&ET?&qs+2=GdV`}wD70iJKTpMN?( zz^fYW=byB?DGN_^!~Oiz-~g{_xSxMID!^+S?&qJhdLvEGa>A=p%OA!0HTY#`%8J4Q z)go2tg&xHDs{p5A1NU~Lxemqrdl>H5`Bn??Jq`EkeD@CULc{$!-;M!Z&+wwCh;zRH zuWxwAs3Yfd0=$9Yov@l=x0(QNX!v2a{&!x0s|~K2+RrWvaMe*&WyQkzsQ_XoXr2SYhGRl28m3&Z`q;4T49GQ&TZgL#fXPD{fFMT0m$9^jg< ztxB77GUtT>-pX)4FE}H>TO01@1^Z*Yk%gy?;eLKXc4Had)^P9F_^1Fsz;N#eSyo6H zKk8G$%0}c0f!Ln=0aOLl+*t#j6WN(t;2OI9~f@Q6h;fEOR z?Sjh&cn8CMJs0{Y{-3PN)tVpGYa^~kGeNyMW;wo^(MKP4g1?td9tQsdv<>G+C<-~osGsuwW~O_W>T8r>^d7M4~lw|FG)elk~{+H_fwIf z@v>_5%4j_=u`x5Ru{Vq`efjy3@~ybr)84DB>G~u}ShmV^xU~e5JStLKp{vn5EV`=f z@Cb-CBrz@N#hUr^qYY#wJ<(@}{bU;}iNXf$umKw!sWb>{9jQLo)hRnxcq%qB&%L#+ zf1$UWW}1Jm_5X3A?+;`#r;(7Caak(&kZ7+oe!4}fA@u9uNNte5S6*?|t_eNUJo_rn z_CSYnQIw6I21YYeSskKV(yK$Gd(*3;XiR!_a8xsW)8ST!Nanz(TPmHkm!yc^Sv#5# ztxKQj7^!s=CtuJh8;3Q*Ht@5FKK{<%VJFsnhn-l<==AjYgQC;Zl#?%DwYYkN;w>8| z4KQm=q0NZnZRvBY=S;)eJvt}7I>Bm0h2>+!!ufNKmUp@sZ!7~pEhWPh&y_3i<#dRsN0`r{P>+>bB( zI+#D0e@3AB385k5&#!~|KEVCB!>@z+G{99?sWmO&f3G>LXMj$D&VsTz>v3FXZMNEB zjV1I>ef#cwp}vn05QIWLTUXV0%t~t|P@^4aR+H6?ve9qtNTHFWe8RA6Dyf#mfzaB- zxZ+h(>qSZtT{YO@x4n2Lf$BSS;JZf}?TW9C#hK*PB84))?bUX8{;zJWy*Mjbs_Lr# zj+VM|q!`rGHKRgHEid!mIz^uf|EKE|mD(hH=VCu!-v9UDTMefLcX?vTi=MG;a@WGx z_U$2dG|T~iA$|cNop0u*Q2i~}QsqBC<)5TMj4!wQ3$IQttVDKuT5{k=Xj#<@)uR{V z7m@Ri09U@)ZU`2FDWizGR8d%(Y9cSG!y1NqWVRgZp-|DNI*zv{*6(RcBW;Q34VN6aI~^c2;j zKeT^tH0@TH3bh)<<*9z%Gny4Y3SRXV!jrH4bK=$>zmA>PvEK~Ri^q7>^LImj5dhwk z%GNXdhWG~fCk1$Y!{^3x!IuZP+Ks~KM)q~bw}WuLSNjD?k5I_|-6U-ZTzY}R=q7f^ zrk%Lk$D8;y{x6Ic$3W3A{wW@WYn)#g-4ibZpDq3r*SNhfS{1KJ@r+;N^TKF(`~dg{ z2_xQ+Q=p7n7(Eg{0<_{*yNOuAm?wOn=!AF*_%}BrpLi=I-aOtv?hjrkh&PSH_f7eK zS9l7=@5*W%zHe$Ld%)6ST;uS4u@^ZRIl}{7LGd8)xx)D_6 zL*i4wUlTw1P5hk=ABFCjHtQZAZ^FA8eva8AcL&epGxX)XmRZrwS+h$jL`V0AAm8?;+mL@Hz^1bhG%0 zH}RijcoVa$dbwDBdErOGp?p;3K0dBcyA`_%0}S{3R_ztw0}c23mqPYD%`X1HHhUPz(I`X~~v{Gj+b-S7iVH*pbobfCva8r}yRGwh%Oe6-x>?1ldBs12EycI0Kp8b}xI54D0?Lv0{R2l{cx znn=eCxWhMsi;AF*P$%dxs58_B>IxkWb%RI^G*pfp=13`r&dK}MJAiXLs6BKbbP&|t z)(Xon-Um>Ht>_2d!iMN&>gEk`G~*`r4udv8J*a5amu~?66!rOOoOQ2j>HTyq-QaED znLhDZuB$x3xBwD%HfQmL@6&s30?*_>%k{1si{{HJFnfzK$ z#?fFX3%{;I`7^lB1%~|8o#ZE?j}9H=A5IiB5a?heRwYAUUJW2 z-tx;nQ8WnrdPta_??`yoa{ncy_-IEy(0#?t{+m?~T|Uoiq55O-GCz89lu8Ua0K0)+ z3%x(LmgLL{SODL{{BYH{CUfEYQP9i5RS7Gf1G(?Otf*{A)Mp|qM6=_Y;@jiJ@#FCm z@zn+15@B!Vog2sBjPw55)iglJAbPEv_TmW94s8);`~2-}9p#vhdOI3)VeRtUnj; z9@mWv<9a15VVl#RI*0h1On>wq;_Z=mJsly%Ont0Q8u8sld~cU%II(g&G5bETIcc@e z73c88SMiXFK3ANBPH;VWUGY07+MMQ_fuvP5h7ecXG7K$m8VR zH@kX^hCPYLWB87)xbpZ- z9Jj=Ga4aAe-?Tjc0r~z!LYd=Dt)e|Bw_~^~&s|Tx;23(lmk{TxiR)kEY;T`aZPow_ zZ^F7OoSn$&viYBv=J2JKx0R>Yk&~Yx_kK$b{W&U(yVvvis64H6o}0G6tm~wi?ir1t zJnLP{DaU%>ca&efQ+xF&276)=b45Ho-Vkq$%eb=cX<|pQu5{kJst<8Cmm%*B7f>o$ zr$C-mJa>#g<4WUH?dH9fcvAj4jrh2OnD`(*hi{fNd5_SJKsC5N!=zk{9F=e7UmYst zzJx0`&mgycK|1dmS0m@?P4l8_xKjKn*A270rd+m!+;vVG<_pMWhf$)$|5E&28pbtI zrRmiBVA4y;BCa#x=}EpAZe`#`N~7}s>*Rms{cJCyJeTh@TJWQAU!IP_Zt`SuuFs(w zgQ*_wmzJri@wE5}>czTXtF6A-M17+gXPebA+p%+gE0Rsnhu9f@fwkKAR?GaRAXBTz zrleea9^a{2L*J>gHP}{xsBF#Sdu7LcDc`%Zv@1h+3V5;_HF~Y6uUXa)imzqdtg`kT zdWzT6kk6*3k+$O;YT4@4V%_4Elr|wXqi#HR1H3=bhA1XiM=QyX(g~=(_BFFltr_Ia zmG+(bM%ALKLsf68p4=OYt}fJ4Dgn3g`;XCIxGT$DUs8T5x%cO&F7`2*PfL~T8N{CQ z%NHCoNJ+)+>CDUcxtp`2ue#x>5zMzW8?BUnW+n5Gv(cO_B%(^rsQ zo$G@sS;sIFHPlwAsLj2JmLtzv-P-XUaRV&U_M;bl0%b%oP%fTBnn=n?#J=`}()C!Z z+9n`fVN}W0ik`99kiWxI%BLC!Y3<=0tAC{pIt^~cqgp_-nsu03f7KG&ZLHBw>r>xf@HMIG(YL8TK8n9hV^gC#mMTSGraiU&$$>?2xO3d`bdoB; z<7Wi5&bSu+j6FE^q;0PkzntdB7vmp!v+~0W)?T(vOIc_7K>Nlgr}5I7eq%dZadUWl zG8_uY+Z4=&lmg|?P1H);tuFco3p3R{!-+AapTes)=acj;*I7H=GR=c(gWJW~JaM@w z-_`2izwJ!hEl#p4VUMn_(9C8n3;*k>tp3*i*CITME#<+!XUUuyL`9F#B1i$9tw7s>o`P9y=nF{!o!z$tPryu800d6_e z#vF`$0$gRUlGTZ{z5y zM~f2IHe7odQu=N#=2w5c3T=|%#xJ?9obUo#ks{8Ara1A?vL5$UQ~VWh>CMp4Gy&c6dAwwLs-+xv3cB%hG%{SRZ~ir#SGF8 zeHf{2dpwXTq=@5dy{=1p*GpGc9tw41(wAw!`)sfKY=8URqDwc&Q9mX!q$dckZw8kx zL->7M|3P|`z8-aN99;vw!0+EenLg!+ZTM~2!d?vzu{Ijg?}u?;`gh%nPv^@xFM(D< zZ$W=Rnf&CLIBE=q&u6mr+Zm;PTgH9Qx6r%%>~&evQDx8Soc$*KnC_MDv6G__!C*cDx1HIZS1xWm6#S+o?{ z&b10%U-K%qX0>nsoAdns_Uy5d>MlLof2aMAY@DGLgj(6CuxVF!ecuLJdW`_{Kx$AT zWUH_TB}rj#L<#iX)jHXCXczik(YW;e^6KBjzJUGidB3C{NGmH}>Z;Qeo)d!J$X}>T z6+`Xes!aQzU2DXz`mnye)BAHf%--jBf(`pE*{J)ZXu%pUp)s+b8cXS;{a@vgzc{WA z-x0137B1Dz3RhpNy>-xCGT>LI?{vWl^|Ji(%+F`ZXnv>ET zRq-B86`w_amD28<8wb>y>y7~(!?oHk>HM>^+U&vL8I4YPl$Iy7RC=fum%Wu*E?=8A zA_r)P?zZGK)w>5pC(xT!Y-F5&##cP*>S+6L5J#k|;!sz4mP>TiAZP<;(QQ)BuELks zqirZ|6N{owxA<{neQL>emPUFy-*T-=Pg6pwlB4Sugtd5leQ4B!XO(k(o74hbY|Hd( zR7Ui~K73Rd!-cjF5tgaea*;1Hm znBG7&g}C=6JyrYYdOuQC^9}#j|NUG4_iz2*zoP$pfRYpKWc)vwdDN1)-{)h=nG~}U z{C@w>K0k`TC}#8q=`X*`ZZzP}-(&n5(X~|jj2_wWupc43GIh`H@Q+O8(6Yp8Z!1UT z%2WaWGLWP8vr39zn({LejMX0UTbW(pFMlsLg&OO)mcB>t@p&mfBgI(lZ(j6M@(%)h zU%+1nJU_*kr~HgEW5j`fo%{fQqkv!ifr1p@obuDs#TsuFL?0zz!vAT&zc+Z*6o23I z!{_4WhQE`10Ds@$duh&SMLm8)HN~^;U7p7O*fl0^!k^*#UiFK1P4VxMUj#obaar}F zc8#_t+u?8Wlb6FtI#2jG`tC1*w*@bvN!&GxTYKEEZ~O9l&oBAvzl~4%dx{_VwC-iq z-y6@o$zaYy0{kGu{W`p{0WLklcxD5Ja-IoJBWZHfpB&HXl2bS@2=ESu`}Lh`0{l?J z{d&-C0bXRdUqAXqfOj<9uQz4lDRS+K^j@={8;?GE6u;LB@WYM&Ec`w(rx@VU8;xiF zVJzn(z_WPhVYv5yduo6mX}I^7J0ZZ2GTi&uogLsk4cB}fc8URhwBZw?37j_tcrU{> zw}-|#z>hI}lI?@~V}NVCKHg>l$xpu&hyPf^r?5jRNfO}48GdPWDd&y>-pBCE*trcI zc7PvmxaL~$;g;f94dn^H7C&n&&xw`_C%<92)Y{{-(1J(N8{ko)<%gChaz8ue|236^ z-C^0jhR-(pvv$Aw@C)x}_;vU{U@d-tGvqdZXmdC}9N;Gzem$PvsGt5`EJtIb*~|pr z!1<5>A87boX5sKaBYeLi!te5j7`}-4oRau3!{_1ihW%gyIe#(S@9$dWx8nCI-_K@; zyN5Ur1eYD2410$t`r6AeewBws(O=CTJ;ZM_e0n?+{-!y5ukqhu z_|4c2l*AVpetkR-e5m*feLHfO;R~=1A>9Lfq2UY79{t7uUu5{AcoF>T{ClGze3#1e zBJBI$O!27D=ac)u7YDfFe;E8L41dYiCrD1l{{Z+BEF@kI%s3iV`;VaD!J`2D2pECSDtSw6NKW+FDY@o2)NWb?C_@6WUQ>-$` zhe7yX0KYr(c*cJw{4X2+e*AGM{#U`5vR*=Xeq!lp?d*2Lf56s={2btK86G*kvZKdi zh5uc{%eV^Q{lS$#g}-ljRkv%3EB=LlXn1ApNLZ5`@PBN09jCn;glGJp8eYTI0-qf4 ze{T4}?$8v^_`fv#0Cynx4FUhxhIe&GqOB27W{;|61f18UBeBEzzlg{7&HaM;_1kuY|C$z$L*nH;M(3Yh)^-!uUEnUaLWIi_>uDv{mh39_kQnpFYogec>Y?$ znP)`)frcA@!NZ1o`-v05Bjl_jJi^zbH9Z{uGsRDM9wj^;_wzHGg77>B|KlnD6_V3L z{I0C}ACF`8a4>Qf1o(Qx4`IeIiZ%)--Qmw?X#o61=9lPW!%a@XM#D8XjJ`&Ve4#A# zU7ql#&~#|t=0qxAg>xg}^tj)@aB&dMP4I6@`D;rK;oOKFgYYeAtD7Rn@S4=?e?%$n z=V98xFZ+y5j4!16+QK@Rz2HA7z?t3$_xn>$2ymwG!To-gcNV|5>@$XI7Mb=)IPpMu z@}D<+U&b=5hcw*6S@444n#ZQS^WSB55?c+gj4q7!=K*dC{rrsji(9DVDb|b@GTVvF zE<&~tvW>`tGTRB+O^_p%3lzi5>^dwOi)}2JZHi<+q4}Ds5wk9wGaHIpT(b)+U*nk3 za?Fc6EJhrGam;V{^+ydjH-s8NdqIt%CQwr-Tu0Q5`{oeZ0A`~7+Mj`(Plg6T^t#oP z#>1aO3*@l#bXdSTtUVpJm<}C{!#35Ssd0E6ad`c9cocTn)jG5^4xfMyy^O;$)M2IQ z(9k&iqC5PyI5b@jt%t)3)Y+(P0_Ta)Bxo`;1-cZv47wbe3ek&T?{|lNv_lW!@T~68 zQaH324lRR2bKuYtI5YwddtrwapToA*VUO<^^}Fa+=r)K}LoER-;~XPW$Ed>5^LO;B z9X%IEZ^Y5VaP%4+Jpo5+?PzHot(BuiakLVSn%q&#Xg)1wzGLTWunquk2epT?byNS< zby-?V)}7~%gpPuGLPtZrpktuk(6P{QP#@@c=mh9Qs4vtH>JOa+4SnFHgO`UyZegB+z%c6tT?=3hFU=NAQ(tFM8{=oH7 z=q4YAbg%DzpX)sIeR@uqWa!)uEVJ3VgzG=Ul#WmFd);4snr7Gixz{r~KMG}G{*LR? z;nsKR`~EE4EzsxP07;(0{1De~L+&?^>3RKj824G2r=-8_411E_7PMji5lHX+fqVBm z>*}C(kgyBOm;7yPDf|lVSESfh&JTS=9^(A>QrHLv;F2ev#p$*9wx`$GH)Ub?l!09y z`mihv`rdZjcY!WDB#wHO`fUvNdUy67$-5pb3*UoW3wtR&m%jfp#j8#JEeZQ4G}gKn@1J4ecZw&AuP|Lg{J$EH z2|BqY`F%U|E0l%jV3axvOBRm9=hER!pqcDCXGkZ?ys^4_4ydCl>40>MqTw%=Gumk)0a(X)Bs|nCFDE$2{ z?zg5`;a9QoRA8(T@*K>)NOgE=-u~dzQvPS?e;(e(+mpP;>Z*$I;qATk$rH)t%OgT2 zU(`p(WvhCtgzMcrH{U&fp{zwnDR-~C&nE3mpx}V(N zoy+aQQ7%_0S0i_1?xd5)sKH?&E<8;^VHcDL5@fE zxZI<;jk(uy@8rJD?aFf zCZeB44r8CaJy^xkFy4#RRr|-A;-}+hIkf7q97l&-QLb}N;a0pVW{=}I-i{N9L&G)hRHr0&5~2@ z_j!3uG%EfGi(5(fE!hhRvh@2L34i3GB;nZto^6!umF&$^d6WQgzMRYBt1w%O6#HMr zzr^KSWmnbJca7a)uA3X>&UKUBRClMVLmux*{Ex{^&dtc(kXx90fS7)s`2CvWo7^tR zt{l4|yDd5LbmH}k$4U&+DUO;#c`arEpqqdafR2Lg9TNw<@^_uO-P#!3zT#EVnQ&tPnLewq)OGGo|}mC&ceYu&?6waI>zroPF@WE3^QCCLOz-{WX?su5}mxki<7 zh4^9jsFl5{l)YAIxl8;(g&PwF`^Z#;yWoSb2DoYxT?+=eqYAjvJO8O%iW@= zBQe#35uWV#waffai?`DmCu?`K35<=WkP|MC?qj{=sh< zZ*{M^^KwPWDaozL{A3wgv@&V#_%K&7`HD1A?9R>I$T2T>6UQyNMY+WsOLBK}+>>h# ze<3{IQWAB1ZzcLyE7O1ED46`IY}cf8>ZoPqyUk4@t>dOOoZ+Wig zGj3l*?Yfjz$NkAegX72MYGpH4sFu6dM_VZupVIo}C>P3Q=Tp-XDb%mMsYTDC#@s^A z&rc2|kKsDsQc2eNLz!grX}B4V3Q5J}G!jaw)+TOBSyk=yVD2F+tB+7xAIm*Ko%=#= zo0ZsCDYLKV-lpFDl<7rzccz9Lq_AO|-l(TdS)!*X3&2aio1g|J-m|+Os$&Q7>I(HPc+`rbSjeJ!19KtGPDT zzINa%52b~@g*N!xw9ZypJd-kY&JJtV^7NA4812{8zJNEh-{KG4Kiq}MUz4TDL4;Oc zqkh90CP>S2tr^=z@d2*A>qw2+pOjGxdN=;S9>VLxhIlh;ecz(Ij-)JK#IJh(cz3ls zi1<~RD56z5GU?2fVz<~bwn8+8+PoZ?uM;<>_2E0Y4QYMzn%nN)=IBffE~y8&gWVl` zm)>95tWg_Mrlbk&KwB?Q8pC+MYNplkW32F3Zl98dXrw#aT}28jL@%-4dY3p`qnaO$ z?C1BlSdT_S-Vipii|_?_5*UXs0j&}#;2E{1pIB@91?BI1O5blBj`p+y?P*oo(=YGy zai@0bs%8FbcZ*6~B`8&@_rDAzezN^PSUxs#PEzTJ?`&YY-MJaVO% z^bkAPG<(o#*8L7(i(_GG1cdOH|4?G1vVjQTCeE8mco?W2nAR zZK1kCHAORGMqefylb_7rM*;i5)TGCjxv!V(o1D+rszs_ps;Nb}fi~s% zw6F1KA`Pr0Rp$4%ky@W?&E3D8`kHv37U_fdQ(C3Zg=S1JCdyC!K$Y)lpsHes`Ntk0?t)hW}G zJV1vZ--lX>O>N8}-yzqz>pAArcTn$nGjH3@@h0#4%6-i{f8_Xy-fyj3om_)lLk{1s z8*cq)_3XyvE}~aAnPW=sQjW_h-!q7}t2t)T2boKqdyAF!CDgPk+sD(_R{J-I9^P5x z6NPqFw2ZQ9)-_w>Z{y$N58WT`qGVQbPolY(1pXsw{|3@umwrq4zU6<+Wp?v>lLB8L zLnU`bvO0M*skF+!Rr%^luJz?#xhqLeeeY0rT<%NSp=z`>m5{00H>(5HUzv|SSbK*q zL(iMFDyPJ!TJJ>fE|)7$A0>}ozxw@Ea~dbKq(`7WfyN7ciTzQ@IUMJ4jA8UJjvkEf zL0`qF;OgX>C8mBz^Vizkd9=u?Q>!6q4E-04A?7CXPoY*;>(10O=x9BH zV`=-BkwP2Dac`N&3dQs|EC_bxOC?49**j@N)Pf93R;Ka)u6vKM+iygztIF1wiAuDa=T`Wlzg=R7u^h(Di^?gICZv}_D_9e8>#c*1tJbltD9 z((Y~#8!t6?t=ulep2kc2({pP@ydBP=@4PXYM~`Y-a#z~td^kBZE%z&ukJC`jCX}+m zRk%9X_~<9b26Y(?s0Q9WtpnA&kx!(zqZ@cmUv#ru>`qBCpF*QZk@|dtT8hc;D#p6Y zZG5ZIt;V(slJ~m#+~V7I-=0^beNYaZ&UmF0_Dem|T1~csJ*d_6p3md?l=JDdT0j2PH zcL@1G(udGXQCvS@?d;Rm&W`6dg=3%_&kl-KTRop8W|i<{dR(lvAsqi>+O$9+tcmIz4Q__(kPA>-~Z^%H}`S<-Cx|Uxz>!T zyX8)x{+g3pz&QEc+{d}fNh@kG)mbkl@<61T>eJlkxo_#A<}q@tNiTF&T2nn2e~r(e zx7^R}{A7A^SF-A#+KzTx z)fh2p{qDisb+^9%vCP$k`U-iK(*CKdIDCKo$5>`L&W5x=SJT74 zJ2#kmqa*z{#nR~H+~k5}a&mccMRH{_BRRd3&l~dttw+E3v$PMRG2``=HF;A~ZR~Xk zK6Nx}ta@u#YC0ba($UCMQa#X{sFxR0C$FdfwaMz6?bfr`USbY^K@~VEqEV@bUzUR? zH{&^WvD~UrnvPb4SZzVeWL}z*&%|G1YW{}%!JVC4n%t3WCj_b!Ix_36`dfM&jU#NY_hj@mm^N;5d==i2l_NPbp%Ry%NPyoolo8F%XMsJHWZ+Skc?I_l@BkMm>NvuVT_<+L4rnygoojaM`_ z@jaIlZ1k?4i|ia!-?WR0CN49b{^v)&2LlTo8Jia;&XBF&GgddFk-wOEO z1uvq(sDwR=$M2-~&HIDzY6SlwDSx@u@b6ayKlXx#dppH0;If|3O5fk?^{6sWf=#6FMRp`snao|Tq9^aPoH-`TN z!+X-3VD3BMr~1bl!{cA3{7vB>Xn0q5WGVi^;73Ou&*bj||1iTlxXz{chlBTuJf6vK z2LA}drTZuuo-@IZF`Wo~sfYb{VVROAyiZimwT8bDxbkOn;@{(qTqE%JgYP;U{^L{r zW5rMWHz%IYGrWo02mYzxihto_4R7Z517D^0693=@7aHD*dKmjE;f1OfT%PcL_^8|i z+&$vM)0*&jJP(~1`vU~w84rK|lz(sW6Q0(*cY@*G?)*e>g-7^g!@V8(ByfcXykLsq zbzNQLFA`p;dc@@kKN;npOyM?4KJjxP;qmyd^!(7b2jQ6t|DcrrEAbN^tb6jO8~(dB zwlyC0;SoO5aEA^uiaLTTJm3Xa8?Lz@{Ll+8RQY##!iOTy@Ut6V6NfcGAgGx{22cV zi{u$Prn8Ft4YBO#<_GV+4g8c8&-jmk{|>_+M4M2Oe8 z!y}J3O2dN%RD8eT*WvN7qu1Il`EGg{M_hx{E#xw53cZ> zNO(NnkMSn<%0YOx!hc@Mzg+x;=S1H7lHmi;q2p&7T;UP^s^LT8zks(|&p*NgUhtaX z!|^Lhz7S6S!ICh3)9|BgebnIKz3+gZ&pNJSVI5=q8sWM;;g_(&syp~paD{&m;rDoR zd}h-B3FN#7|AdtP4e=L>-<5seaP^0oiwN)!3~!C@6;1Br#rz){-X?AX-ds5GfSmkK z4L`uvxg7znco6=D;hos&8@vAi|Jv|F;v(=Kzy9s7!il#t zh_@dMmuJT)Iy(5?pTQ?a9>3lAmH%9xa4aO_Lim@1E8a#DZyrzZuS$Iv$oUoi=_!BN z4L%;Q1}yt`!^`1|m3B11e=}U8F8Vq{5 z!)r3@RuV63cr{zcI17Ho8~gxM@4;%Pg$;_X7>&Ewh|9eqR~hXDtcr=GvV6aITIZ@~WuxWYe)@Oyjm&14I0PN64Rn9l7v%*y64QzYkpUuSCAbAHX^n8?``w zGx%>x`M0I=uS9-J!&hO6jX(WV{w(ARzr`#TisfI8e2*`|QkZc^Aiov-x2F7BB&hIT zjr;=)m;Z0l5j-kXI=OPf=VOz+06Yu-waEAQt;k}e9msDF|LrM%i&Xx#$Unqz&4|)p zPUX)EQ705pn{sk%j$*KJ7k$;%sb4VNN<5d35$QQnl6uml- zKM(mHpGF--etRy)SbUcgeh+r)7Y6e0K)%P%HU9$l1oDr8|K61UwN(Bc z$nRsg_dD=&Dt|HZg)gJ0Gb)h35cwYWeh}^qEg+Ith zqA&R9RQ`R)_xQ1BXUNBa{2}nKO8IA{^6x|bDTeoy$UhhUbt!*EuWbywP@;&a?y^IOuUkLw(l)qUj|1soWYth(X<8RCFcf+VzBUOzKH6pY9aTwX4#qet| z7*&wp{hEt@oV8wN2t=>V*22&WvGpyq=4zpB-3l!it+!vNLM?4;Qs#5k8Wd^`vxuhj z+1e6vv8}CG&zTfc?4k1v*9l2iANp}~(tt6a;QhPp#<>Pm6>N9T;d&u7LAG9~9(aAI z0fe^1)(h>$xe2s4v@d)uIJboMhh*W6)&NbQBgYo6YhmP0*(tf#5Toa)BiLb3XQ&HQ z1a*bFLEWJvp`K7Lc#q}W2Ra_o+Lhj5eL08gRv2M0D;!6IIS++~L4Scxflh^nL#IKf zLxZ3Z@Se$eG=v2i_4m%#CDFrV4mh?oN#S~=3&AIVPv(3nbQyFxM9*r+dKr2(JJ!t5 z1F`i;*T6$>!7PEbeukFa)+F7?HLb9%N77m(TFmG+&bLFfZnW5bjSVdkt)*X&M5|%z zk?!T58s63-E$5or*w!IE$Tc;mRwdecGHN+$KCQjc8l9M0$FIquHlP>fY(36XoHsz5 zp)Js+sO)ob)C}qd$?kZl?&$=|SMIr7-wLhU$#3t0m3uypnnK}o|B<}z@SYA`TI!kb z`OHUe_TF3JeUZ-aLe49oO*?ru3rEH)TlAkw@nv$eZx!#UA9}gFy%0x@pfDV|&cd4U zc7W$_Xb_ai37^qBCh=Pq_R_yC=C>@Y;cx$uye&MFg(G|>yw1KYd#}R#3C}6ce&zh1 z#hG~Xw*G5zwg-HYyEo_mEY8H+r-hHR_FP{L-3uw~TR6V~DZhQj`OkhU+VF`_&pRhHYpMVsfTR6W8eF*&kh41?%y$|_!e<_X{LgL+* zb4Tby^6{~p_3UWQDredC#oWIN9rm*SUHo@*{T5XF6`qGiL%Mzk+V#~qnhsqJt$@U@ za`I>LH^I~JHTWUDQ~bYjz4zHkeUEQ5u_`CgFny5ch{OY)7LVMo(<+xikFsyelkrnnCvJ|nu(!y|*t5LK4kK^G z(z=#I#%1x<%ue6MlWXC6HP$Rz0zLy9g-!VF&}`>!+`o&Lt0wqmni|i-`_LlZ@(40t zj}O8=wTC;-4RCAR2KZlcZ#m6)O2$KOy?Ywp8O1(b-*Z~4(VX9!(i3b=5AaZWG2Q8@ z^r2TW0$r4>#bjx8C3=WCwCeL&8LM5XRxzIW8&(Oj^Qg&=AMN7yc$+$gFTaSDEQxF8 zTDVF0Tag7o!nc*@9ZwT`&k=uq*PyrghKBsom|s3bOcCcQ><8kiV;Ah?5maZHUy5*)REbeEn2) z)m#(i$J@JuTu0*P2x6!=anzq!I@Jw#p{+ zLDF_<26#6tV(YQ*@rh{khs0;5Wo-&EdZ~qdDz+Un@ZP0wm=(_>OFF`L+g z{NBpRK3sXM1NlVxOg2%e26{f0cTCpn@yWl5S>rQzGAd)HN?Sfg%T?G;IX zrmJgBlc}r6qE$RmldDg#j`^07mJl=5u!F2iX=_1@3@5*wP3fA#7hXf2xrq`cJ4DSb zDv$g^Y$~P{E7C7Y>f%T7f6S}^HQmvXEiEgqouT*Zh* zdk;3GJocpCdT&P_`)NlW(^?6i$LjCMW9`yBc4(T%4o~yg(P26168S=<}4&cWEuZuvW6N)#*)W2h{@ijy2yUSvgwGMzoZ&_t0DW z@31ES5Pw_J#tI#7b|~T>N}Z(IMmB!BS1YU5RC-Bq9v(@Ru=7cn>6m|v@a?M7W)#w_(JT7RhpEt=*U)o0Qyl_dOT^O|~JGrmCK*SxV>%F(n+ z@*JqWXrH8SqrD7e1E#08yFs+PYHz1w8LXKeN!U!>C}uQsrTdSFBlRPW;J&!^*)wf@ zj)+eKSJ+Ra9n=n~=Mwhb-0Ka+_I4E`Y2Jlh9Q|AW$LzoPSNWgo|DN-D(tq0j>%Fl= zbqTvb@BjP6Pf3HqBKlV@R;oqOo8~v}Aj6enu4P5gIK}7FQ$~*M7bd)7G?kSw%zLJC zc0rEp{3=FU-5cO_0y*koS4#1xQ~q-B*EalVYDab@3HbK}uN-;&?cfVMvF6(=kzx%jYelPHdJizd2tduJ$e-L=}$m89NU;BQ!JmHO^8fJ$#GYvo5 z-j+ka_e$~59#r^Yq|9Z=KOQ+nh1$cxl^tq$ZC4xoY~lMA(X(X!#_-OrONuK#;cqz{ zoV`$Y;Nl0*A7OZ7`Xt42gr8}+TJ4hfS%%kjh2Yctd*gcWpJTXsOi}b$`n`JZdEi|l zkAIc&H-P^F!`sl3u>$!EpDyB8(dim_ydOB>j1``7hI@aXA%2PB-ObH?VH-9Tsh%K zU{@!eO^jh%5SpIL%D;RB+p;$6UN zpwrPjWh>^fJU)|=33iFWdo|BIFy)^k`Gw|JrmW_%2SyshFs~Zm^9-NOx(YM^7M>!_ zQsm!a_-*D_IK<~0em#3tV{iJEk2mq(VfbQNSL~}i9t&5$d0@1L_O>Lx*zlDx&2Q8_ z;J@2&jSkTp2l%~)t9MiqUuL-W|EA>*!n54)S6Sc4ygWGh$G&T&;cvz7g0Bzo2MyPL z>a+rZoQDkmgtdI=w-B^v0~1N>3L9e?P4!IeLGZ^2`RCyZ$5r3Cmo!?kvs zcI+GY3uSNX?d{Hp2D9^TalSf|d?o%f@W4F`yj75|Hh_;z`RgO62sz9?m3_kSQ&|PU zm_5KZ8t(1bE)H_`L zSe-+D4&w75@bgoAYsxKq_XqJWNea{W)H4*+bhWEs_xTO3? z!6#7z3g0*7pA7#-!`YFn6#pjh$!K(hcTV}4$&Q~ld>=GECFO4epMvIF_{k|hGv3y2 zO`(x!A~`|$UxokD6d#xJUjaW;Md102chS=Z{7fw{i|+A_Pjge~?Ka*rJhR(SbCQD? zkuXmEXP>C_#I@>%@$^62c4RgY1^iYG+7+q=(VH#dE0tcR**!Gm+z6tVXLb)wIm`Az zb|Cvg&7kHGy(sm#)oU{Q2U?*W_6gL8X8%FWWp)YFFlLWHO@MaH``4rtnhgS_h5Y3G zp^{T~*c^~cl=3@l4TyEKF{sVC5R#q7UQlL>A)lbFxo-;{0JVeKLkB_!L9$yp1nK}C z3Kc;ep-#|YP-mzMBs+{A5UsG;W*pAB8^o?0SXKRNenx4DWc_X9;FCBHga$!FpkdG{ z&~Qk08D~IeLbAz_J;u4v`Op|h_7>xyi=he7BxnkB88p>=t-bjhteioxOW^) z<*a$C8ecF62!22J@*66@Z2w)}bvuz+THelh-sQPVK1MSSeZsZE_d_b{VK9YJVf)|0 zSA+4i;w}qY>2Q_)J)2+ET%@jB@cdD!jAe<(hI4;eirvb2O?thJvuptLoc!eJoIMlX zzYAX`L)V!MUGMCDdUiSC(Rt~goRxOj`{$-%&*t2JMDCXp2@mtj+4o7#$e;Xu?lb1b zA^p~qv-YFTzF{c$na@LAXS}*rcy!MEjE0zgyEx^^&R3^l&-@7r&q%*r&;3eB?^Zri z_?2FwEIpLpUxeo^Nbk@&3*Rn`m9wy9zw6o3`TDfKIhWmzw&(__6=3AW%$U~ zIa#<@r~LZ9?0ZYg&ca)ZacODU8Sm$$nd-8O10L03`d#lG#dqs>z4w-sNAJvdl;)WX zz3c;rhiipDt0z>4_4}L8f2Czt{?@1Kc{_P#XJMI?@;|#1 z{y%%izfz|v{8`@IgYjhP@Mq;G41bs}2k+#WorOP3;|>1;f9d-4f)CIsFji~}b%c(D z6yNGh_~X&>MI+wRpIUj)*{tl#=Qal zB04kAcuag!{3P?ouelH0Sl%INpTyFbCS2{#eDE^7MXX;D+4l}(T=5=ZtH^IHSnImK zYvbBF%|IT)9JjQg^DB56bxk|0_ump-$taG0O_QD$Vk!Ux3QCv%i#W~fTo9{h% z?SagFEo@zxK^(%)L&KSQzQB!P_W2Sw0Zm}t={`)O-S1tcWu#T1cey{kTkXm$eP5K)~wX)9QPnc^uY_HykZQGN5rFT{!adnu85~&k#Hq*_SbUUNQ&OXEbLtz z_Y&%5Hcu!!nJ1Vleumjt?=iP7d8ImE(4Rwd;F~$V;+R1k$V=I+9E&+ta6H2CW>=pg zug22ZC_Vee^14GIq%S@N``&7d{I88OpF5YCmmQUq$M6iYC0a?WEkK2*CqIrfzEUaG zSV}qwpwr=>s^Ds3>9_EbDBZPW$wHtpWwJf*Tm`1@ zZ^!On^*U=Fi8W^Njg0kg!h_xIsRhj4R_iRIUW;$^rThZ?B*|u?3;f!JyE-ANL;Y6B zIJXh`?F#fUA8=G4d_AaXhM)~pPSISi^2$|csc)lfYxlP`@g_XXZo^jSOV*ZG!d|1c z#ge>}Gl=>sb5!B|P6_FVel9|H2B<=T5$1C2w7PdMAIido(Sr zPrr?yM$xQy%%N01O4@(uDxd-uA{&SH#OQ&pT3UY$j~AyQYC!!Z-v;M7`R`FJxgK9- zby?-VH+7MGF^!}4nc(D0R>ih@mA)uKc{J=KLjU5f66q0i=A=nz86oeCR}R z+j!oX?E8OP?d$!ySm>{%OwFSZ37M2hOHU zsZ=j^nmbkAdxHEa`+-JWFQGo%$`^k?+5Cc9;0M0Fa-47NQ9W9uebE|r!MBiX_WIE- zokz^9VXpu2_z6nkGo->Rl)?8Xfn{#?5{EFlz5qR)^5kE!vr)LU7I2A$ej|4Mdn5I* zG|prrCO_p2& zpE-F;)$a$Q$#{Sjxx2&%$C?4xJD;IOqQWsr#Ws=UqYrpSb~&mi8`FPiYjvdR$AMPj z&vR2Kfy%AEWH+Ros9d+F*Hngnku-0T--uqxFutQa*R%MB_4opOpS;QJ3^Oj7^<-u9 zGper{>f}vSS4*PIqOd$RB@YbpDRwwopo`HyT}OUbxm2B3Cn`jC=7aN>_>bkj{C6V1 zeTa=*msoma$$Tmro`$-BXTFG~uNPh~?#7kEdsM5N=LF@P zu)pDRgnAo3S14D7y^Z4BaS!cTm_uGBkGw`%+rA^GsNGeoPq&fYXISnUQ1;XxY;Bga z2hz$MZau@kl)(XZjG&MDmgTgp=c3$}^;@zWr&6jzCDk7}KgAAJmsv3j9DU#wFr#AL8zS5;1o@t!!3rDIOFDlQAPv&N#(Ao|c}2(1|{XjZ#@` zpoWr*l%tEt4IO!_O6xK7(rU)8UyAN9&9 z)FXFMS8SmVre9BuS5gb9Y~5nD)eq@YyGOGh^l_zn=p<^=>GWd1Vho{Cg6iS{#L^t% zX$kT495MBwlgCa;8pWvQpje(d8*n#_d^*aWm&M~vyys48{FSsL@?N)@P`6{Wlhy7w zlY+c*}d{fn%3@m3pO53A-K zNIWVQWVzlkjm3e)j7oM(dNrrgYhM_3;63UG$_u&5x~xNQW<2sB^}lZc)}^h0+5y#& zAJUUhUn1*ue2-7<%xmXQu^+Q$x;u>b9ff5m#VKhxi5 zx{Uu*^?&J}b{0Z~- zYJJ(C!}#Y@{~^ch|AaS*PL5^gH~AUl6iN=5K68fU9Q1-zhyG{P6_1Mk`J5TXq0=z2}PMt37DKI+OO`gTQ46Lpbx* zgKH9LWdS`o@uzqd!;7$>kD_-1yqe)h(vK^NtBq_D9nKgGTj%GC<<~I$INJ}pQ-IUO zh2PtCo#An6K9^s|@PX)AqUgo|R}I@F(&`3Q`viD>!%uS~!G8{LjT4$gqZs>S*v6l+)eGDJVxQcn(0B>ga#jK=2R~+Ci44>jI2Y(lwc(d>`NaDR$o8Q3@ zSH@}*T|pn4KK|BXer2U5(arAmQh0mA=iu*@_9x&!*zmi|p7Km^*~96(4mJE9T0vU8 zfWMRBE7*+#E9QW|i{X#rKeZ%IlR|hN!m}#SlK4o&r?O)~Nqm&ylg+;B3glf1)qYHhpPKR)!GE#g@>`AlWxziHytnzY zMu(E}Gjnf#4SPq+>7}6~3-~XE|JW3-`2ZkNO5 z(NszNdc$8}g&BU`0{$Bf|Aby=NgVYY;d#gG9VZ3+w;KMp_$T<62I0BgaILP2qE`a` z1&05DR)_vGMk`tP7a3l`RVjtvZMar-5&nSxUc>Xvj`jp_)ie6uWro)@yXtWP&VYvS zd%Nd5z*Wz{U%)UOTv}A>w*X&hcms6$q`UA!X}yY;KJj>ATnPSp zTA%czK4CD#Xw&m+mIFD~9}qs05yk-c8*KOWzzNhdD8#@uJ|;f~_!`3-#tp$I2l!gU zwI-D{o&o-_;Z4xvG6y4^`T_a*>kQw=?CbV<)8`Z68w_uWz7OqrfNwNhBXsO#1ALR= zn$IbTZ#Mjh_(<@z@H^5)@}DvMIP{2U%E1-?;O0+pBwF{rK)WiFrucKl@BJor5?)vo zW6=_CGdw@u9jK8qK_T;Z#Ph3Mp2;{<_^ByB)-UmP!^^OG7xh@c|1S6_bUebZG=9aq z%M(69enG$=09Si~SCiHrU(DJ-{3r$K`w{mOQ~sYNr=j>=*^dp^dOO;sw~s)z53**O z_5^;FJMn*O_ul4&>F)7!%)W45Ag3byGgAJB z$SFe31k$~d;aZs)MZE&Nvf&q?J;uH?z?J`Ipe-5;ey?!KDRT0w8h#NPAl90BJQlvI z;S;dXLX-Hu@f%*laA|R=Cj-2e;hHNfiPtgwD)T4T2Y!`1+jj+Lpbp~gLtlI`012A;xCAw2H-Q%`3rx@_~l>GDtm1b#*! zNA=p=l>ZIn6ctLYE4!EBU2M*%@(0CuW5YG$g{C;bRS(WZucm(M7~#Y-a#DYX-k;er zkH^BB8~@Q}_xW~!?`Qb&v;}CEKQuYU-^y@l7E9u74DXMH9{m&e70<{oXluB3aYS1y zocNqae6}~dz1f2f4C3J+@Eg%f9|Hemf=qLXDukpvF)WNTHJL?LJ)X%{jDzZNa_lUo#t2 z*^K^~4Jy57vpp^1OwZNqP3d8x*Ujupi)~M3KPp>O+0-5l^@5IpdPB!T$3cCd;~{!U zW`8Ri*FzxLwswSM)7phF%MP_abP_ZGk}c}V&>(0qGz1z74TJsyodVJFt2ed7MwOOV zwYJ%xQmdFxFG_=Qcxu-hqwDo{tfM%~mh~)1_N=n+l})Q`d}Y^q0VLbjvCxIkMbJ2C zJVXmajT%Q2IZuYBK$k+7L6<{Qp(~(i&~)fZh+2`B0S`W$XF=CM*Fv+Q>!3N%_0SE_ zTxceABm6gWz7@I+nh)I$-2vSREr9NV7D6|fZgvHIq9-BQ3}z&o$e+MO>cC5nD?6eh zt}lh8)1Ae6K6E$qNQ#M1&*;3Mx!3>7pU=nqz88In|H*ZKo|oLer00>GGdstdcY-~g zVmkj0sjs4Evg;6U#BXgNg)!vOJ2QTLe-;nfcj_BOijR>zKMq;|W$~!9;&KFyxo9iD zWil$$XE+N?&-Ubc5~S

3Kcp-_z^n@3D^=bQmNalfkn(D^5#4|NjM6Iz9Rjwk$m+ zasB_WcP8LAR{h_@_v46tvkzpj-Gm+=l#F$|GFOc^>y#_-QT_Lwbs4n^;>I+-*V&RyD(1W z`|z{P%lin!Z)^VSeLR6%62}rhV$ZgYzdzlBjoN}bjHhZ z4{c}Vv-rC!_b@CW7ry_GKV-a!?_yv?@hUo%uHIUEpT)BsS3Ay{>mV@m;e*Z1^ z@LAzKx95oNBnY1&pXC|iPWX(FlV_AY^!MFw&u>Ea<+BO{_t5>26Zgfh!>R9OPR!$8 z#M`4zRuA|*o-+SI=OO1^zRTqAxy<1$!;*0uwm~0r%0oIUYTJALu>yF(D~KcV`-*NQ zcinV7XW5o-JF2~|WQ4u}eZz;GDNkzMm7K#W7K-wmEb7`TooqKe-Mq6C?q~HadvJ(F z)!EFa%AP>87)!gG>p^_75Idnq+?Due6(=yPcGt7V(I%`4Qn6Udz&4@3+M#C%tCmNw zOV8!r6`YTK4OUX)u?>0wt2ePzOy=qNY0q9uAFwRrhP6F89gpS?ebk+_fW+U=GaLVt z^Cf?YUn?==UW=Y~XuH_YmD9!Lo8Q<`rI5GVyZZ|LI|+R!@3;H)9Ozp1w|og}xA&a` zgh}?t`dRjEccq;r@h0t;u6$16b0McVt%VC{Netl)Or>U&(N%c^VkI;ZYc1I!=`OAZ zi32%jVm%?36Z&Fk$|&29imYa@%#28NR-@Ncdm6Q6N0PU^=jKa%%icP&zxNZ&Vapy> zdDzkEZ0rhUADe2-h|3x0aw4CEYdbrf{pjZPrWMgKv&<3eKJoKYP8m0;ramoBRG%o_ zB+d@Ij~#-x{c*}(A9o0GO+s_TI%tC0yCuh4x?ZP}Qdlwcbj8B20E$7J&LC%44rNqX zc7__oTPfrfQ+8(+u*Z^6=`htMuHW$FOmulm`q`nqUR&(BdN98IjwiNx5~s^}qbr@L z3a#vRcD5^Loaf=2OL)#@SfpVs;s#zSmaP?eLUpVY9%Gh!9jRrjva%DcSYp1#o6zP?OPhZXo&ss+<(ZCI~abHxAQP7PT#{X zlA51z-XpXO!#IhtD|SM5tV%y8iY`u@yeRGL^6aHskGw16HNrnaEUv*)OTr?tDC2bU zW{dF_!w|_y?2>YRb-KC*uyzx>I`Pp>Sfn=Pt;^?CPDyq8x`g~y@`C$^b;N$`;zIkk ztysg)86NZ1)M00ksIY~bJ;(y8c*0dS5EwOobO5P zKdSR)Pmpq4R)HszcJgxNBkerGwVV_rb~dX?MbDCo#Li~>A7|u^aqFw|Pv!kgb;Op9 zXmhT0ClX6i(n&ctk5X39)uS@#JRcXJS@_sKR{wI|A z66SPDSSkDE=_S;&JMiTGswNo0b6?=vPFW+TvPznhp0A81$jFUYosMGv#5nm_W?Cl_ zFW;=wY2sV#-20kR;R({1a!D|4S-tL#ZflF|3&eV#hj?((v?>umrikgC{+I z31dAclh8`(DKjw-P-ZTn)O?h3^C?PB**WfcN>7=8PDN9eGP5PWznOf!fIPi{{C{sv zT~fV_#aw-LZhHxoD>+xDb3ssi3(D77`+(LPA7Mi81PI#QMB1x50St@@Qp;nOn z8Y}*hyLa|1X67dX;97>m%qizSay_@Gs7i^Z^ss}o-6izlJ|$W6+9W| zl5maq!?rILIYPh2TR>EF-1nO)SX4P7~9 zTk5t4$k79>dSs-jNv>q3?7j z_o1?T`^T1ujJQe+J^0`8KcZnSCHQ~G|0I|G|26*CI*q)Ti~UbiIV3MThn$M#Dyf*6 z3t9-&IFIo$TS^75n&fWwcvbuq+JEqBUQhTa-U;dRzRtir>Pi0L(uLUsdn_RZj78&amd4Y-QhB`asMb9X6ysF~& zW6^uMzB+%GrOpp|(PyKVd4jUc>M<0fo*TN)Fghc>r+Crx+;{`UzlIg?DSryzNbx(J z-3feS#mhs5mO-Q$66fbRd%{$rZeW`u!TB^4EDSb2a6VbJ#Wi>iMKZ(CvS-iO40{sn&AIiSI zr@KFmzgsgu67r%aoy2D-Ue;-xdam%dD!#8H=_vHS@V6MxbSeG5grBYW0%~03LW{pw z@datEQVv_Zp5n_YzPsp&Py88wK=FE>(dHK@Ue7b$e9HaghZHY6IAezZ-^94HSn;)Kce5Xv za-VvVdC4V;ug?xK_(!)l)V$~kj&L3fxwa8|9@t# z@*LceIZA2-MhH&LPf}77cY1D;QeMqz7U5nDlms$gSrL@SFO|9HHaA%dzBZ@>>Voq? zJs|Uk4Z!)JA!r1ojYTfYb*_@s>of*Ufy^^rz`Y$f)12jne0LF$xkZ_il=(&8040Eo zv+p7;9{~kvTgbR^Kkj`G>iuCx=EBvfuE&=}Hv=pNFM%&X@oZuVln0~125=IzroNa7 z-T?VaF#8D>gRend%D9_>Jo~2;^a6i#o!$JMMqX+Sgb&C0?eEu~;k#@3z5Scetv8Kc z{;o}a5si$YOB{sm+P`g%W*E2|yaeQL`P`EzZho~$)3n)%E?FQE@6W9LsXXRw-HM^Q#cWS4CjpOK!3)UVT+ z>AqdHe1Bln@;Aq4FY~B-XIzh{OHC`S-@|EATIm^xne+;dsa8%JOcS2igZ}Qt)Lo;g zH|MLTo;vZPiYqfD0m`L>q%0xXuulIiwY9XMj~KUW5<_k1L9B7An^>q#Nuk4Pj|j;c zPKk+#o0cKvBo>K`jUIE3JK@UAbSE6$31jb8Mt9^l`Tkh5nNN-JNGuef9+I(?62yOP z%9C!i(zmF1sI2ih~8h{G;~M9weii6z7!##^q! z>OhazK22!W(#u&-&qc<6HxkpE2=iv1u#GvEJ&erB&gwtm`;&wy)eYB=${5qxylF`p zH)2m0?nzL|t<77f*-4!DBi08oA9WSh4ij0)whOzyJrJa9p~Mbg~VXUc+A>;mWPN2_Ibr!d~Bz7D6(A<)ucbLRxD{ z+IrfNy$Zya;;xKqN#9XgGQ(8+M@FwFa7ka|E!9K$Q1xpL(+kMtdY(B2c{7C^ndK1w zN^4VkfXmD`MV+;OXzH4o9%<1@FY9r_A+(twz7b zU@J1gnZyYBWM>NL{!aWP>sa4ow(CQ+GX7Im-yX)^QP#75OMW=Xdd@uTCZC_HfGaZ~ z;zwz*N-y$zupF>W4 z!?;$=kv_fTuE)u{FRAzO7XCX-I+XkyuFkB=NTkI0kcjebJBNjSoHcrMR7hreTLZK|BglS6H+OOsZrG?8`hOBq>MsrDU_66G0H zqLfrVk{Jk!IPyE|~mAIg)YuQHRIwT>8;6{1l%$qkYdBo{~yc!ty>sj=`M`CEEE zl1nAEORkY~F(e;KdY4>tmU)Ypkxr(NCO#t#gyG5L{mVRo#GCYFWOQK@4NwVV3;Zu@ z@1>oq)0|FkI<1{bXF84P^cAKpY&lI0P?R$0zyJPk#lY&-q^MlR|EBIpTegmj=oa`LN3d8Zjk&!E?9ABeeLNBfQYLY^++EBbbUMPGz<>zSh*BEzbdAq5K zza%mO{%gyfbodNM^D~W}9)l}ocZM?{G8lczGN%*hpD?RmE%j@x2ybP4U`({0EDtu*W}gF;}Xx7ZzVj@%o(a4yX7O;m4`@W5O$ZHt|Y-y0+qFzL|ZRExwM$PdepJ za$UvW!0a^d*W#tWJdXCvjohEI_2Eo%^R2FXI^FsA+HFejMJb zn>J2aA_+t#Q=)lI32u_^yiAnKbok5S`zih<+E$zeXYu_N|FRm-{!sX;IWn4|)=kc0X82>i zxA`GTFQ*Jr?&ihvnsqj!AFBATY59@wEPlA+Pf}uH-vW>ONI;=uLXi{Jos8hyRT`9eM9llsgY#D}nzxWFrUng_m+_p7S6U6s(iBcqxyV z1#lO@53qPCkLEcKVM{`9OL)SCJMo(p|0KJCoX*cwyqq8rCwW^LHzL2YZ{*raW8uN9pfX{5~vPPUr7a{M%|@@J6D~ z*5&_P#ec@$BFv9j{5-`URO>sZTfCHa^PJB)wT%9p#nY6BKZMPQa%E&Xc6msjWM2p{UD{F>*;Ig5_d*wU|8yjUq} zKGZ*}_$t`qF&=H{H!5DvXViSC-=z5SyawQ#zB4<*5&ssyL-F0bp74h(ewX5Vd;Q@30y-X8RS|zp@$Y+|!xx8lvQ@gO z_B#B0=M*1?>n+7kQTt(tKIGq3`~YmdC>kt&pW;{es~BXk`HvL8(0?R>|5WjJ`3n;G z&lP{zy92(x<^EyCKj}XUKL}pRD@i9`DSn&3+wh@3zg7H3e=Gd8mi~z1U-RFBzs=%* zQv5#uBg2R898>%|{`>GNEd8&F|J?t=@S*;9#eeL72EWbHyX33+&iDS0h7a|D;=l60 zh5rP7$R{iQsGl6L?*+V5SBIAlGVbILDkkumicbyBg3px9Wb|~L(N_-Yz?ZUkF>#ph zoEPN4*SGirifx0)w>*XkcNMZeJKkBK{FMeijyQ+z*0P8dy*L(B}{T=D&#{_ypM=e?tkw^sZ> zHE-EN@yea7Hi{q0_#piV;j_iw*^3GPh?Bz@D(we&@#j+fsre>O6Zlsxf3`)x+~^+^ zcks_r{3+`NmouW-8vQzpm-T|n)%Y^$!Qy4T;Bv-+_fhX~2U!^b2xUJ(XP`voV%j&0i*&EMs zUa>-zM9&DvW>+LQoNjp%lIU` z30Lx9#TR9Kj&jxFhbX=nqw<8`;xAErwv!FN+v0~RzPK7c`$Bl$7x5OqRPkaTiJg{I z{7fezfA_4zJajso$e= z=Sszg^SxM_FlwmRpvrtNBQk2;DI+J0j_5U}~U2YtQw{ye?KWV(CH(`D<%X&os|VtCv#2qXanf z`p--FZYUTAhJz8{QZN!+1}+Dqz!hLLxDwcFJZXvKy1sKF{PkcGm<*QHsJGcYf3GM=aw%&6d-_Hm4g9iY$9H~y$`?_k*J8{0dG2b-- zGOyhXGzTp}OVA3m1~PAb0cZp9c{x}C9tA7GV}R0@QFu>E3FeACM%q2bw>|po9&=Wnvk8!M7^U|Z`S+M7 z^62L?^9t61^=i#q9vb{Lz=c5OJY`LutcCl3!QWx|A)Kcc|15%k4!jSJf_$m0vId>N zXfP8j2D`y`&1olqqkL{e{=O9)02L@3#)G@T(+Qv1B>NA(z+d=W-O{w;^HpFe*b4G8 z_9xG}g!?qG6l?|SX%LArqqz~g9M z1wR0J#<`5ubO7@CGVTk&9^f<9Q5y&!{{5!;Tb^H*v4rrqt@te5CFY*^_awtVZ0?DF zZ#R5+mpBvmJ~q5dzhC|?V(w?M(U9lYN7D;T0b9)H54g*30{X!fKqny2n#cV`Aiq1z zJ%xTlIzWwpor9?o<)?0wDkt@oYx zqj%K%*$e#J{l)%Lu7|lc`7ih{`dj>${T==;{}o?OL&@NIGra|@Xk3KLD_8@y#e0dB zW3of^Uhj4~v2@#<-@N8~%7F;-UBKj}LhuCkdHU>aN<+K)5*nSRZnR*(|OA1M(j9jPAq1()R) zE&P7|czm^n>pTy%4Kd)cXugF!&ujM!PTl($%u6_@{uYb9Jt$)-%=ASUWiv*D%HAoLK zf|6X-gYH59V0bV)csN)VJQZvRo(*0O_6BbSZwDU)`+@_(_d!;qTBLoXW295$!brDB zuSj36fssLxp^@Q{%Oay9;pr$Dkys=vLS(A&b@zw+Q~WD}sllG$=_e`YRro5?Dq6t$ z;wf&bpY9j;%lhT5_+}VqOy9-Y$NRkpS!=hP9XX$4P2!83zOmce?C)~er4WTr$`^(SZVWKHjzi(@%Q1^ANf!;g6{Y=!gC4+#e(dhbWkB^Q(Wi4G;;OT zkuecDKSLBB;S=o(IXy%2uapOSeK{{f{(7Cyd;Q|LFYkLAZTACwF39KO z`B~(jv;6{oVZVr9jx<@pKcB0i-^jnf@91CVU+GWxWi_y*huV?5*6UB5B4U%HU0&nl zr9_d>a_Y_-JM})|<>&*?rsuZYIpGuy-XN{zplF9Z*bVeSX3)R5n>BV1kn5K@dznG{ z+_})5%nH`K*u(NkR&-v>ipy^)?~Z%FdMCX6fm{WHB0=S#YS1KT8T1Km3+@Q+3>Hv| zJWScNj@a82Yzuag>)r@H3qB7H1wRMLk(5X=b!AfuuiuUwO~?zxqdmXUVscK92{#1}B2wg5SB=cAQJ>h9srjNbb0aF^Lm|Oyc_{ z6;>IuNanBnr2HoIVLFkUu6Meaw~&{$$9Z|f^83a9>*Sm7eX-+_xP3-h@W?Y|_OmH# zffxEq{MY<9{Kk<9CY2m^U*{J;_;r5LId?DCIr~Tn2b|^Z3S#XkwX#+6-W4iNkC0X+ zHczrvH|`zvrTqIj$Tn~5Df%kXmlyxOu55Zru#Wsg|FGY>r;Mtx1D`XTw0$?}TJIXa zg4Dc`HON~?#jkoVQr}1}6#E`2^^ds6+z-5u*r)z3{~mw7zrtVXKjw=KkHnA6%`b2} z^GQM*IGst?@+rfqUQd7eB@p||l5qF3!c)%4SVme{h5y%*9(Hhc?Cb2)xzGKOS)0$9 zaXI7`_DWH1OyQbIEqR#d%C(U?@g4tTzeyn0nx%11Yz#MI&Gb64@;)*48L2J65-Xi^ znDevdrYQBzJYw)E&OO=8I@Ncn(`4=@n|&CzQEKe-KlhIZ$4LWTtqe zOTG1oDL=&GzF4GWMC?MdP>ChPG-n}ku>yZ><9$jA^fB(qyT6TeT8{XU{5+jJaSOTP z4kxq`O>wS@$Y~$)?XPaKS0*SBDH93T2uqtoEJnpIGLLo8t-?Cx^C$&-kvilzMS}X| zlVnoASdvPb6FZCEtYsEEQYklQ|LOa^6P4K6$f+S`QATW_gvu8*4B7`>g0AE{>7U7) zeb4`pkTm0yyw6h>si}@wq{?&O@pRd=g_I{PfF-nDmXWge`fvKpD8r@fsKQF}#l)?& zUE++|oI^?|&B%d_S+*k&T~E1DGP1#hqzvOU*~D{b*_u~bwl?9nWvR#H&2-{S@ow%2 z?{~_&IHg>1zXVqWRpU1D+xi#zgZ&ZyD1VGU!Jq7(8=M=|2s%^$UPG-qH&{rUU^z9a z)TYk_n}ZiAQ}$AieiLLw&W=vp&_T=2P;k1?H3TNSzX%1S93bVYjS_<>SFJLM6X{{tv6!C!J!Z1YYNtrZ%Y_g!Zwi&e(|9$4b5p z%d!KMW}kTnO^J5D|9~mg9{1&>6LI-v=LvG5#LZIDv)H}L=NovF+exd^W+=z#uH@?+ zPDJYD$|+)(yVuaRo#GDpqb2(_ZTsKJPHE(`!qmfU{E>cUP?%Og)u2IeH)(MLsqn4f zi=c319C0GgD8(s;FPieAoQ zI`xVDX5<2CD_`XIp|w1e_Oj%LYyC;&hw1*s!64e5*9PNgVa^N+Me3PYld?-%P@%2u zn8?_O?Cv3N<0r30P&aaZM9xDIAAaPm^lu@5OFXsn((xGu!XM?_-IPCe87ggsz1TzV z!y5W?Y@shCuDZG1*-2(HaW$2lQf{O^(DmGUO6n8DnDhW#KcF=eRXMz*Uy7Es^aZM! zmUUhF1WgEQOX5_*+d+l6o8O&2LT|!7*dIdJM-bl<{?RH1#?e2S;9pNX6rmL+WrOq> zs;a9xLKh0}FdDWgi%!Tw}dQnmhqz5yU9?WGCIZ;N+iy8FQ z@~M)oDt#WY8`hzD`T(${ML5V0SYnF*PnD2}SWnn7xd_Cm(I#fo?+ z*7vd-=`h{N{3Yf|66+WCm5ZrtBATtCtaUq`xNC$WltKrtSWa+EMCvQlX?!hm#nN z(I;$3S}et%(n2ajt7nim%Ue$kw}F1FLy44+OIn*!hc=*OYRJ`+>jGMw3+X5BrgeED zs6vmb8a>+@v@D-7HIuXeq-Ht`ze-6m)oJ24C)IT$oed*>jq_WPb_US98x@Qpg-i?H zL@Dj^Z@uqn@1F3YeyX2IopqL9$fRjW&sC|p!ro$CzrHX1>+lqu`jJcM*GVpG5y<)& z342}ozPeXl(9{`E(#CwAlKrGJkoPP3Gle#B31UY4spE4NqZ0ENHCV!E#45FO(l$mS zUT4&xNl=1GZb>TveQ@bV=U4ecW=SPxd(pp>)dcqu8u3Z*KTZ*S*}1^f@#lFBJ(&%X zXG_~b)~TGs=Y@=CNUQBd>ZF%xRlY{s_#OW}T1p?%R{E3@=dkKyexq8yKhWB^hnCZq zfy^AzHDTVT04cGUlTCV+^{TDaT9i)A*Y+kg_NPB5=Z4B^R9O>pwOa8omeCGrn{URd zwne0!${}4<9_gua$pDp4E>SsUq{=I@(nVr+H09RU?4jd$*TG1g)QWRFng_DmmelC^ zXqA?yEmoWHok!Sx<`w#*FEB#0gV7o3l}exVIntl}@_TQ!|8pR_af!>@S#QzW?Z=Ki z;i{I=krt-zZyia(eTnHoDm9)Y?R6Rb zkrAa=88wl&DdR~pniLS{yZrD}&DN2}X)#L1Bh&jL9~Q~do4U87P#o=B;PtVj_*hV`h=@9tSpgMRzB78zu#X-|96G| zIC0$gsD5f{Br_6^FFEUcRbMnet+wb* zT_Lrk)D^={t0}Ihp3pUBQI)Ty-W;szfHA7}9Ir}!sX=8Atx`Pg73#SC)NfMuoNy{I z+LgmtR}B&nkzA>dw3u-^<%}b5fhtapegkd;!p7ideo}0vYm7Gv1Z|Y~)_euomk#i#- zki_LJbYe}B9^pDwLp;Tk8}r>DTA6ZcjFiRsDJ`XEegSQcF0?s%Fpf2V*tmvrZXD(2 zeZl>zuf9yxb&t`u)?-yt-$|c+ud3VLW5i02SxNnNh`Q|u#t=_EKYyf9q;TXMO0JTO zDwd1L3Y#+cM0x}RXz@xpHXh$hr9_upF_-d8daq%=kaA5%S>>Er$r)k3kX-SO*EDEF zd%I-hGn2{=c)MwBNqP2~FZ*oe;gjtCcSMZ?m0+||#w+Ej!-&x3j0sIAZ@H0KjFU(y zm&9&=vICZU{+S-6>_a7G=ub{d&J*q94q$J*v2Hh0vdr{r1^LxjX{ISfCp)|OB>6?c zA$~4I`)~uJvAQSLgO=U4pgp-#df@qKF&5>L_KJ*?R1IVVHf)9bcdYP#Zmdvp)m-?-?GazeN!gHk@tz&qvy7p%Z z`ihG0menu8{i^VF9nIG_`ZV-)72h`NLiER~iaR=7VwZHDqxnmXJ_CJo#W&7sgZ@KH z-v+*(qxlDo9xE2Nlj7@SHA-;*LiqZQ=64x=7W&?buas3Q!TtX54IIt?YV=rGxI-0R zBC7)Wmn{E`gg@WWeB~NCepnaeUak22S=s1USo(4B4IRy2Z1h;txRVv1k#$yr`!~Wj zax{OZ(PMGr-lBLvD=oqO+u?H@&A({$SmwBM6n`x4qQB4bkJwc=b~OL3(HB9#MDbt8 zkH#5+v-Hd1n>d;;Qd5T)OCR?M#eWk2620yIGw@9v%{Mpt;^?1M{JZf33GQ!#Z{}$J za-%;N{dUFgiNB5hGRr@&z&Cd^|De&ALjR`XUyi?uzHp^e>FquE7OZR$evi?YL4QE; zFT}Scxc?b^OGop+8GSkQUnzcF{P_g;zk_e(Xud)%9X}P&A5;7j@ipi#vi$!Wd}~MZ z{f)j7`iLw1Bk{-4$10xkKg~Yc+?v1F=&PWo`3L_{{NV)m&w{_e@Y{{P8hTl`aRDoW z9!zjQ8@{dKe>M6V=*6D3EtVMfqHksSU+h-f8UEbbI=onFvG1?&Q{%UwKUv|F|LeiG zH+(yzuYX1&C%7;6ogEy_Ut#p;p%?qh4$i3f*aY`G!gn6y} zb#(kRMlW`LU7XJG?&yzHITb&n;kz2XoY6N$KUVRr;vLcNxAYU>FLX5D!RVW#pQ8AN z@fPT}Tl#767de_AWArW2&s2P^c!LD@XTf)KG=HDbV=<=I({ytx#%m=CB!t&1o^gRrJ(CD#1W7kpP3&o40zoXo#_*o9$)9_h!b$oU}ze@4( zcmeeHTkby%-^2?lj51^$6M}igzs(men#H~{fmnKEf%1kVY$BzzK^5% z8;$-#^t%-QW9(O&LRVY**Wmj)nqO)3Sk$R=(fT@vV@J^UvGgCH?`Qb;jlKu^PZYmD z_Br~dmi`cYe@F9a=jr&tLXR_jh2I%HmJm9>7G5KC0#)Hu{Uv zpQZR!v9;*mxAd6CaLR|~_Zt0R^u-mwH1-(!ZI-??{18X;em(xkma~Cq&nW(Z*y05D zB`aUzXuhn`4?{0m{}N|*Y<`0KA{lD<4n{u$eIv!sjNOiYweb%YsMVUl4|6m>#cJ0H zKhn)`?nHm7aR*CPx257Qjol2t*m9>0{AI4@XBa&et!{h84~`8>cy34d%U#VcGI}gu z*+p0Q*0GBd+`kBZl;NKke0Z;aIT*_b-LN($#!ceg4SKVcnKLPz1 z#s8T3D_y^{l)O(UCr+>daRq>Wr|;%`B;Mc%i$-un*Y$~ zv4VD=RQ$b}523GO`DYFMb*|>~G~kbHeg4-b#owBFH~O$GWLNW{em43e zif^0QH$i_Ceu}I4CC2?Z=$Wg6Z1O1{4`hdMb5|5**VSv^wkxg znwgd0er@>auI5AiLi7z4e>6ijq_zFu1pX#h^G%KWSeCnO6n{A52Rg#C-<8xO65bB* zH@lj@%;;G^<91j4hZzUazhUY7z|U|sAL^H(AENjj86PC*N5Ic?H9yz5k5#)nTJak* zwk7!I8u(jW&A(vukD{Nb_@^^AB)C5X{#IA>p&l!FcZT8@WIU0ep9Me5)%;=OKGyW^ zY{lP|aX%63;ED_%GAHWwOF{zcBnf zSMw!|eh2z&#lM|?7`^R&3HbT0=Ia>!F7)LT|8n|X^y4l6RD!?X)qF3b-;KVu;#Z|_ zLqF8gH-LY@)%*;je+_*T#V<-xZfFmfvfp9jeals z?ux%5{buyNEdTU^f5_GRH%9*!`hkicojwJ9J4-(Vexa-R^c)@k@1P%{_z~%sC%8Wn zevzyB;zs`-`YRRRJAGJ!``5rPb~Rt$=s!R|Uh(bId!TP@`DY^h5?AwGjDA1*8x`Lq zy)F8hmVO5OQdje#{v-5vD858`PJ(_m{KKy1uQBd_jQ)PbC#Pql|JjUtNO`^xei=Iz z3jdJNe~Ny&;!mbU;NP|MkHbIWYChB-M88(?Kc$^u7~j@E2fy6ae5gN!{w2k~opvNa zzY~6itNE9Wf4)F3>v~tXyVCZex8rjU{G*27XY^m8e_Qb{r0qa&$LIU-E15SFKGc7M z{(#~ar9GdZ{|x>ySMw)~``@AeQt>yZJ%rwl&u`%$cQt=*W1ZfPpg*ek$!XKk+wpT8 zewC~FQ2!%(FCzSyw22A&B={!`AL@^y&s2QRw5t;IdElRPHQ&NT$B*BCvq={8mT*3=Ks zPqg$c;McMjo$zlMeSlu}uUhLqm%16=j-R&hoc^x(kBmMEeJ8~)PThdsj-RgZ>s`(N zX!KF^vj5h4cSPz!^mhF8gx_HJEa|Lf=Wvn<<7SHQojMG?9X|u$pLI1~-00KM4^e!l z)Sl?=_!$cSoU8dNMxTlPQpI18+5x>CKbOI8bT!}7=;P?GRD8A6*62rC@p%pW^RDIx z8GRn~6BJ)2wKDpCmi~J9O|IrA8ht+W(-nVKYAN&`E&VO@ns8+`%v3l;x%%04FGKeY4@!@uZiKGYXNze@41r0h-5KLfwT)qJQw z2mMCHuTR;Lpnnm5tE>5=#y>^TZ&&;iDQnQ%@v{T|C0Fz5O?7(6M!!e#3sN3OZ^zG@ z@Y`I?S2Fq%==Ujpc*+Cl?f5wWzunb*2cs{E{*dAarVLH+|5xxYyP6O6rP2SW`0gqF z67Plt-Vg_zEe_&_7*X;z9RE;_$m%&CfIX zis%a{zDP=0^vAI?3H3$bUvV|R!RRZaFQfRpDTUC#W~GNp@Vi~jA2Rx?=<6sxNRb0U zY<&axS6$7A?pH_OLh;{4-2{DG_}5&`r!>>=w26q=0_O! z8=#-2_(!8pqu*@B=M4BaUCrNY^bOJ9ruaqCM-udR!oTHeev#4Vpr51o`=Sfb%Zh~X z{mzGf+tvK@M&AVeBE?@By%+s6mVcJPzvF8DW20||ex>4vM@J>NzY6|cSM$e>z6JW# zif<7en&AF=`1f4R7i_NIZ!7eh6kjje6unrchW_6I|GumFT1MXn{Z7SaN9&?rX8Hd$ z_zzsocQ^XB=-*WQ+0h~i?!N=S&(-`Wqi>IXzv53O=Sy(^WBC29=5I6lj_405{)glf z7=y_Aq|pCg!GGv#eudF@M*oB2-%b7={XLfdkHLTBYJRuTcSZl3;$KaEE5Us+J~`lO z{-Ducgg!~}Ym#3{a6gs5KXx@AX`$o4JNlU7A4`6k`%KF}dHDMiSM!C9z9;(pieH-i zDECR0z7T(Z>T15a(f3AQRPhfaFXC>ypUvN&xtecg^nKBnRQ&AZ`P^;yOY`?ZSM%MB zzCZd3ioYfKF7DS@{;AC0pSzkLY4iip*HZj-$uqc*u=Mr#`;e>oSw=qyeM7}xl{}8S z?S2k_A9gjr!03mdZ=v`h$)ma3?ziFZFI>$(XY@nScTjxqT+LTA`cdewReb5>irj7gkLT}iUClQ!`qAhoDZXg3yl310Q~CQlQj73C zjs7b1@}9nP^Ch3d-S+=1{{G(Z*BJdZ=fpIps< zYxEP*KdbolNiQe(XCwSkSMzQw{k|rl-=g@(lh!8qXFL4QuHlV-3i{oOe;`T9b=yC$ z!yj`sKg{TFK>xPl`y~xWztw7Qya)e_tNCe0KMnl>#dl8XgZ@5Ce-Qq-tNBoW6Z)?e zUnZ$zg8m5nue3&lf6TZ)1O3m6FOpOe{x-|~~kMjLD zSM%>1{Vep!ivKO*qrckHr^5g4YW`=Vza4#C@!v&$rG3}T(o6ku($##S*7|+jiN1j1 z4@JI4Z@XUz-tjbF&FJq&Urh0@M-C>qUjp9sG~dDKXQMBx_#Kf~(bu*7Qvu%dG(X(v z=b*2y_!lDE&{weZwcveE^Pzq&`UZ+$8J-a=!(9 z#MAseM*jf%wu*lw@)-JG%1ONG_HBFkBv128jD7+73l%>-BK;Lx-vd6`)BN*BzYu*t z#ZQdfn4lj3AN4f=E8R}`c>%XE52%^HvF5G{~v&ld72++ z^iQH+r1)}?$_e@<@NrM`R~r4(=vOGd7`C+Zw=DM`htKjfe}~bpM!!b!XJJ>&c#oxj z7M@)P6u-gf*P`E|_|%9RAF}k)zR&Av{(YlgkN!2qJCSID`+MQ@u>e%~Uyc4*^dBhx zTUMN&?w^m~&+;^1_yYZYH=;kJ_=8wWpRWH3{%lY4^^ATK`X3elX7Fi({ulWCp62@) z{buyPD}Gn-I(j=kr9Z~`(25^p^jpwJ6~CF4GN=0|9loHa`TLFjCG>d}zb<$_L4P)U zAy4z`jD9=%B8q=P?T2W;uWb0jp61^)`W@)YD1H$utWNh&dH8cY&3|w7yU!RTK@Fa7YM-qb+Gr$4v)*Dc|T8NQ*> zzmC4G;ztLQ(J!~sTL<`TPxGCPelPkiiXX;0gwx%Z@q*%><_8%4Tj+ZzzGrYrg8RMT zOL&^U!sy>Y-(T?;1l`c@v;2QC{JEayryKoy=w%$_T(1Gv_1N>apw2So^9cBohM#Nn zAE3WN@il_;&|hkW_iFf3p5`|g{eJWl6ki^TckB%;{UrF(p5{aSN9d<3zHm?`K|d3| zjHmg1#{G}c-=X-dpaA-gmiza>m-RINtI>aoe!k+9S=ovml%-z)U(VBfs6UAQVZ|Tw zg9QBw`0}h+6TVP8o!$vzIe@-$!9=)Xb#y5e`T0`_$G--fU3X?~K?e~119#lPrpM<28N z^C5f{b`}tRw$UF!|Ec2Fv5t!R-_m~$U)9t6N~8Y~{WpqV>90orU0I1Y-5&S>z8b4i zg@427kD@=J_=o)E@E=-wkMYpzp5~L<>-ay0K27m=`1dF16o09IHTo@dYCcj_^e~==6|@{&vNuv-%2q z5KDhAd_zz3p+1gY<}DhsdO0;g{|I~|!-x7j=$}^n5$`u1X}d4;B{`nvdl>)ZL;sTE zKVrv$)AhUH8+)3++33$k|F+`yc>5Fd`{0|fW>EMIMqdEE%o{cFHnE=Yboal8Z)*6^ z|Ao-Yyi`+GUOktfKMCK=@CS_h=b(=;@70W5bXKCb<39zyx#52|`l9Hw6hGfvoZ$Z1 z@GU&emlfl}>>TP##+MX7%bSy+F9F|@m1Dw(?w3GcUh$LIXXNzoR)KHjX}*PVza;va ziXY=$hkk;U9_qli_B4O7(U(TwQ1K(ZtI!X!^iAN~c$&Y(=*yySt@wWIzHqv}E&K)S zRxW(#etGm=6yL?`ouHTb%eJ28mmBvhqVJ{n3)KGU9W4L!g>T1h>muE1^p(*MR(wNt zts%c#`D++_dsh7lf5_;oq93LBs%oG29Ls%~f9>FDKD`q^%Fdzu_1tlaFQN9Mx81)E zz9ajSR6<(8=xd^%s`z|fHoWcrH26-Q<}Wb%+URdpe3F-izK-ReJK#HenjdELbO_%e-*x);X{2B^lvMEfO~y{ z{sZ{#p61W#Ok`x|kZ(QrW5suMWxr+HKL_D^c$z=Y=v$!wTJaTG{d&58zK8GWX+G4q zLVry0nVgz_303 zjD$J?9L397X{Wni48E_Y`PD|>5q%lOKgUYo)7`HK-_O(hKBMo9 zzMA5nW;a>puPp!6gzxWZ{(GbEivB#sFJU(s<})pQ1NZ@+=99YU_jM8a#)_ZsEJQCW zUc>M2=3T;=BFula>S0*y;1QEoTf-^eum;}uom%j{x-!|RQr!_HqRZw zbMIDsadx~8^*Wv33qQis{2N9;68(I|=T*CZ47bAdApE7C=KH~?W-E6Bu~)m))BAv* zEHCLz?+?C2@pF^rGG6+F#V=F*eM$Ghzh&`{D1KzpNcb-LxoSW0<%$pY6L%d?T@n6I z2CN8WUG(XDip###tb|nigtKB%?GMh%LbWe=aqj1WQlJcAMV;CQoRx3vjOY=2vR{D5 z%2s`@Gb_GW#i`G7X0;V77CqjG-pjfrcUB}htTJN789TZHR`{^Gid~=qt7}Ld?4}A> z*}`fXy-)bX+*v8YDh|Cbc)&dgL_sP@2bmxa@_>BcY)}9c0_T9DARCkbB|&LW7L*4S zL1j=CR0lOdZBQ4~0}Vh!kOP{4W}pRV1=@hNpgrgaI)kp@BG4W51ie9D&>sv0gTN3l z6buKfI#GL@kK#TWTm`NHW5GBu0Zaswz!Y!;mgrU^#dcJO);QC&ANTHCPMQgJ;1;unBAiTfj?TJJe+WGC>^V z0r|k$pa3WY&H+V1HYfo~g3_QYC=V)v%AhK!4r+qhpf0Ef8i0l%2Q&fAKnu_cv;l2F zd(aVd23^5LpgZUZdV{{8KNtuGfgxZh7!EE4mw{1WG`I>}1IB`JU;>y3CV?s71~3iW z1ZIF+z$|b(xD(tBW`j9kE|?D<01LoEuox@_%fNE*D0mF40#Aac!D_G;tOw76jbIbl z47Pxmz;>_$>;k*NYv6UT7rX`D0q=niz<%%%_!xW&4uV7A3-A^A27CvOfFHq8a10y= zC&2H(@p%7$-ZV29ynjGXmeG3NKcE-M$TaUC(1T+XmiG_nJu$M#`v)Zey%9#hc>jQ& z0HZy;e?Ti-TGos{@csd(7|9~2qRtfJPP#aPMQ=WmLU>Kn0ai~q$W0*T>{c>;xxDs3q#(-I}9gPq_N@G95?-T-fcx52yMeXtLF2o8Wxz-Qoda2R|Ez6Rfd@4*k? zC-5`)1^fzr11Et?n(#pcB!d)?1~NblWP!ZkERY`*1cgBnPz)3Y=Ymq83@8UGfJ&eW zs0M0)TA&U%57Y9-tTK1Nwmh;9@WsTmpuH z5nv>^99#je1XqJG;94*qTnDZPlfhJQBbW|u1~b8};5KjvxC`6^?gjUOdEkEVAb1EY z0!zTd;1RF_tOSpPC%{wS8L$Sd0~^3|;Cb)@coA#`+rZ0UCwK+C3ig0Ez?;oTy1K<{0x2pzk=VuN#K%Kd=LT2AO)m>3=jiZATKxz zIff}F|r~}Re^}+d|5oipWg65zlXbmm^?LY_6 z33LG$f^MJ(=mq+KeqaE&7z_r(!KL2V&#{I1jQ$TuI>kYma{upW|Lgz1_RjuJocD0HL%|pz{=bpCV)-WsDnPx)3-1 z+4t9@xdn(HB>oy3H=g5fyX^i~bW3nU(o*P__{VnVpMC$I_Rl)P*Eb=2m0s6%lkKlF z=_HRyJV{=kiaWE6TM|!_&zJD`U(qDSgM?F_`BZ}6B;V!czrU;Bhr8baznV^C;rqzV z?LX7j;`ir+cAz)76v+F%nfqMu&%T#%+wBI4%N6`?wQn!C+zxC$}d$f9MbKo zP%GunzpMQ{!Oh&CDtAVSC5^J`9`aGT7Hq;#+iK z*d*R;y|kHYq7!|${|ov#wZ9hTq1c70-45}zgY=?8z|cXnIPj+-zpE3gS% zVm#WqFb-v(%m0MV4o7a|1opFSt;Ew5%MW2Zok=h8v;7QuDL=xrpNIV#C0t>i75BpL zW$#K!JGCv1q&0arUExBVXwKx0orlg;PW>~@Kg%DXKSo;qObo~M)^`#H+yA-!F7(r% z<>$ojLVunq%}M^BWBeicR?3j@{XGFMV_OoJvgc-)*6e&>Yr^#Vfu+r@90-4t#=esU zL0BG?;dA&5`*&v=6B2*@E8|p>ZbzAC{hjeGNxz%V@Vmq~E5M$SVOSEs3*$-l#SArJ zcoVgD9QDpcf2O#}ZM^JET8WPZ#%()3&ZL)k_&OK;x)ZwI$nE{+=J&A);{g9|ziiWY z*ly#uhV1hw@!F8|Vb47@|NhVWXG{65gl*0le*b6wb&u%Zrm_d&-+lJq>EnfA9Gc5> z{w#c9*q+PfcV`M$7^d><)0Y?~d6u*d!*K%{x03ug)o5kxAZ(8$>W(qaAnt{lhxyH4 zaVIyO6*WmKa6pFLOH`Z^c4>~V}g3ukV+Kl5LrKGA=P-~Vs*pOk4~efVef z@?WX{bE_BScW2`N%JU>%r5-$s{S75uO1mR0kHfky^#7Tj6S~nL7dQTH_{A@MEqB6v zWVkGUwM!6+>SgijK6;;F8<1Ux1X0=IKz4~Y-=TsFDHHvpi$Fd5+{G8D~%YUi|-Yf=2vq>;5dCMcDVyPE%5U z{VVfm(pJbeZvEMOo3sh~C+Nhl_A?h---qD{+v`&IZnXTI_iCHyE}r?y{aC{kpJiVY?N!Dc(uYCO$K4 zN7QP3%HN@zVfZBNC-zao@Hltk0&g5<=OV!kCY2%n#&B`mv|A~r??|& z;uq^#;!mjq8aKhh5nbYM!Z_&4_hFh0f0Gyw@(l6sOFUz>(aSru^CWh_L@Kwd0|EdHxQtHz?F;_w`^31B_bu`BcWn#8`k<6~zWq++9fb8lVw#a>h4C@&48J{-AH(|M z^E3P|w`cyDy+Y!1LTwnfoYtqO*E5AH{9PEX`*Zo-nVuDfDGz&u*m)y-mZXpHeTMH! z_CpEFG08)s{a19Mzwfo&OLXf@8VQd*_cVvU{}o$}M`(+L@h$28MdO!-gex4Q5nGR> zuTQ0^+@2e{BW_6EY|5S=5=Z~4JK~1m#edPA@%T4P58|gr>>+U`|C}i<<@aIw5I5dF zgBxMG&n;fW4T1b#a0PoKA`=MC-+<$MsA3M*V$#zDbm#7QV!6NgFuuPG@ zLKw!x--KcNDwp5n_KYwr?K$raB0HxSMc`+aHg>R6~BaT?>vLsb{Hd_SxG=VivRQSS@M*;Pw|74p^5&m^^y)6 z|IOb>8}|0U@tb#Z(dOoV@eA7o{Dc2<(~2M3{u8a({rxNHE{yyC7w`2(#wWsZMc(J_ zCX7-x$b0-d-%FZUV*Osyg8lp4zW<-@Gi=QK^YH$i?{f>!y_J{`BM$b1)tA$6=3cog ztIj}gAl%j5I}Knjc{U!{34|LnjPVf5Z@IZ$c;6|%OWm>*cO>u0yOMgM$86VW+(yqM zd{V}B4ueHyU8M>CK4N|&XG6-K?&++NZkxJ3bz5q?w0qL#q%BX&m!3bpeEOmENJdB2 zY`5e4D!zNUdVcB-uAQl`r0!0AJ#}yDTdD7)zMDEIU9Q3DL%6O}*TnSexxAPki^fu7>9NdM z-dNdKxme{`m00yy&DeRdcCq%c&ap1Bi(=hlePW|ySH{N1u8mEIO^i*A$u0n_Dr6n( zI(71#e4Z0q7F)N9oyf%J-U9C!SH#cbU*RwH5BX_9rQoHYAg9%DiR_Q&PwAbqC*_Tl z@oB%L4am4PV{OJK8JU^qWe(1~BU5(d5cf)YjXl{NiwJY_1+tGe#}Yd0qOU~Xi0+Gi z6#XK4B$||xo^p0d!IY9I*Tg5qXT|@Ackp_89fC@c zTEyv;$kfOU#NhErfuzPs^O9F2Z%ICsoEEJT?HU~rof^G8`f&8gXiiGwl&ex^q|8jY zGv%(7FH)S;XzGQj-BNp`PEVbcdQa-Tsq<6sPhF6@I&}?k{ch?fsh_2Oo?0NSSX$|{ zvT2plDyLOTYn|36?c%h-X`|BaN_#x*K-wp1-=yV9uaZ76eQ5gl^vUUS(jQFUn7%bV zGZu@TMXc9~)hD)l#QG7-*T-&*$!o^U3 zga4wxm8(I}P+iSAgT0-)x^g~vFLm_|h6TgbH9ELTU1Ni(oJ}v+BF<%B5-bnC4UTXf z3r0pRQ`Z%dRgovuwKlR|T`!Op(%vQ@~g>v)b(!iK6QPb{6q3lb)8K1 zqH?81&yE&QS9Y|dx++KOMbB4Pi)d?eb&2+m4vb#RbqUw-=%wbmGCIawQ=+#;?}*;X zHJj_c=zMc6iZ0=LH2OH#;>;!LT9&yg^9gmW%iN%@=QFouzO1f2nXjws&CGq7`_*+Y z^N_l}%KS0&sJaHm2dQgVe1y98wQ$*0fH8`s8Y%Ts#-?1C@=eN*Df80`r^_yQ^4{A8 zrE9UCjZe=eA4m?OWutAQ^4&Ocs|XI&Er}aTg0^@_9)j%u4iJaxz=!P zj6KiwQfwR7Yq33C@5SEd`Yd*k>$}+ZT))JQ$Go^7PmgEB&yMGh7mH`d%f`#atHrCw z>&5HGo5h>Q+s8Y^FN$~L>KpIJHH2#<*ER7mT$5BDoEe`6lanff=pC|pE#KscI zUb3HjR&s&l!dz98YjD+0u9Mt4xm|Kcu1k`KC67oRnLLp^J~jD<1Jgh?a_$i&l!ZinfWii*}A)9UU8;5S<*Ym{NsnM9O7cH>5n2vN&Z~ z%JP(tQara*+EEBe3o0q?d1-3 zZ*-q>Wmi8*@mqb_Z&^MSOOg|#rTm+i@>9yZ_=>ok05A1M&#cR{3ZR$ocKW+{Ylr+c z#n~B{zbV9>8?vTl?RbWrJ^6c)${pLt3E#(j(tJ76c?Z(szEyhg4af zl-QNjH!*7fevq>Goyfk({>Vp>k0WoeHH)0`eil1toZ}R6rg+o6o4wn;d%Op|h2A6H z3hyazowvbz(c9_m_1^bB@xJhmddEHAPxj+}KEH@xjBwxN{|4!8Kk4lY z(%TRI50RtPRwpA~(wx}b*aC9;Bjod^$l*VeZ&|({??Q+Q;e!d@qh7Y3?O*Rd;}45` z6)lr8k1|0@1St!iC;#suvYVDIy1bcx^hdd!xu(IH-%x_u3s`5qSD;L~{Q3AAWPSYA_?u{7pP+qx6aOy0J^oXCPy9D} z+}{x=5lf`d$10+a)lAe$)Jt?v^i1?Z(>p0~YGPF4*~ANpwMOgPocJg)H$6XnJ^Ifg z(>L6jzB|1%y)1oidU^Uj`iUpgPoWn*Z~BWD)0@(-rC(3Kk$yA%R=Ql~z)ZzVrA(E~ zL78fq+L?NpLozKgEi+GcI#M zW=du%W56YuOOa`r%h5e&XKu_a%G{Z`C$lVbZ|1(t{h0^RM^|OmWM0g?mU%PtHY3J+ znfEiB(NVw5{E*q1*_-(@voFKK8QD-alFepw*-F`}**e+!*@oFh*(TYh*=Fdn?X#V; zM`wFyPssMm_RkK?o`?+24n@Zul^vfwJ9}aF;_Ri2MANgEBUfgxLie4QU7Wo&yVQ)~ z51aA(@q(w#=)KmA-shN+_9A+x8ECuLwH zZ@%%?n=&okS2Ha}$c@O1WOl021cwgS(kQnm(9 zrcSmsPo!P8m}k;CdmK-tcXl{W;?(RIp2hg=1w4%lv$J>tbF(+{3>Iha#+rGk;NgO^ za_1mZau*@fDfJn-*_8Uc+-6Go}7O;Z(`eHKg1I8RJGY9eaHjo1z#t& zCw3+NNJNu`=ms^CHIdrM`>|kFnEvdE)RU=akS16%%}w9dE`3qi?!Pl)!94vP+tPK!>DzJ@;c8QR=;(e2R|u~xBT(c1dO z`p1UGPKsTE#x^TpUFef*p5&2No__G zlO855ESXNH>!jl4=F5rV}k@a?m;!(lSZbbH%xix$e1Rb63!I=F)PO(NC?QpOVfejc*5S=XY9871~N2 zT1scyMlV{%INHJ_TEf}Xg^JXn19;Y>yc@iY$VbR`$Z4TPp-)41haU^C4*wL6MG7N* zBjY1)$1{nuFLGI(480|JR&rwU9OPW&JTr<7S^Ei>b=TC}K0a{#K3D zi8RN8>x}ibE6{}c=2`^W^2ox;g3F<9Z6m~TtD<4U+bCTt!C8JjvwliRz!*u;%V;WihAF@ zU^F#$c7aw%)HRNFio@EiR-c{3Z#A0NS>hVhNmOXMA}E!p%Lvv z?`fH6h5debi3L9{dl=ayfShEU|$`P%1sNa4)s~mn29Ts~ywl65rNr@j5qf%$5zD(^% zP0U@Hn|ljvFh`cd8mZt^rmoar9YRSLexsxpy{cp|J*(te*1wyJ%xAs3TUg)fR?feN zo^~ng+pT0hyT_4ByvvYlv1#V80`jfMJ=itNSgpG^G9+{oGA1-0xgazJnHIVnnH!pi zED7C-+#gzj{2KZliG`C$VYoa}mHyc8k(-2D(kHhG&kD~$7E!-%4sQ&*=$WVV7>E=h_zfBb4FS zAHwgwh1Ps`cqOg*X(Jk8Gh(lY{9Q! zeKIgTEns&Bz~;yzyahdSH5|cbv)<_4Buzwkjh?dGT6r4qd02zb7E zi9}L6Cy)`YqJ#Ak7_yvhc zaCaA({`?18<8By+TVxoQWsAS({|KvbMwF?-_u1cPY9aRa7=U%Lm{@LZ(_p{>k z#ocQ?dzDLz(0!DUxcSqOGgvwEBIIJ~^-1BA!Y7AEgii^N3}1ju3SStW8omeycX{}} z@cqcI;l1JC!+#*!JwsP(6V|>$%8iOtV|*4va6LWR!e}*EXqE2Mu@~Vh)9{u3;wOQ% z1*^pRo>N&T?+4avyUP91ZR1@5Px1uJ$dRFbp{qhy!+^XF_pvWjBV03le)ziZvhYXY zkHf!&_k_E^fTW^VMz_T3#V5y~jsF_&mpUOmIlU^qC*3=9VPjjGMiYe&%2tVQ18D#PeGHiw=L zXCuw&2bM=(qvem_o7S0cdN{Dv)}TMUg~(R(tu^0X^DQ>tW|P(SB=QQrlucM|A0uDH zzeaZ8Q`v>p7DdY8SvfFqP@)Es%N&5z$kaj_Wtt*KP;SMUV=~7gLo>sWQJFK4iJ9|} zt1>f@d6@;sZJ9fem9RvQXI5vPM_z_2dKIf}EAnmTd*qkQZ%8tmLCR+7uaNIyigxCH&HaId3ZqD-Fo#qutcuhutcx@$Y=#_Kco@>LunW?ous1TG za1b)Qa3pdjoa6Yy^U$Rx7j8YqWldaGzD8bSCC5F;udK$p(cR>}25i)=fxJh4MtQ9-a z=!ktfGztjcm#K2ueeqw*Q5;}d-nearAv>k{h|8%nWNHyDoUUc*j3 zZ8)hn0yfI#p=<`KEbmm7Z7R(&m1dVpvr47eq_P~+e&$I0P@WwUH}v1l3~gl$Ig;nL znkTo0`u#pnZZoTpZbSC4s%RKl1z))uw(-iPj2SmobQ>tk5vNv{HYWkqU!Ef~u> zUUMvUah6A7t#|Tzc*hYG(hoTq4PM;kSh&jx>~Ap%Sp^UFbitZ}wTSi*Qg6Jegd_hc z^c%h_?ft3RUk~eBUftVyuiF1&?Aus6-i(oGdi?f)nH`f{p8O-(A@xc6_jLJ|?Ayh0 zFlA| zQ?j$O^U)O4ch4`Ff0k?R>_a^CpW+w#&3J|OMzrg!?)X-CfX9>FQ={?y-bzb;C1{Ix zCzmDfGa^R2ZK{3hNF(C4|LjUMCYQgA(Q*b}g{#rH=3AbH`(XSZVH6d!`!x3Bh7upc zH-F=05VzZ#(YAkRKxiO3`zfK3=VSW{<7^@QN5$hFOg%0r?oc7xII;3oGvE6Xn zzrt<*9{&>?Pgb7IZr6p~_WAAJrTPw^<$keL-|ux?lYb#d7jr}f4z>C@m}C>-fBF~ z-v=IN`L6aF?-dkBE{W&4yzx9Agzveo@jW-qHN*dWXs(^{KzGa?1&eWP?l|Lz?rS{J zLjq6qNNkrgjW2pXM_!sGzoDcz+|QIhmU{|I=LO@Heua_mE#sHY^XJ=27<30t*XPj7 zm$2v!OL+7SB}{tX5-xpo37dXVVfjE0T}B zwP0^M-k;=+@n(68yl1_g-r&%gp*f-3Lhpt?4@JWb!q11xM~;o07sz!0_abD*XD3BMtH4_rrfbIC>l2`xW@^ACJBYXSD^M_v`3B zeD(+8tv@(cJyt8$9L~2poNr(Fn-gQB@zqa=T@3F#BlZM-`qznJ*$nHu8`hU4*W(q5 zSE&K}+aC7!X#DhN#>d9bfdyU&3w$ThCilYxH^Ey!CNVy7JD&Rc5}(2SR>VhNGua~9 zlIX5$QnONbrS3_+fCv61oNeiJZJ6H9FumQ=L(?Y_-8B)m_u}+yeC{`=A3;}nA-%ES zRpi}*_mR)wX1Bx5#%XN_(Au;cjcVWXtStU5D}ihGKaFHNL)y1jxs8#wJV`N~(-Sjb zI_JQ1-k4a3$KdzGzhF9}@SK@s0iJ?igIaPJy74w5Co-Hf#9is`4!ses6KNk=8QF`E zy#*fjF8J8bfS)~(BQ8u{iinTBGC3Q+>Vo7=#8hQc2OwfzE2XOARjr?DNHmqpJrTO^ zjEkHVIfuBo$&rgqEZ5bMnUPsUWZWCMpZKCjkd>zA-{0>S6XzujxSNTbdI68gi&)ez z#lFU8@-1;A+ha+*Ch2$<&q-7KCe7k4@SU81=cFH2_lfZ#CXVPbJSfwNFqsj*#zYM@ z4Vb_7iQ>dq?DBI;n1E{%GZS-(8e5RKBO&%;8Qzuq6Avd=B9GEez9pXQhr|xU6rk89 zWAMdkIR2vKLCJ&hxYUB{Z-g{X_QBHchpj&VYyZUL(BvsbPEC$Zj-$tzfEM!r@}TjA zufQ{~l{mC7h(!B}ShVfQT}E~%_axaHE#;<;NOeRy8Gm`_)Oh03&PHaZt|JEV2BHuj zz{ewxwLCmer?Tln69Z5&-4suceAx2y96>!BmL5(F+eqr$==2!Fm0pmZL`2(E>fWWW zwlmTnr?;d(OK(konckcJGySjhzO*>J(F_h&t^vqk3Jz*+x!B zK8q&1j$Jjjv2y-XXs&DAuhCd{xY`+2ZDVkFEFPj6;g7KE=$u)j|5dEIU(k2=vOazl zx29VMspqzI+q&J|2H1{=-c$(APbGWN3+y(9}+|fhC)*K${ME}_x zW^yK8vW0lbmeNnIq@Q$4^tle<;&4~`$?L;6pusJmuiO&;4E=0tSbY9{hSC3!p0Uux zF|~r%SM<^<+SnVhx9I`DqX*nez=PV!Vqe ztflma562&gw@bE9c7XHhn*1F7;Rm#bysn_#Sye98jGoyxd@x$WVrr52li|q`h}z3Y z7(VNQ^{QB~~Mw60algB|boI$}K{c@^gb$GmF%A6d*}xG z4ae{cx|`oH#QcU+6HoICQk}*!+e&&2Nx@@DV(O6$37AQ^5up#4Ax> zD&PsMLXEG(E<}xCSq_1rZN-j5ZJl=1{Ue=@PA60Uk7sA3et0&95eGZkFrH(Ggq?^N z`9i~cUWzaIDq6`rcKcB~S;}rc55OHiiIsIZR#s^Xt6r#Ks1cE}t-W&VLJnS!3_cIpN7ci%N~|Nbua2~^7hB*t4sPG8MvJ3F$#aMgE| zjJp1qo42&yj=YNv{B7hrn4zB{KVt{)i?~q_KYB8njpm}|kP6XC_|$9SQ*Rz^O%%Hr zszGp6!=tCbQ%#JX8$CaIL39c{=@rqdqE|;}p^L3Fk(5tGpN+1Ku16#L!bDPTkM4;6 z9Q`#~k@&6Zv6@J&SiM+-SVKH(J?M%0#|9!N!V3(G4ad`VIx&^!#?Cj9)6?+L&mn$# z0ln%%WKrx^dRN6E+>0#7Vt<&3gjKPpW2?~`)SrD!Ebiy%4ZoN^EgX-cIjCQ&O?+-c zbcZA8+q%Jg_e6UbWBBGN@u_GIi%a^o2Ti}$6u)8XM4P~qARS_o@g!WFxR|K(Md%Lq zl;{o88h#8khF^$H&7mzERH7*~MmucH41gYZX!{s#VQBK?#LHhlg|-J_dM|h8<;<^#pn>*lRwaBs;~6h^dClxh@+WRM;{YQ(E)9u zGom>6UHnl#rA+;&>TI%)Go7lhdj^u6M z6tf`Y2d>Lph*n11=$h`9K9)F!KIy*c{^%aV(K~#dV-os?bdC4Zo6{erKS9^{CcWKw zYJW-p3a{g3BE&hQGk0b0$u7&@OXRkEPS0eY%RWzkzma(Dx3lkN-y>T4Gh!LGWxvn< zfCu2W?7pl>%}_zgMCBJ1NVBMGW=AwPy2MfF8Qlwdm>ClNjAn6~@g+|%vm~Y%J!2N0 z<$SEBY+zZyvVLXzCa`qNVd>`WT-(aEZCqKnvTyVHQQlU~TdLLRW2K=yY+Ayv(LUrg zf`y$vHT+!C>4RaVXn}6*33oR8o_)mrUxVC--H+Y0*TC!SjiD#05j{2fR_wP}m3VP{ z8Ig96WM9c{$^M$Xj&Vq%tL@w0z=$h5^3`z7$cA9dIs=wJ5qLj_X`|9Zr*ltLIpulw zV_VOjYabZvXS=h5{gFa$%q?`wyVZ+RTml1@>wm zGh`H#sW~z=615qNkHcT-^WB5-7>^__b9G`3aVS3D{W^1UJ|H@CPI?~xhlTjo6_xpD z`U$)b&*5EH9OeO;3PfPm%GAXR)SSr6;>=O_fO-;fIS?<cdGb7;2 z*e?}*E(Ma(X#-oV*3cpR*f2kq=TvVreDMP6(W~A!-uK=qp;0iqi$foW`b7Fg-i*IP z2y-^k1~1RKoOnDw+Wtm!nvAdZVxuQ5#b^7V(T=v^yWML%G^e?z2bRQDmM!reUfth~ zr>2$H2ESG(ud8=>=*UpVz{0q?jEzwZKX2_4ElAo=KlGgQjSu>AG@K9c{(cr{FnjPp zm)2nFMB)T$Wzi(^T0|RT<;%}C91UVR{$kAyQM{2fg|CUy`!(7s);_RL#MwwA7-1Nj zYtaFgmW=nG#I`WXiyM&TQYT)Iv0bcy?3N4gKumAz7Nx7f5H-YlZ*8pi4sb;pO;1Pzkp|A6YAN{-$9`|i{+y_R%&D_3+u{0hDuOjO3sqh-&4qps!GErLZnkcQWX|LagcMyZPE9??S8zP_*Ma;y~ zR*FHS^D<*R79TU0ssfk?MW+K;i6EFQI9+MdHYe@nX%E94QH4$vJO$1vL6T#NTM6exc zBG|f_2(}Y)eUZUvlS6W+m^p}Nm>Gy?6CrUOTv zys#bPX#2vW7)iSp_GBzQzVJjw)4_$OFrJ=TIF=E0Lg59BsZ$EiqZP?NdM>uuW65r* z5%fzp(ii>0_$rp+w~Vv{=?2mYx@KE4J|Dx_{8+%>oJJ2ZI?(>Qnc1FWi1N{#&c*RD z#Q4hBTLbpyUUSlnN6mITIp_->PBci~8fXdI)5*-I0ZZPDQrTHD zZeLm0oG8?}D79iZDhCWlU6{QF0nc%W;X0b(uW5r`eW+nP+Tpu7(kVv7dx-hy2KRR? zW4PFlevIP-8OcwE1sPt#gPZ{mayCrJIVD_(#`qbqAy)@{$PEE^=yM_u1S7xCi^%_6 znj5*#^VyL`p~f&=`#F+g#(bYw^qCU*n+KHPOXO`9VDE>BCHi-y|g46?ynq+yw!O=R9uUquYWFynJcZa_#SJYb=l9m)W7WhZnz`S~@6R_xDy?#E|;#Af;o&?KUjG`H5UnuZCwj%atE4YIkQ(oE0` zc#k&12E7Fz^mgo>fD`%}Ptp!}q2JIM_r`vQ@fJIj#H&;ehNuc0QPp@+z!Npa!*nQI zQ85~2$9SiJF**Tn(=b*c7-43ti#<}jqWGiB@H@?BZGyRGrn~p&(x!d$B?{lN?g;=$UY)wlgwj~ zrh0JTmuj4Bg7}P6dsdw2V0b4nPx4jyek!p~;@?LYW?1Z#{8bZ^GvJ@DE8(ByxB5H& z=@nK~@O@dnA4@!xxci-kTNV!`e^xkE878V$2@@s1R$d>@Gf^Y(u#AR}8jqiAKO;5U zFj77z^#C5PC-8QaW~JUV%+wY%>aXCZzAwd4Wer2+b5u>ytlQxeE6q|3K)aTgY=l{J zV^rWJ)0~0}0*(8UKwZ)y$a7o`3L3ET zM|-1ti{a{t48?Pn=eH)Z3dl6PXnA%kANOHLdDt-?f6sKaC==1q8_YXy*R@$uztw94ojm5q(|G;t_vi9^X-FQd^J z^c`~y|MGfzbl~TF({Po)WjA+roICk^F5Zj#oQK$P`~bJ2TZFH#wcFl30=~-k_Kk7R z!rM2~z0REvLnVLTCSthWBy!G<;hN1#2J>O`Z$uVG8b_N(n?+mTGw&SjikwKf4#uW_ zH2N5^5MM^W!jgUlHvBo(A<)djt(5r}%sCH4E`Lo=9)z zB5Ee$a8@Rm8o!tsiJFf%C%zOmdS&v-kxD!M&j6Xe!hI!^4?6ug1F8(%!0Xv z*)R7o@1+VJ-^0MxQP*BUex$zbMvB~8lyO)0SjzSSO7>>=cD%+fFf(%le&e0Y%-rK1 zL##p1sODNW4`y1P$4tu^c(fO@0>iRWb1k6_fZJ-szXv z<9!=*KnsY6DRP_ejN7~Yc)la>=APwV#`C?-y^m-6G~VmA?l*X^ce!T;R_j^JS2-)- zm_8xi=rifq#bDO!F(VX!NoT+3J zyV8GPpAg^Xn3PbC%H#;~W7mhNG0UwBi=a8`7XoZ(&yb1J!-=;h^brjjS& zO(pB_l)n#mD)|!rRI(etdDKf7DG!e-sR@%RX~t|*NeB2;$+2GPSkixrBwa`=Qv}od zL@R6!dVc&qMG0IouL|oZ?&F#fz52Cw4{jxny5_Cw)v5hT<;fF_-=c=FD$S|B}83|Hj++ zGF&_sJqjii^!vs&kvNTM!G{o6bRQ8#HIuW5A$lp5h8gOfp2@QnYjHewLJxX2wStOh zRz1*~PJV`CJY`4y>f zdOUHM>xi=~B93w*v5}J~eXa1*BC0vpnr*F_)hklX)48Cem(ZiWPJdd6zPg6rw1uOe zw3wBo#ho;xgqugM#0HSavww4B8U9zvo2*0gHroC-X#3wrcHleti50^B#DB6cayHue zL|CrN(8{O7a@~S9{vdkz!_igIr;v@@!6#_mTcg`xv9?G5MB^@xmMy7xx1NEmN~jLQmxSl+hXk>k?M_4vQKIVx|n2S`b<2BlC#moBvaGV z@gPcOF`IBMa(((vydHNWEAV?fhCG#i8FqgY@*bW>$;Zfd^cIp`u%wc`NF1hA@>>v< zG7g*VYU3YY8EHg4QY+JZ%r&$gwV3(Njm}NZ8ft<*xeFb>5k0kP^(qsw{Axt2D=i1> z4%V0vxwWyu+M98?rx}wq!nDMT+?x8OIjD!z#?LcxXp^XIQ_=M=4x*?uxBpA(pJu52 zNG;SXwVxSv6uYPS{j&m{_?}X;{58U+1AVuineCtFku{nw544m6j5p}0%<_QUh{6RO z#4qjz@2Owh9T|p9M6N=XAWtG6BcC8Kyl!!1F!BiU3GykD!DGfU8~Dl^vc5?pd}Uqm zD0KBsV?C28#K12{UMAjsGm-8GvvNsmq&qT_$eN4bY*r%ckxyu`YO`&z_{U=5&oEKu ziXLx|oM2+bWj(LN3!|AV9u{y-Y}?cDtggpr@GG;RH4l0O5d#(k-<8N$y?DCPzzUYrXdz_IOc(G@o=`CXg zlzZ{9X|n&wik!;>wq74b^Q4kV2)`#|Ji zq(0IdIn2y9*L?Gyc(653?j(G2zFdu0PI7%9pW=;^d>hDadR@uBKoWT8B;^9BhL=v# zAdr@L>m)}6atyqnH)RFN%C9{nM=ipZA%$o4JZcr_)S~(N)gPXkQxD>cfitpQ64F;u~d++)RYl zZLIBhdocU6Emn1>WanfTV%|1k3u_I>IO{YP6g0&*(%P)cc%oU4@#2D;11+swZs6bO zu)VmGnta1?tO(?*#b0(ty!D!a^Y3`Hn^u71bGY>^GQA+#p zx8vWC7k@8vP&5mrv@gG2;LYF9LCcSy=b<|hFRA+Dd-64xa3QjYsBqt>zdZ2jYgXZN zh`fHjfB((E!>=`#si&<%D8d5eA z;NHw~R$6+nOhmvtnRoFYZY~oU;ACCIW2L3CF#?U4xzd>RmYV$~TA)8OSO&1>(%`?u z4P3??mT9cHbY+llmJi#?4qTq)A_LzbtjFoTFN>>=qnq$0X z4bXENM%ogS*DhlF%Y1Lysm5D&5gLXhN?e`fAlO?;J=j}GE5p}ziS~iBm7I)UT+%4f zG>|jk1|`$z@os|;l&m09UGgbxpkyz7VFegKNj-eklIHM#EzO#tThNeak<2>H@;(Tx1wA59sB{oZo>xe>XAb&%?c~O>HD1Y*Xqz zymcR@wh#~fz46-lemgfEOQ#S;q}L=itS%Aho#5QMrhDSc?w$S@Y}P)OLyHr$RTVa? zsGue>TeXSVYFf~|pd)m97#eQwCRI_Tq_T)B*|EsnvnH7~I7mw82@a)Bmx z9iA-3^3MxAV@2Zf0$WM(42oh-j5h;?)}Y#|w|@l8Pyl&a8EpWl=$YnfrI0eAL?k&Pn*wbZp#d z%C(d$=j3NVRdKfT*C$FTEWR|JwgZuhj=o9yw{-G+3{QFXnDwLBFopO&KPvA(JY}_X zS>EhFJmr6QN}H#wtEN<{{i~HZ&ZGTI`?uP&Rvu#i77N#@tlxytyIQ!~Jv&k(Xv!8Y zjhnR&5XZT}!WE&z%mmXjoMYj#ti^L3&;K(lJZA7?@tix(DHg8Yf_0*d^*zMG)&D4> zwj2L@S-5(1W;`G;ffk-JxK>_roK6-l-icWr2+>6ru9cLk^?+ZB5L0a7bld#3M;vE|g;z58VTOa>X5p0$-i|pRj`O*N zE6!Of&9vqJ#}+Pckz=AJ9OqpNSG{E|8^m#5vv8)k^4A(+{Y4AcsP8b}q!s_4xA21v z-jdi1m>UbPZtxanU|VV7H4NU|Y0m3?7GBff&CIGp+GBurWZFwDgDV2Wac;Bl+6HfG zRvTGt;dKn >PW=LQR}Yw*TqUeFv1uV?T^P9t8gvhex_Z|F4Sb()1YFn9xEQ`q;+ z!gZX+Z`F&-sSmSAb4c?@YM&arZ{l?^=~mM1qz>I-zIfIC2}^lZfA9cl1!*PeandT% zgvGA&46o;oah&IPeSx%&G=Hk=Y~Xbx={3@uq<2W~lQuWzIi2k~FOc@oNfh!OCcrL>byqxtgBZd(&#~&rt-BYOVvCb(b(*lq1+*+^(oiJ^cTtL#eIE#$Qfnvh>5VBJ*O-lHOzSPyUOA$q0duz@9wgA+-Unf?kS5WjQyY|SNcAa z#v=R3zfbkMW>_uaMHa@O$33T*0X6P;Iq4lmm^T_PPqA=12k>%cPRm&EPQmfg7mCar z7kpDXzFD!kj`V^eV}&@*Yzx=;Uxa0%aq;X8+&>+vzE?L?gmt8G?hcO6;~FQ6=oy-p z!F61b5&Agmc#UsGw0ezO>n&XGizt-pynZU2fsXGj)cYdZw8o(w7GA^Pb?|qxC#Q8C zy)Sa=BaV}LV*h>W{)%Wr4SB6@;VlgAk4uMHxW?HcdJT4i0i<%I@}vr+14$K0l}MFIRY+AyMWlmB)kp`Es*`GvYLaS^ zYMU{2`Vz)|(n6BP*tsag+Cy$R@1G>SND|f(1ttHPUQe6vIdAjXc2fFwUKe}LucYYB z+!d(^OxMYuvx4{CQNr_>uBU5118(1gK7SqT3sU(-#Oja^BlRL}oXy^0;Q4bF-{Cn+ zN%?E)o}S?SdeU#V`1iJjyzpc1ERCPUd*KIhTuV~^_)XwP&~J?-={o20`T$Aav71+y zzN-SM0qIcEKjC}PXU^sGDWvJ78-io=-?NnWYyJkSNgvpNr0d$pUTfit$?LO6dDZv) z8oaNu)PIJuT~?3w`*LZ79ZvUW**B+?IFuHoxz|TgLytilDT`dmdFnG8&_^k)53ZvY zUytjk-&ACCyWsylU^>1%>1*E8I%q$|&ZrH3UcKU$QU0|Kpyz2!o!0+m z!FQ>*6W65kQpmF4o*L3?Ds^KV(r3MpPS!bVg6~r6J|H+omRZdpFRQLkknfF#^*i^V z>&WU|RPr57_>Lw{)!8uoPZ(x;VIxl5~8Pp@+MJ8XWL z>vj(A?KpN6J1x-EbY3R-4vjKH$*XTxdC4k~g`*gASy-~ZWckTjl!Ym4RXxrz|HY$^ z3x2z-q>stR`MzSO6MbEmlGktM`Ex^62J0wC9h0FP>u^r~HOjfNgPYL%x28w;uTlD4 z8-BCO_E?^Wl4b_zndn*VJI#MSvfdA|p5c)}zK7GpiBlf>Zhf=rW&X83xUQ?QR%vul zh8pRf2!5aLJsw<3miiz%`v~VGO?jCT=15tdemhYK%ktHzQnn5K{b!d3-=wFrguGpg zRs^5vYTJUEs8yi52Y0HmeOr)MJ(?UGFB^DUkk?awi*t3|EWclAUhvEFE%=e(eZKYl z#QXoZr*ew*T@$UmG%oc31+>_5!T%zzC#)i)O1t3yM_?*9-M3nhYLf1|4M*f_(*NnR zbnu_xbw0>wFp9gWYrdY?a?#Wq$9q!L@wO!d&P-|4a!q?#RpE=>N+_(v`w} z{eQTWp;EZ-FDUL$i!FuwcENEY%HqCVa57ITI9}>DTz+}97xZ=?FOE1~(lxlRSNF4U z&g6KXr|fOvbeG_2KUksxE`Nk-P6)k8JlY`^u67=x21`$`Vd1LDA=-ypNXo)v2G7v9 zVe|UG*XVERdqPfLe~Z$0#YpiI-eOl5yegzihI`KCq*)~CS-PJ)DQEw8#s>L4oxV5U z>&YgHaR>UvvV(Lt%Ih8~T6z5{;rcE5<;v^#s&tfBnaJCsUm*RGg-z(?qU7s#^uOOT zJ)iC*Y<`>F+Eg~WitbF$L3x$_^W=3#)I2qz{<9+UpTGYlB~Vw7tyH`9+tuv9v}ga> z9y*K@a)#%0bt;x5!k&I7@5j}y9A^u{Ds&dEcH*x^%sO%w?(^-6D`V#_3pWP6i8;e& zuyEP&4sk3W@qf65A87Cooey~(XyHEp{JvSi_!tZKdE@tpjfPi0spS5{K5wjeH}=3D zT7tW^&GjE7dY?7yExf+L?|1I!_2j|(k4G&Rg0L5Xg*P?$5O&I8Pgx6ZX7Isg|I>;V zE?%3S5uyLGaPjGmb0Pv4YT-v1e1O@HC~M(I8r=8G9O3uNrvEB7cpIX8;5se5qrqFb zt-vc;cqfCmBu?CM(iVP{!CMe7TY%LRu--yo1GSk+rs{^@V*AGMno5LX)L^-!Hbxq!1J|m=vw}& z5Cz7{_7*Nah4@gnGI-j;2O7MRTM0a3;i{L63Cwe$KB(Ua%1!l{F^L%mj`OpH4>ovt zR&#NjA1z$%1kTtk2mZB%4>kA!%(9@jvG9`&t~m`v=~%ehA!DRl0REDN4>P#JmheAV z_;7<~+zj|*7Cyq@EYAqO%)(DGc#)^92{8WQ0juwB7g`Z|{#n|Gn zvG7p_j}og#KWX8k4IXhL;3F;kbc1V_2mOzQpJ8y%^}xGZ_?ZTGj3RTSg^w}#K4%}V zA@wKK{dPUp;D53TkK=4dd&%SD4E~4n2d_=6>x?(}udJ?5e`VpA()?-NeQY%g7mvmq z4$W0@vKD@}!GC0a4|bx3Pc--sta-v&>gTKb_j!)Nzh^#&<7~5V@p0Ta!rqP+EDgKJg|dzD-GB!hp$?q`m3uZ2%G_}9!5qW`h*DF*+FwJq^O zS@?wp*ZdvFsbk?&4gLnJTcQzK_(cYPjol0=2aRh%Ib3Y;S6L6!alW+hOANk=_)zxL zweU*~zR}sp>vI-o0Tw>P;F{-zN6o^oGWc`ObG){+@T(2}EGvmp4=wx}gReGw zDSoK&Jt()C23HI`>xNkPEQ2p{7V$dQ!ml;>LT4ebQ!RY9!Ea&?f#aNG;d2arBeM$} zXM}~%HTVMN_v68{@aqh&9iZ^8S@=AI&tXm+9y<%4Z}8cy(@g!b@aqje%hB&BZ{ar> ze5Rw{ow0D;2O}fGZahQwmyhn-VLbws>n;n|@5Hl=IL>Dlu5v*$L|B*1!c~s+gb3wq z;foD^nWK8Q%))Or_@$2O>0%4N#o!mS8WQsZE&Nu4YaboQxzxgMGx${2PvW^)xSltf zDgxJS;kO%nirL9~kcHo2aP8dAbFuI{4L*ro5oy;JewV?|VQmLSc?-YW;F@~@4`t!^ z7<`@VeH*?=|?D>?uS%gM}|Q_!;arL>z*J-)C^` zL&Ofb7Jk3MPjNKvO|$R^3_ijc!Rs&9xbUFCdpbRN-D2Sn8C;AfYs6Xj3WJN`bDS3} z{9%Lp@jt69{1Jou@jv%l_)3HO@jo|P_@f5*NxoeN1wsNj14xxg)k#fBtx4h% zr*ZrY(k#+-qy;36iAzX#la`YnB0Wm_mFw!-`RlF%Ysfg?np8|WmZbN3?H{D!yp9R5 z^Lf3DG>dd&fa(1mqz6b(lGc)5BW)&qN!k&le>&!OK98V_Wl5DuwMd7MI*_`O`jCc` zPA8p5x{RclFvW(6U%i_5b4d$GvxqTMtlCoYibd1sPm)($S^k`tdH*Kq15)-bcnMyA zCP|OZk?NCFu1Y`Cu8ywi^P~qm9e9#1$RMW!_e}4HUWLxp$@f|9VucI!l{(@u=Sq%H z?k1!6>e%&8V^`dT(8jLf(<+h^S0f%r9FKUU2NCg7@55z%Xl86_-lb-3eU7v{%Kxrs zv1oep>~yV3M$?Iqy9hn?E@zn&bu~umvo4OTB;|f^&fzAMd(<#$%6(*X3EkURrA!^<*K;io|J3pzD!~1PVaHHI^AoCbyuvN*3FXsq+=!; zO;g8AhcWn!Cn|KKQ-kNJ+-rt0RPICPEv}~A9VW(1xk1ibV|^a~d82vhI^+1gvXb?= zHgq-i=~^wgC-JmG_p+&nkB*hz z8{EM|#-7u$FT=lyThg)BU3n;!tLsY7*5{Wxh3>N8td|Viq0f`9_$B44x%*=yrGp6T zV5|V0eYtahD+X2QgU+ttI-3kzCajJt{YSZuMsw9UW4Mp1!8tP>*?zV{(VJhhH}&oEWWW!*RUejRxxtyA`<(1lK6@Ef)7udHGn z@jNW%8$o`f)7+JorlZ?A(wCL%?yL%~b_T6fR*8Q7IsA%{EABy8c^Ae(e5#IbNOuU9F(qd9N!~eUHQRSC$d?TKZR$1 zU&*ho={63&X_jF#byt;K@!86?aK%XItabc$v6MntXF9n5!wq93>^sA$Dp%w_#688y zso%C+zPtsx*8Ol_VlZ{|0j{`VS_d$7lwShh z8XZz+HKK=?Uaeyfb#4!S;py0+ViSZeF#Z|kwisqxxq7a2T%CUiu@$m^gdS~}0M&(= zw7JUe{Gc9w?py&~R=T{82)?tbBkfmLYQp(qJana-4Ckv{1y|kx<(j+lJ1E!2{jrnZ zm#>C@la(d3tKrp@`__0mlsnN87pz=4SL~W{-xyw0xu`3PNVy}8O|Ltg8uS)%_xa$= zj4L}xM;+muLHQ_mveCsflqI>EE} z&gfeD?u&!(j=5s?bjDYP(^T#k<84r`zAJlBxlV?W(e-9g`^3sAzlr)Mrce1dC@Wb( z%D1Ae$fKitUs{XU6XmB-GsTeVia#13f^s$7VT^EkmM5`m#siLgN;-M~?WJOH<~Z*7 zJ@Pt!n$ez=Tkmw^m+9E&xSnhz<(tuK$Zl8uIC?R0?mD{A&97hI-$?|&`c3gqcbQA}tGZq=^N2ub- z#c(KpCck?vM{Cr$jQ)Hsnv1-UI^$DEYi}#p&k;kQTsOmE>dXyJQ&)Vo&|eL6Ar!X4 zJ+GwBh*uLj+sU}%R+WDh&7@864eT@&_ha1&z%*)ufCL#bVcy17dmJ0y}H_q##^e~$HpI^T*Q@!O}Rr{*^>H( zhV&q^uZ6ZTR))%Ua!|G@SH38HR@3c~@Z0zx?(}5*oDVr#RY{)>G!|%o~C2c=2?!Ja_-$|0hur>Z`ut|Nm6}|F8akf1d9u?0KiU??2HK&Ce&BXW^<_()PqN z9d6;OztT0@@xP*lt3_&DYs>#12JFASYGa#=GtdV)xz;P<8t?#DrFvG|n&gZuLc-nQ_Z!TorlH^Ce59ZgAR zk#v8nNY9c!BYj2MM+#FeDzjqJ!z7irY)zF-#h}-2YGOHM3#g1nidwqR!{ z*UFhtDW97|TUFVsH!SaLIVg|o8R*!y&IiZ%)=e=pr}9^==(OM@eO~O`PAMo?&QbX( zSKm23IJ=!GBVh+RYl2UkI%k)B>IFSaM|vCoDkN#UeevRsv z&TrwI8(i}+XKG2VLdkFVrKEhyn`fwV8ar2%99aHc z4~}c+d=})6bUqKtqQ3J&P!=ss9nl$0ovTZ}Lv=#fk{sIg4+nd&4 zahw?z?zgK>-cjJwE!=Nc#a>77ODw#cx&IFAH(eU%!Si>xcLew@>v$dne_8>C(aplE z8C?6eJI;9)Uc=yRST}|-+`{V^yp`7){80;UVDJ{KHG}`%!o~BV9kD+)R<4CNGk8;v z#UPw97A~He+T^hWgfrU0+ZbFcXJM;YxcX6ABK!ZKL0I_V2CvJCgp4m1ex$)`vtu{f zvxOgJ@S5!AjrM5aT@7B{s{!82!n+w<>+E1JT6hnG7qJEp{-YCl6V#Jl2Cu??IdCD? z@qG+liJf#x*Png{Kad^9OV^))1~1R<@iy&q)T)d4=G1{TX3!mKiC7 zpJs5aC{()soMG^!mjbuz&sc-US;?|={egn!FY3j>?fN5s9*nIQ0k`YV1qNqp2ynap zTxf7iZ*aT*K#KAAFIE&OU4Je!_#f_{;CB7F+~9lJ(WP|#nPKo>SxKpM{kg{Azp(mg z>G}h8&);tMXK=gzTxalItle9>{#mU=y20;pmx7;f;qoiF&Ry(>%5${vcMX0AyJ*qtTKESBU&1Q8aLN|` zvB7V3Zv!7?;h!0N5j&hZ&M*uA!rVwYL}Z;w}6KgU@3X zGUA{te5b+ZvKlWOi-qqt_-uC$cxwyaWAIt-wct}N9FCRpxrSAn8NV(3Uk1O56?5sm zE!^e3>s-mYve;Y}9ya*ptPc#AWZ{YfbDe4KbY5?;aK)dw&LynOi|uaVieqz~i`&@KE}gLh|rYDNtU?`iO3+-|(?v!1WM&vm-8M=VfOrhH(GV2ZH0r7~GGW`rX3E8{ChZ+GF9k?YNE~H)Zs_;5z3S+>ej? z);fNY!RNDHYcMVc$Kw{{I@cojJ*?x^eq8vsS>Wp|TQCthOuUoP+XH-w!ToqAqn`)3`f(TEg7guiUj_I*2KVEgjD8j1%MI?w zI~jc`z#lNUAMa%J?Eqh4@CzL2K}P=x@J9`PzH>gf(USxG34@>KoCj|7oB)5y;O9CJ z(!QP?;HwSp$5Rgy{c+$e(GPuu!ylmlb8(gzY;TiMj;@b?Y=B&)>}A8X+s82kxW&-noh-)!*5-N$*o%fdf2_+##4yxwNv z9~t~nRuaYQVBsGdd?jm)vR|W~i(mfHPYmwINp`gGPYv$R*Ra>E+G23c7KX1Uo*;jn z&kU{^$czitb);X$VaSgIuVCSy8{Cg)OIr9B2KVFH91H)_;C?*Y-u=%#`jx@`c(z>@ z{3>Y;^iGq^u5&VylMRUpz_(mc|9()FYpNDG|D z=HMZRvu;cw|KH}Pa=sY){P{PMzsGw20{OSB_y6==Wv{c7bAGeVD|_94y3T(E*ERL~ z?fd>MZbza%){?m2- zE4Z$y-*4aVzk7Z@E=~7+CfCTnSIk|WR+^WSZ%car@3y6U-|t1llv6)CuQ&VpMIC{d|k;uXT@M{#5mJhEC1E{ zyO}colB8?=#%pHy{-1?Y zKE*Zu(|UP2R%sn$ymT_O7e|_y7R6dkzOCc(r@3I7C&qS-uI72hCg4oHosO zOCy>Or@3;PN0&o1|4wuBG;dFH`VK@i=TGwiHCIsc2sOu0^Af8gwGqvY)VxW}snmSS z28iZkYObc{acYjI=6`B#Xfs4}M>Vfhb51oMwKbyos{gz1UNNIQ8nd3rL+l6D-g(GG zgvy>c%^Af!j5G1w$UYg5Odz)L9BiKRu#?WmhMI&2e=@OK7ZSa4k=gnC%3xp6tBHD; zi8U)rcL8?uLLwy=VTH>=U(QZh_Y(`ESA|&ANHB*>-J}FtU>Nc$T0TE8tIN=x2du21ovEIvU`zx z2{Mh{1g>hq z#I6I?*~LoxSk+}8DD6DZl-;bFc`dwFNE@#$I}jX>bU=!|PF`nrKRL$x&(r+>)6 zYY1jgUbEq3^Q)hz>s*KR<^O+@>*#asZzm2=pGRn4bv*yS>{NX&>r~v8?(Z6By{ojl z8hi@xuXFr1vA;!>ZVze=`L>W{?~T8@fhb{ zmjvG{c4i>@l)h&I@tSA5{(nWv3)@6g*JZB%UmTRKbtqAgS5Ol9*CpJCezTZG#l-8F zyPRt5RyftozlyKWZ#&j`+*K0)rF%aE{h>CD@N|0BBCqtjmxFU=IU8Ih`HocgA0=L` zCB1byZ+}jFxb8R3=+MaX|I2qFtcXz{KfqX4kCEgj*UANTMXZy2gDQjf@i-O`eUN``8a%sk-Z)SEwC>|3 z=Vez({xV(rIYz@)j6)T?{kc8C^|Y_eRwVy=XmGvp-gr;EkFM98nW@Kuhkd$@a$=l>Ufre`kJ?7B*RT^R_+ z^Q`Ot-#}f_=VJL9a4*VhWfJl1DjW4gg)n{jSNYrY{n|INu{#f+_5NIg;Jc(bb_;&< z+1}ZnW)A2#mvef0O6|Ms@ADP~ZF!_~s-vW6Qhl$UXa2eBRs5H(ag4LlRg!-|^>P96 z)y>$MXfa!49_E#PcQ*H`-y@CZ;UNDL8jE};DyJ}e9M$st|6g#AI<^vW=LFY$mwvO7 zxOsiI+LDrd0XqL`Vnf%t{{P>DV-`BExJvS4s+?A#KQ(1fq?orqH+GQ!UAnKeLHUct z6&J7HG=(VN7I?*OcXM8`SNfg&m%8ps;?5hg=hAQP{+xVDx~~|zR|C)g-#K_DS|wv- z@cDu0UR^x@zj$5!Zn3$YgJ*V@cb3JyVfoMXd-^n+udwv!jvN;-D#@nBh-$3VIK&)_6Jasp+muMTW^gH=Lbj-!hf!GA6 z;-4;$zE%32{Jr{)C(&3Nu@lwr?*5#7sj5>OH1oxcc=^|N!Sy?|B8B|#%1fi1ahCsE z#h}Z-pzoeY1bPEJao3_r*7Zuilg~?KwTKZ&NxpX7%L?XIv_?~{={OM}3P{{S(!|MVAhtKSa=^Q)c%r#o;LSNO4k%p;CO6Vzm^(x7p!7S%1E?K%Vwv$Kesff zf0|3ExD!2dMVrWHrt6+hM0pdQ(hZbzGq3bJ`TumxMa(8>gNOcJw-WY8>38yZtFB~u z#;ra7|6DMQo!ZfH2)*WFp0J%)yov5ZQ6`!nq%G( zZj3TY@)7FZCOJ9m`V)!kh+{96ey2DRmCHlSp=p6lSLp4}?G5gsuh-YpY@}N_?nI*n zs3*Dtf9VWU%k$Q6-u9K{`_Fdo)AT?4?Oxfud5c%`FaK)q=B-^>y1t$3Te)WtXH!<2 z{GWYy`5lvcdA&Tv@u}QTGd96Cw+c3^tOMob(^NlsBIEzb&KfuWdP?v-&tYU~NR+}H zZ0Y)5>350;P`%NZFfDktYnf4b5m8=$y8Cl4+~r5E78(z*H1+e)c@HL5;$q^v{%{+6 zW#223;s0UpP2hE^-v0kR-1oh=kXbl}gJZ}{WX>3cM5c<&ndg~Gp^_mN`B&=l6S_-@mh8*V%i2_I0nl_8PBst!rINrPyUp z!qQIgU)E15aZj?pw}B-ZLTE->IKls(VShZ{8SiK>3_gXpEv7|3Y+XQ`J%#q! zq1~-T`}$}2sA9qQ%ZrRwt({3?#I+Q0ZBw9Y%G5OdSv~vfTK4bNv3L!W<%z6PWU->2 zN|r9Nf{}%ctY>6dBdeQu4<;)gSpZ#3imE4*Rgo-?WQ`nQYURl3(fzW$z|iIN8a`hEDc%+1rCRko_h7%QjJV zi|Q|B?( zk1JbU+40K8SAB2>w!!7iPUhM@vocz&s_3z*XX%?|7hMmV>3ARA6dP^XZ_Bn@cHgoI z|GU)uU1~BVx_`FR$o^C9rP{0-)S;YC=2Z>a+o)|G6}EK~or#WYchn9KXM|RP`ahex zQUCK$rzidJjo-9Fj7tK0;$r+Bhq-UEmBll4xv zq6)JJZR@#C@PFEEqz~BZj241c@Q@w9mVKsvlZV-Wx=!$4wnF+ISqM!E<21>c5KxW*$GB#S?^vTP6|uj8D)#BIOM07ZRiC5wenccZ|CS1zH6K_&iQ{~Hs^2se>4yF zxBmZsyZ-;r_WyclmKf;DLQ^u1%Tm zRfI~?>!{x;FT6%m^WJ<0*WMniR*dl%FnF+T`l1+K$l!rLzsWJ2rj+oTao|^2c=%n2 zGT?!K!HqFo>mW;-onP=<6AOn0qu_x(>5&*-%HV-r>ZuQs&I~A(ZWRo!T?p|f9m8cO zTr%9pwS5e)Zt!3~*vo|1GvVY@ew4(6z=fQzkKr{99@s~(is7{k9{4+dJcgfP@W4O% zYcX8;R}vo=JvkqZ;dKli*z?+(GvlLmmL(}ny*U?+;dKq(*Xql;N(|>S;P202SxsYj zeS=@h>;yhFVz|mdNoH6FaULDRnK=Xx{AkXL;VK^`nMp(ZwAQUBp6P*|xbSjT8D?OR zJK>j|czNu*8yh@>-Mi3B$MCZZ9_;USForiVczJ${-_{u3)Zl@gc%g?f!&f;g7p|AD z8pE3#Jg^f#Cx*8$cwi^4ooJ%?3$MW}R%yLH1Ndc6UKqu)foi}T8sG=4vc z_lhD+Y1Wi-GJ|eT=fET2ut6T29IcI z$fq9nUF>v~CTjIshPWh#YiZPkt5!#Qzsd9PyJ5W4YQGzMUy1O2O4}>KYxO9So5(V1 zPYr5K@c)hQooazq{}ngOvJI(y5`QkzGEewleUh*;)T2S+|1ZLLs5iJFjE5wPC&Fu` z$Ig&PJyN|8my~o}crD4LV|XoTXj82qE!4tI34g2B{m1ZHJxsBXUs79x@H^G>tKU)k zU65}&jh>=5?Li~rAnBzG&->DQ|JAdxyhG_wgkOkOhVN8s?()u{OkPMT;t45?gCxXG zVH_kKL_4G9G+e=d?Tn^;l+;os{GBAoc43%}h?ywbu`DY0i^BJ-S1K3FTg?LeC-wiU z*!zy^5!?Sa*jM+0q1o}Ezi2bx;PMONsl>2Cnge?wzLRha&J}-wT&?{OBiuE3;HUZQ zSU5rX3;Z-Ui{X;zWM zNs!J;pOobM6mQb|ZL=R&PRd9wDBA1Qw<=%jSk0iW&IFo#pE~zx_M|QfMXOj7~6I)TfGL5=k5h>xncCVb%8`b_~ zr+SE1N+rEb@A^mQb6F~=u#^Yc50x}MJA;y!o$3*Xiabl_n@jVi@_c6nkpJra?G#-} zfy#TuM=AQRUcW%~QM@IWWOnTM%Z^zX}=u2zU zVq_=P4?Xj!71^mAxu>z2{8|MiQ)M&Vy2Jh~$po zP)jKuwU5D(|F)nXQ46c%Z~cGfT)^M@|NlGsf32yeD#iN$VElLV4{|{$yN9y@|E~U@ zxBdP1cMANS0{=r&puB|jEcHLw-&S%WxRF=IqTW~XW1K(0|HvQ6^8tTj^o?FWbQ$4U zGPKrGi03qVN|D~B`vS;MBH8vSY)M1ad8TV=v9w!4gv)oNt|iaq*p!KPg-2mUlGH;8 z<+>N2jsXk~^gG2)-Y%msMzqKbqwl25>&Coaa=PNBBRZcO#yJg4^tb-s$@{ndKbY_M z-=zPaA!l`2>VL3r_x&R%^jYv=-|k|=sWIvDU&BHISn#so|4aqZNCjN&1zH@9i1Jv! zfR_#V*%e!E7_l+TSBE5gOKF3cezSYhG}mRm>{}{#*>#Xkeg~ z=B0tZAH$_D7-$vuii4*{WX3a>!Ap82!OO?++y*b@l>%=U!=>*ZXr+7U;KO6M+RTAg z8LtfZtQanR|3Is(R~CG249{oq3@-zGZw!~7VxU#Ys|5aO3|G58(5mcJ2G7G%q$r&= zG9PGF@v4BI8N;Q&7-&`Xs)F|uj^3mwdK2kI23qaB^Fo~Rp!}*Sz1*M}F8(z5c?^EG z*D4!-8Sud|T>OM%<|7ANO}rMd_X@9U`0IO(v*FbYUfZji4VT_%uvOiw1%6c+|I&mb zJ=S2WyVnc+UhpXXD%wLrJmN14zsAx-tWMrV+4waNH#Ed|hv6%pO%2}1>kt2t7*5v% z{{U|=xHrnN&I!NwY=aN=Mu3-(;jIlm!J8c7QTk|pYp6Ba8wcJz#^2W9H+YLeJmNpk z;4{7J!F$B`&o}ro?~V|U_%+Wo)LQJ_3O+f;-^t*syn91D;_qVc72aLo3*nFOiwu6h zw*h=ZES&BJ-{d_6z9)uXV(^E(t>B-=@LmRg!h0Ir8=aYMeGI2H)qs z8sbqp4>b5L?*;Id0l%&M8e;Hwy!S#JeuED;`0L(V-~(ds9cl27ydxnVy?3<1-}erK zPml4BHTaj_@eq&r#~b`p?{o0mV(~{TA^lHy--BY3P0k z@uqy&bc0)d0$lu2Ilmfw7%EfYCB_8l)*Sv>2G8Z^18)u<@y`JtZUuP6-xB`$22c5? zWaD1|KEev{-eLHy;9qR;48J1$SI5F%0zT5p#G~}N-QcDCG9iD2-)Zn7ehKguVfbwb zf3?9I`t87quQzy2zkW9Ujo_oL0FU_F!~d|sEBV#4@jnVa#tQJm zVSH4swi&#)KL-9d{*=Mn`#r%~1pa%uea7J9{E6VjWB3k(Pxh|_uM6HhY&Uipe6D|E zh)3zO$Kcca+29wzZ`BLh)qMtEp4_<|Vzror#@wMKm-xD$r+j={J4 z&w+m#|di!Bbu?>c!nJbCYi5mYSb($x1zgFADgXfpPK(pJlB|CE$Mm zT=NILkxv4Ab!s&N#$F9h!f=kkKRe{#Cw}nW$S0p0{QlJa@P84*zcBck)Ee+2<1_ic zH2B)oTJRPz{40a6ORWPR7{k9d`1+LAe$0;H#|^$AwE=un4FAU98&ey>_s8%P2H%w0 z1pb|H$`A3+`-8zBO+Awh|Has&x20CXA1`n6i#x{( z@aBYLrE6`VlSlZy)=SBy@b?B+d7DCc3-DKxuOR3?8Y^$5;lD5BpDKRBnL>FhWAN9K zufe}Eh9hFb|9bLu@RwtFhQZ%Vz6tJ5$_%HR!QV>01zt6VmpAy^$+y9~#_$RTe<%44 z_%$)SqQT!yz6-u4hM#Wm1IYv6uL`HU5&yhZ4gO*B^K5u^gC9&D0{12d=`a482LCd7 z9K0sD%A4@o2LCC^EXU$MJ>+cTy?vnKAye44x--I{3y| ze3}`&a;iG`J2C#22CtdY1f(}5Gybg&-YC^N8{Wp?XQmo}*NpMYU+{g_xv6&GJz{tV zgSSt01D_eg<)`>Q>!MT-@QpFNtHFDw27$j5!!I)UkkoMS)Mc6R>|yYcsWIR+V|Xuv zk4sGip8>9ZMCsqh;4@P5!S9LT{S3Y!bu0L8;gs8@)R%z<-PvuMo4gkMo>+Yu3jaeP|2KrA^0th4V*UVreR4kh zah&D-;Ioo*z>8lVlq>O%HTdG>?b+}N249d|1l}y*H{nk*`10gR@ZR8(8x_tJgWsK8 z4Sr1wzue&WB_9BPAizyHQw_c@`2_fj;OaLO&Q%6~I=KV<3vi2cyN~n{{C!$qa*6PgaNjO5vm%c;1-?Z=dXx4WDiB z*2#9+aQQ=j#;TR91AdPQ$Aq8ndV}{(_66S=!{-^iU$P(g5pc;fdhdLLUz!{Qo?~hz zzQEu^lEcAIkKqdqJ~BB5ydAjYe1&tf!N(^jfsc>jw-|g%@=EYaNS{-Ja+tW);N_C# zz`JIqo43^98OaRr55DCly(#_$999A9dy6GYfyc}9o#5L;yi34uKL)@2>2J64CyT(p zFIN8V1>X_k!$bb9@IPSiQ<5@tJ{IF&5B{tb;MauwPr#3BKyWAN!=GcFWy*=_m;CBJ z7vjr8{-@x7%-}yHG;O&)#=i}GrxoCvLjGsqf7;+*CB8#ZQ!d881ALbi;JZWq9q{im z_$P@k;6D=M-vj=<72r$M8I%6RFV9{scUuP&AHpBuivK?FJt4k=d~6Co-|5L8@*eAO z;xPQLgInOc2}gKY)@8m6{;~L}7rUqz0lwPocOcsb@hklO@Mnbl_LV{Sy9i(YkTdN2 zInZ6l@Yf8!#$Lm@MhurfK@g@`s#ZZ{?sLh~Xa^e4DNExI2c+ zA99BM3D+c{DhPDJA)r)MQ>L8XM-QWPexYUBFOTric`Kt@l-gj!C$sjzT$Yw z;CpPzo5Z?#phC1{=(c> zWWAs8VPW`+XEB54H~Rt2j^V`(UWygR$fW^pi@%h?Gt7QcPsI4eSJ7_k4Ced>xY}*; zXBd1aUYFR{Acku$s-iu?LF6*H@>l#74L+LHX0&_LGsCH5@T;5|As+EpG5BSUnv9Y$ z{%Qta?yL;)h`)xxmpZp|J~PH&%i#Ap4}^HcU)$h!JF7XjgFnLS8T>)#(QJ4_gRgTo za_%1szp=p|cb?!pC5AUK_*2ey&I@CBGlM_t?BaZX3~yoZ-OdY~p9hcP)5_qlJMV;e zl>X-$e4q0w=K}%1$;WmEKj!=x;*xWe{^uL~fb%KmpJMOrXmHz2xB(u$x0Attc7EfW zpUjEg+r{8H-BaNg9`ScGc*@NIUNMGWZ1B8pI(Um1-oxNE+`8bG#PHq*KhNy|K0d^A z*-l=THd3w{xMzj@R@goa06#s%7l!<&!mqC5bi0+?7XAmpBYvg`@WmA15r1CzrGlzt zH+5TP<5zjD9O8S!@bkm3@?F{P>Gp;Hvsm~NjjP1)D1B%G!7p-qg!~bHwZSiNyMZUT z5nh<^XB&L1`!aZjn8NR!%VkwNz$5-5@Gmg;RAWi@|@Z!TY;|v+*wj zuWko;<1judKg$jNnVX`&j^is0e#kvSIGtnscN^SKurALOg@-Rei2*w@Y*ccdp?k zOwY%;tP$eHgcG0g@IPhnPKgWQuOH)o2E3*n;2lGL#eb*4FHUTNe^?CPYw*p9N5HQJ zcf#*|(cq6Iwt+8=;V&8d$;30@8)Nt@2H%m`3I3@G-}I09_8a`I#9QFWYq>!$M||?B zU8rflop>9(WDI}J;O`{f0Y6hX=}^;l@(8bkAB{Wh%z41-wp}~GZ+_gA_9pyi zhWzbK_)SS)C$HM6Gx5Q(4F0jgD=OU`?_Go6ZshR=VSK>z9WeL`JazEBCO%E^k>uEi z3_i>3_Y~LLd*tSgJ*YEL^FzsijFWB6wVm#<~y_85N5;9BcW zyB)(nH+Y(z2A;SsGd^D!T)vtuYxM3+{7Zw&e>43ExY}pppZ9Bnm$s!(Iw<}SKVk6l z_(h`~QurbMgTd?C4YJ`s8N3R9-msI0U;T)}|Ha@f@bN-q@y5KFKbG=LyR?p?FemJ5z20Jg`&0duYI~aZowtrm3I><;E8~$EUeVyedbtl{_~`~uSM;p3Iho;CGPta5@P`@0 zD;vCwRR(-&46kDFvc^*Sz8GHB;K4e{H)41-g9qy#OYg~iZ*_wQ``YvYS2^c<^VT%D z*3Qshh(E+@8@v|Qy^IIvW`&YDPHI;a9oRdm9`4 zV&?pqCyn7v3_hH>E9?-0@C|=+gHOR9Vpd#o#$Hq8#^1%@_oK_pieG5(yU~fW zUs#O4yTP~MGn4jxUgmpy8eD!1Syvgu`xtyDV}E?8#PI$G-;0MXeBa0Lfd-eSH^z@K ze2Bs2>m2?64Vmv9ZtxGRkH9B`OHZZz8foz3c*J156T>AZO}4+cG=H);hL1HkvnMud z?!cQ;zz8SbID^Y4Klo5nAB`Q}1cL|rD=muQ6Ad1$&!^YtNI}eiS$!d9CN$e1jVn3i zNK=TG)3LTdXsz%V>sV-)@Pg-9Xo1jRIcT5Q%>Y7sq8^)GmNk_Stqv`Tje-cPKFEi1 zK&L?2*RbRP%M0a$@0r-FmxJJ6iS1NLnWY+P$>v&3~DngH6g7DEe}>$K$?64%RU(d+4wZqLK+T{Q(Am(rP+RCcs3*mu z59fYRf9O(Z05lL91Pz9UKtrKn&~Ru3G!hyGjfTcRW1(@-cxVDN5$X+1BK*rZUja>p zu7s|Fra{x88PL_xHPE%tOz1jj7Bm~01I>l5hvq>yK=Yv+p#{)Q&_ZYtbThOVx&>MS zF=R2U~&9HqF7Y5m zy@U!wjPCFpOPz#@LnWY+P$?)KDh-u^80Bc>g7%0y37rmAf+|B*psG+cXcuvN4|*Ru z0(}bQ1kVlSf$~9xpwpnDP+6!P?Mn^LwV*Sg+7Qw^BL>^5$GHL25NZT9hR%YTKuw`$ zP;;mS)Dk)yY6Z21&VkN_+CXigcF=iHd+2>t0nk8b5HuJX0u6pKZ(e#kQ(kN~%J_rsT-_Y%h&|JLqu&=LytAQxkg)5*^Tt29e=WrQ zfdPN^d%d?d&!Tuo;YMerpWdT1)wwUcGaLdZ$t ziM}IBM}0?x>D!dg5muYu=w8p2kNW*DV9|B_z2d7lj1~nN1ll zsg!N%W;gD~Lrb7%An||7`4=evh~QrDsmZm@3ST}Lw5Qi4e}U=Q<7 zHImj7iu34Q5&ux0&4czqKSKZP_w*b^FAs@-ALmaX7aK#}>pS$!q@ThKzo#0{{|wW! zPLRGwaf+_v_s?$Q z3-Q8CltkC!iGHVZ_It%e-~S1dtGX6X^vzMa=srr{|5QKRlsHCV_Tf4zGkTYvMftLj zYo)U=#pip@5l{4c^~04e|6>@@bM?cM{^GghuI;hsdS4#wacV#vpy>U#aIJSoX|$F5 zw?iz7uga0~>;$;-Nc_c^Xl(#p1Vz7pjO!?V`?>xaiqhb(o<-jty-(>QeuWWXwXV#3 zPxQX%EZ&IpzNl@}^$?G84>iC*ZY5zn4IPHcU4@(mW#^B68?_1Q>$U%^Wb-P}*--sy zj8Gp9%An%#IoHP@4#HYTm>)pTz^Aa4u0H%a>vuX2;vDsx3;zPsv!|hQm)Pbv(RCdE zmFIP)GxC5GZp5Q^M%Q=qY%f%B1|uuz&%Rl0;Ci0xJLBIyxtGmernaTNYSh(?3Lne- z_7Pm)`v{}%FkGAG*}uO&n7&)T)%kAD(f7ap7nq*qye9a5{U*AOad&oWPe&~MUUYzKa=*=-cF)1-GF+Xu*Vqs!&;`YRf#Qll2 ziS-;s{9=BZU&=4-m-8$5mHlddEx(T6$ZzAf_dEEV{4N|9aV+(3_wV%Y^6&9GEVJ-y zqaDn0nw=X5`h)!8{s{jv|8kBiIOgY*MiKd!9e|2DrJcr!4tzC}hSomkb!V5i&ue~~ zEVGzhcKpORUuzBXaQ6(BJ%tmeC5j{pvxct<>(Sbpw+|%z>-^~(jbarYU-P^++DiIU zYZbO$_hYAZF!6q(c{AID`Kb4p_qaC{<@jar+>cI4`(i$BJ!w6S9&{)Ap}pvWUP1Ts zCc2&j=yyIqr*i~dhI|>zlmEwf@jqhA7j9L2=-1>3_Q8|yeEG_6>Eur2Nfbx~aV?%G zp7=CzEb)2bo5Z(?pA)}vB$Hk;cQQ}1Q1Y~7@np$ly<~lkhRH_B*2!}?+9ca1yC%DF zT%VkmT##It+?Cvu+?#BiYL;r5YL#lAx**jh)irfds(Y$us&DGj)PU5$)R5G$)X3E6 z)VS1y)a9wEspY9VQ$MACN#*czdei)CNTXT)T>l1tzTcdY0+T`34eoq*p?izF#9i&) z>)z*%PK-%RNK8pwmYAKGlbD+rM@pU#Uv>PqG(|hw0j*~*w29iQR6CPijka(h8o!%K z!3Rmb9i$pMGrKH4uphHkBDYfh;wA66d))nwje=C_Zl{#(<2b{7eN*%0=bNwYfvxBj z$xX>eliQL7Ql(Pm`0AE?aTmT+-#Q>QCp9;9eQIH9N$M4U9HmF)X`QpddCi&FX3u zXg=m_tJpP}6>J>t53$vj<*3rI95F4GN+*uxiQ~M~&8gw0ggxs&>%Zb3@$(S7v*9~} z&->2KX#8(q>&$WPan?AGIQyNqonIZ-J=bkR-R|n1lE_GuqojPE_?1#JG1=1_?Tz&& zc$2)#y{Xe;yu|NItsCKw z_9sy97W=pOcW~V0KjQE8KlVQ&=1QG&y$)VyuZMTxgUoMoU&JcIF&|Csa?qDU#hScHI(bSiz z6O=s5^I4l)%zOV7o7n)Z5za8a-S;^M*nT*t`#LKI4kW)!p34fEQr<4_b?+nZOK$~b zt~A`*XF~hm&Y+aZQ~4t5=?3cP)6~sZtcjG3N0X0n6i5|F6;2i7m}5%CTuQ~l)FO^H z1f%af1z%e*QmR-0g zUY^{ZES@S!xlB)Gn0(jwcjXw!aZPHbDFuruoBRFQCxVig;(I^k>s~p7KAw=jw_b7H za-K{KN$&Ap@s9g9G1;Xu_j#f~&fpi{un)*@cFHM0Yng*5C8>jrn5}5183=4WAGF($ zk9?W6!+n-xr@PBtmAHpvZDL(w3whnBmTE4xN6a@|g8uvo^xU7I->t!}aDALn&il@n zPC>VfJITGvecavc?svapOX&QG=82w(YZJF6?n^wMsGA&@+?YI^Y?|tr>XW)G^+;-z z*UZ1b@9$sjuks)FclnP~pYrpT7ZNX;+Wb=DrNsWks~j)-FHr;b`>%1l>A%I%DHl3x zcoV4^sRE2Xl{<(1k0_I$`a4MTp4`t5Ta;UwEm&^dNl9EyNqmH|n3Iw?n6fyE(m0;- zc$wKHcrH7&sP0@&J)BCJ%$F)?%0uy#@+gBcT8&bA2IaIqWwb4&^iIm?N0icIl+&*% zsozsl9m;A>%HVG5)jscK>elPju6L+kLA|O=&1z%nR##KIM$_L#b!w~s6yNzO$2GSF zJ$XJ>$tPL1s1>(`jSs7$%z2d{56dvmm4Tk#vwb^gLW}&Gm8Jd_sl|UT$ZpW z&;wWuucN+g#De!B_C$CD3)yY7yAVV+ z$uFCI8<>=2hncp{#m-P?9j)u*&Qp$h=>yI&r-gf7D3J_ur@1qbJW3}jCb}msMV8o{ z=$D*AP0=c%!sJ9LR;*lt`u*2Q@f?1EQ0Aycd)As% z?_gT9MgB4)V@S%_&hb3QEB-eyOa06rIe-Lngn5_qu$9psf4%L#rcEDdTJOibxI7`{)9V^rU^aAFz)+6qNH?%nDsVEYxx(tP5x|b(PDi z)gV)%9kVI89`Byz*P^G9H}0+2ZjWZy=%*z zaZ45J%&!5?+vinju=T>)%dwJrPL_@w-`JB!?+ndR?smCZK zr*bdL_3idj=QihV8oWO$?>9-s@jRPa>JP ztXsqV(YqileUdJ}=2}nMnEKI@E9HW1X)jY<<*+j91u{=1*7~hW<)sx!^D?OGl3&hn znmU&_mE79Mfy)^+yzPGE{_56Cv_cM?&S+qJnDbq!Hy3&>LrHz9v)oziE%W*lE43l7 zvWL$5>_V2`xjO9eex{FqpB{ZU(z{}j$I^bMlDukBa?2wj?xp_bX0)I@Icg;2&uPoP zr6v27BY}*Z3mLg!C?oGm?nVZl>(4`iy?#Rwl6pf)WjEXTyklVcp1#bq9(Im9<=xBN zsqUNZH*TNAL&+;sE&a~^0Drar0R5FxtF_gLI(;5_q}(mde56(;D1Fkss#}6Mzn{p> z*DDVt^+=X^AWV(6&H!4G{-k_Yo>pY7RZwqLYx^Z9nzrxiu1p(q_Pt!epm7( z>hf!}itm_~M78=v@~7l4Nhjr}PD$lKj;WlgYUHYVsm4h97a`#fL9QQ1%dseRTk3Xt zu;r;$tWLh47Ii~PZP62{=Tm!9`%*8bUQfN5dN=i6*u#BhB(d+zC?Mr|^l>@7Xb0CE zv}`w%7Wz7se6=bQNDZ~4CFv0=V__hh!BU~zdybJgYO+UIM@Qp^9qtMDN6JaP#CaT@ zIW&4$Ma#cAv76&9>_gv4yqnyZs^oP=9#@+GW<8e}oz$A@g52Gc+Dz=X5%(bGLA;Nq zqF4v<&G35FX1^Qw2O)6C zo@ou-h8#^9Pd9U0F{WYctFp>yGDG@3u4F(#d?y+4w1G<;lCr zd0r>vtEB7pQ;f_#KNq9(+Izl;8S{9~{S3h?JJ=tFRu!^LP!gwLE&(|KZ zy3S!aIciex+H?IC`xJeHH1QKhik({-VT6yPkoX1F`18LV2vB%}e&3HxngbJip zU5Z+iPneYM~(tqHs{vlvgDn~HKf95 z+8mXTElwA-BZJUuto72+SyW@>v(%qL`B4k>x%C!}V_&XbwqHfMc^f(EePnD&I0e}~ zudQ<)t!_uBt8=N-%$0O=zR|W!XS%c8>)mxiM=Xs$vWpQFD`V>j!>!}%A5)UWplS7S=f|`2GDOHk$22s={_Y^Xk z7HL^plNN3KMZ{lH&mHt+_xfx6wMZxr`VS-hJnKIb_BzMdvpmhY&{^s}>|T*rl8^;i zI^X!1Ep3o=K@S-{&_1K{IYD0iNM2>t_^b%EJrk3WRJ7OEO7wC{tK>mS*pY0l)StIe zLHo4Yv`TwujXpB1Pg$giw+KQE9G(2qKjF`PI4CKXyUqQ% z)F73VXPt6xE%yoUXYUzON8z_Ll42`*fp$h-Y>%F!CcACdwd>hsiKpshXD3L(XWh<5 zLpGmW+)QsK?N(5ycgAY<`IPvz=5z1A-772=zu4a@12qLv0S(iK*4&a>c>G~A0;a}oN7)67oHwaqS%_1S~Dsnd)@dpmYV0_e#x&>7A#7TM@J zmp2Six~0+MMHVVRT!S5;YUG5@#fuAStxwIM?VAuR>;+!7-QiKUYi^ zmgnSZ#OGsMIvLbbtO{5vBU%3T5laA zho=~=y^Lg}TCoYaeJZ_IG2W4ZE#4OFnToS#;Mt53AF{XDuTy${c2e$v~v(=#iU$ex3GH}M;gcJ9F;gKBW2Zg>!26Ane@Du+WDYqMYhtLKI=YbbY*WL zfxV5E_Fd}hM;srM-X~~Ze?%(#%{>kMXC>0Tl}YbOq_$d``RHw>xm{{>x6%TvMz{8M zq7Wrn64z;t;xQ4P&51=JHpR#!>O~i&HiPMVmnSFt_n@IrO8jE&NQ_M0Lm#FmJKeR3 zfuUCI1a)p8buIEAo}Y2oJ&Yorr7Q=d#>4c)-`k~}_ss}Z<5P`JH8$1ARO3>OO7nWs z<5p)psxe_JN_`*iXJ0G&rPa75Ig63c0*=K-Zh9?wf2t(o60NjW?av+QSJ9vDN=^&4 zn?=K#qVen!dIf!b3)=D0i5#@9i~KtojY#5&Wb(eDwnZ{cO(d8ylmp4~>iIMdk7y4$(WS>dhn4uvVN z{&^5u%I%C@w}!v_&2Huna68ivRPh@VC&@>JX^-l$1Mb=EyVwKGhxE^D7=1lQi}4D3 zRlbKV`fGNKy#juv*m;c2pK)fobKI)*MZ*&sS+DgE`M;1RRe65I?#zhmDn?t27<=4F zy?ey*-P~>|^p9(pF_88#&^*p$)PoqD$3JLY{&%km34Mrr#m3j5{>jF=ar?U$bE zWB=J&8uhWN6End9<_6^*KQYQvAfxwoVYnrFZ`;^`G|*OGG0BtM*YcldpW6o zADZ8)jGS(#M6CAevHo4vW{fq_PN1{HK`VKwU zEWUOwW7?a%g`RfkJcl>rMJHN_l#+g`G*+a6W-3ppnJUV9s9;Crn^<3UcQ~IC=%FM- z9WY})>D}`hiAnv@AZlA#B%=PbHkx_)#Iyom89mhxrX_HUp6V3S8ss9 z7S^f)iEDf;QW7`Sjk4IBsTq zuMwMik@KiGovArvkZUG#Ok%7b$fiw_O&MLB&-kK8Y+UgeBa0_el}KmFK85McG_Ugx zy^`i|b|<6Z;gWu+zy|;BIoqC2mR-KN8gJEs0CJ2m7^VO5f5MoJRTC zLJ3kYRf=(1AbVdB&UR*&rY(uZ$tCCk_9i7mOH%4giMgM4>I7|6BtsVoXDlU0&ttYL zkfQJKKMYIO6>bav?ofkO6&vT`e3wdDGbEr(k$+ZDW{NP&ScwuNxn>3>Q77f(Jv5zJ5oa}=*IXQ*Q`v#(#fz0itlhEH>QZP6o6WPa;GGlx-tK6t7*RC*Sr z-t^}^8nj>EB^RW$LQAQB8a4E+Q2!s)(fnwRr4L?QJLuE;SsyyzI9rn4Xh&80no$ON zI%+Rln-=m^zEgeF5xW7>$|B0vd5Lt|Ch40bBfXaVnm%?T{=uG0mGO2VM>ph&Mu-|8 zdg16W8XHFQ&l(kKO!(mMBSOh5(hU4@B&cy zuG0?uxmfsQ19%sw7x)J;Tr&j)tw9c^vevILyq>|QIGAQx#qQ2b2jx>iYYuWE>2N3i zf_zUkGI+2b)Qds+H|y&f8{9McUo3!-7;{0np;MteP+lk>lpiVp6@&^wg`v}+B2ZDN z7?cJThe|*ttt|@z+o=~h=kFKT`V^opeH!AjZHjEZWFw?!<)Oxq?)5v}|HL_ZK9;x( zYkgCIE#bT-ynd9kY{kVp4xa7YzX7e|djG3vN4d_iF!){cycG9cpb_xsx1Vy3u4Qwj zI4Zo8od@u{3D8Z@8c5$Vfb{&BSx?E!lgzP=+NV-p-)g|RxL#J@lU_}|Lo1vttZa0A z#EPlt=w<8ZZ4dbUkdF5&Mm=BK$2suGqk$_@8_Gw=cXHs{Ce0kh@lI3CslidpX@ssr z+K!9NaWUGC9?mdx49CaJNXG0srgAKB7CN_@;|^z)IqqSGW;GJKjt%H49%p3#cRc^I z>8ZLZxuhU7Xc3j9-5U>4^7vwNC`YBa3i9)IJoVh}+~KS@ z#|CG!IUXYS{wIgllP}KC7hg|_Q<-~+lJ;lU6<8s2H@qe2ZK_kJTAN*-JF-Ug1J)q2 z>W*o9`G+WGm$a*M)W8QrBW#zNaGYm%;5cemH+7@2sTpn1eRrjHsBS1Nd*G94m`P35 zkCA4ccB=FL^4kW|2B{2wZ7*~p8c4ZRpMIHj6{}g}|D}TxcMsAgqBqa6%_wmav+y^f zBfOIps=H|g|NL$g;j53n0q$E^C%b~*tYoe0T5O#DS!@)gMsZw%W?`EX|9^-G>Pb#o z$%GUCA6Zw$w&S}kRNX8+7gcv?ZTL3I-@o_lo4!Gx zq?xX7?EUmm$OiQFxvaLlRU`Wz=yk`iO8!Npv84T1chaRv-fBaR-9la|w>sE2Ia{57 z23Z)UXghq9M5JB%=w!{8k24l;6R_gAi*@;jnUmJncSrm81;>|mQD-j4^`>1=YW#Qd z|3X|dh?jcWZ}0(^pg(Oy|9A^I@dU@eipvgCrCsTyR9nj`UZvbEVcPvOSb5?kd7_4q zCkB#RC%bADmeDy_cg%4Hgf-+A`t>!uE%U!*LDgcW1AZqPwPOXaG3ec{OC@@3rq^j$n_gkVpBdZN?APtLn6-U}`tWxw z|5ItXlbl!Clui2)dp3hK-Q8#oX+Blo0x9D>FXA?%lr+qXCoZ6L;KwY%Gwz)=(_u#}VT{MFq{{6ezT z=cWhvmj1Ai^Jmvz-5bn>NpI1Qxm>-eANHp&TL-b8{n1Ld|LX20W&+fvOhsoOQSpZY z$slWg_*ZvF=@T@cQpv82-FXdq!K~+_XghlId;>DZCS!Xq`}@rt4>9u@91qjFJdXsj z2OGfPcmaPGFJc26952!C{NMil6xwFBR<{{>{Z1@Q*BcxDe{_E|%p>Wp_Ryaz#oJMO zBU-cDHap*Hhw?VeNVUTfS5j{W`rVrx9SiAobOe3bf12+&`J*_^pznyN6J=2H*ktB& z?#=RFIx3|?T3EYUqQiKM;~(9xVZ5%oI@la*!kUtz#6+|wly4+!96^Jdmr+xO^H+D8 zr*BJ`%kagrgTCniBXWm6=@MphYcN)5Yeoqg8(d)|ksHXlRpi=c=l{enHj}QZ7uC@v zjG_0>e(u8e>iH?Q#xdKR?C0_1fl~S?W27Xhbc$WTSYQ96`)l}}Qo24pbbb57ur-lH z_7xh4G(6k>+4YH#_e-QGhY@UEMy-E#T@7B9nlbomiKsm_MDoa-Ftt^7Z}~mVRf7MW zCv|y~LLF!9g_j|1uHx8=%o(iVIr?usse4b*a!Rv1IFxvLkyE{_tH>9npL`q^wh!`l z<>^XSi3l~85VaNYVa5KT;%MmXIb?s)g*&QG%I|cbUIU=BiyOx zJw}OmntGM_KS$X9d~fnb+9T-{GMs;O-w-KLTHQJ3jd`-2moi3BjMNWC^cZmv7D@d& zw*-?8wK`I4FMK}@q#jGUREu#vrTcrz=&AO9<>_|bAQ?WW@fw%8P7*E3sm#u$GeY}U z@vii4>JI}6`07xS|Es&3M+Irohp&mKYM8%+938T9l!kT*WpOF(&Pqz--KI1?O?ljI z)|7pUm!cYW38NMHPxEOvQsqKhbSLU%r74kaM4FMV=s_-XZa^RNUwL{nxuDXoQPUGn zVZL7F`3L6IezEg9+0R{hE}3gCebgOB=XkQK>xu?)S|eMn@*rd;mGE1T2KHq6--~za zNic$o|Gy)AG6Egw6Hw;=Ce+U}_|14i(y_#7C4#Z8#%)iB{ld}z2*({^tJmF@3>VN7 zVCsb~LHpYeYli`hMMg3HxSTP^b@n_)8H*WRtYB2JhLOa>j2w0{N_d@-!T*V0{BPF( zzs=kZ^CGeRzZ1qrX;D2MWWj^^y!bw!{1TZsuUV^dZl@p|TKt9zGB@)i`8daMX<1H& zt1g@jNAv&>=I!F)$X@7VxZ2Z`;hw>R{fOh?_7f=vRv&mGfl`nM`4HCHnr%DD{M442 zj`b9@8+sLb4>|%Jhkk*)>zKWQ(xCEC4M_7eg?XPxi=lkWXFd1(Rnzb)zoqs>PYYPl z>W#eC*1AE9BW+0ztLpE(D}Lv_fM4iWr&>MfA9dwh)fi9eDvuS}fEBiig}*3h%?q#c znNgqk3R#DKe|kR|AB58BckHt8s(_`GR0&hcwd5>L+j=m3p5OXg|9>+5|0Sf7m8G5s z`~QB*2pn9cP@NA_a&=aPvPNUIZ8goSl(jWY3tkILYDPAUy2MY3mAhPKK?DAHdm+3s zrC~i6y_v^s3P0kqr+Qx5s)HRY;lyy&^UBtl?wR1LW4P*hWvj07=f5w8tDaZ3>bdpc z|1pNEo>#W&yYjzVnt9LYy{hMxtp;ub@N;6g>Um`>66Ke7r0^O|70(}oS#Au-WHqetl<spqQ}Cs+_m(mEV)xc;xFq(m91;s>%j9c2OQx|3_cqRJbX!kN9ozj;LEUl#^)5c>@Nr>Uvq=6bXS7=%ehI{ z3M40w@Fv!Jr!;u}JA!gpoN^f8o19GqF)mgP&xXHg$Uj5xB^+kty;cU-{2%2xhPO8O z7A(*3^B=>djc;l_j8!_?Z{d6|;pCM>($sp#IhYOaU~pNlXXWo=@SVG8tH$@tJ zHXGi<;EytnAqf@*>962K-$@ z{yaC64(YPsbG)k!UJqMIRzJq@YYbkW)mrRR5W}xExGen{`3NUH3CHY{+r{eX^v#CP zGyI*=KxE~=$>43UX3mP=V(@0pIoa@A4c^FU0=_2pUVUO0YY}>YtoTZUU(c8{D}Il` zCp)-!$`Z~RgO7G_Czb_YZ}4FMo%nk<8@wN5BG%_9KC}-?hb;!b(wPSS8@S4+@J9?j zgB8B4$yl6;KW6aj&|EO;0*}&jtHEzYyMg~7aFqwb$+ykmE1VTTEthkXE^UC5NB9+t znahH2WOFU`Q|C|~0(_YEHnzGcvEWxf^%R#=L;j_DFZel>ho=ob5>LvsdolbOgO4(P z*AK<;?FJu>$7M8+WI`0q4ug+j49{9_;iM1Y=Y7uL8~g^m zaah({;8FU#ZSZIDDx4KRXz)kS4P?a+8+;Qw@T~X|gRer{ofSW3@D=DAvf^JGd?B8y zS+Nj{&o>6&gBNJzid#vC20{G4Gx)n`w=C9T{;R=T zGPh<~kH>JA`)Ss6yaia+p&0HNe5u(#&R?1tAIyK@-@v>YYY1X^Zi8<#`=)h>;V97H z-@zD~enfb^;JXSM{CQjZt=$sC^_|nKPwYIfJ{iM{8ay9s;IRV}PW>f+^JzblX;uj| zYiP}uW#VZDFX@y7su{zzAIUVU6tg;(b#V+YVeoV`SL~w^!%G^xG@hhbYZJq9$3{41 z%zk9Mg{L=FJAij0;eGM2&U&vHUcum(SiQ61l?{F&-rckEvmAtqoq)stbP{Z)@<<$Z)ieXx5cJ(+U54gQww{pYMo;-x2(3W+{YE7EXJs z^z3Tz!e+%z9Pe)M{AOGo$9o%G>rRjlk=w2GU_9K%;QN{DrQF8wz6O7VSzy|qAUdP9AnzED4?KXfTH02&Alf(AoFprOz(XgD+i8VQYpMnhwu zvCue()+NjS3zNCO0-9#@9Iw*R9fqc&_gHqnZPhx!daBnfYu;`6vW2!o(ub_#d9H4O zJ??{C??krT&-n*P&kr&S9AV#V3i!qj%*0B}3iu*BSv~7S82zsc>}Rv{%BEKD5l>xy z8{J3m(0hgHz2bQX0WrFdc%pddoxKP{=g3#8cy&J`j8~KncXR&&q_jBMcNcp0kKY|( z(fjl*5f=Y$g{OCZdy=@EEIs03MBkr1JtCgJN{@&~@r%B@#OxqHqVI0b{a<}|pXdJg z-4Pc5?g)#2x88ZO?~C*P+4n^}fAxJ4PZSTO@ld|!Wcj@y+jr}m(-2O!fbS2V>37Pj zZ`pL}lq-UAkQYH*<^N>$qfi^hS`4hehNALS2L5>YjqZ;(kucZBx`!+UpL z@Vq!@@iz|d&kygvd@p$aVD6P)D$C-#I^?TE+o1b1ud>a1ZVG?bp7`j!cW3+E!{P6C zhJ5dZ_n(IM`yUO$`HlPNefpNGs#;dT8v-A!DyPD#(;h{b@=;jFKAD*EtqQ*pDJ+c} zpKB>ykMue-mjxbo-m{9^C6L7$vV!ePyEWFcF3*2pFO8q<4pRgD^C9a82EqE>Qu`4& zbT!8MA-pc$PijJSzAw_HBI%5~q*BpbfW7AsMarQ)J;J-D;FZldOIMW{u z^w~3P4_B6w*}^Se?Ct-CEypPT(6dpIh8L$L)w;lOcHOTj<{5Ucx8y;q-u0*r`XB!Yi0B-Gq(O zv&{az%Qw`qTQXC&6rV-g>>cb6{E3|p+s$T98`g#Pbo$|0YBam(Udhh5^7F6=o5*;q zK4K@=FP-o4Oqp_Xxdq*#c!X)rZl_(0cdp@h%ef4HZ`Zi9-5cD+?lSkbR>3!KvfphL ztaQGDdEB*F6Te|S!rS-ZWu=I7$;f~8J8z>DC}riP<$Ze-v!Fh#4eox-O z*U4AT*R1C}K~DV0Ub(-~m{Af&bCWVrZBi{7O#PYod(C+<%*UHa zt;ehuq<~f$kLAmr;v4o8XN$PC)cSsRAU=a`bk7fSXPbRXSerN4w~zzM%?4;$&vZ44 zNpjZ+iL@2gIeF|p{6_O>@{Cvl`?q@7-85il$krx5@3Y&K4r){m=EW-DORO@pzgkng zi5209mR#6FNQ;*wdTufzsxwKIY^&|EVbD9NZIgXGYY3;$4*AS17q(QD%Q*K~`?cXA4SWS4!VFN?AE-rc!?o-UiR+T4|ln zDZtwAZZ(5Y_t=X`b@3czRkk#DDgi^0{)3jTqEiXo>=s(cER!Z~ww2RlEZQMf7@QIV|rWXxjH4&eq z%bNw(h8d)37gDkpHVRLYSBmM#Y%TE%Rz2GLI_^QrV@{q+6ZfuZpVdOwrH$4cRd0sp z37!Tm*>m=}ltaZrU#nbIAF&$0J4fmTskGdl)jWvLOv=TPFl=e_rW?D6rL_C2@DieV zuG48jm7ecghpYvwgX`z<9%AvOit!QhuN+pBeX!vEkTpRkZ27?|;atEowWkSdK@t5& z5AWRNlyz6R7f|n%b2-@u>8te589U@@9I0xLZbN1{)w=4HyY_9 z-MNfXD*2!UEz&vE>|xaB?zC4*>4xO$V_|!jZf^|VeFZwwm$_CwzrniBnN1IS%$bds ziu~k+!m{lbNdF)3MOMmD->&%Bzk6`>tpuRLzmZm;C9%=-)%JF-nsJq8>U={}+s|U8 z-ky>4Fv{a7;(HY>(UriKUjc2r#ZcA#TQs_taLHpi59Hziw z>w!8!TqoL*CBdoIF-nc%|FnG&9qg1xX6mBPB>ic!G9yC++IXw5wmz zuBvYQO4}+KAQ$bcdjICsjkeT{F4T=n!@4on4eG`X`2JA8zM2+FDYt-@VGyNPDWg?Z zU+@K0?N7qA+=Ojpl+!zrN~lhN*W^fAVA4M!jpx z)1KsrpYbF03w0<-nR}2@_Y1xme?|Uw9jzKrejI0qyW{p-VI1njN?;4>pz>&?y)vwg z8}Nkupe@@2^?@}hinqKfXyNn}0b;|3?$QhgQ+a+Ihx?gJg zXFU0GulKdEs)RN44*LW}K-h!!c+$NzSMvW{(b#;}HqymGa^gc{k^F__A}vV5C~22A z@hVU5RHvtCh)rS>*6{~x9J+*c?NoX^-#NiZUT>IgZw_l+nw_g^P%1Art9XXmvJ_XJ zGLiAYtWHx4Op+bu!=Q;0Qvo$wO=lJkqx*&X9bQ>zlO zAO8Ti6P~U|)0@|r8StNASH#8m2YP`1{e+$Fd`Y~NIx~#)Jm3D9-&ErMX7XS)b>T7U zf#hgO(2|`cHA_~Oge<98@~|Xf$-t6)CGWPRte;0&??zc4NLe3GIlqxI9<9CXgRFj= zoxRr?L#XozH7<=Dy2(cC%DfEv+L>W1p5iYJ&~t+xos)aO2he-wcW@7D$%7W8IsoG za@ua>ZSiRg(l#6sRbxDJzkO&}kP8PH9UUTd*ccUrAT-#>3*wv)<# z-nO(Rt^d4LDM(wVm}zxZ=dkRZYj35HtE_!#q~D87xf;p{qA_xf%0nbc{L(5|pZb*< zw@W%6h<*3Bv=CdVDc#^4682&0b*CXaX)T`Q@%Jp%nNPwx6PL`TQ7B>Rj%0MTZMEp5 z8**s(`16gtuHITQyGH9@Qclk}N#D2OBz<3vuE6rfO}QSAJUN>ZxD2UMZR~dX)4lYluhXXPg+w>5oh2YT0w>0kR$ z&L<-A&NW^bSGw1h2wIej?Q2O<)%^8tD(o2-Q~RE!EJ@lNL#bBpr|~fsyR_r^kn9?V zz2LiMOg$3GTWxSK=1K9)PPSvgB#7J?QVUI;?psOAB z|6le0`g$vi{a@h!=Z}7V0{=gM^z#$=|M{aIp}=0aYp3kt2mXKl=+7tc|MN$`J%Rrp ztp_Kbzx(Y;qlLYV$TwIH&b+e6yt2L}4a-BiWvg8bSLsYcFIbH8B{5tjJ;==PcN4PV`3!$eX1M}>t9HO& zz~B|kN}R2+a5Sz?!}{YI&M$$>PD0_Uk4dAv-@y697_RS6!$Sd$fc0H0oHT>0{xLpX zkr_@&gReJw*)rf!{7V~rD|HD?S`5!H_%37z(m57Rd4um~g)wtbF)=Ls=f zy?+|5_Gg^0iQx>yz`tRI2&+J1IE@py%MKan^<(%M2A5U{JBb)ha|r(#Xo>Kj10H=> zLxXo^H8UgO7~a_6<&dl`;DN3z-Bzm-XbD!-z;a_a0#K7j!LjBeW9Q2kOz06vgWtuEnpgF6Md)bUmc+P(H|)km}`n#&B90yOmvUp2UJ^cewVx zDI;JVlQ^z3$1Eheo6WHpP1`N3T))+pHxM!zN$Pd3)SkGk&p&N>fL?2Bb(@|qF)Q12 zwbeQZCy`)8k(VPM9b!TI5P)iDaq4(Y%e_6q5Zvu8kH-Ba6lyXEC~HhDDM*CU-+qaIx_^(S!K(G#;2PWppr% zwf^!3TDf%~cPz1njtXKqfz+I0%NvN=%x>sPbD8f~E3Vj{7RGieI+KzdXYlUY*o}1K z7!$^Jy;UYm-$iz1Flq7Sai(UNQcsYF?_1^Bt*bdlPY!wSP~Ox;Ue@|LeY0!JLx;!J z8A$HZ8aLs)`kA$Mid#)Ok2=^jw6nA}PJFIe2bwF)u>^5Yy7x62MXg>_s3}`sI`k!J z*hq{aSIUxRUGYPp+>sB2nMmaC4h|%guB4iDy~k)H^y_xku`qUL*tx@R9B)h0t~agX zUHxpWg7dj+#Tt6$MQ`3enA9E#UfsM`DRDN3IQlWx4)T61y3z62nMgj?s=1An`ERWx zUlZhY#_ze?l-TwlTz%PKQ~qcDUf#6^PQAt1CbX-}3cO%#_%_y%ziJ&sPx!5sz#~hF zl2q1cFO{~9DJebdkHYUf*V0Ni<;Z?Yz_(nhKAb_xt{djVb?933&014-t662DJJpKw zEv-~jYAv?3GEG2X&}H4X|Np%rAl?s7=BDAU)<0axO}G8On7d%5Zmk zNb^A7q4eudjhk*s^PrqBMjBqv`);-5+d_T^^wwL9&jDS1W7hxc>OxEN0lKPf-E_8X zzOgIo(zLQ)Xg5nM@>OD6nzD61mN6GlD!ayxZseQRs*B&XwL)FxQRPG{-1^&EGp=WK ztPjHPFJYgtJV?()jI6c3ThEVLTGg#|b4?xlImEl#Rbt#4*^B!UTRoM-mDcTO{j|`U z)~j4eo+xTkwh!8yvDQ_LuppS!MK+VA_h zHD_+$>h7v@-gBzzRCQIg??G)touKvAy8i_CU9jGb(Zq09bqsg?_`jaS{yUEUOM7k| z|NoEe^C?RroxFcu$`hBJNctzmqNY4x|DiIHBsM0 zJf=*1EYrwKDf8~y^L=I_ zzLt;gz-&DB>LFf!xUN?_P)fP!$oE}|c&0-V-^urWpG>4v&&PLWCLjK1B3^!esq5qY zmah`=Dwm~<;!oo{ONop5RDY(F-G_JN`zmm*8R4H(zonEuyz+0%^+CUb)Nd)J)e^tw zRqCr)xRlb`sJ&5(^+)GTUd{ZDHDPXud_4JkG07kME9Z`(u8n=n*dL6)<-^IB)9<&q z_G2iH)AzUh&f>G`{q)OrC~_l%|0?^qllEA4A+0H>1(Q5_kH;kH-uPQ>ldkK7$0cfV zfn-*_*VH}4IbqhE`v>|FyGhJyocx>LPja0wY{_+u#=*-8Ey*CEhHuX};Py`Y;i#l;;N*csa&{z@j($F%?%9YSo$4H~ zB=V#(DIS_|Wry%z^}Kj*Ni*u$=j54+LM!Z{Y)OuJwIwW2N5s(Ra#{ptLVSlP~p`F1hpT6TBYQ% zc5V|YwVc{Y<+?pVW7|rp137jM{~i9&`tg5yNO*b+c&@R2{D1xUfAsWy3Hv37_Cd`O zpJ@E=xBGKPe!*kExjq{I`*=asbfWRU+b>i6F!=@S{-w{b%w!7f6^VF_duguLhE?KK zuj}br_bTyie7v5Bt(#6KAK#c=BG--A92lNH@+@uLc#S7fgJg2VpO)aKzmNac?|*lA zB7P$u|A8N`IyezO)W^R-|AZ%CiTL3@UVa~bM$Sd(I*i<-p4ofep8o3Ium?+v@b(NB7UNe5B`Er$NO>BxA5_i zzpyCMyI*H9$;U_ITWXgVvKDS1Xeo3QbQ1I@=mO{pXeIRQ$?IPCF>&8O|A4Bo7Of6c z=$hdL&Mz{~othHAGQ>T^_mfc1*^!U&V)(t5Z^@MWExzLGzvg^0jY+FAo^PGk@sE6q zidiRC1}QFi9G_R3@`E~nl=iSKt!D??dbQS3=*r5ED0Ju9 zqJnk>>K#HKT1f?sY(!y=pTl?uqf!cYhHw{SVG4IM!mFU2;k5VUOU!=zfahr+z&6a$-`=t{Nqism*Rxb$l94Lb`4INQ_dC zgL0`1|6TX2gh#as;;^cW!x&B6%+KZgkDMKIdE}9*R#jcAzFisR=@UxN_l{TLW(xgM zD^i0y{_3wz{y&s6((MbB(pTJT?8ldOw1%rxqX^xYo(^%t*zr52-hoTC`NPAp+VdSp zGGm(i(-DZqh5zWeZ}y0u=BuW8jpz53HBHr8rfLln)i2r1|HPeYM>QUy*0ZitYpY-C zH8%BawSK9EUg^}LOWS{8M$6q^3|4(~d^b{nu4$A;zG?Eqz;2^+^7T zc=^Bwc{Td=tq(WyOHN+0gj>h*+jQqJav7F+j$g9JVdSiQEB|X}A3QwzV71)psjPG7 z_*O#P)>O7OcZSwREl$+l-1EDyllLKe)|h2X^1#I53qHIFI)yBD94(S%vH$GczM+H^gUNq#gBGA&-?GHLND^&?q%)Tl~2 zWk!5mBVJ{HB%}NqPfYS7ywc(u81a&4B>sXthGaV8FD+jAjilsgyfS&c?oW%?6Vj3N zUey0fUa$Mp;&okGyv9LChH>I#IvNK}i`O`4TD-=GM}~3bWIE+We1#FOe(T6E4xLP= ztr6eOh}XFE$S`i5Os9hpuW{+L>(yT#N#QT&JDHB^@U(cTVkAHl#h@0b5MKwA9*(MufDIV>fDI3c3xt z7kU(W26`EK3;GE93i<&mV(+G!P+h1gR1S55dP5sQBcO56WN0R|BeVco3@w2Ug^q@1 zp31CdzW)TB4_yjf3$21~h3dTb zw%@79W%w?4yUdM_8o5c~sEIo{95vvHOZ3d3j+=p3r#sraWAbNz2uID`jC^`uhwD1K zHsNet_jUfdHsQKf{;8eP%ea~0Y(pn&me(Wejn}(W-8pk=o{#0>sEZpFQmF58A^jF^ zYB*}`=7yv4{2rR!-3j4d_VEk%HgX4tqk3-R{JrvJ#bqaVW+EKSxJGVmIFeuVM?aSTKWsX7yH3BL*!RHd(3c_Jj{{4e zda^J7UFA@gt~y)s8K)~_+h0Hazkd9G{rG?K`M|%+`2TLqSfe~A_WzEa=l%A%VDvoi zm0=X_b*?WwpTGB|RqK&xKL2<|8`n)Idj510b2`?IkDgb3!~7276Z4DOxifR@5O5vw zIO_5I|I*;c&rQU01tVvX|9w~@UiDTyKj*?kJjoIt`OUWzKde_Y-(LOvQZi$x$-P5- zJP%*}^HTP$TFG~<>nr2cuP$}>`U-JCB3}L5QdfgHzRW94#H*iK>Uyv;ml<`5c=fMJ z-PM`B5oC2DUj3g^x17~7&b^w5SO1~ZJzO*g0n1ia@*}^$)a{x5nD`-yc-7gZZe;EZ z;hBgZ>*IgU4ky0JRh7>v&raP`w(iw`F_x5Rj!NUk5N3&5aaaX_?Lrkh&_I+!1?w!edJ-02|j-VY~w5Q9?tm9h{!mhj>Rd3ADyHR&% zFP+7#?Nd0FZi~WmK0MC~zZZOXk(GXL`|wWDr#^hfs#=9#{k|@8s`N0m$cJ1um#yYQ zF)O_r`OuhMn;U1FgwQIh(1sO>eY5@8|9qqDSw8%kb#mviOG8Ocp+>G|ZVMkK<+kx* zW^TLOdhPr>YiH>-(KDOJioPrQ!LRoJmB&d%Si^5)j^bLC!M|cdxoq_RWa?*)b4Tj} zuFrp$T^q&!z?HI>_&c71s9ITdxZ1*oJmV6rxjIUJEM;W|dll$Euh8^!1sCP*zw+qY zInhc{t?CwCO&u>@8t1y?cFir##ow#oMPs#xvV+tG>;``kEBCcO&-JXSzd5@mdq?&O z_Ls8H^`k9Tx?AR^=eEtw&BfnZqoFoT`(8Z4x&^&qayjpmyPiE1o+3O=c%$geqIXzt zJCPN(d$Oy;LD`oHzYuEXN?+f z;F#>GtXw~xw^p2=y)S!z_JQn!*~cm2uVw$Y@!KTmr8L(vSCQ+Q8$>O!IJZykklcyX z9lwn`_PS{GQk`7gTm#N`M4MA`Q**O(JLGo4qgsqlwLDk&tmcx)zut>y(R!YJ2Rr)d zO}UM;71=|wk7cd+3V7A?fJQlm##l|$Tu&c*!9`ym`sEh*uq)QJD0jFI%i-uKACC5S z{?U8CIa~9QXq&Q6XP-mYs?*-iuKTO+-=lZK-N9}cA7rEdngg!7{RVbmn8N-C@wet< z6cN8Eb=I-iyUNENyhZa6_H=oa-5^%8;{TxRIoY(hW2s+Mm)yl3S0AwF!#9~hzK*H- z`&il~mG{ZnDZImFO7=9`6W!M@)EpbTYcui?tNy-`>uPdcf9i$nGV%s1kJOJQNu0=p;B<=N7+U*^3l}CC5sw8-reIS0${+u1jx#Y2CrwHK-ik-{*?;Nvh93mpY6fEL4&E8j-b!-UiSB1cYBcb z$n1*jHQANfTeEj!*X#be6gh-Qf9l`sD64m6%A3GiIzX|9KD0L=?|3TYNPeZ zXnj`Bihlq(WsOa9Eppu`$%}G(Clt;PV}Fau+s7aSJ|dtkWG)hlzVpL zp2KM;&R|94S-x$%f|)ka?9f-eC!u{ov`T*{Wl%dY-p3mQD$`DD0lO5PK&FbuS%nj22YS@ZumE}dti`sK68$5>HP%p%8E@SV= z-hVlHPM{WCZVO1XRv zBHpFwO3JRvO@GSGbs6>U6`~&g?v&xQ*cw+vm^YJjuiYFx>v4Q3_PL3#bBAY#vkTma>~CYP z=m-z0gU)m3v(EmKM9uRVZ(IJBci8^Qu4fw* zX{X9^-eG%z?>)-T{^NI^L*7%#d!OJfpW!)(>Ot|b!gEp+&$tm@ajQh%=?OgHXEV>U zTj9%@bpHM;(!33RWe?if>4e2muX{A*T68TsQ~h#R(GJv7(SNf9D^)S95eVzj2^rorWKk*%Z6@H9I=@8Is6O zYOoG#4ZEA@|7W3%)P9tUi=zLZg?8*aMwwK5$KQ`rm#AIQ-n3WK&%K3~J$bAhEmTiM zqaD#0M>MkW+ZfHR)$FLDyai-Fdr;`D&ri7CewXEy=;^4U;}|!&xu}Fa(zNU7-so%@ z{@ZhmmSnN4KYE|`tB?#e=!H$9Z#I*@S@Kx(dR5Nk?=%7%wPSVIkEj{D%(bI879TYN zBaLVsRdiI*(RdBlz-bAdaLw!n?9-{ey2oV;oja5JmG1H3*~t^qgZ=p zqyL-aEqk8dANgJodk9;qhRya{$xhx0Y* z(e|Ky9O&D$b$@9#NgJ+-bNOxGMWgc?iT~$UXuXQCK94#*;=b}oPq)fB*F>}Y*%|U2 zc2oS+eeIfNp2_@}spt2`y__A!|JnH~NT(a=EN9e3?Z=gV?Sn?*esK3QiW0YBU5id+ zY((Qk_hwhb4(=xXh4~S%<-9B5 zWMq1rQ7`ptUgmx8@A4e!D{8>1BVJmYI+&f1R#6J>&pc?3c&%l8`6$Z!aejZ%3yQ8T zT8aPuBxB5P7JWe-P+9)Vvh{h6(}|v|!WQ`U`_n=$&z{KMhG#Px_6ojt2G1}W-P?>h zEgJFr-_HLlp_RCjR^obmv|H%=C65QuKB_d%^*ssoBPx%ywxt*6{*>?m%Y5Cdahy;6 zNRGxcvPIR4YO<4jqoU^Qp53PCU%mcfZ1hyj^*|pEqFq0j5z|8mXZr9bI5@|LbLkhW zJS$w}!;0V=UV^9kj1SLZUmyCQ^^~9bpi%f}9A0DbpHrhKeB(p3R!9F!S+N|AzBXk| zbJP6z>oe3o&rr`k%P9TxjMKkJh(}yMVbt|gJWu(a@{Yfyo>KUUI_76WwA=Ep_{XyV8HTQK%t&gg#yzP3U;!YCh9->Wxy3}d{< z@Vw?&?I=vRfUqKaxer(P+U-hot|vUv2*65eP=(cgbo^$lLQj37QGq)d8&-IN@N{;) zM*iJ2ayaF=A7yegMl>c9rZPs`z>hFD#jov%Pum55wlAaG3+Rh4!kax1Pj)F@>`}Qt za!>z1B}Yc|+$06_^SCd0BKJ*rCYPlISEu~eq~z+2E%F}z_?>6KyLi1j)S^)h zI@tUFX>t1?o4mxhulF-koz=-J&i*#$d9Iabr}3VzikkT6&V&5uPvx(DLiBph$A5A+xnmx-E-XcV^ zM2d>^p3;6k^yke73WJ#Cp|CSOe4(Fgck3Sao}C31f4 z!!PX9{|nx{0swi8G_RwR4_&j}vfaJ6+lTRN&Ee?Bn6%zxuQ!6|%^idB3KY&EoR?jd zt&J}fc|()&g(7cgR`7_{V`F3U27aK*rk)*(w#VLOlh^sVLYbnbMH?3FP_*u^R>5wM zWNBuc&5w?1Y;-KS>FJ<+n%{Sob{*BTzIc>V z^B1&7cs#~w#doCs(0v^kx6`P^A$TAfm(S61A4@xG#qUDd)5u(HKdY!aHmK4!hW@JN z8CCx7h>xa`f{Ba>&&@^uSCVH3;*R8*vPSE!#-DzJn(HU`AWw*+k+AMXC-c`o%&NQG|rhkUePt`L)=`nb+!%IsUF*zpiwdPj5J!R{zY0` zn=o=)PFuA%ZBzWc0{c*ZWti_tZdw$7PYt7NBNzz~jSJXqz_YJ5l;*ykyD{|l*Zr;C zNQGVU8E1o#cOzQM1+Ho}AqD~yE=M~$4dS9B;r9P2*VbO@icD`5i zd#}4A*tYtJ9~8wi$kzS!GuH@%?-`3|gJkjdgUBpdqB%R!|L^BSqm7$p{F4R$|9Z;Y zY_8jtzSoKLBcmSITP~Wl7xlLK`5x9N|Ar0CC6HgMIRtOeqdJZmbSrs2`Uc@W+Rj$= zm-h3$rL%lb$x)GRN)PG3I{n?Tap^<$^F1=Dj5YRScwKmg-V6UmBX&zE;mdjYps~H* z#@`a!_ETuvSI{DT;QfxbQrdRSvT06Cq}BSQ@RwAAL6xtzT!2iSVk?WdXm@t z`T6;Z*Zll4%Iti;n-L$Uqxtz|yt8J1zI!LG*HgbTr`>PyGZXPD?`5=aC-A*j%z1rt8cCFAlhT|&JDc1V%GFDJ%p9Ix#xbV;) z+Xqzpeu^$+zWT+`jgaQuSDo9gIPLY>hdJrvp|P9u-k6hF%gOOnNPE63o%o!Nb$!)u z&9m1Y@B0wT@i#)Mba-4Yrlv9exGBhWRj(XPwbZ^KIFi zd2b)~;mOz4K3wCj<-H=;@w_MskFo#wW9-oLqz_N=-bjULHbWl?eaxeMtGW!<2!aT#uF|YrQJLLCkpNLJ|2v!tKW)06) zyshyoTHoIjqd6V28nyg8JNf$R^Y-W7Ef~-Hf^@9oUesH<^8z0A~*I9_cTVj&-cr3A!^{IiY?0wQIqh?4+Zom=6*j^5Ib|GPcF%*pcu*;|k4cP~OXY z&|HRE{L*espYpbXs^8l6UtZx=%t4JwwUeGY)&~7)>-^Wayw)qV1i=A>!Pw6h*v(#y zv`RL~^(ZCm6OZzL=2i0eC6%7-pW#M?U$?QJ&uxBRcAdM@2kkRUt&0RToMu4Cj;2#D zTnE-K6J*Wb{H~b2!!yval$7yaZx1n!k$$WiS~$l09qC)Ozjj}#OKVwaDTRJb3EFxt z@LBac?vIQI=a@7HK)J}K^{!j#IkIr;m)@PAR#r2KuK|~psYm~Sd!f462laaN>o^~V zgkKTj+lF7!xOx0mx(nGkDkjbCS9>fRVkA_8{@HKMn(M-Stw4R8ujLP;c2fC?O3q8v zOMmp-$RqB!6K+%e;T9e;+u9HR{Kswbszc)_L_oY3p3LD9L zko2yGL$R}e_FJ?2CG8~8olXtDH5gmRdQL9;igs*MA5`<7;~HcTExyX#mOl4G-SM>X zs&8KKHO-g*>DQ^hsCsT^^4kTw&^zq*#KVw%EJOA~-C)Ph{(EX_gwNt2d96ga)KmH%hI!it)SU>*1e*FJ`%lQ8uyWrWZvz|ZN&*RWF zK0e?7ug2SHG&cMo*AL@>`GSlB=uJ8byepgQqxhmS{jSD{VF};&DV{1t{c!a!t9dVq z^;wB{d4|-JaGx7^@D#($x9 zP%kL%Z>qoO`-tIN@tSWSxs+ZtSMM*;QHj&+eZ`fyY(B1f{zx3b6Q7I|T54+~bq)7g zNUOvh9j>nBPUZ@w#d`hqC>k$2I}xwmk9-mJw~kK4s~(B=-gR#O zM7-)7&DE1IThy*5_Wy}a`*ye;YY2aJWl=e=$9vI3yWJ*= zkIHj(dRU>I5AjjC&H2#_?-!Iu*GJ_l8pld&ht)2pwcWi)UwetDyfz4XD!0qO>!7dO zjXi5r#=9^kHrwss<`C4Q+|Sjyr^t_jH{wZn9LCajToS?oPVKqs6L}Nk{F8Rg_51Gb zD7QxRswXo}IGYrAC(ZqMR#2TZRni-|%|aN%H48&nG%M5RPWMLGUFzm`&J$K5R315}xe5hYSY=L#DdQroS?4ADi!AU+wUw|2ujHz>s1fhooPyQK zl4EU2U-Pl4y{vw-#E z|9S?ne*8arM)2=9{{P$lKSi3)UDGJr>+}nv{`Pq{(w}dW^b0m&{uBE%B;q5#pf>N2 z<~g?F%cJX6voMQ@^%c&2l!#aD;+QS=E&n^OBHvEY^^t%67$cU69D;SajMzK3 zB$19rF15l#&*$qTuGjN<-q6mdD}H|Bdi6K-hDhy0HzX0S(QVBzoxuNEiTH9wQ89xw?u5kk-FyPbMjgj6}eVWH)vyM9F)9%;e|!+VCXpL0_ZyEKImB}e$GCV3CUCLX}2~%XZL+(5GwqG)e!Z4 zXvkVSh4M_t@D`!&ta4N6!yGb&=sn+qGHQ|J7p~2(zlc^_eBsWg_04jog1vE0cXtM# z>j-8qp2)1M%iQ&Z_uVge8?xm%_5-ey=XVIRi_hV@8~od~Z*}+i)pj3xUlP-%wfrFX zJAHT>vu1>Pd5*c}SGk*==Dca|pii08t>?zyFstSlSCTn()bF`U-l2NS<-8Abwkzgs zN>>u2JlncQLY~t&w>j1$`D!z_wXyddb(egN4z&06GfVD?&L8P_0h0e$#Q8F}uRDzN zBy&qVM5Y&Jp5eDVo`ac9eKyGG?R1~|F*41X6}~mdr6GRFF@7yfOLU?&hZ|;MZ*gJX zTb$;efk)K>)A2L6MFRPubKq548jl~b4>oWe^8=seNyxkIu)t+&%(Q|w{X z6Jx1crcocAh!wm+y;qx+lrIGioAT~)rI+z*3dVMuB$^?X+Z7JlRnEoSRYt~{)#ilVhOTfy$iA@ z)-^EmEP1MZsKy<_dm3RnNdLo?W%eRZ^+}r(H-j*fu%kyp_EwGbidjunk!hQ`m@C!0 zYy;W{hQ7)nPS4}6qXt-st=|B@s|YuF)FWFF_V;;w?)P#$gqE~-mUQu!UuEz~+0!*|;t_h2^#xg}Wx{Pm4pLuxhkk5tQ)v6@)BZfWILIo!4(v?au& z%dCUIu1mPGrt1hUee(5Qw~+d-8?h?mljv(J_Db~d2(7|9Zo@kx86#MfqzB<8W+M|_!o z4wuob&Q(x1Q34;x$LCZcX{Xs21rH<n7smW#NGnsHqb1QNKVlAK3pn!N2A>F*B7wYKeFTkNCVuaPIR& zeAHji3{U4CNyL})+cC4}IsQMNh;QrTwf+~WC2#pKL@Ua4^zl#AYB+b3t}pj^_U_E@ z46*t6fI|--uh~P+-JM9kw~yESQ)XTz;`{sfC;WSdS0v(j^Tv?(8tSTzz!4fd-!;HK=@IK z_`Q6*dK1j5ycc`|pZocEd27zSmxy2D>7VN3FL#&o z{YWDHGkpA|_|n)zBK{m7uXXgSCr-pO{gU)AB=F=c5wGj2`FXX-mx#Z_$7@YK>lG65 zm-%?D+-Ec(5r2h`*Q$P&HYDP&^6{s!ij)~tiFn~vjn%m)@%`C7d7P^Y_iC(4*q-ly zsQ!uYFJ=N3@eMK!GV~plPKcNOs?iHMm+#q$cx0hXduSs5FFyWsylm=|M7-># znqTwk+}|qsDVCj8moWFJz_sG9nvsHA@Bns@g`$y;Ma&Ar6=vZk^SnAwM#C;4+hhl$Fg)io*>hV9g zt`2M6luljJZViby<-ak10hR&p4#qao>mgsdW>`0mqY$=ESJ)Fo47RDbS}#pP|26fOLz<*-_D#% zyHE0r3HRyvq`>1s;)JVYJCx(&A@Q+>Z{e=vM-s>HbNu~@&W$=Ln#(gD2SmKb-+jA> zwI$f--?%o%yD{oQ6;Ll|*$xqZ;!$-)_2z2l96jsJj*RAve#ywp*S_p2{&e>XrHyh+ zP5gv!2^D*vJDDi?I$h~g*2+9ZYW4VaIrX5{irhxKqj#%o?Y>g`ju8NjW2t9!a!Zvk zJ-r(3%34Q#?%TQcd(NLcB05*bj+7^ljdsn|ZXsV0v@6Kp2;UJjDn>Ueqnc7&{K;L2 zZ*>&E#NGLB2^r{!aYi`n$B}B*OW{u(UJZ}pQmu>nxayU!riHtO)^82G--V>wp+{cF z(|9n?;q|=e*7|WPNhE|MRV7D1k)1w8nI)YgiSED?_`&_`eGPH)fV;OOl5Gt#bcJcf zHg$UkPW$`TPjM^V>rJA4%C3aR+x^>w?S$HMtKr%O*jP=UhtRwm6t(A!tgR@cXMw_IAv?bA;f~!d z;ypq`5=4l|Targ6d$=kf>@xDsgybEre$ZwU*SC74xr;zj7Vwm}S=m9~S`k*~xW0`d z3z41}Zs0`icN4lbNBs9I|LO*iRm-WXx1+t3m!$Nr_WdBmK8(ew ztygS=jJz}*UGM!qombgXUqrF5xEH}D$C384lZIYI@#0oi{d3`#6sqdfY=n3C* z(s|V>uOd-3j!W?}x-yHQOQv}!TiUID@aQNd)fVzobXR@66Zv8~K8ccjL&)JG*C(L7 zmZ#kjS7q+qfLI&vx9c92EcF4!%ggR@YJOCb*Le&2rmZsFL&@5l5k=LLm9=D4E;Tax zfUg0+_I{@@J_*}xkx{Q!DYwW>FJ9NeSMytEo_2rF^E3dYRDx9}%hFXEl(MW`*70Vj zZ&gC%XNv#ru`Ttfl~&74Yna#38t>=o{5g1&>I3OmEs*-wu37880tLmkVN7?+U`1VB-H_ggJR`g!q<5ifmbbUFQLSW%>y1HylPldR;pz)~ z&qujOno~bZIo{wjQlO((-F+aTqiL=!o`TX7{;J9eYi1#qts4JQc)0mFEWI18QsBQd*8;u8nFawHig4rQx0*-1!^{>!?Li-$UshMNO#w zm5#M%uEq$&)jfW+L)Xi%c-oJZDE?VDE$F5=^8vci6%%<1^s8G*)~b_ZY*+iT@uu4& zSj>*@ORQLF9OQe3%JDSXke5U364x}O{HA*>#O>!aCZa1JrS3jG$nvv0eR1@J`yw|k zZ>2}#;p$4&KpGiQPWR{g=kxiMrQH5+?*H#PnrDCI!!*x7<2A{M{87mDH5kP4D1lG3 z9{!U=Jf_I!AnF0ey%O=Yef<7BQE~3AM0}Z#U(6FEe8EJ#`kV4UcIW>SiFm3AK6Cwk z#5X76j>KU_@=%V+~5Y&$t9H^_ ztnJx7MZFOH*1WGN)Lt5slSNMQqm(*gt)b-h*G!49hzRyBI!*5IXy32$l5f$BW4+vu-tnM$vmY8{nnFnU9WLO&} z+kH#zC3`8OMQxBOW14&#ZPWd&y?>yiQF-rRsq?l@+@_!rdw%VG`>hhumM4cB^K?=B zW2+^Xb*nuXK^mJn`7h(WPpvtJdgIPAcbNAImCHb16Y6M(d@VRH?e5bJ7me{f7-8KRU8qIJ#rAjUO6fMKPmOUa&jX@T!%+n~RR2RIs)F88XS^`Y z%ak00@y8^KW}$Ay6VzGoIv3wT{e;C>n&i^cyRj9K7t@xRj~&3IH?unRR;6M73G}w$ zqq&QER=%(AT}Te)qx3XNDUN9Q18;ru?evjR-ND(x*L$fvd~{k#H){3Lhag)?|zB+`aZrr^)@YIB3}Mf z2{m2^zBf$Z(9p+6>#2Gs;u-kh`ey#Uc+C^>YEMgO#pO4YCgSzGgw|H)f4sdCXZ0pa zmz{i?exmeLLdz<<(A*r&Ak(gq(K8aB=#sZ)fE6KO{5(P5 z6PTx>xhnBoO2yS-|2OS*)Q<1HIX9ATofm2UBhhouS02Z4@%f2dKMR@5W_UNz@ZwxAxr!hC#41+7)l?gP;p8Ton&hxi%%DnoNYHZcS^!(zC`J`Bjs!JTcWii`}%ujdpgscxjkEPtn%D}Ra?&~7$+{wrWUulS>fvo{#0tm>jJK+c z=xh@=jw9XG&i$Fb{b}&0-s&8Dp6Cq=dwS1Lwil%~itB|)1vB|nL#bqUCC5|!81@-p zqyF-r{VYq(Ig`|PlCo+)-8YsIubsh7$KvF~GorCp`CKP*?sP_9E@qzTtxn}hSkwc{ zozeFR@Fq@Y^Lt;n1!?GPB-3e5rA!>wbDIW<+H%!dzIIi7Z>RDg{nf(zJCIR@HLgR@ z#^t_lP}+?>_o`XMUo&QpZNahbYR~as(Bd8LD{NDE?vA}J!{fRdUiCHy<+86+X^fES z9a2Bvw+IpE=QFaRv9bU0{y)6_U-<}USMKY%u+DcNwo5rp#7mo+W7n7eDudzr>e7nF z%hb*diQ=`6utf2yClx<|c(tFb(61|tQ{Aa{bY3D}7NYu8?dZ>uzaYP$SazaWo~n~% z&9bF7)S055(2grfn{V}(b!}XG)Xv*xBVVp%QFVOElB5RdNeXdUic|w#Y-0ZzAfopP(U@}_7hm%eb^K2haFxUOoW51| zUZ%`xtnjEA(avyD`w-vB+vxC8o`xUwoK`;SQys2b;@4CZ$hT&=H%>Ron>i*y=8^^L@?0tVVAt8; z`Ru^6-W6uadq~5KKNsig8RlO@^;-(ux2d7Of1tm!(U0=0n&va;reTVl%Jan_XT1V) z?#hJ5v~)kh58BYc;LiaAz1!WwKyRkB&b2Z4eIfAsD7Kcy(=_Z%@1RMhTdA`NZb&#+ z6{8aTu{H%TSZUb)vtauiG}F+_FX&~ofzg=(qtD(-mt`qsxegP2)8w3j-S;vudOTp% zvw%F44W7;lJY8YfXCv(Me#6e52ZsR#@*JGPuj-e-27dQ3Fl0r8+s@$kPk~>(K`pHg z(CFg?#>PwDPRDo|7=IpYN##MG*f!*C=$(Uw(*3r;y_*-nVu2ygX+fU3hMm?xnpXq< zNnUmQ0{H)2g`e2=i;#0V_{)~!PkgQh_f0Oq>;49>X9QlWogZNvr<=s@bVH{u)85T8 z?BTIs58J|%e8*@+D^6YCQ}FbLQNNEyo-vg83H%=H+8H`N9N9-2lfgsNr7`M3!FRE;PuqN>wbowo)3D; zY?I#Zzl1C=LtBHr%1~@?u_mX1{dDL?!$vaLNJscqpFF-d+TBcctd)YQJ)*UbFBm%f z6dj&#$ahMR@2C{{#N%^uJz533m>1=Ip`oh{&{YF)QF)8YgVNOJ6)>4(*y?g@^%ujg znqXJg7_yukWEoV2*Enz0Wy1@cd)m-J5jr?01s@^*Y{2Kwp^l96(zni+y5R)3Y>mP5 zNrC5Y4BdT>?m7nyNp2k+Uj@U>3&?Z3p_f|dww_s022hkr@Yh4_0W=;9+o zk6HA%pJ8)HU~|I_TYU{_IyXwUW9^snf+5R^L6*{I(tXD-(e2zSawajl*O2q+Am^@C z?oDF!w!za0fu{^}k4ZkSN8zVWH87fH;P5&)ykpo@ZER}q0{ko~aPHX@IaPL^3UYpF z$Z|}OrK^GO*Wi0-fqZW>%D~o?fq4c7Z-Bv31=9T0;Ptq`>$}J*+~ZHIvl>L4P$1pr zhQ5l?*EWW2Hp4bgtCD7HUn;BD8)e~0%ED(UIuXxL2AzCN9ieAfaa*Kw`efV);>L1r ziaQVt)7rc@!Eh~9YiwnoRX9XJy9`9*Xn(H4dyJLpfH8*7zeVS@m>(~U1kO_W{T8@W*GV| zLEoFev&xA+;#pV-@1s1=?LcHR*D(c8UGr$*W>Z7%BZJ(B8oK%pT|JLnY2{Q;{`AzZ z9{kttm|m8p<7)ITGL+|D{7Bl3cFYxzk9Zzix^gtzncqEkjmjQ}{uA5ANPcZ;U~xnO zi+hZE_dRrUydmfJ$f@-q8mo`<)00~9_b~j)AE|@J8u7F%TJ)9sIJLyJ`3SJ@?U%BXg9VA%qntjYeP57gKmbxm++7IQoSR-9`d-U zL^!vfVLvsnpOr>gX+c@pxB%9@ z=v$xqTwTG_*}mBBSVO)CgM4+levVNt%fN7RWFU#~5jR3ddnf(+>qxXT-{AF7_&hAn zYhCw>QNG{DZa#o6#db7jA$kJtv+)0Vl3#DAFVr8}5PAu0r({MkbGd^3T4Ha#P+TG*R{14SZ?U_H&k@|+Z6P?A^ z#cibS`3aq!P*mZTLl;0N80Duf<>w$6NvmJ(%gf5VpPA`(!AGDvD@7LZuv;XHJI}!T zzy#iR8aUPl$4kQfkxc^_T zaXMali`grN4b{PhjzlK)k7E7A*zAIi=RxzKU4y>w3-+eGbzNLP?BnH-zr}iz6pVHK zbdPa`JKnIVxjqkk4MVq|pj)l>kPi{_sCQ(kuD#3SB+F_}Jr?;NgJ>I65B$}@e(!*N z$+JZHP6dSlbw4Yw^giIl$RX%K1k|o{K}CPr-At4U79}w|kx& zU_tUOrnI`*(x>~eQd8Ah5G#$!!C9Yc5!b3 zn|g?IX=zXO`W)y!;$+qHst<1SHpN=IaqIebaoxFFLf;(>Z0myU(?+J*egHAWf&NpEAae;hm zlW>~dtqFElgT<(6^`z?d&IUH~z-4{{o39GwU#CF&uNpRYDmM2$X-0TQdX3BKcc((Z5A?9QI=_Ur(P-~|h!zF-aGlce zmA^TJawFYTEgKCfH;tg-h73Ce89KseY`Y{wTG4po&0e>$C*9GtEx=z1{H5VM7K|r) zoCmrt1@159{xtt^8265VHigE7bY3#b0DFA7iO4EGgt>w+k>+3)69Fj{da6sW6Q{aa}IFCxhv9(yfZQuDzMwnd(~YIh)S& zWOtgu^HGt$+>(U735!_Y+XuWhG;}fmeGCfrG|afB7w7whYqm3FSRKi*OndiQGJIy( z%@5ejkI+trPHzl4ectH54xpT#XW(;Wz-Mj&oh~=9+b&?I{j4pSwg9s`RJDVrdu2TNoT=-U78OO(bcR*L2pe|l# zeOwQtjJKdvY1j9(JjDNG+UwVhK1?Q4;qErDIXu|Hkp*PG+>m{nAiH*lQ3tS$ z@LWA_l_B?xAom#sFnh+p`>=rbK}Oka7s~EM24*V*X5EeQ^$U32ZScKy;9Kttu<$$@ zzDhwLTD4M%Pb>Ip1~r1pp*m0*R1azZHG$ed3RfAtUmtkC+^BcX5B2za26l%A?EY%V zw^fi&`^8)GorZkUdu&6o{%gT|i@^W>M*VaK_0x7n`79^Jn+>_I3v%C7$X*KYJlZH9 zF2lSlsO-7)F^??e{$&HJ=>e--4P6`*+JNs2T`UW_IIlqY>ur?3fs{YJ$H1;La_-Us z={{uOd~Lw_eM9DHLFO4o*(n0cYspu9#dZ;Y7kk@q%k&Nnn{VeHH}IU}@vLwgus*hG z`l@#h33zIUwdA;M+{d`a%T|YenMRPKvEyZiEmmNQ-x?T94H)R1429(AY1mW_n_6RF zl#4KOuN1KJH<6FOJiclVCI8jPr@n1_j`hxkLcINI$TlU&w!5LLqB@lGH#|()~aPHT(w2(wq;3MYH!FjDafU_bXdHd zWwa^P&_^*;t3bYWDL_dZjCFBE(8cBkX6$iBaPCXPj=l|cr1yVVeAh3)S6>5o(x+SDx&<4Ev50xE4$l(|nI{C9^#;yl{TSOq7$AwHW&@=rhjmCsnOv2Spx$5*pw7+W)N z7#DEpQ9ys=4ZA79Zr(KN!x~^;6S~T<_^WqOdi&d+ zT<00M*8unL4cs>X^IFj51>{cpVCd{xb|49uAF!MnR*YO`*-8F_7LiD?H*) z?1QPCMqU`t^$dNz?eSthUV(COx`EZ0fYp*JSjY9qicpUXp&UtUs0eSlyY1{1*oKOPZ$Z zWdt_$l!46>k4;_w4#5KD*Bxlcx1}FZ>E}9uU7Aglg4?%-zH6ZGI}N!MSS50iFKX#v1wl>G^$3c4Iq$STU z22T41Jzr(iXU|ZsUkGLUu`0F{w@v4IncBOD4EwEx{cdB_Id#!tJ?Im|&PD_~)0zOc4D4%zz1}~Yyf3bs z)z+M3ln>qm<@PknU48WRh+!|Q!0BF()j;Z}b=}_hS z&t5k6Ff(`@8hCtzJS1z}?}=^T3evv{x+dgvf}sQ60_EQ-Yw5Lw!OJu|J|8|I(R)HItadf(+)`|2foJ#J?-IfG@PHgTeoqf&Y;P zHX8?QhJks3^xgIa?5~4if2Hs}$FQ%xf_>d&=%f)kDXxM?Y(uJh>l8SrH(^`$)1bh8 zuN(H<6?;C`u)8wsZcDID%TMbIHZt^bM$k+AE?`9RpJe&Uyr1sBuAq#xEFi~>f1=9+ z3g~i`;jeFjeYPXds%1n>pX=>@pj&F_de5M1z4bc{C$()|Nn3SbEPt%)vq<~wP_FbI z43)w7Ts%MjbdRNc&}f~&#+0a6f?bKf_<9{T#;(R2_F9I$?v5_g>f)h(y>Ha#nGO@l zYxKN8b;W7$p|z8$vGrDCOV)t~j%NlOPc5LI+=_IY=mv6U8u%{`_>VF$KAC(^_j#|L zr}vy&eD6|4?%1C?HQ=v3g^w`mnZco+S!7^e7wq3Me1YlM-qz4b1% zLbi~!2WF3Y1jkr?sWGUnCu=fxy;bjMnPA{7`m#5u1>5XcU%Te&f7wJ_l{9#*3DG7 zD-3;Gzb2k1oqN>>|4h9_t`$ZoHxTBmm_0ZJ$$^Ek3NurZ7JB+1l#uvyVxz* z#bfX$dynm0{OOYcos*2bj}6%FW7zs7*!p#bJ=Mpa{%q*&NYXtzqxmxMs6RK) zC=Wd-53d@y)B%?bz@_O6>2lY@UI$_in&YGOY01wv*uqR`J7{}o7Bm~$0h$Bt2+f6d zg4psowI1n6f>$HIRmVJq-0FYC`iRF~PDqrsjy#Eb+`zX1_|_!vsy3rGYf;eoDnqYb zBJ7uaZD3a$>}rACJnU8J$L%+V{?iDjZ+WndJ;`6? zUZ1!u>39rzw}9qC9SY$8iGf{1u$ztU)5^oP=(N_2m1Qy3kMgYrF15ks@5q*h`*B`2 zcK0@Hu0A%`U}E~cHLyh4VlP9d3xiHq7-gX+T3T+@FRj7pg%qr1D~sd#Je-fPE|REu zyVQCbeHfjY*Ad>+>{)z2i7lkr%4OKXpJz@#tts*J|=ul7*r}($NtHHzW z5f5%i0se;=cDey}S_*F48MrM7xOFgea!k<4XhZ%isaH?Pe~Tf1h3w9-*Ipo5)-}Cd zKZx>wSf~T$7bxFH8Re`2q z*%+H_j@)VGNWSM#LnlWEos=7x9ROa-0%kJ|yQqm>lwlW782W01zGfNNsHLoy$0p;J z8raN>uvvDSVfVXW^YfwZh8+7N!_pwfLU@Vmf7QdW&$XfV>C`V|pDcrqU4o8&3iijP z`8rL59=dLm9N@?0Rhv_A4K(d-0sES$GCn3)`4NyY2#o`u$%F_71jmf+0686M;R+uvghy z($C;0?<{P^8q`*-L2c!x8~H3Ck3B;^e=&HS8+aWGzG-D&*p|#n_et7=(NZu<`it=z z!y`OKdY%=HlstpYrM1J2u(`(2IR*}W0uG}L{T~(Sf7u)ZgL%lmN5G)##g#S`+mEp9 zi>>v6mSIC_Jo4Hp*20f+=Na~0gnie;zV9+H-Z5Z&DKe(j8~wbD(f$|58aB5)*xas$ zoO6(IXD{dKdDj|P_6}G+X7E`n@VT#%$86G{8?bC^*hB|xVq0{jo{MZjpBU>U=;}b| zVCYcjaOem~Hg*(`|4O_J5v%+2H}RTMaz=20WG-@@|8y+Xs2SH|)0w zw%Zh%U!eTF2Ht69OYOu125&tAZ@U?Ge~8DewL8w>eQWsMHt>F>Vb{#^V`cg%x3UU; zaou}ZD8pM*Zp44AM-Kg`A7$oA!=`&BY!WhG0zOqY$2y6>>%m_m&m(VcHF)S2cvx%ba9Pmd zy#|j%;BRQaa(6=)oipsQ7|Nk|j(OK{f4FW@K(=aIr2AH#1K%@^x^)k1wq1dAKQi>* z9=$(>tZ8jP59I6x^??RRW@wPUnenojVZ+U_;jRVvsIw}4T%-oJ(+JzCZ^+*@$p5{e zw?l&7UPP8OyHUUBE~D<)-P;WBhBNfp1%1A0VAKRWnn5j~c2EbX6EslohBRd95M&u# z0H^AEq>o2*Kwq6mH_bQc>Xu$&`t)vvjV=Q-O|Toy2E+z!2d*phc*VP93l-Z#YF_b;Hw*+!n_A9nNO;MSL~N`WL{`XLl-l=F6z5|ktwZC-q_DCh~|0?EWr2ahRidA z%r_dg-3r^@*06)F*g!XEc!7L3xFo&5q4y^qNO_YE<2qV4s83VM+BpWl+eG{>yQlz` zV+-)J$k5S}prgx-d}oAwj|+MbpW-`i8(VwZiuBOe(B;HXt|q}>(m##mZ$R5p9@>|; zjq<^pcil4R1OvNfV0Wz{!`4C9ryJ#?RVW`fR>3yruOl)qF>IkbcF+TwWyn?!xmtPI zR?j=v$iHRC{}zM)t%45f%uctd9+bhu4gKyP^g9OKq}3a$|6exBKtWdOM%eLP z2EWq--j^oIuCP?OFCxF@$lD^w{6GQBFEe!A99=I0@2Y+VNxQOON7Jg?N&?_rz9ev`F`%4psdRJ#FMYHRQd<$h%3%d#PcI zMPO4W;4`;?JzQj9vv0uWC4;{yLGQO4dTW8+<`>9!tJAorHoVncLXb-&L+Sk+)? z2(&RY6xswD1`UTsKqH}1&}e8=XftRGv^g{u`o$;%<&=Sk4ZIr%ystIz+9%+(M**2X zFl62`U^&Dn^F1l^CmMQo=(v{G^Xhr08`u1TzgaWb!e0zq?FC{>s_-6{qki1~g~9uz z!262^ZjAzN=fYcBog`o8&?@=Hb+PKJ9!B{&oU*eVdcm;2mRQ8yhOYJwy862z(-uLd z6$YOF0FRP@=TQZC|HVjuVo3i3FiT<*<1PQ~B+^Z*^O{8M>#}O6r}w=kgtXhels>*z zfsOywuz}v#z{dujt-$kH1JAtzo(EE98Jd7^abEcuN0}QB>8*kjp)H_E&{>9zy&@T1 zZ9~TKk&Mf3E?`p)jC;ogeC{l8@1+HFy2vP_y(ptC$g|Ral@&*pJeE8)_oJihmCa0w z^cJHNKPQvUyAe6vu=gXd^&_FH3hzRiP(ZFv414W^z19kNMo35Fp&El3LtTL#jjXDZooJ1EY-sMgt5S#^iDMtf;ABH|5w(mIv8Y>niDBaj=Pp;7xWJ*Ke^r zWt8&w>))o2N~t*D9X~&(8vPzG1|aovpg;fioPho zcQ*sG3NX9Ks7HEJk9RCakD!nH3_o9cicc|Q-ZU@s zp~Y{b&!oO%z1H!%q<>_jF*={d_Qj*B)Dy8y)Ip2G4BXm)TdnTv`Vn#71M%{@Vkc>3 zt{-;N9~xh!94JrO=>T62oV(Dlm1D4zW1;zmT%+=G^(pQP_R?J}PuzFj-D6*u)fc?; zsEQ2nwJOKWIhUsU_UOH{*F6_~v@ZVf{k1&)E#2M*pLz#U)DG1u-p0V9f52iZLkDfq z!H0(ZOvQeN8@9Jwu)Q-3yKRTvjxzK&0Nrf}JwH3WPuzzxGtZExUy$c$1CtSXOs=Wc z5A2zenqRjW?a{+|23EuKSiPI8b7^}1)3AZV47vJv zxr%G;Z0K2Q`8I-fHLzV6u$^GY_X4uL668D8;GuWGc5oH_#5iWrO^Mf!n}4E#e|zvh zz~FJ$z~hYuhQsn0PRW(*kd9&B4EysKGCqfVFL@bP&wI(xVFz@0n1S&i@Er`TF!1RW z@cG`buj8?=-iGd{qx*RV-%r5vGeI{G7}#u*$L68z$p*d)0=`?Lzcl+VLU-2~dh3YZ zZZzcX8RY)Lz_b&X9%#t+SLAvs$aWsMr|~re%r7%!njd89YuH0S?BRa+R(%qGDt&vs z1*kn^A&uNxaJ78hw++mP<}sg`{ne1Y3$j0K;MODHc7lP;gW&RLz~(_iFP+d!>z3*I zJOO)~Y1rFV*xRZqn5v#tn?BED+TJ~D@ZCM|eKvfjVK$I7E-+-eA9)`3GOeC>hoSF{ z(f9pTcvBrC-gXK4Zt`+^AH5rRuMK?1`mXeAJJOHd(7l~FAEg_m-O!J>IJefox-(e+ zV%WmQd0S|gz1oodPUOBf=<{Tw3|6BI&N6JdKeqgp!8^P55S$xr*usg}!c7KWx5Lxj zp09!KWdrw}1MY_z_Ovy&)7#KV4|H-Td8hdYH<0ft=oaW!&qGn!YexM$6uV$%vHQu; zPZ!Rz0N(qt(tT35^#eZ5&q(iY4MBe$x#tlBqm}Ts+Vkh!=LSYQ1&lfwc?^#7SXRg2 zv0mWuSp%!f$o~rH8t6LDOHtWa1M^;B-WNVp??u)fqe1^ZZ>z=GOAUR_K%YMt<#Q8s zu*k5pld!XftJCZ8uIQ(gA$#2*`$>lF55V@{GjwwaSX|}t;9b2&xvEaN+Qh(PqdXq> z7M0Xaw~x6&w{r}<`+#>hL$WHo2Bdy++{qJqa*AMwx?wQ_4)LR8dLTwD}b`01(X4u*`*xG4^J)Mj_757N* z*PVsD=X;r*n`P*B!@O?KDjsLxB24O|A~aoMMMh@rPRL2ug{xYZ80jWFzD z1U8}Yg`xME=>1#+yMbW0gQ1U}=wq27SO2_RlZ)@brqaeVPQj*5g?2UMsukqwY1rNI z=;Tzdm(}y88`$j-usabx#Y6mw_kh++)G2Pd+ryBt7c!n=$k;D0V~66E27ZIU?*QaW zE9bKHFARGgh&|6npSmwhOBA# z$*(@0{A5qDZlYG*xo*KHKgG~NA9S$F&_SQP4i2cct%37$Fg`li{CNfsT>}rx4XkGc ztY0hd z#p7hES@tnxI0*ii1sR^Ia(`@7vd>vYS*%T2yv5+VB=Ei3z_uUQmbOYSqo-r{FB^L8 zmDg*B+@XeC`y$f;L9UAo8`>P(83#>}4H+^N2N|w4u-`6V|EO_)wQ&CjhAchvvRs;d z)WE4fIL$QbvRT;8X$A&+Bme#$gVpn%HTcT~{$4W9XT$li*mqhRFa*2)u7KUVWXLoC znO-;YEDCvEV#u`{GVK|3`+%XBZG&FkA&)e^n~}#r!}iX=_8v5BW-PWc9-0W9YLtmm z%ESkT+#4cy^)u7^VLkG;FeJO$kbPI=-Xq9Fx$oB zwtC)WLFcgJKQTTU3%l2_$GX^KBSYrF$h?ukd)GYgXBM?Gu-*l%-CpTOJCmDRzhOg>7rsF;gJ2=?D zZEC>nY(u8!;piqqFYWSr>0E6)1NW^0?qdv_XpBw#Xz1iT^l(0O0dygBF|x-#LfqF8 z#;u`Jak#)MkXEXR5Z0N2Goz;VQ1EAZ-z+qa1!?IHi-EM_$ zR~qH5E^__Z(BG7xzuOF%+R`U~$-tyd9+Pjg0}R_4j_q7c-ZAdNJKmE~J1R!Il6G_t z8~L{*|2@G}uRPCRuk8JXJ!~25 z;aJ0t%fa{^gSQUw_NGz4)Cd2PKPBxTs@YVxwa)WZH~SYuwsBsz3ip+fcSrJGYGB?1 ztl7odl|x?|{4wIp=W82Ai6t>FxK#fbCMlPOii@u7a+Hu7S=mY;7dA zR%`Ec{I?1Ce{GbZ;X(dB$QIk6_>M}VV_ze^VI=1!8u+xxAN>f3kS1C$S6bmRe>;-%86%~6y?7g>p?byY7?fv@w-kH70aqg`7 zzUTQr|KZt5$jR(?y=$#^?>*(r*--Uip<`QmYftM)>o0uNjF^q!sx-!xKgYUz$W>V| zOWZTZY?`OIzkxFMf0GN17)Kj0HAc)nCV#}4__OFrwud}_u% zr6iyC#^-aNYCinu2OVe~X`N`DX_bjyg_c9BN~=c8rRCA8(`wLa(hOxST5X#Bt4pg# zE1>b|#Ne$1-a6o|1Kv8|tpnaV;H?ARI^eAX-a6o|1Kv8|twZcWViyv-kl2O9E+lp# zu?vY^NbEvl8xwX1O(C%@N+GceiCswSLSh$&{~GYMA*~UuF|8Rt@rgIYY(&gP#B4;& zM#OAFOhZ=8&!zlaO8ipdmlD5}_@%@zC4MRKONno6+7k#$iC@ZorNl2Kekt)wiC;>z zQgSaPekl=3iC;>DQgSZ^M=3Z;!BGm1QlgfEqZF-5(W*53SH{=Yv^KQ1w05-iv<|e6 zv`)0nv@W!+v~INSv>vpcv|hB{v_3SR_QCy{rQC~QeYeF2ZOL;Kd5$8_QRF#_JV%k| zDDoUdo}?e%cu9=W>1ww+vsafM&HA`NpPE(hi*otEwo!`x6)>coEw3&2|15o47Is1dmgkz_Jh^e#2hw) zIqW!*U*lc*)vUUQ(8JtmoL)_S-T2;#f7#pV|mUB6Q*P>hqHEjl}Cmx%FDS*4M({{)a>D)2Gd@bhtk-?5J0?Si`oS=?PkZrS~N9Ca8OyOCG+Yd*H+bh+THkk^XfY`NgQ z6`Z$m+TKX)r1NF=l)Mb_D|4;668EtTNWpQFz)>F@_G!;Mg|A2B>uLDf{8w?Dz<=0m zMlGYYp=}oao`p6wij&`0yOqed)9#?%NxO@7H*Hi(9`}em3c%BXJl+yo7VgrL&vp}j z7~}kKtk9$gJ@~W${_%OJDHxvwW3(oY?s+h-Y^z5r24e|rpOpP?c3j#%-b?oLY`9!4 z#+cSeIWPHKNXLbA(=P(d#8qGjq}TKVmE$ zl!=}wu|6f{0m27k@xcys@ZK~}`D?tk!p&p#S;p^9OzHbifoq_{)m(5|Zx^Qnf+qy0 z1@PH0`&{pJD&*fGd zagxr%@Z=i)aZjGZot?M!&usy0dj*SyANIfx-HDwvuiM!2tKh5#eARZG?L}@$``enN z(VFBn|9t%NvEZ@;Tt4GG=)GrI*p`Eqg9TUp9ao!$&+fx#Gg7d&7aR|F9FG=p`+AMK zC9hv|;3>~>wKygIHsPOg{PT<8sv}%Y6}W0UTsI3o?uU;xDR_nmK886yW~BILPReV; zg(nu^i4EXMtCIz>T+Q!RNwvt;&Op`rI(ZK51W!w2`ulIGuxu|(U8&(~Qfe6SE7oCL0ipog4BGY+d3GVsLj=FOIet$k*KDkQ47M!KNy+1U!F@Hy{T1T%KJN8$fw>!) zAA|?v-*5g|Kb2Ss)n{eihWYR}!Q(b~+$3@y;&SeJeX<7C@Oh*8$*=8>-!=)&7oqtL zBHt=5->b4}FI&SZ@LU;BeJyHa5;by{>)Z3;@5!+B#W=18-6LXWTY0ajK|`D%8b` z;Li58=iM-umL%)^ApW^s=)4%6UlUyX;kfuN1?y2p&KHif( z!+bghdFLl{%;$HP&uxO|KJeToC7&)S zuU#g*n1>g47k=3rzcc`=s^wqM%ry0Lm+52M0cf_Ac978JA#~}Ng0=a5$#X8Z6$HDb z?3c#?V|cvp?Yp_HpX0ra;Qd#}`)K-38IOYtg&+3B4O7(K!)QGxCHGf_FRSCrQG%E5j+gP`^=|I<6NIn##n;PHFg+r4-V2?l zikMwp%%OtwK92L8Z<6P~{&-|xe4pgs8oUExPu3el@j;Tumg9pJwAlh%7l&;_O3w3Q zvHcjEM`X_E21`WWon7A#3;iEK|5J#YR#$68-<@3F1BAz`uceWiFo8lkxxgLPkTI&q~icQFp#!Q_;xzJy&?tE0^yGXZ7il;8{5~9 z+jcH{h2XK5dsFtiSj24aVqPFHS9O@j ziCP?l1}6wUIE%_Z-rJIbtKovkbNrc`f$XOsn1nZ$3NP2h%YE=_k}qoF)qL7XVjftD zwl@hb+Ijv37deiLms9fjM)+|CeyrUxxxOAly9WfOwhq(fg5w^J<9AaqEfF;|81078 z9u)ajaru6h()aTMcN>TMR-wZxbQmtQpN#e|2~3q8rteZPT`GLTy9R^pg2(QT$M?x6 zY5umOyf)0=otVM@N{QY0z2xJGndtwa;HtIbs<-gR!nfh|@gmFtdqwliyCT=&uxF6nV}FvzcFfkkEB5 zx=s~&=8@;=Lh~olyy%eRW06D9Y?RX_p68EFmrjC*&W?xCBA@-jd{(a7E_B-m-F_Dw zj)21t#hhCQ1?tjP3ofd|#T0>QdWfmU^x49TKe(KS3BC@4uRGy6X)JjPo}Z?T5qx!W ze0A=TtVMmiu|VLS7UEvMu+g{4bNWd5Iu$-_F7Z10`(B>oDsTam*n(yUvZt9Myw?E6Kyhj_Nr&=k*NO?LC?AiW+(bU9V$be@t%s`g8D4 zI}Ymc-LCWZ5*m#{qmu>peM0O9&%TuyN#}G7+gibE2gmD?!m~%f>HRKmub=;Zm&<#u z@MHr#d1=ZRd8x=}?=YX`3m+mbkG$KpMR(NMd8x{r>#oPOi{?QIcf7RXuHWw5$=jPd z1MO)o^%o{IRf9*H^x<>&_TE=69_Z#rq11UOQ zDZFze9PLQK`viT)#~iDuvT%*rl>4wbUmn}Pg8$LMt%Cn{j{iZz2h;JvnZmP;@a*$~ zN4r`X1VfkpATjM8yylC_FsM>1Dln z4EFQ$=ykNHnTFKNLgByt@ZWpznB@I7@R&pEK>vS&+v{m@qklXHG{nul+3=#q`$vVp zo8a&3gvZ9B%Rc04bG2>R@0)#*T%QczInkTnkKprlM+Ad}pAN{B1i=Hz$1UT-o(K1D z?l0*g7ZvW*T2R0%$ldZcHAx# zn!f}Og(A0d>kPlO5Pg3Y_MI10UYopzTMw_hrD(cY_-O`ydQNCM4ozh0mJdvrh2f&rcY~ek?qddoJxgS`A=pgW&mPcy2Fv9vAYwU_o!e z^OsJ;y~!=R#{7JDJGn(G&Mv{Hf;W42&}M<{6|fy9yuS?Zw-ub(JIAcHX2&=;Zfx5c za?W)bmzV#2&(qcE4X^{Mm$-`A_m%X*?S3C%7u{TnQ~&IV~2jf6^Fg zv)*xnt6Lpc3xp11!UUGhKPaW|sY0Wp(db#hxRZ3Xb@Jwve$N#B zjtu)vJ&(rc_i9b%e0N-WfYtH}Mfy{8-lEPt|MajC&!e@5~T*HXp5L_*? zaJ>O8zdqt+jwPd`$x6HUDgjZ1=K=88xMo{4hDX`#bYp3q(&)3mE3VH+f7_YA?n>)U z>q+ZP`xhSik@l$Q^K;kdju^gZ#qq3-6%gr%12N zj;P+eUQs4IvMo~*JR>lF<}lwRJh~B&?j#?7-o*O!T={IGvnE0CtiZY(`xJt)XcyKd zb6;_IJl04XKI6%+En_kL`6?gNGkBz^gS}8~o){;Z;f)6c?=2kfmx>y)cW=KXxcoHa zGAHPUr)=Ewx$$GTy@^_H2#$vE7xm$&*)EQP;14+P-n9<=`rOVGjOO~%yP~hb{B1q@ zYMRy8M*{OFPXDQ*HfK|tABi}Fh*LnECRuT+UR1H(G|c|^C5PNwQB5}1el4(k=&F}%YOOf+SH}c8$yFGWrHb3{b2syViHs0;cgN6d%dk$Y; zr=Qo=d-x3cvU5Oo?zE}Mp)av(kwb&590t)}wr73qSXH+aSavup)ecQQ?l>L{Bk9+B z)N-yET2N1a2`{(B%TvJ@Kd)#E zEU46%UR#C8M)LnYBIjPbR+F5$(#}uOTH|9;`;*9Yddw?cAJcP4ik^d=Ui?|Oc`rmU zCj_%n`aNPt@_2FxQgj|=c)d1?%vr9q7)jkhOIV<*z~_`mEwHAR;-|Bv|h{=dXnM?Xn(it*sjkMB<( zR!d%c`)Ugl)$v#eNPyRLFAup>I{}SVZt;=uPkz5ytQWs}|HR(E>_ho@| z=19CbhNsl+6#iU@KMxc6yyNmYmsm;Te01zkE!a=^cN5+{i8fnk(%5OTCd+%#JP?gK z?LxoIJa~h^_lCoFDfp7+85^@s5&ORF_C1BzN&8ypEh+teCj9vx{@g5Lz8=PGn;DD; zlj?m69-K-$Qt;Kt@pTTE{drmMF?%9lE_=5%;C!DYYNR7I^7@WsU#-Je+sN6U)3Cn% z`u$dBn#fxfSB_18JEPGDk6kHpe#`M(e{pi%Ey91ti#5i{c;_mSYc+Cg<8po6`7?4& z#d>%KqmFr?&&|oP?TKGE3*4_c+!qQh8agfR65eecVw*Yie$oG%VgLETQZXLwjSn7Y z-z0C^`stGtZ$2R~l|`5iE-6dq<9)n4Sm?AEoxV(oxm9R*3L2g(yx18p*8CvZi$~za z*HiNU-f14D#1}v3MAzbjV4Kjbfzxe~@I)D&_$?*Rw}c;a@MCERW@@k_1$X6(lQlJ; zewDJ{PU0qc!9t!bJhTrUnkDpHf}V9!u>78a<$b}eJz3D^|3>s{<6FEQr@4B3M|kB_ zyz)y*o|A=dci`KngvYw#u|dLPN8z#HLCtF}H#Noc$dFgDyEbwG9!eU=TjQZNw7Tq{ zq?y(4F+!IE(4}4qrba1!_7c4B<#^8&Cg)S%>Grtr(KLKimJ+wxVae;))6nyDT5Ix2 zp0DhjwQZAva)EshhrPSd;#D_J{~`3Za~&rO-+X{?ZV);wMTb5y9sF@~5KIhO2`&p9 zm;0sE)^L$a3+JoDgj|;Y$v+o^bKH2I=9rED=HQD?b$o3dlB6}-E~ATCnd*4#8>0du`ZU+ z+h3PyL9E@#+g1z~H@aHXowHdyKTp)vhy3O8EG;b8=wHBRhDYzwUy_3JG_cqj)bCZp zu~3O~GJ``b(Uk;$->a=cM+d?B)xZ;pWHc zy7<7Z!EH&&`}Qm!WseQd?aDI<{v+z{*i1=qPgZQ(Kl;aYQ&-=2r^J3saMS|Udclz$ zS4Y=Gqx%EKQAY*T3Pzv@!i{^FC-E{%`2gk5XcsDzsUEHXo(%oO4O?HHzrEqRq*?mx?}YPA>Z} z@`lG3!s5&EnUdfYp_e^9-^SWQ#Ted^{%eB4=2q_=|Gi5XJ^K1}EO-AmHurv!lHZR` zZ;#pbGj@yI*!!K}yokTye$mDE2`>%AE$@(XQmt6N2MDjM!Yl6x?{0?U-&1mFCV1)u zPc7lmwE84L2g{^}(;?Wdk4dXeOJ3tVlQoV_6ZNr^`nXMaa1s8gni97Lan1L(nND7# zr^E4YNKh+f-vY7kQx0=i!C42`Ds-Ivp1_%Tq`Kp*Q7ne9%O^v89I=VIIFY(|U-)M* z{%Mqw*XhDPtMN}xgNik*ac0+r4X;&NF0B^08gN&Qf2Xm{V3T>hIF^U!`3c8WS?qP6 z=i@HVt#0nHn7;n(=g#mrmepm|b;-vs=iuuRLWg$fP}%9wGKG&>rmm#lknvig3qP!*;eFS)#ZGb@a7u4IXoqo`GSiwxajG)ctgw+UCm?U zn?2ro57uQhI4ULX*p$~MWN~O-u2>J)(|CfQ2VB^3kN1|p-^JbsVwF~#D(gUXbraq{ z7w=CF@gxI zTNhS#InAYSKObakV$a8&$S)=cY?U3hMJd>p!HLzp-=Yz~d{q}tdB$#d_n4jU;CUmW zw!h*pzozXFb#O3saGj{VQ>eXFF&}$x*_oOHQ?Q@mxbxU6ycpemW#@^`b${dg^nUI_ zhBlILEnw!_lo)dbw|4d2c&m9!vS+$cpGU|1=Fbt>Y-DrMrC`g})xRDcCHD=EOu^L| zuO^MN2jbP$w2dkIUL!cE1|N2e-YO`bxrgxV2sk|{D=*{K&zq0Bd2>@r>@|YV=nNgl zm0(L6)9hZ(vtn^Aw$1a8xbgk;l(=~ZBi%-2?U%=V<$!^WpWM4gPHPNs|b zWF^Yonv%xd#&){`Ob$=r)cw8j7LBAHwKfvcXK3PZ%g6oMZwjBj;m)= zaGx)HF$Q0>Z<9P0eM{Yq7CapRPe%wp9gLrT68txE{J)lhbs;sEG?(8Y2fntIi=r4g2VN2xJ~$I96owm zFAUjj#TXIgyMZ5o|>{oeu1s<=R%~$t?_0}dR ziE-@5HCr24J?~73J44jmf2g^95%&S-m-d27dk&0^BF5$SDY4h1Z&H07jlP>`)gRL5 zpe_;fVK3_PmlXZlg6T&$c6y%pRk&S>KQ5#FmV&u^jB8(OcK@ldT_4W8zwEV0uOPS& z&h8KO;=c2gyb9cFzF!B8*_M0AMC`gQcBWwz+wbG&dh>1D@Vf3@i;BRPGzZ%A=Jpli z$7aTlGes?KM5j+hEsm!abHS7p&oDhF*6N2*M~Bmf#q#xf)d}8z{8s3;|^+nD!U>*r(iDJ+)8Sca*5LyQs6fU9Ej1 z#_A*S*BfFC>CG7OfbjeAXt-Elt{Gyk64dRRd@gPR^)Nwl%qP;N!t{uy71bW)W2Ov_2&!tG2G6l{x6_iL_3FeF70C4kQBUY z1xGcUuG2+6x4V2^5Os7i{9jBPM(phKGyXcFT~)Sh?VU5-Ip4=Sgo2^?-o_wbD=w|z zN?sk4lEZv3+H=kQRzR<|*?kgr9>|V}qWfUV-1`abE*SqFE5`XBlh?EB@!k@V|5lg( z@q)kVj=#l1$FAUeOw8#&fObkszAFW$+Z?7o!qraGUr=ZnEw9O))JeSY@;7a1! zW;D~&KAYM;_1QjixdV4i3}huXgwHS@$GrjV$axm~`}>+qBmZ9WTz*>v{6+4#wMTfJ zesXZ9nCs5N*GC8*Zgo7&5`MZ0KOG@-=?11t1P8f}gIc#H`=t-#(V`UHItrg1jn9q~ zx!mG%`9tV-DwVB_J<^li0y zw$PzFf74pli-U!e4gExDfTi~cSMZgRRjlhXGMg4Z5I7$SJ>2e0R)X#H|Z zyt`spz0Nl}oo5P7jzg0-Q~K>BI657E&ZiwKd@vawJRHO1`MbgK_hCxh#{_?N&T>l% zM>h*ET!R;;3Eum|`8LpueQ%Ntxa`F6LPcC*&psZ~)CYgb(55N6_KVN0v zY+w7=?fl>2LYEWJWwhY_40u0}_OFzF-{!TXT&JGFFuOp8}Y(t z>$-iPK?CdGZ+~XX3##Fpf@^Qq8kLmllFvI7A3!Mg_Q|@KSIyFNldtSlL z7;dlAmEbm=&Vg^kZNIn8zS~bPvkH2Yb&#!vUM08eHIu)l73Jpd1hBgRnguTkzg>&p zzKvn=9A4o#oFnu-6K&6>eg07LalPsDHW*u20&eRau3w|`?a}jWY&}q&`Q7ebuy;t? zDy$**4mRd_70sCEZADhhY;UZU1+6((-If(XdsYqhGyE-`Qu^n?^U1QB88PvvS!vR%96E_rKXy zwy^mUVGF1Z7~k+!#MZ{`6Qh$$l!H*!bM}j<0X#A zM`Ce(%~%~3rr>Ro^4inF#}9{WGj62pdp15zI)*$OkG78GVpwgayqH{UY#wo0at(~3 z23k`Cxkps^!t=}S!SyIqmV)Wk6plK9DSK}A{MnlGAyMmtsP(Hwo*72kp0PeXR-5nN zNx{-BC5MlMCilAv=$EqZh!~#i9A^v8GvwG7&cBYu_4_sqe>&O3d+> zWJ-eJDR{q6;ix?3A>-CObdjrv@hScOnbPkR`b}CdT|mDVy1pl;^j+zviuE6G9I618 zf?&5s6~6Yb8RmTEGCLNZ71Jl%FL$_grT?AnZ`*Io-~SQ*9E^4~V|cu7HZIIg$zwcN zJr5Sgt{ofJ8X&dxLpOgB=81+lpPZ;Xe9DRK9599c};{55MIbJJxN9Qr=( z?+VDZJwEL&e7GMzT$U1dZ{lXxzwg_0DN4!Z;1tbPrNrBrHIEy9i)Z}ivEs6Gz%yd} z`+GLbDG?Xk`z`vP$o@xW)d&A&omAPr;b6OGs8;Z!h@b1?cS_0mxU9YnwRy_0pGWUD zejlBJ>p=2SYwDV;PVBr>E6!C-rpHYw{roNPSBvnkKMjoDzY({FGYHNB-?=m!gZspC z%&v_?z?pr1*p6!~#|-@EgbLX6!ApYT+mh$GA^7n#QM12Ovx8G&PZu8E9}nMgS+f6& ziPsV4PIH_^ZUV5|a(I7Y^=1FNF14JhI?Xo-&*eGKmGQS1$Fz^Q<^AlA)1w#@jCb!h z7oKw^BRJPIBG^J3m6CfQ7?bMIYT{ink6fB52`0q)^!eL((>Rv5_iGM$7tpSEUNNk; zpRcvE$jSWNm*1ZWH(ci2wMA#u?C<}13}W~GRIE7dI3!wa+7VX8@s%B0b>XOLh&zIs zxq1s2lJYj6PLJi5?bFg&ZeEWnt`077ntI^=8fSD=SOx;FwWh>gFT6MlR^~}ue9o=V z>Tds44S>+IdwcPQ;zF{j;v zZ~F<{l^pJaQut`mE_s~zgR$T?^35J=Oe3pHJ40_dM|VSKf)~ik^AhQ7U-71^z2O31 z#^GC+g703(dDLUYd}Q%$4t#}i#bU=_-;I&l-UG2QrSIJZE_;Uqb-n(*SYEz9&v5nk z7}%0(!*DhJBzn!`;#c8z1wMNswx6$?>Wtji3SZB`*B__&XH!a^?+A|UT_VQO-hziG z7=`RgS(VF^eO-?+rYpXFN_g{Dy!i!~ZQQlZxbS1x>2MgmPdx}ui(&Vi*%-M_%wxl- ziSJ_i*nZ}_)12?-h`b(mdHo9=Oe??n_l8H_j;;&Z*(keH(s(*QhSTe2Pc!{maNO5% z{4TMw*BAaeXHHm0w)(L(Mj5N$$-z&eFI#;~=5PKGoSvG+>6H>|pJ2J*ll6vz2ZvABL;)3T-TQA=FW9Upx~+@xBr=4ySX@Y!wfU*(aC_Yg!rh$8oJ z{Ld8Q+@FkdhYLO)b$rx}+yP~7_YC&@MQNRlh=-0@ttok zrR3E{@ZH_3_S5G}+{_?)wC(!?i&cio}9Jae0ipjy&Ab#`D1hCadbT>eIv>zQ*?w@>~X8}0( z6TZoC-Jv(W`HVabr_axSe~CO_bGZ%{-W(X_%ANEn8V--~?0tQl(3r+lo3|1e*CVu6-RG?ff=N)YyQK&sxFwlw95veBST)EJ(>` zyr`2qT%9ZtI(H3mRSG_c@!{t$TRTqyvmXQb@2>T46~ic>l93L$vJ!8@H$s^^G^QO^S0F$6NIK=&Q|A>+$>s=lh{CY<`@vYXoPc~P4KYrawD!D48+UhV)=RgY;IX9 zJhKeXG*03DWUv*vyzEsPr;51@567`rRd#4=zX`-d!QI^Mls%OP0@L4O3a$=lgF^X8HX;7f$Sfwg;i@0iu3JQ$NQF&*b8n2T|dj7{A_g_6!Z18$WfqTh6xm*PDdr z3yOkg!JR$U`p=v)&)D@0yJ|RueLsoC@f@}Z<8ZA)aCp1pFzi?Krwfa9kaZAA;ir3Aq{8qg`&D zg+Fh?pZ^l$$u=!H~0m#aLtg*eqiXTkGP~rw@x|cNDe~+V6?> zYg2OhI_8V)YgjetpO=Hr9KSwa`)=Da@LL^>e(bT|`Ee{_Ay|K&sJk)L-R;5?HSxqF z^quqQKgTuisZ!^udc^j1W&HSSJBK)aB6f;`x}qODBW_y1B|NeQkDQRg-Je3^t3svh z+)e`+EDIW^a}+cc_*y!AnWK{D%je+e%oKbriEHD&ZP`9O*zsfD*^jz14*k6#;UDv5 zOQs~am9~|37wuW0RV}o73>?FR|9CQV&_0I4&p&Ix;d~NY7|X-gVh;6Rr%CcT2*cf8 zaM#LlcNP7{=RV8P^0m)cw0izk=zj?M_Y~MyXJKzB^m!g$4uW5+51)_4w(Sl$y@&R= zsE@JK$BhEJ-Ir^vfUl=8W+(Mug)uva_L0!74!Yd~zCJPj%qKR+*gZ&-nHPqM{8we= zf4jixpQc(6%wM&eh*KQKsT;IQ(fCJlNLnw}Cx>k!b~X61C%F~`D;C!skX%29qHkBB z-3xFt9?VH|fE{yAgcsx8Z~q+k>IP2;Tvd1BnzQC~ypfdGefZ*F>M5x%Cs9w6Y4!<1 zd)s#~dVfdSMQhgP{8fvP+e|P+Xt**{*4G|~KUZFl{_VHXJ?RC(Zah`1Jciki|5rH7?Klp$ z_aKfD8o!9f?-DONZ$JO#h4HM$EK=oQiQu^jIW=`WPX>>9!ejUI)#XIUg}=W|CA4=iftm8R)X_w29uyVE5NVpZFHNXTd(z zD+tyIZ5xFglm%arN1Ow8VY}92v{W>((&LX-e>;=)Zne|Hle#4$RW#*H}M(%*YM7v9W65m_@>?FX7eW z1kMHyXT#f*b1cVS2cmuUajU=1krP&T4SZoMm5$*(OT8UerknRlq+$1<@`~j7v~X7r z%N8F(to*EfYty@pC70r}f8Nt&@0h9ZSXWk?r;8j5U5@7po>ye?yr1yOQFtX!;BUAK zf4g=U#V{BLhQCsXf%{?UBWYf+wZt((zn9T(6TD>a=hp-_zD^MSY=l3r5P0f4JWX6q zgbz1AhERZDQbUP zrX*-h4mNK1&DXH6-x?i~yX$2hG--*w=$uH&_9EN4F+MC+CyI96zO44Pe+;-!a#p7mVZr_d@s zMqA#E!t)hn!GIKhKP~#scYPl!IB5bWBU1XkCzg*NcWiFHSnzNxJiO_A7u9G5&r4x> zS?Im8;C|tOSMk6@#Lea+>c`&eVBVg;>~)cEEtl^Eax$I$R#AJ=j9L&ZUGahA+y2IT z!T4U{@Vzf$)NnDLPT^*1%tO9zj0u}jiatwTV?IdDeI~eD1g^yn+i612rsz2%mb*Wv z6pir~eROcBsGr@bpI6B%iM!nJteCAfgWy}i-2#ViB;$hV=f_fh47Xgyg*@6_!aK*~ zomYe}Uc(pP2u*4_P3FgP|6ko_PWnmkI}hyh9sZ^ClRYPR-`iZWLwNJT(3_dyzk-`N zuJ3DvcFoZ450PJWmtXOf$-dc_F)?Rmg>Ht|&j+)^xTUNkg5cnkyq*!7oQNhlk0qb; z$#b~A5SqP?W;Ma(=aB3=o8|aepMvQ}!Sw|p*Q?vzFSsm%%en${uEX3w@HI1wuT3#* z-p}^loA(7@C&AbCqP`}u->E5m774EQcU(0lrzBt6vG19&ezQGWjW@yCwNd{&yFOxL z-TCn7&o%q=Vs`GW^7`as^Ec45jo@uY7H{XJU}+uG#V{F`YN0MQg1KUB+@2{3juPWa zb;gt$v{!{6>`6ae1h@M+Zm&qe+&zW&{(_IaUB5P77Q=s%ZZ?nJoD#RC(BWU`FhuZJ zHRO?VSti4tzoSvo6qPe62egsj)Wqw?1@(eoY`6GyyfE?Cl;fzTgP5aeJA&+8wH?Z?xu-0QnW%nxT# zKbvW12!Fh7bEVLzW~fo+;0}R(4~Kn=;5*Op-6n;X(J49IE&8qI`h5^w*;;r$tX38Z zf0W{n-D5F5=ceIy5i>W8Sr+t;<>F)7dE%!8PZJzZQykBP33c{ytA;%129Jx_IWFHD zg@*5-;jJlk^o8*I{`h?e`6P|oHm))UuYXD8w7bjc1%bJ$!#r2yoDow=lEJy z)-m$ar=IqGDf^0=8yC7{Drid0{3W# z`)lEy_wddgLgO}QoG&m}ahMk{KG>Sv&Z%c_cAl&@tq#rJQ?oI~i}!Xx&@E^vu#a-s z8wd=Q9fs?L)_G`ss)%dz!P6q|w&Yzz%q0KRCT6L_>&F(aW5e(mfoE0_(>U>)zcvaYfOGuiI@dk z$@^7|y%*!b!VTm^(*FKcpZ}+L>=W9@w9jbo({|84pnXXDi1s<{eW6D?^yr_JkM--1 zUu-SWCKy-gCV@HBS@@#{{p+&L!2QZHsZ@aoJqh39XX$-AUvx zX+H}s+M~rpa3|$!?|+#j@@-4LPk|?CEfZA*_va5v#&jv(x}0{Fn8O~+lmySG1IP3_A1-~WF zYaP(#os?Xbr{LLBc;O3t@D*)M%D$fwGrNBNdCkJksVrVz`Oaj_wc+t#a<%=9!-<=uU$-zO_Xv}-*C^69QhKPX%O6uP zElL>=-W2QUderMu_RGFc$>t4PADkI_%I=o3yD99Q13_>C_>#tsA>iB1VcaNk>>B2n zA3P@N=?Us-DV|8;^=tglMCe%`Jx>Rh8XGbPMLqz2xcS<#@#wG=&V~vdJE7wRvyych z{lAg z)9Yh?xeGkmoRgg&%W&&%o4uo%wOCge9_$1M*Ec5mynOm?H-Sfc~+-qxH>Hg z?|I4u4}vjC$3ETzos!4J0>*;-1itESe7aKT_$@k45;`_U$G$0fJt^?^c6gsm(dxDo zjdONJV}j=ks>1C_#+esqC3Dov#XL-CXrIRZtyurgqjpD;XSP57cV1e#_yRF^Tu+_6 znv(0A0&`D?`N0$}#;5SV1l{Z$x%YBN5??BZZ6x#J7}{9=Hvzv*3bqRm{09#_9>d_r zCwouf#1sr4&q~&#hs*8hSifFVtA`I#IQt~!wf$1?yp$5}8-bOp=llzTFH>T^meTL% zDf@ks^4d?}$sPke=k`Rp1>|TP`OV*h9NpJq*M*`pdOxJ}|8Jr9cj&#l7)$Cimb{me z>z}id_3q|4T$ZBE!(y(vk$i8aeMDSUgSp(LY1f^8P09CD_Rn4q8D}=mo)V6;(R*Q{ z`%5PWtH9~UTI1MX*Q?@qtvowyRpXh_rA8DyE4{Pc|y-`hsI+2Z2`=WqPGO}lo z?G$ssExcM5)5gcJu_f>5Wd47I`=4kRrsQ*Oay%Xk72GBv`@+R@>suK{{rwH zC&qw6#(;)J(VE3#+UCzmMeo$KbJO(EVpL|Alr-3J=eVJnbB) zd38`q+}l(7ZA+fnHDI2|(BH}7I5|0(4gY=|_G1$-2MghT1MPg;a8aKfU47o05b0MP7?T9|L!&b8PNgaK8e}44& z93MEoykGtIT8^*Y!h^r!zu#z+$UEB)w!iry&mB7qiTTC9ep2X{;`VFti`9*fYx&u> z7@vGDw9JpNt>0g0+1_dSB3c?Yzj;4K=K!k&`=)3%Gv&3{Qatj#z+BVuxkzAc=PI%$l9OjiNadYpg@JQs%OlX(t4)fun@7AvGZ&Gj{7K`gW zZs#d36~14B?|(??^8qoJJew&AeoonM2^`wE>@ip^Sf)Kg4sAwWJ-~1d9==NQ z&7XK`BRu*3J&$&7wG^Jp99Iov{d@g$=|7+yo5I&bG49`uXYZx05*|4*%y0JUX2kZ# zM262F_f~VU?K;_Byi@WF@~|BJ<}rrj@$bp!PH z`?~PKQhd;f{XGAM!5{0`+-m2gFBkQALg<4a*e3KVak-8cxz-`qUNOwRMlJ5&Vtjl) zQxZHyOwXTT_8i(V)}w->VmLZY=(Y{rZWO%#4ex_uIDI@jPPtvwN%xQ+`vhuRxpfTd zWIw@0UAP#Y65~6e-!gi?kNDni#)Y2`x`pvA^6ZtPQ~G{G=*QDa_{V3Ah_SLKW96%Y z>k_ywPl@?XOh2!?y&q$bl>HucxmupK`LRDYTpQaHy{81rUETXWqrWs?+qQc!DW(4p zQ*eDKa&1Yjd#ChylknVjJomZd-uuZgXF%B?W89Yo&)`X`&3GA4S@=9R*00?M^Pb?O5`0vqJtp{m7`{J~{)s+0(avV%%&Dj+i*3Bw`lktbGk8|!8TFDy{O@L1z(TC*B^rGD)5{`D-xI+I?T-kPp#qU48cWJxVXjDu+PW7TRyLV zw>wADtwr1hE^dwH$$WHme9ZhJxo%#_@Qfibeng+{)h8H@zQ(n$Cw>gK1JU;&S^=?Z z@*9u67DxAnoli66UvzBOC_J{0j_2)DHqG-t2^}6shkC~(j{{ZFpc?H;!DThL>;_kU zelSel&-LM|(DBt&@O4~>d2-N8=x9&YUnRJF2`+~So$9%`v*FUlD9=?$Bwtp-<6R=B zTykm)A4&V=!bK-?@%dVRejMr?=3*6|32F^V-v3FsE*E^+^YQE)jg89}i&|_H$!KEQGOqoBD$A{ij%prp3Rq(u7==TcxwG=!(4No&fp6$qU zxX>pLedd!#(!69jj1$^*+NIsfng13XRfnTfM4qe3bBf@8qvO7h$n{xr{Y#8T&+{IQ z9(e4Kl$=%zp4!9H3{ltB;i)FA`rXmm+}DTy{)~(JvhZOOeE1*1Qw?~UFL*vC}=5^BQ=596wcsllb`fDt>y6)|i~K_4hd$kE?`6M?3vD2`)Rp6JKvrye4me2wQ0FslJ#neuP=z@V}0BF zx<1UON^mcjEw*jZYtifZ;W!xtZwdYnf&Z&xefxD(V>r&GZ4(+);k@S_DLnQP`qV<7 zO~QXK;=dbXczmu$g}Da7lPUTeDKYVYWR&s~XuNK6}arlmp1Pr8=E2K51m5Ds6x;(xS{&^k$ zv={s4xP31YzO0Wg>yUSL&HDRv4-NCKh12aAvSYA8c&rK>+Ex69RKfj%qbnRot%a5u zr)4*hM-`XH0b+jnH}gw3(Knw^8TzER=)1D(`_UM7@9|4Q?7f52$UobMetfD+<~A=r z72Dsxeu2wTrBjDty%lKQ*8=p^XrES8{pZBfL?F zsx@~@K5y_ZJokpk_Z*jRxyv`6lbsQ|L~xn!xZGXvQ3XDFO}H4Af@u&MnQy$GB4vZ1DcUrneJwDb>M$QA^gjaq?*p^tZJQtS z?Pt5MrZTu|(dyavKa-Cy1~9gdPr?3<;L9rhSAlzz(|?iBFb55%5Yy%>zg1k<@aGE| zbKuQ%j{Bzw&ZfmMdv0xh9w2mj8=b1$^Uq^(zh4htdmb*6;#Gsc*~Bvq{pQyX7LS*L zJo-%<8#X!(H;7s&uv!rM9*Mr+JN_+hHV=*9e?x4%v)7}w+Em6no^c2;TgUjV9!{{$ z9Ahlk3s*5kJZrOl>lZG3c{Z@Kpj|vqk)wF8*kt zQBySPDsrwt&X?met4Ys4KZe^!`0NwfXSBt{PFi=E#tpwpKL7AG_3^%_k5<&jGLg?T zm(Tk`i&|*$oZzXY@#J{$K6L5uIRXX24+2kT@YK03IggF#@@9&k#tLq0!tDH=omI_V{a>+xUC1^Qc`5cv_4*JMqE6g4-gvtvWB6 zzy5Gr?djz8OdWU_Dg5&;{+TPdtqr%`gkHy@*A;MEgS`CO%6nln+>WJ{({`urLEDRF zJ}wma2ZR4zF-Lz1CtuTU5Lym%eV;CPYYuOfj!ovK6up`Y-s-|zslYo7ymx>{)oZO{ zeGG9=%6=P#7In~~K}w%J1kQcHc{RKwjXf>krI=Pin<#WX4xJxP!TYE1@wezz1m2`N zSQFNPU7h3}5TQ#My7Uyf)I*o2gck-nFWf1-(2`t73a;kD)vKc4-mc$kggyo6GeO`j z0PhqLb0INT3GR=F`zM8V+!euHaGVdPokndZt!>}4xqO`h+*!xul$exeOe@$)>v*8%WVp0eMMBNg_~b{58!_ji<5o5dY7*=!JmTjvM_cK>?JsF1LuzmkJ%Zp zRf3mw@Ujxj{ut5cZQyyF6~|)(f}JAYHspH_9!&Dk33%{C+E$_U2WXvhZ}PEeag^)& z(Rjhe$!tu9>lZxmi@?+tOa-FfCa&KT1Q$oa#ZtjV6Ca0}}(++UjPH@^3PLHAv zleF56Ivh$HBWk=GJk5iHq_Hpq2Rj7TJHdLj;O1|*86dDW1M9v*x9(u+K`Ry9eGYd! zMg4qA{nWTVne$W7<5l5>gLZjg?xJr+uJ@Ab-6Gdarf+bJ^N^p91GiNnn_SxNf{P-! zSSGmW2@kz!e>+UpW%iiy3YZ26o_501m-xv1V0VIMZyoWGJ#+C0;fLPDY%h2`)p!&< zRECE|B2V679{g6U=by_3e^ueGI&Hh~_Aq=soVG(?$^jEpBpwghe0r+jpbs46vR~3% zabV~ddz$>R;+*4>Iqu{*9xZr04IVqpPxk7c=-T#~EH9xi6US6Lnk@4u2FJ zRfD6ALbnoh8z^x81@JGdk=UY^55h^$hD+T|B@ZaE@H~*|3J=xAL)C9c#<>~Y=7`*fk^37lEPlOe40jZ{ ze?#s+i~RD*Z%3@pY#mk#EW^Q4c|mdxb?EbHG)g+gZ-_>XX-#Q6iJLtK`|~cQzuh(P zspHlx;`6kh`@(IdXOq_imF@i+v3~vB9`(!Tbqd^d!TnQg-)v0vLDgC4b`H87C%EDc z(BO|)zi~`V`C*m#JpH|L%lNI;O?0nZ5Hu6m?emjv5Pqv?V;0^wu6_UZJ;VQ7bFRnE zYmF0mol9P|j!)*gKRWy@YOx4?PjvNWn%U-Kx8>)n1y>{C>dch=o+U@`8Shi;+m32m z(AvUd_L$;hT76t7I4B7@;Jt>!lk;prE=vSI=fTe}Vk{iZSoo00a}HX#HKLBsj?J7w>Z@dhRW>9>{Air0Drd%4-)2&M$)VH&gceN$@fT zUJgj{YuCS%*I;9)kLB!_w5DDf`p!nZ*(>)ztE9Q46(eC9QEcA1i_3-CBgo*`LrM5>knEb ze$J!Sp*5s6rB>xfH0Rv| zjwi#C9Xl7yd9+o6i{0U3r_f-pNQ2;ZG0v3Zi<%Bsc1**N0aXS*I>J}d9Crn;T_iMU ziU!Mt2Gz;sWRc4Ra(PZ*9S_#eg%7)+OO+Fn*K51M{cw@PmE=(JT=IUi*l(`T`WLjm zROGM+In-~Jto4#mkJYn}6I$1Ro0_y~0`FDeeO_?h49>R-OnZVUZ$xsQJ>ae*+$DK_ z1RRW{?J2z5geP4Ta`*QmE^g!-tNv))i?}xmALNtgK*7_V5l{1`5w{jy`5KPisbzJ{ zo4s&l^iKF?`Su3K}jo#63mc&tK|CHZ=He0Gk|{a19K4JJE& z@W+Du7;YJus04yaVdSYn8GI*k+6%t>(Pj(Z&4%x{g^m-+_z$6f5&EAY^1X(9r;GX+ zMZA}VAM2nIS4VwR;;;!s07c5mN$g797+c(_4ez81_+3LSn! zhmVD?>VY>{o4i)z6MH!KmaO{(bZ`AY@_x~$M+?sIw6 zzbQH9jd1X9q3t+yEvHQom>PlU58~!IJQmT;%bD)8hXQo3n&YJOw4#U*y)9+-iuJce|MP2+!?_=Z+S5 z_5)A3(EqOt@9`q0)sbzMqs^(N<6XowCb@$&=q0qgiPwt6{od zDxR};Gp}z6|E5uJf$()Ra()%AlGb6Z;i^5YqtJPGbpBa*elI+~2e@*boeY~lM}H%j zq9@JUQ@exUA(8(~a=(Sv3qN>%th*>rd!nYD>z~)H@yKK!jz*KIF>Y*M8;`CB!wn%f zL9j+>vjuH#5xf<_+f4d4T((91M$bdI*5&uL;I*xBO1nV#M@T%Zs7JO`>EpU1H z*nV8NhS;`ZXaKXz_#0cl`_0eAHupX*@@h_ArwBf7fsa)wefAPMj75h}MLx61Ow<&3HD|Z4A7cEbUrk|RZI|_yyqB(` zFJrD_CfQ39@$=h)vlei6g6r4%v(5K=rR(<*p>@D{w?73pbKvC$+V$w+{qOs?7Qr5W!>iLqf%#)ivdxI8D9 zgt&s>XUAuDP8Pc*d_E*RcqjQbI5c^@oNHVeXCm&!Vcc55fr5|S;p22M_l$S`DFfff zLdy(V-Y#NaLPfX z2WQvOo`~)5^}4|EHc8ZIH@tG4@WEdA;55Pa9`OCS^R^$GOn=+%fscD>x!)zPQ!B&u z%L4EDj_cNf&nk==BLo-o;o(}^+oJFDT;Gqz#u?Am{Lm*eC;ct*x{sXhr+p^+KiBoY zx4^dmY}e3k6rAn_r{9Ub&vAXfBD9)}Ru_r!Zwek;A}}ok&(*YsHz#ZL0Qq(oI#xl) zzXaaR4(|!VcXsDo?&9R}{A{=H3xcOf@N|U8XA!wvMf*XF1?9WOfHv+uS|L8~HStNDFpET*ro3=!+o zP7}E=ChyB>Q-oeQ==G`KbPAldc6>xRMqh2cbvk^U;WW8N=xOgZI~v@%{JrgIn_n|l z19SA5gNB|bA`>TR9zWB?ILXz1*a=^Jf41*+BKIZaeHraE$6d5$j$sO0s>-o`DHPqvTz_&zW6V_9&7(5xz& zjRSM`TyA_A!js|a6vx>WQ4#?t+u)aI!*RKbE-1x!99po-ho?(zwtQ2hOkbV6>(%Jv~1Axfi^iBY1ll z-qwknj|t;82woI9S0QJskuL?O%i!~3+6a;N4D#+!DY=IBb~SXY;AI2Yj&{7f9rKLO z-8^G%Ubsos*@)m#p;sQEJ$oVmHK3vq@ zKCbTSe4o6&tAQ48$M`nBY<`(b+%+`g>@tz_d~&{DXt^(1?kTuF2%gWSeI#PfA?9iq z`%A&gDqe5E71aDK$+>a`@b3(6Vf}TRNnrN0;qSrB>2tB5uM;`kn&4(+%Wam&?3of68%R7a~_H`b6Mewm0 zK8_MRuY%*vw0bdIUZ(>cSB-hyuhoGWt}X4mjSO~9tQS9DFSP29R>f|AKc3ik^Y}9M zUQV;z2aDXFBKNZe{?%YVo0ix5pX)n6W{h!K&JbGWqh-x;!G*k2>t0%Ou57gA_dWTYy*rA#EP}xz$Au2#7QyctxIK%uKUlnP4U50; z)*|)98Ql_xyS8A}1MlD}!;uv-{!M zZbG9KXtaqKk&~l9-q${cdDS9ZEwrhPHfN;de~94j!H~PW;4{I&TJk@gw!hG3RH#jH z`*Txb4-ns_YtyaI^$L%iu`i-x>J#a?$q;*Y|d(h40(?wJk%x_17gIzZ?c% zr_weFf6WU0#r!E^@8@FQDqf%NUO!lHwg%2#0(U+*E9yFg&2u?2{653e;4{IOjFXkf zqYkYKzO2HCc|WtqP~o8=c&M$&c^&zlLc3RBo)%)x3+7TA=D|3h`xE~i!F3M!9v1!X z>$vz`__H4Vd`j%QkK6YK;g9|C$BSa$z1_Y;1RsaP#mTg-~Jr$RM&4CaO@*EI|4>dqTML+K9s!kZb|laLt-_iHKlzEpSfVE zPs@XkJowxWpJhKpZaEQ?{Ws;hl6hqt6et>g3jlmJff6IHJf$ zr$^E01)={s^v`!VB9$t1ngEVHLM&xLH^F5MVl@zXjL*vBa^d~qX!$T6s7-R!!>3eM zWVx6e=F;ZT=F?`==Fk?<7Sa~cmeA~++KGbequ}{OT9Lq5o`rFW@N#{;oJ*0#=R>Q1 zKCy{^b61qb`uFFq$A$ezpM*P9aF`E=9ogUdx6Rjz^*`3}|2iDm7!W@;IDq_@IS#%R z8XtkimkEB>!_5h_o-V$xGe35Xaq%A&`i(%ph9@V_KXa+2sUqjvt57?`#H458)lP|H=Tb0126e%>gw7(*LJyFhSJ2p1bf9@W7x zAPYxF!S{iV@1F%%$HLVK#7G){`i1?M1@HDruC>aXH913Y)IST`t>kAjSjF*bUT;K6=pf`Wn$6*^P@;=DrT_*S+5APFbd(vJP9%zII z?iboL1nZB2mmF3~wGU6`>^S&7T8xJ=(r@@^<$L{3R!{zmg;JGn8cM;ew1luEm zub!^o-HwvC^gQv~JFrNK6;fj82YzE9LF?coKa_V%wrt?`&6AnKWb{< z`F(4B#kzDuy}DIKF}QF`sy;G4Qu1UYQzrWm>;Y zgy;I;xnOAgIoM^;XCld~o??1|@OCeFORW@N8*4P@&q*y$KrK%rd=wyVU5(ur{)-!H z7s7kxgsT#8wICrU(b9CSiTfZ+@bC9DC)3%+nmqhRTf)^A8AB8Lm1FGuxwhiHooLVi z8hnbFw)U2|hDpx#^N?jRxD*dY&;856<+;k|naY_QFY)bsw^k58Jm0;F@X`dld<_f| z!#26^QMM36Yn*dCH~L)nh=RWoeR%-=igxyY=AVP`Rx#dLmd`r2cszb>G7!DakO zt*3Xbs7d*MtLLJi=Rxl3NG;g@DM2k%bFV@Zc`w-dOxNmq2zkl91s$-q5AQ3${VEY0 z#!oW%d4S|lO>@WvPSZZrEnJQC1kMHlR@5!g=RDP?btJxF79MsHKQD%#A1BzVDz@`U zy>5qg9Xv4$2=|4`{YxZnuEuRhIO&1o>nkTcJ@M0jh+pFuL%T1bYq;iMP+qnYT{fsLujpDgC9;lOf*O$Z#!@u7-Z`D{7tUYK4I%t>1CBZY7JN?7-$!|^ zdye&=@$q2bKYXU0@V^`UcOt%Sh-3c%zc&9TdZ)7T+Z5gzM|iBQJT4^~$T)VH`p zKV_Q?-=!@&HYd~eVU2w!^bu^)_0I*+=R(!!1j21sV5_Cvu8!a{?qr-hLU_9#yk#ps z!7IlYKKYJLS=X%d^gCB^*|GM%P|X0-K%7AgaWzQ)>DvFlBXwi(CkJ&?;{Hmo-w5nW z2`_k}5Z))3c@pn65dUvfZVL&%G{twZC;vZCJ8^Tk%pc3pws?;1OT7Modc6t3RY`H3 zN&K20E&5V6PV7ckcd(zP4r#$LeA?95Ld~FY6%2L6V!yQ@aUo zRh75am&Bj9o{Cy{!iy=@Edg(FYs&kHYT#d8mn zoI4vV`O;?`Zu(#+ef^&RmR~GQg|Fvh(iyj%wNoSO4p{ z38)EM=ZhA$wwn~xgnaixX0yYD+brew6R*D-xg&%ld0Iqf(8vC{|M2!P*!3m)-2wgf z5l=QjuG2_eEJt1JB)b1eIa*7&F9G-8M>I80$Qb?(@|Aj$P575{G+EVGL9V!a2!Dt3 z^GJ+Z3&4MPMMPd*p_gd)OC*MADeH>%@Qu7Cx^}z_zPS|ba`n#`!rNWo?IYlnK4g== z<$GKOXXT?fWfd{fC7r{s5o{qGwFO6agWn2oNrdp+<~NKfvaT)0zgHvwM4uXliRwQ& zA1%S1U0)CnwFA}+G-0-~2j?k-hkL-ocj(*ZB=7Oz(&)vGyTnx1%hFs8}R za1PFM4-qc=fXh7eZJsqR$O@wk`c73Y=D-h9->JtSbofkEJAB@y9X{XJ4xg0^?;m?N zl85mo_tm%ZaI*)xNe;%B9XCGEt)}|`{f0S)HD#|eFa1Wm)C^wg;Sd0$4nbia)A;3UoyGJbrCm{sso7?aKJr4~MH4b$=HXKrw9 zjO5q~`6a8)10y(11M$&0@Ic(T<2BHIyJ|n1)a6O2%i&%PT={#1-;v>pm;Q(RZzuBgkfxX0z*SMetOWd>w-b8<_BHEt}?X&NV_pxX* zNIA0Hjio-S>nu;q>YjcNlDc{Tbv2*%iEH76ySd=5jwjv)nm*v)$>#j-ZLWmj7RZMGvJk)wawPV;rP%Q>tT!|#NR97?^B32y;Yms#ql0p2(AVZ z|F(dC&-Gw_7+l1y^R5FI*P`uGPTnQ@9)P|bBRZK+ac7C!=!v})`6iCHcATtW6n8T9hBkfwr+&@dm7e~qL@=8-gx|A>w!Ku_ZJvH# zBYxej+T?oT&LqBQ3194t#5DfpdcbgSQ5m=`2YVmr)uf7Zc6ldgfEzonEzzSKdhCwG zu>SJU_l=%?7e>5c$H_YUSK`Hk@Zu$e=N8Iyp@*ybo8!;nPe*NjMl{%?8uTL^tOp18 zBF~C>sls>m9`81Sxw&GV?e%5HU|e|!F~api#o8ZKVGSwo#OEPCRuz%lP45g`Jy}nD zQU;$~Pw+Jf@Rhm_k$z1p@%_7Go|=JidOYFm0&upM#4HJ7=DWJX!`U zdi=51L(AC&(Iip#xf6*Fk3)ym7+>PJUL|W=Y}*O;+kyRIf;}&|ej2VVS`p4> zgR>fI;`z*gPEVrmM4c?3eb7NXHkNqgX60iqa7(S5H}Gq)CF5FDGG3DmUXtLIkBQ!` z5$6hcMR+$Y?K)wvz$vPlEfmBbr$s;+dh~P4c(A z@oTWn0dI5Bsz>6=>m;tM8(O0M6@5$ow%KO|WPF!83C{}$xa*1jt5yF+#Cx}*k6V=M z0)j{X3s5)V~@hYk?^4nx0@5qyTf3GkI+F8!U1De`Sz z^2r|#i#G{}&w;}q)t?|E*zCPP`%dfm$RRHGO30xd@g}a`ftg0`w}kOH%ssq6 zD;3_a6!`!28P^m37J%p&kg-|*P_>>l8;HJUt$r#f!#mYS8#IF$@q z27Eeqz6aYv;*oZU@fX6^UCP(yNWX>?b>>cr;ZpG3t6cV95T%+oEO@6A$+dZqYmz%P;scv|?>g!OaY2381-Y3IgcGY9VVl&=M&$OU_%qwJnCEcH!5x>U0SNWX_ePmoT zZY2M3s|_CTu5wRbIvKaRj3!w8OK#jyceB=ThA&mDoU<=h3|FX-WUH2RNQ zLu8=;ZHA17Yxh}SHR^lh=*b9^%eZGQmR@S~gk^T2G?GeX7G(9_-Tz_BVn35yIzf%4a+9c|P*XOwdU_dnt1S zp6HH0Ik-|2zGK}oIQ!_0cdqfwlJa<8zchSv`(jGnr>)u6$UJv;UJm!>x|nL-K79 zAs)kFF*^hEHH3$E!Na4TcpW|Q{vaIPoWRkuM8Cp7zgb16frmJrR)B}o&|W6T*AI?Q za{WE{j=#)VKp!iR}cO~`tBC=UDRSH@zw+CtvN*FYS35y90ccaxxEk0|BBX* z=+y=M)xNJ{O)EOuJR5#eq>CHt$@{OGchr0GbgC5G8RVA!cO45amGDXP0*uy$h#lwa zV!Y-vk5?`yo?ZzZs~~1vp9SdiBu_5)5e*(x4Vrqee&fMfP4Pr)MV_8C--D+e;$;D| z9hVKhWZMPJDy|%dSAqrxcVUgf`_9SkeNulP!Uw;5aE>J&>56za5x!3c-^)EYbVm*{ z*4t+1Rd!A#SFtXKw?!|@(_V|G+PW8@N!-2z(Bw?SjjOr(;rV@eCNAj5`9Q|Zk-!z6 z+lSHYUXa3I#Fe{Q?TTL~SHsiKBZQY#;N@3RlOIEePtoe4-zu87V@NX8hG1m7p&NmX-^U!2xbDG!&&`zs&ZcJRb~PxFcLeJ1j` zh49@_`TmXg_F-r>fsBdC_#{(ZtPcxD#(Vzn@XSiDj?K}#`L?<1%)?2k}u4_-KK~xBhL;sf%l>@(s-wAij+o(x>_TOdPuv zO>|up>BH7d4jFXE{w3HS=ZU)5_axB|pP;}W=jv3B*WeK_e0(Hl!zK)Mfp&58@aNF( zOR0O}#TxM9Di7W(z(;hfLpXPpa|77tTa;(Z!8p7m=vU6Mox9l6_YzXq7huF1 zjQQ#l!gG=G{2cK}PsHy=G)iNp2zQja>7?fW0neNp z!?DC$8{owEs}l`Z1zgBXR_Jaf8rDHS7oh*RI*~c&67VQo2}klr>Qvs9ssjB|ut#Pn zc|U0{`j7fkxRA3@iSb;7OXK|X03+`6B{`lGjbgj4xQ4#6@i~-c+b59Ufba3 zkV88L{}pV#QFoQ@|L?I-c76>%6@!gCh#$U#A6^14apS1WSQ&2liho9Umh%?zbRMt@ z(mEK8!?Tz0ev%VO-POhs&w2QI&9m=2V6e5BIWPz z=U(=I_SvUu%6A={gEdDU9njla;>R`cOjB5`Y@d0 zznh5vo&@Vj%Z@$H#s?W^K8nP%eGVhl-y{1hp3J`)o<92%5B7lvr<43MH2)T!9CHyf z(Sw3jJXSUESRMB|{44t_a=<^Z{Q&>|jP^ZrNgPk@oWE<};T*mCUFN>@pJlDF5;PTcxC~3G4Be`;rdVfTn5c$C4=wg_27Dj=>HV-Z$Nm<4SZe4?IpO@ z0++j-ufbLlEz?3R%hLcl&aa|Dny24p5pS9AWW6@f9 z`@zePDsO-l)Uo`OZ5?>a^W=9S;Z5$H0A=OlfJeMw813h$@Yvr2pLKCvh^9HJ>21V^ z1@K{g54OJ(A3Y5pH3GQk_$c{yIi`M^2JaiCjfy`{{Wt3HWDnm1NnY8=OUB=AguB#` zJ6Gb#ZH^~y8IDUFTf}oRwrmL2&4q4E#6O9iyoq2+QA~>vH?eQi^P@mZoVTNIt9{|q z#-&QgxDYeWNL)Q#M*4V9`{?MYwT>jW^Yxry65%`x@nw$ajlQG!g`3WS?)6=zD)CxB z1J9hKxfx$Ju4SU%@H`aHy76e%*R$_+;_uW* zb37gOZD5qSDcVOS5H3)yqWjX&!v(+=SF5rnFTpCjH?9)?Ong}nz8nFM2=6uq7|!3} zk)&ii&H9;mT<60Jw?xJO!}nG&2H<*_@@9S7H8Z)|F%s4K45^6$sEID5hF^deEJsrB=O>~tr z%r{6(nIq*4^J>Cl3Tmna$u}4ImJ@AWf;KZX52Sz8GxGaJ>WmYQV5^?6?w#+ zgUGiEg`e4ykz}w-+JEevYkqoK^=gAM_hHE=ixuhz1Ry zLF%a?w|H5AL^u#UX?Ws%ZL}hAAJ=a&UNePoTMgVEA>5^dyF86)dRfdIjoF&$eK09J zul$MdTLt`%AYK>@FYF@RUIcD`A$nGZo=*|pkAU~(go8YA@G;?_GB{{Vc(1G++zqT* zA__KpUr&C&7+5buyAo|1+D^3HXg8wWinfhtT?DOLk(j9(bEHS>nyun%EEDK95Duz? zgP#Zonc$!&@j;g2`IPYf3V5ID!Mc)oU?@CLyd{2pUIjY8PW-VMyzU@5<|D^>9xRU$ zJ&K{naYT;{&Afc!Cfv|HMBZtQ_)Y{`Yj0+oRS&8#*){k;TrrsB(ECCt2fa+ z3z~mTxVjWv4Ivz7g5!-Iu5Kc_4TEma5}Y-G^HaicLvWmQIDVb71vs|=i(FH-b4(kL z_Fpf~AD-Z1BAV zoW|YHodr&_(Q?po(W;^~AUR)woF~ImabBqo9~~k54+sDK)knsW{FHfO3htxtgxq&T zYT5Qzg_rB$bzc*1YJ;21b@3WCf_@K2__p{m{|p7DxLh0%wI&=~1rBZ?SaTKY)1H`V zz2mXgK^{j`WAlVz-3#yB5%|Zs2T1H}jlCT@%lp;lN&FgY)u5|9FQ7V_+-Xz;O}^=D z5AjS6JTroDa5Xq+PdIOkC>x1KYQQ7E6OW95N9q!83c$?^I!0MO#*KL6^Z!F_Oe48$ zM=oti+`5SSC>e`tfxC}9m^Kl=KZSG0&X|8D6aGrT-boHK(wz| zV_O})27bl!ZxX$8p?C9NsdXe6Wi$WEU5f{a7iz%^KY94uNa9_G zc(+F4nHS_fmWkjdF@IYd_Q5^l`Djzg{@%L(u1MdBxlB{ugCy~n#l`KG?jOV_wc(Td zBYoO&g7+NagC_7n)#dSPXYu?@l1DGiqYOTXJ2$!o<48DXg!hyl^kADyV)WD)yNE`+ zpwVdJrBU$GLeg&!?e}pHrlsWA?t1Kp#BX)sw-w~rZhGvqp160AT(3v2t4P0HwcpCE z;Jb3%+XUzC0B5l~4mf2lw$18JJ{xfZsgb6rkxe9S zM~!>Dr{Dj;E5e<{ve@aTU*iFv{KFqSQ{I#3+a%AM zk>@z#{dDzyN8+~v_-$_lljYhDh$;!HtkA2bX(CT6fH$sYu18H2W0rW1_^lcImhS0y ze*}~9)K+fkKGqs4_E!=SxN<-zE|Pc#BsuSk~y*1bKI5CJbEow zV)upS_W7%{XXDrAdy(&C;>Eh~;;SUzR?6|eh@YCnPt84;uO&X+75LP-w@6%h!id!6 zAmX=1@Z0$w9@|AQCDzUp#A{>WwGSeA%%`P5BWtf^#B0^zwa$nctw|ZXp3wQ>vINhB zbrmXKNymyiW4MyzUj;51Z;Oexw?o^15ZuC|;GO{<Ya>Ii=h8Sq`sTNlYjd^=-+_gZlbtXcyM(i-f0Q% zG$H*qLcikqvpoIg{1(4fJ|6ncAR62a4gL&{*}Tvic;fcS7`fhqwq#rv z{YCk;eReO#k-(?nbCo)J;yz2fRs&wUID*M)Pu6(15zSjd^X`Zjo#SLQDGc-!=J(HC z3J&FbKsLLED8JtW4(~@hfc6O5<7k&ha9FNVr|AzK%eP^a=k>fuJX;LUX5qLvj4vnf zHZa1Q^(|xZHV>wgi6=|p$ui=r@rXOZ6YmC3ym1k}WgR1Y*9A_wA4eE}n&?#qy$Zoa z;+!XW%JDA+Ty$}FL}D8c@=T1&NiFPyZc~9v`jt&IvwjPJM=NqDDd&w=9ILhDBU-n@J(KnE^E2X;*6_*8 z5lqH~)Zswlp%>LdZ+ecc)+Ts-W<1{rnEhMIlDJ}8t$138RN#L>Q%J}oPrtt6=9;_!po5X7` z@;dIUhvMlOq1KyyW@u^>Jrfa`v(3 z|A{qoFEGVqMe51C`Fv1Mc)u^wZ{qmypr_yM#9x!q?;Mg#istfX;_KG%bxWds zduU%BSY^C6jP|on5y*k3J>De;i*12t}w>VffJ2vz$z8`{ccpUgU zUO9Z7;LA~bnIyNzklT8KuZ7|pPW0^vecvN-vk_NnyPb!Zn~2Y!Ri9r(a5Yz4PZB>* z!SSCGTv>{%8{u>a_#B~}CY=}Whc@v1>BL6`@X-q5*XHnRBcj70=x`tS2-i03d>PNY zA)GW*PQD^}XQ~eddGshF*q#KopGm(}wBJ#les3n2n=0lfkayx(Xk&z|EG4yfZZKhY4>bs^50_ zJ?{Pf7VvvZv{JM(v{q>HE$8opD_f@u4!dtRT!rB7W`ZXjy~&tznBZxwcs}|6pv6kU zOB#4-OmL(rj{Av@^`PTx1Y;w`xRv<2D|}t~_xLsO3GhG}!6ffD2sb0hn1xR;xu3yH zVx5^6$%>q2I)PHlDP^7?61&-g~$@i%)Xn`KpBbY2dypj*Yu+a2WeS@78xedTU3jYG^SlRrx2f>3=US492+3V9b^va2%S5j z4UNRK+L5`mwen*a<)`r8Q2EK-8h;Mh5k9Fw_-O)u-Y5Lzfu9RWE=9;?Eb+lp>Vqx> zZ?WS21wM(JPkX~BebM?yjyInr1;;ma+X=Q}V4E3(4OF?_NitU8nY7xs{9njp$R$3_ zi9fi9p6ELrxwRo&HU*c95jQ$UNsOKvSMJe#g4B9v=>Heu@n_-j_C()K(05XVEAvK? z=5q((sv)>q3Cyx~viD#^CYaKG#+C`S^3Q=it-b5#EhEsk`&Rd!k2dUwzlp{S{aeIX6GZGa_05 z>n#yYj_%i7mOvB9+y394H?dYVsU2L6kQFhWJ0H>C#+Isq{!Lw1;<=jOcOt2Qq0sX) z*Wu9hMe6Ae?h2Aid63JjZt4AwT@NSb@({tB zt$1gXTx%oOcOsaqU#aUo1k;)T(~7w@JeWR0zu|QdbcD_BBbPBv)*q7g}$$K4^W>`k}o4?wbVqPb@c7v{yiAP_ANAD** zofGg>I<1L^r>}r32eIv$qE?4vf$Dg)320N$PCz>m?Ig5mXw%UIcS}#-Yl!Z3p!*LV z-CITaG)(f|+`EM5D$4V<#Q!7V|6e^ZpCTNd9dMZHI(smELNHZUOvw)&J6|MvyicTG z+b3hhm!#he?YD}j-`7Y!X9fApS={75AtsB5aKSbQ-hYM6+5O@3{e<7q;CDOGy8wFs zNODQnT=I}h+`Rd2;4|k&M0he!$a8S!k-F)Qx_J*gB+k{AuZ#`rP*XCO*_ttAK;~XN z9|@Rc#&MV*{s49v3+#3Fa~QAL?Cb&;Qt9VXVGdCfU zm*ErrE3FJU!LPv#Ap2ww=H(h^Nj7Jax+S zwh=#Czp`c;P5d?&etVyIY79J8KsXStC6~pXT)GlZJp+|weo1b3tmg!;@Vh$5r<2=E zeANTK`h(QS0My9o5lo4iHumV!A9%%&w%O-hli|F)V0G0RBko|=!qdkaM8A5_?;FDN zIPkpAgSj2iAXPOO9nszL6^?5Xj#nwi%ZM-L!57bdcavVw;;lq#S|@5!_%2kw_bM*a$YP`bmyGc}A{^NBYgYyw*gLcpPX<5TlgC-u zm$){xwV2#tB;$8S1iza2az1=nB{yEHLh$>5dc%0LJkpRubHdML@Us?}5^G=1AY>Cv zA-nRfhjYV;PX=M{1)iK2d&Z0ph-Z7jv&Vz?xOqg-U4nRVe!$r|m>A$z5Y1)ema+R; zqPaY!w=&um<-|N;emf2-O+u4*<|NKkGR9^2ERyemKFkk4=`X=B?)YG_?wfv<- zuX?K2rzGEOSUs|~5MrNqzjMDBeNtahA?Md=&j&w+b`+mnc9CqlC| z;9PXEyyd67Q+^u$_c3sr4*pui@QatY>jHjpU4d#V-@h7;A3qVUa=_K&^!V^;FF3ne zaTC!ZInbh-8%_Ae)lPSz<|vqDvvXg`T%LN`8qYg;kN9gLIJksxv;xOJsvI4TXk&Z| z11kvs)4>1B`oiYIru6Z1P^bteI;gcX>y?DbC(oAdAFj$6ie^F9+sF z6mxHn4}8vso9!qd-izo~j&_?FGyPnYj#=nU3>Cw^H3ZZ{FV zr$g^gJbFLp;k=M=UKO10C0d^ftshpcR}k(SA)DhpK6ov{wTwB!b%Bn7Cy}vXhmH*g zfGu&Xv$~LRrJP`D3{2lgcuE}Wt|k1=0KfTvgz@b4fq3|933zA=4sCum9J0R}ILt$P zlz4Xpy!!#+L7t5&bN6o%yw<&h=0nxv z=t^BCzv27!piMPkkH(aJ8x-%_h=+}Tsn=RKHqL`G#y&yvoR2&&COTXa=zx2DPd~O_ z^PKph0pWTL@Scmd4(&X}{#m3(tRI<|KO&wS2~YMSUSA5Y?;|`n0nb?;+|!8$a;@!qT^)b!Gz$9OLwH-G~MM9$4S9{yqhG689OmGFH4!yku*F zQsTu$fftvrXil^q4Xp=za+&AB^bXN+a;RhZ^@P9L;BO=G$EongFNDA5;BTo1&v;KB z&k-LCfDg_yKV;hXS zvX0z~*UGaZ?KOrGSAg(dZ86@b#q}Jt0cZo!2BYDsr7HxsxV2VF=wWv`;Z)8?dlD^5 zp~Vs6krnXBzKBN*tMFJ(#?^&EX5G4dP57z@z79tEHJ)WWUrWa0v0&mRGJezso{kai z46FF!8N`d@u1COafg4BoDFZ)sE{H#`9t6MK2|Uq$#jAC36+kd04~RduJ~-&1cnv3B z9&Aa_^CjR-y#8aak?UsN0?f{>B4b_)yrLWA`G)9v8gxBCa5oHa=eu>J@8;TfO_En3 z^13-PcG&wv>Ehvpt04;r=dHl`MiReS7~kDSJTeX*`5U;CTC_E#U5{-K-sIVbc-j#D zgx6&6CLUf8czD{N7r~S0VEkL3mB5pHhfy=^yOdyUs#yCH|Hu;pPfGBt#SjxD!vkAM zzfH8?KY3~)7l>`Wl-Tb|Xy1}(*8tk>ATdic=31heTuI+Wj%^$sTmBah-v30#1H&xi z%uS@O=CB z@oj!kA06F8BzBSV^b_GpDrY{aiy^3s+640xiurL8w}Hm}4~Z)^JC5istGSd_|IL-? zQ-I@Y;|`=}N!&t>TTF02uDF|!{fBgaCgNM&N?h}+%q9DX2in2|M+mO^A+GY4h#S|h z=>G#Wj@u{W-k(Un^)%l(gv*BD@)u9Pzhhr?ToqqU$F*L$*QTi}aveRGeh2dr{GIL@SwfdLyrB?h>n6FfWDI z8c!tS_iFg$48nOMaK44q)KJva7bNdGn)laae{J1AD#p8lyGelCxqp-6YX!$wa~(Y1 z{(~G_Q)6FFa&C;Ar$%s@UX7K{&xsc8p+&=O@#kF=;G_N?yv^W**z#kqk88o9Lb z@#mv8G@op;KVSDhM06Ym9rq9}O29=v>9@M}J0Zc_qMfa0s>9dv`Sw2uS27bVkML|` zQ$y9iE{UBN#xB1?J#EKHeA&)`r~86WHU^#G(cxagMH6sQOz>1wJg1;vsYBcB{)+H> zOq<~x3^hsmsH%Jp18zA_ww&bLUdFLGfe$Lar+6sw*+lqk0dUB@t+rLim37(Vn}Ngk z6Xm{Yh3HUqyK33hphS+L(6!EPAq1=t6; z(F9i&#kGWZauPiG0@###G`{d_u$?XQ54ca9zeHQ%ewK1CYugh@?8+Lu^2Yf7N5DHf zkauEDSzXH9TO04I7X^34;~DkfPR3x%J4EQfoP0VMpU@z@%M-z85PTVm?@)wW4AHoKlDzgG&*3TuIp+PL;t8~<*G=lnNw8wl5v!S#HCC0((k42v806ya*rm z8ab{;QoNteL2Z9P_{;{MHxNEjl#gdTF`xJB+e`XQ)_x}wZ;XOBUPix(W09?ACgA^Bi!#?xlFGDq#ii4*VCqR~hs!J%-x}@ZX7OC!tM4I~i>{+GD^e<7#4k%Mo%d zItf>vliXPRHrb5Ned5Y>4{!c}Gi9N%!uO-1HpIoYdEJKGQOMwExRJuxcOP$XV^8r1%350*?^ zL{IdD<#@8{dA8@+R>)tDHO_=z*{UIbT07*=A#pT)i8DyWNYgiC%3AdHO z?O=lSB*pqbq+jDexPP7KIR<*}BK|Lj|A!F0W`UalgI8VM^J^7?O8o#cp z25-EqwP(?6zL#A3;y;@t$B(;fQ9u1XF{gR3zKNKUt87vm5>r&V4_6n`(Ms_9U+|hZ zPfo!rH)(feil6@gXeTq{|6*)md0J?>HA_2rY2_` zyZ)B=5_c4?hc&>@Gd%s?N5+iG7&9`q$B#Ahpx;2EQ4MHxl?Q9pPRC+3j?&=PbhNLO zBft(etD~Oas5jQWb4eYoLmjmN4{>8-GFVve;owIdQ!S?HCtkS0lS=`~Ws>UsSJX}1 zxlMl=bI~sKV7kK-H)Ud|OB~*7JbfPU^f{a8Sqpl$CV8f+W@W@D^Wl?x57t{eSfBP_ z?FKwDrpYE++4cSVgBq_9jC^BJdzTQeoDZ+`MIVV{r(LJsozTZU9(+eU_)3s-bc~XE ztfF6q<8;O79 zvwFu7e=LAMmXfh6-xc8xK3@x5rW5`dXe~ce@teH=H5k8t;>l|Yu*Z!F((6hcFQh-& zjPoM={u%m=YACOn5+Eomddb7rm*m*V!Lif&uZhW7`pyk<&Twyf`u>jeJt63O#*(4L zdzICD@1yU;`-+UDlBca<yo-r3{YeSFQmS6TIS$mBd#Wp|8rXCfY25 zHU|iY)is|i52h9oOvZ)O^lsF4v__Ng|MIB>`CP&*_)PX2@3Kd>LGamNw0DUw{Qb_w@OMhsV*L;|>x3E{0Q{@$@;t z)8}Qxe?#ECp=iC3f7HLC;RV6D46Yk^`u-NY%Q!CHmQUQvCQn>X2k%L^LoNwF)6nF6 zcZi4QnVuLAdB&OdNbOAof^@f{d7G5@@pvQZr^aLPbF#dnHadorB;>Ux;G~jUY3S7q@RkDpQt-2qawvYC7l|jw$tIsse1xnWhM}G|c=B5m>C^Da zyte}T66?_7oeK_yyGoto=b7V!9A`}LLHyhZer|-^txn|%jcoFF737B`a%px^>A!_(q51#7aEAE=pIPeu-a|)mR+6LUj&Ce;p zRf~@9Mo)|jJ-Bc69CwFj-{p}$%?ILvl86UnUlMd28+f45eNKEi9KO8Q6Z4u#%tT+# zBEBktuW~2xYXG~^XVlMvb(i}2F%O=$#4F3-m0F0I*soxfepA(FA7BiL(=!KSNG{sb zk+{Zh3S7|>{MtQJ=o0q|$ejl=uGko6pHXgvb@^a-hljW4B5{mUSuTu8|)nl~Z;pE=h5u0z-^o+?!fOIGf;$)M;3)B- zoLR^n$Bl9CV)zuJHqiChdyl)~K2Ld`+i=wH)1>Aug5CwM#IF;pV!Ze`lB3~0OZ|Nt z;jR?;k}irr&lMfI5$}(L_g8@%d5vurQ#`$o#A}6kUwQPO?is7sBA&eOSc-23l1<** zFU3!JCr31u(NCV8nE_NXcc!5w;|_sjXd};Hle@q(;QeGgK_U$*rQvva&nX#C$x4P^ z$xti}nq@(?mcW?`<3)k6lUVjCNJ^Yy1N$#}&>O)2n+*gVA z4^sD=QTG``;_Fk^CSNX}r=f?Dc; z-=!|(e$ph@#uNX1PyDCIeApbd+7PjBC0YzSMhoX|B=xic^;8haQR+#yd|>b7!F{0z zcMs2TFOxY>z9pw&1dI7zwBLewacj(Eoxkq~7m4c&JKr1{a3RmG8Q}VPaJBHn9_%^p zds0Uo;DblhBLSiK%RZ}{j&b_f=h`M!ZsUo+fp~kgjJc#H^5DNQ9^9P~FOg5vy?!vp z40g{(__X!f5b!DU4L&PT`T~3<wG!=gv{h)0Q{(6IOHuD9c`y!$aAFu` zMfWDbH~1*Ng$oD!jwdy-8hy|9V0wu7FiFpKMn_^MdiVoiPUKwn$*4Fe@aT$J3q5hi zNBT|V;%|hDfk(MmQS=G&jXMWB6ZxKnb~`*~*bKAic^o`87Om(|{8|;?(B)QoaGyYM z%Lwx&(co<0`Ih7~pdzQX+llw9!}~KxT=7n|v*LAl1?!(i$a$S7pN*b<1?V?!J)ewT ze@($V1K{WGt7b z27ONEm~rsQy&haGBK_Mv7k!TD-?{A`PO5nDKZ4kC;%*PF6Uo@r9p`0@;mbzAZG7OLN5_Jj^*+_Xz##i=v$;7P z*O2Pt4DtYCCmwI}$Sj@rXX_Yd$6HNE?6=eh_J8&o(fl}#Yy0G8J-=5I1FWPw2Vj>rYxe-2zF$7gJ z)#I&~JeYbCZ^`-mmxRO0;P7O{6UAE@V?!Dcy^WYs%eL8jy7Dx4xfa+OY|D2lycfY{ z{mGhs5z(notu@ySudxMEiJp!F(Hh=0+{9HK%JTH#;&-(3&Yb%>0{mMS6)9&b3=7OaJ^9_nQ zX(&HGznhF*1CmOD`_p!i*xfYtH^h5az-br6HJ~>c)VVDJdf<(qx)+{@-+?Rdit$|$F9ob(}a(H%17Nu--&fNp43Y% z)XQyztLgz)uKe$WtI^=<2*K1>F*WvJx`J@ETe;dF;lsx9#^58}&6s{aa3@|HuyffI z;Fc!`4@E0Q{ODYOvT(Kan%gjiDe!Dck zL%<)m#uL;#p0LNB%=J$W)Jv^~Ah|jGdF=+b0P}JC&nJ zo_;?Ee{%iQc#$=vTzTva<;DgaW<$Y7@K?I~TO>C-M!0MYf5)A3kAt_rz;TJ|6qh zk$f#~m@lrlc;fzozGZD`+{&?{MH zDxckM8b zwt3gqAE`;l$~5n2UhRU|ZpKiO_wT5?5_dRxrziGzWKA>`zCQsiH-gPL-Kv`0=;`|j zG7jaz2ki-0>EP-^)LWc~3Q%u#(Yi(WFuvLbd{lSK$#^go8W)m$t_<@jpGvs=G2qg< zyFK|12Cl?we0B}4O@PauT0FoFAh~BC_XD2(TM+D5s21}H_CA6CYr2hums7w?JJRU5HC?;zh?cVa{jyXIO; z^^oWB$@9)$@nG*uc)478nS~f}W4w$NRbPwuaXomrKH3I?zgK`C_lE(O^kbX&NjAGj zBHt}pd?OjtW01M>CR!~tc{*Div;wrcXkU2n^oIY0IU7HN4)NDCsDGA+gQ%>}f@!m2+8n`T>qz!ro>bPdMQq$lF9 zCoP0NOVR#Lw0|JbKF7W2;o%O#!$#$ymnYXLMB5T*dxY?p3;y2p;CYDPxj^y!o8)>x zeLmcS_d24@DbVIg5_f~f{gC8S75V(llg|VXp3@0`O~7BqITh#FGPZ<&oZGK?p5W=X zG5iu&bBp1XuRT~FApFb#KRbwb@$`514dJF5xOtuMdVa`j`A;4^^O2)}O*CUkZNk%o z%F_oV{&}kFX&xSX5*|+lk15y1uQT$H^A$wbrckAFH@=2!LUOrZb2$Qigb%wWf?tDe zCiIzwHXH4qB;WqZ_c@+?*JEGwoLT~8V=T?bi25Vxd%bemUh#`pWwUd&E=e+Hmb%)W z+-rePxi)F*-k<~gl@C4(aF=pE?o+OUJEO|*e%fW4gT=Aerr}j9$vC%rhRomUy1yPhlQUq{BL-#`m_PR5&q|b|E``K?;(Duj2!!sxTT0H z@4e=`zWrY!x-`ctP9~o2oD_PxG0D5S*2I7aZqrS!4-fb3Yfbvi(|*Swuei03+;dWb z>(W1y@wyRwzBn?@Senj zg`6=0qb!EF9)dDJJ9+%%6~>xoY~ zsZYuXrwhR6LbN#%PK`4gJ4O&cR8>DLRX-RPVLi(;)}_9tFFZAZ-CieS#01iJuJ-*h z8B=#)OzlhZT7;YyqfH}y=V;%}UXNe*Hil1k5RZJP9ytd&#f?wK*(ls`ITrK91ouNm z_U8CFE#ai{2seo}`aSVXCOmUKIFIw8jB^hYAFhHAZy3}%Hj>f@#yu`C5 z@N9u{WHBTU*>Zqy5wwY0moI}Z7ZGf072ER!TYF%`yF|)?b9Z@ozTM;Ve-gi*1;5@C z;Weu5s|mi5Ty4M1L#1G@AE~`Eu<-`Ts~z&f9U@2b+DiC2H{_@MpeOIOg!fay`@u+V zQO~>!e2Fz~9+Y+0UkLWLz&+=XM>qhJ`@j=3X-)k2+6s9MNXY9cqS+d)!H**`EN_QOPD2bI z_LaoL^2yiF(Qo3hR->}o9OYd3SDw79AgmKhHJNG;t+}SfK ztd51dH29?z+6icK1zNsor4aWMrtXSAXONofO~#XQ9KD73vK{(wsyUb!BtJQ)ZJ89F z8y+FPI1Rq|!sCk^_{GooPJOAJX`g=P{(m}bIkg!1~{rk`W=F6FZDcl zIw$BTIE{m^F(%2Vw1Uh(*JA!DR*fw``VtRn~qUnvI* ziLckf*X_}-_{n0*m?F814ya@IRi!{!(N2^5ol1bF$b$Nc@$7ap6wFMQw1A zQagVAd^$8OCfb~-+Pp$^?Fe0`lU)9(xf}o{(>)P$0Wj4;n@^7ahaNv#eJ***@!=nt zZ{*y3#`F<{kILYqjYore@bQK6(T!+zhH6y|o#W=?RnU1g+8Jp7BznqIF{UfumV@!#Jjh{1 z(TRlbD&Tt!!Tz~oA40INR_qH9JFc$e=^i0}MNKx57@uj3g#=$F@EzyzL)|yx&(B*x z^G{SS^Pv2ctse9`ErMC*V$r-l@PyAfZt1!}6Y+)3({ikAXF`j!(9T9X2klCd+ut>} zDTKdO%3u1WVXalnYhj$u(6tNN8lr8}fZyp0&nDbufxAbD@6U(t_YmBFQ{1x&?$Z_b zC^9y!0VltbTB#52_ma4uYTQdB`P%&2B*?e9TS0KGR9yccW5gbe5myqfvcc7>;7Z24 zs16r^t4q)xAh>n%kTM@(7Up9t_3#Ec@17~q#Qw})GMXQSTBI*Al)0E&_q4*jT?izr* z)x>9O!Ofc_?uQz8AmP0mvfV*2EmusB5U*52zE2RoGQiY_1k(qKsS9$An_G*JYZ)3& zgkt@0Av|~y+N}ilsfv3u@zXl+wI1yYg72@2?;iATUJwtMA7l;MJR{!6*Q2&xC4A+9 zuOX_h^(Fnv))4v5f=0RcJ$!0%@ZZ5--GQP9T2HiIXuZ+;p!G%Tht?l$0NOybA4yJs z(VPwv&X$FomA^;ytPDN>Abr2DeLv;lYXZr;5%S(kbUF_josae@;j=pUYz&XYjVG7F zA1{+!m#RN9%PY<^MGqTa-_v~75IqJV;$XBPXhYG4p$$hHfi@Ct6xwLC7|?;_ z^JmTHSAuJi;`*43^&7!+%87hjYDjph37(oF9~;jS#~=ChUO$5OEyX*HjKx>LH&>%= zCpj~Jo%Oo4lf3W zUlA`J4<4ow9_oOH?aIBwmdN3DaDOha+Igewld(pwQ^uCqyA)sfe~$e7a< zW6migpV?X`rEkWs-%4@5yocbD_laIsT<4Lz>LRcC9&Z&WSBV~g)c9O_B{z<6ycrxn zOKNu~{Bs%MC?6c%fn20^WixNd*!z;^@foS1n@~fQM#k5DbMV^?Z3W?YmU`xa@-VjL zDnBK5izK-|?A$iOVLfnoHtBn&_I)$Sxdw7Rj%Zs3Z5I%ZF9pX1$Tx0&#FO*g29KuC zYMw~x7>-{IIBx20CwbOKo|ln4XK0?UlD=QizWWhBO+qH$5YJo-&pf33nKpu5Hu=WF zwS=R~z|p(q@qT(<@jOg&Ekv$|5mUxF+3bBR`CXorD`)TpXkCZ~Euq0b%a4t1etIs5 z?OaLac>QjNm+$fDcZ6VW0L^sbRymAnEBDEKNOCPgt__}!KbN`=en~wyzLuK@wS0T>7ew27;G#ZSA==%9%PrvY zOp@x0SLG76*o(Z`qpF_B41ulLdT;N-#-Md7e>7hR5HqX zV6t(@^Kkgl@i_6Eq5=3RLVKEUbOkv2yJC`V!aPHTv(+dB?ICvIbnYd9_L$?DJ7h+e0Fxy*w2nz#zw z&hp^-mW&&%F>b7VI)41!4Nnj8&MGr;{i^qqLVB)ZA@(j(~mQSE<@2iyDLOLC6-sh#kJHilq3Q8~NB zqwi8r+|xY!dc#kWlicHyxLplDZ9|ji`tKwD*aLs8j`UrT+d!9jdAKezpIiSk!Q~F3 z(?R8NZNeBV$5|ipe&9^P(+SGc`JQ8cRL@#}hN%PiKQEGty++278$H}#tmA~eUVbLw zn1;AZS-!<)8SqxJK=^5|!(r|&Prs9(O*rn0%PO{ORF~5T4^x$gD?IsZBbf07z5sLI zKgDa;2IEB&qU$VV`H&}{+)?rCH6?CH0kf-XTiP23K>?=Azx>$!&imzSNg^t1yU<_k2kFdxQ8% z?kW#A&50hJpvSkU`M9y_der<4Xxj;|lhu06uSPH%*D{t3AiCqKwc81Pg?oEFehs#r;P=ObT;xB^)5U>m&bYkjc;zY1#rXYU56_1PmlH!S%Rlhs^eKs5H{eR{ZpF4X^t9z>d^SxAuL~_F zTFeLfPZ8VdT)MK{#RDVpRMnR}d3_zx(L7K9Y{_WTi5^{m`hKFvwa}x*Gx6)T8^QFe zgv$xaWu9^&xr97~tlS;=(z%}r<~oY`2agsv5nsx;(H4-ncLi~i-0xnVu}r7E*W>6;9<3*MaCM7lWj+`aXw}=DNVKY^TD?qs&;vgBocMY% ze0`tl5Ri+%D(;DG5PaJBEW*W&s^fkfA2&ucKwl?$@_i7;#f^#bJ&?`ud^=HM0PfJ9 zoksG@)%-3cxUW~--HFFpvyD0ie(Q)=$ajZ!#JNOAcdv*4 zD}XOCFT)_(R?a+jO=SB91-v=em-uEGdOSe*%v3)2lUmJ%-aC{tizh#2j5#jkth_pK z$(&{T?epscfGZrcJ7CVL>)!Qf_JoI%zeH-y;+G_a*AX_TE`V?pgZzFoSbv7(T}AWm zLiFwfy$g|7q88>c$>}!2$!PV_B%;Ns=ASJ| zU?W*mbVJR3OgPU_&W~3gn1_XL+4{l<&k$TARqN$M>*dh8r`AT;n_MFZS2oA4=bZbe zhx5woj=ctB{=Zf^{RgStJZSkf$va*19teDK&({&>ABz#sRw6u%P#&rhoI4fgOu}(L zaD0IH;x_o=XOcsj=1`NwZKS>!jT{r}*ff^4_yt6}6*%HAB;VnhZ%XfD=OF7>=BJ5X z-COIEs*~Lv#IxPu+3uu{GYJ5bEPECc8yaF z{KzZ6vfShl*5-|vAxdU&wZBODG=4to&q)PQ%c zRDLCnZ1ya68Q*0j>Y!&tCwXu;Ch-Sq{B7zV(=d!A*G=S(w+5JF8n{88{2n6u4TOGk zJh;jTt^pyg^7o*9;uvE1l5mET>Q0z3#)E0GCvKg3@#F6u(ElUEOspka56e9tsbGAt zE1K3>aSKo3xEQ)2S@}Gk=vfnbp60>zJb27TpY|M2(_uJx9Dyd!ZXAj>3{9T6ItXnr z+9z5||0Nzgor!1eglGN$o;aU|%r{G#K;rh+xG7h} zuW^Kw?n_1x4d|~5*kaaIO-iOxO)Au@(Yj@4{NfNtZQh5DguP5JINNp8Bzq*9Oap3S{ zvX0z`bwU^9BDvaTb6Pl7BqhB_@D?lH%_QG$ns0CI-*~j2)i4L7x)G(Xqkpyz%+8AU zMK1I`=;3J%sge7j-A;nHtKywQeBK*Ae~)lcq+GNn8XOM|h7%sD20V1@b}PZvCB#+! zHxEyTi7)EH7cY8vnm{n+2AG!5>#zBUH%vGAeLV8XdN$N8@&9GteehIsqFYty_ATMC zfpT~X!IYzz_7k2utA0O`{tJWtbKLtLK6Vk`+z;O@B)GBzT=Nz`PH=Tn{l*b4CxFYO z_3`siedXk1qHjIu`z(puQTaHH;LZwg_w1RWu|+%4GW>)06?H89(!ms=;5?2$%Jg%g2ev`=N1N!o`Woh3gYPR>?YJDam&d z^8F9duRiqaM(XH()X^sJWMgAuoz($P9}te(tKa@k_P5jhO_8hhZQ9Gv613@r-#qZU zO)(|nk>lzD)4xc}wyImzKJhVyzaPl4ZS>go9=sa~_mjc>6U3u^;nCko%+|_L!Hx0f zWrfhK$dgMC;-eGPN1qT6J^&9^nqIN?04+!Bv6W)FisU*4xeg(5rv`EH{wvY09<<9M zamzGr8&AITiHG;Y!+E6NQq}bWcun5#vFmY?vuxGjwS2T1Xf@H=LJK($w)IKyBK(z# zGtX2MrkqiZ(frMuHkK7=?bjw)T567kWPc0Adbe_K{Tqg57*YS`f!b!5seN&qn*Ux55V8=5Ux%H zR~L|+YD1q1ifNGt(@#XBLTEIKaM47$ScH19bC?P~@VzUzS~JYK^20>O+R*V*g1Z)Q zk5}CF-;Q6K_lLJudUBdVaF;0V)rvcMp6Y-)3AMhBV5$AhUS@k(ui;{9UQztVvg3B4|!tl zAo&z&KGn11*Q@g0z(Fz|4Z>5GF z@RSBurn*J(6hXIlkVgi%h_27%|3bAJL6ed02g1j2^A*XfQ1f!<#gAjd^!UT%`1*SM zWRm+#_Rodul&BsD;qy8K z(~tlYuJsX2bwf<$w-f&if`6Kjz6Wc*FB2Xg1&=2a9vgzkvq`SAk?S`EZ-H`{b5r~} zCK>NQjezso5zK=Wb1iaw&0rlg%+>E3f9<6`-uaSiJGT-I8)4sOlGhyM^*hO{j^?$B z@YM)>6-O}3m?!th)d(<;bWMP{68>$QjfvTK;%6Vi2kzv+ALqUx8a@UMPl4~^#@L79 zyGPJU5jXA}EPR)+2QW@>S*OJ7Ra^6JL2{FK5r<(Md5idSF#I`^-i}}`?oJ?i_1C;!ga?K9&X3ueP5GtqA9c~!*Nnq)|dSp zfqNx7A)gBf=03{tNMMeegHuuONmxCl;_M^^wKtz=k*iuPMg2x`h?{07<=|dy=RPEQ zEPx)%NZ&cycQ=w_}F_Z6YSZF zeJ#N@Q?Y$Vcv%QuO5yLgF>@&VJq+z!#I9t3@YA%%IkFPVVqFBY%>h{f=8|K6h;VSh5H@>;hi9ek54rI-&GCJ;2)t_oaYu&Dk&;r};@THy-b9h~#Yh zPY(LPxAhTDTY%4&XtyA@OvJJK-Q;-jhCJ;#4J{ol1FbSz6*QUeo&~0GEiGu}wc+Rc;yhhGLd+2IQ%yP?FA2~my+>tFFvIp=Ro&@lQ=zcfbDLNx2xpD zYt;-M*ylO!K~KEbJbCQ*^mz?({C~{73v^{!dKPx8AJa2a;~CG`9zVv|cgmg`Nu#Qk zRMpizn(7*>BvrTEDoIGHt{!(chb!r->bkG)mG8Z(ho@&4Fc{lB;sA>nCjk<`VDca# zA&CQvB*f;8fwg!p2n!MxfvhA1Ll%UvR`UI?efHkx>~qhRss?&Sb*`Nc$n+L$ zmvmrd$0PqY3%mVC6+Hi91L327`8`H3jzg$7{cO+sCZvAcil?uGSi87S= z*r(yw^tE!bdXJ{d8|D=kF|$?QBmI8u(7f>q7NH8#^2w8 ze7;Rk9i0P{Ok?fG{;c?5TzCHieE;VXHt}23CU6;kVEZON#k-%c@QZ(#km*;bOn;^V z_xlp{JA?ZDV1+zCoQSWNV567u_g`rJlm2~Od=T~jmlAsTS=GZoO_b+dEzidxmtP0w zm)~?w+J<|HIPpWMzkijW{f^T9dkNY8EtTyHiTeE$sNW{!vUZKiOmdM0&ckLG@JIFd zpCs&d19tnu&9MGWZ)ExZTSXoIRH80kL_N&mZ&vkXbz%CtqB4EFg6|>hgLEw=Aqw)} z=U^YR`1_@VzWxB~>obiXP1MBzb#cv;i>TUqA?b;}RrV>!MZ8T9CimN1SFbhxWrFwb z*ScB+eTt*@pOt~=|1XL7^kLZNcmDn`?h}9V@lT--aGQwjm*@YC^8MaOZo~fpwXvnB z+%{kL8H^CAELIW^(%&->?-J_uGS@B9d!})au-X3+ zHhU={>z7p4|0dBE&BLz#dcu}BVap#*=;-%}j=nYz9hcP&^|P)eWO_?w+CjO=&*(oZ zH`ULJuFM~6{7fQ_4`FvB{C!J8zTeC8eZ28)nLx zpM&hwhulRumJ{W_tL6WxM9iLtO)N!ni{;XaT%++lDmNZkZ)TUjS>>KazF#MXOMS0H z&t@szd~t?#zT0@cg757_dEV6W{EbBXT7ZpR!QVP)Q+-=}Ao=M(`Wnjz8sCS%FEr*V zWdDVPEu6p(9^h}Fbt3x6fV$dD@c1NX zU&h~WR33jnVN(xbPml1oo1pV8z`umQ-=K7UTcYkRXx)7&LFb!+Ka0PgP&!}LGFzFf z%uOwGmZ0+q;LqUi$Cb`sOW4B|*u(FHtYz)ZcSF`D%S-JI#%Zv3iX&z>BoqC&4V&0c z$nkOTpT^&hsT|**u-R{b&E5x%4}+fB0gd6w4!#k%Q~3M!Oym18+jbk4_h#eAp&RR$ zksQ?Ck{y3HbVDNwnsNBHf2UmLmjK&M$ow(z`7Hi^l=;2U_=9T0#DmIC@rwA+y?xTQ z|5x{a17g_+G~eI|=38(QX9GROpMIlrxQB-Ce~r2@ip+FxgD9GkvKv0J^=bJ z;P1Qe_ucrL$KS8P-xpD`Uz?DPzQ*>;@b{|~?#B{v&msRi@%J@_`;Qa4*iv2mP{O`H z3j2N~VT;#bi+2;gwFAxkN7_!B-fY)_EQQ{Pexvc568d=tdif6g{VLVZzny?Phx~8H-&Ymx!yhZR?`x>R-wqmOcKa-F zKZU=q;E!(bpgjvehjRHbz;v^r<=O`1zYBV#8~TrQDF35xK=b_C*Z$k;vVZNrk924F z>&&Ck_zyro)xY}FiYwgnzRpLnyOPe``~rCUxaJ$A^*@-<Q+v3c zsPk7)=l`HWu0NaLd%}Fb*!a+|FW1L8)yFRazpM{<9{AsbzY)`Uqw$Z&*u}3@dxjd> z&*_)``wHy&{Y3nI1%C2>qHI>51Rux0zoO-{dNRHJE-l~x9qHBV<#n}}k0;9Ckn(@+ zUyUi(?@jp19r((>sHm4uCHQ_P+V#(%oc}6;OCEX$wm>>D`y;*3f1igfEaLB(ODt6F&Nl@X_y4xriR=()9HyNJV3Vf0VGNA?q8y^9RDXY4t*J<-E#8wCO*qON+T5 z0&Z1ZPbXyi4wda|2^;$=Z0zF+o!nBL{8GZsKZtTQ@i*Y|z0tUr@WU@a?{kpP?@P)l zThgPP7ou?mrK^|K|xk|B&eUYu{F_%ddTNr7pkFcsZfVZ&zLZ zzX|@w!oTrd34N}rKL5W2exLEb*!Xh^zj+gW^F_$^0_;P4S^j+n@81g9z72omAD^i% zf8#=B`5TRYl<^}`VBl*mJ@yP#u4Ym8L@b|0n_ql|AR#ZQ4 zpp0eh43+Il0(V()=OQ1=;{a|KNXUMq_4X$cHn#|y+o_Q0^VRzP+HX$y#dY|_cdASl z3oNGma+c|h#+NGiei3}j^hE9P^+*p!pJL601kWwyc{9TGb+`w4EDjM(llNQHH~#BH z-|W|*-q))2)R;=hwW)Ib(}Z8#g=8g9d%LW7ofM?-l^Pl z)`-5`D?azlO^NNMXJqq#pMcN2l#p#*W!s7LZ8WH^{yuEdcoRVzE4+m#iJhI%gG8Nt zTiC0_LJ8IzKfxC_}3D)_amsK-}UFjS4_7i%b&t%|CgX+vT4gRo4yMjQ|t8o3At{n zTpj4ge1hoO8j6fVcN#s&O?7Dh**=etLN1z*Sw?&Jt$+KRYacD2;IHC;xAFHDZ2VW_ z?m^G&V ztOr8&_zBd>Cm|#CL}szF^&0ZO2X#YnHs<#>>fxtVR?9QnIj^$50A0M`;hO)x>HN1p z_*z1r->Le1JE5=FRA0X`k$+3`e>Y?-YbU5Z{bvcE`L)o)Cm?$n-m}2_Jry*64CSFR z+kbZVkoo&-$oQWU^|Xw7`WetJ^T!XXPXD`vFaK$H)3-%3TdblwK1%3mMfG$qk-w_> zzXjz=#j#I7HtD(I{71q*pM`z?r;*-FKEnRbk!Ryc(jD0fwKLCv_J{EIJ?y!kYz!c0 zS-sE<)5Am=mb45%g);cK#-H}Gd?um0XJO~RG7%53a^CnSiMm`xUH)9Mye~Drl92Vb z*)3$XxJv$IzV#{i1t`eRDUW87zC-g?)Pq4UJYRjL5?tY=79RDD}^IMeX2s~-M z&0?61HE31#1^j&j@x~wR1=zrD09tGLUr|@o2AF(!k?L5dJaQz6*O3R>1W!WcK5()%kOPd>()28ROZ;FIMQ~7I+X1 z!?iI4zHo%J=TTeVg*ELL8#4+2`E&4}f0iiAH+g0Gs@AFTu`+!SGXAv+`MxPp-`|D$ z{+Cgm5^ajyp8#Kq2RkKki1_{sl!@*%_`Bd+)?e&utR5!%06z|``~?1HD{WpZV#`A4lJEW$~Ra^?UdB@3;Evos)NN?<{Q%`g=q7aB1%H=PzGzukPXUgZ<+{ z{|6f{ZXPsWTxnjoyS8y<;Q~KqE2}r}yr$2~n;Scu>#O>9XJc)7b4B0sm)DM(FRs2m z+;6_Py}LZ$eDU@Qh~Da7SZVK_+s{citWzxg6i z?;c;f+I;Z`)|xNwZZ%(Q4+j0gcKf(L7%f83qvH`|%Wh|Hy>hMb;?nY6hK+~LpPkNDw>3KK4~}+L-Z&#MqVQnh@?3$;@|~5XLZWJHr8R23 zv+?HI%Gy$Mxj#VVv__qN&yrr-x`X7SHx=!+iNiC`YgvaWAU3lNo zumxL%_t}GbpS@E0<^AL1#{S|v0AwRP^o;Px6w-VkMmRJheBg}do#AKz^`41D2Q=EP zqchRyKLHw@{_spPJnHuMdnacr$9}hS)ES*kj>ivL-Qnf?XDZA7V06$vJS&x9s|z_A z?MKIhMwWGYz4jnGY<0V%`-A?;z56ch0G^z+d!xbQ<9??%nmTuGy0PCHweR%@j~&o{ z9{~Ms3}|Jzw1@qZ!G1eO2G_mT{(CN={{S()bC5%f9v`<4JCB4ny*SYQ z`|bVrw%enVK@VxigLX5^dMDj3USPKet-Wr0w?8$6{GDFAJ2f{w?NEm&`}^(Tkcnp5 zL3_|X%=*V8sG@%|%J%mAC%q9RFu<_$!^AX(YKKro0N|IPg~XdCI8(S!V?P;H7kiW zN640E=7lPug%XA)8=4qppQ;5RQJy&MCq=N(a;UUp>aNggOoHZl3(%@t3-gqKA^FOL zn8I@sDRVo5uIs2{JecRQ6l3a169uOFNT*S=$7~`c=OwEz-y{mwCXuYZo)4bX4p{XB zo%(9549KPjI&+f(EdIO@~mQ!wjti<;Q-@<3`sIA@ezY>wjw zW%*H~NTn!9=-3rpYM@5mRXR#&mkmQ}(3WAMS0djZC-Q1ffoGyo?y9F1CGxvuiOuud7VMpGf3*Ubj8-#2^WJ=>7HC;7@JM1Q{W7u01zrKkZkYqsO?YI z$rMcFmnA^;%iiv`kH&H+0SY-3RLU|v9CSuH%cz5;&=5<2#*k$}#*r-n8bdY=npBuj z&@dmwdi@cl0Wwz2d~r}{aWf)n$u{ZYWXuCvVAM!XfIy6hc0u4MKjvM7LLp$68FVgs zmdXyTJ=AlRCFi8Aw-MsT6#-Xq>Z;-ytHL2w1*UOGVg;dqB{<5$hmMQk=W!LFs&ea# zs#T+#U=sBJHxuKsH)tR%_7DCdsR~tL)Aug zQxn6h9L3NntdzldrJx$EkK~nRoZdYibE?;8jw}S)#*jH)gbSP zRy`!mB1(in_Ei#2%IH*rf_!CuJ;gZL$LXch1Gl8l)nlg7Upin(S`yK6imaL3I7m=S zvR_rPmZ40&5I*HRegr)O1>#UruVWcYLG!4Zm(Hxpc>`x99ZR@d(=Ko2y_j5?Ia?0q zWhCNWfOKYZDFT%-chpMGp)@<K&14Q9~CA9$tZ4c`Ay0nKWA8V8kF7o`cVL|)R2-}N5=Agab9Uiy$rvQ&lR1dLF z>I|Fr9<*$e*ZtO@IRp9+vFr7uH|*T&VN(#cVl}3k=gu`>ZB9LCWnFC4o1SY3ia6h+^fxOZDV(5?FUvjZy|kpx_POPGL7qVVrtpa%F6cY&W>O;KNlf^ z*8|{8(axy;AsgZ6n)(9ahzrc^V)Ls8kta^$0*k3E!-kA|Jwcsr7!)iIFU^aCHsIR> z)Zi%FZw*J+vBeCVps;&+(7bqq*^!AtC)jt54TdNCqb9VDO2uBYRu|ZZa34x;kg5W` zxtA_>WH!&geeK=G`f|3mB99M=M>c}Wfrx+0sV**N*-5X5ji?9N+}zwN*}PzPA?E{N zIUd9N*qDq2k$+q=myasDyPu6ZN9~NZ-vQf7*t#c@7E&UHhL9^GQxXodkkvSLMJ4Uo z>(SmmznTcFWKE1|Is!orK>mzNbM0zIjsm@++Qgu#3iOfci3|uZQxE!`gXweUaHD3n zyuAwp-dSC~v%QK9=UdyW%S*efQ|F$YCi54BW|r-f`!&x!Gj;Cy=FGVd%r?)x&^-4+ z{Cuc+?!)*w-#qt`=`S?06@cx)OB>m(livOYDzK65wD(U2?f89VINIgChWlJy$&yx_Iq)yOz;kj%GH9Sk2a4L9i3PqoZ%Rbw@eEIV97n(^@ z&zF#TK0!(&PBViJh9sYC!4!4L^H#sx*++DJGgs?`h4=sp@d9e@gQ!FNd>D0j+Cr3) zDik6i-?`_@RQy3mS68faFBB+zU<&2(DHNm;qa3fka`8R@`}cJ>bM8FV)9Y%yuZ!{W zE3B4Y@iUPE9EZFV6_%QkvZRX7eWZEr8zB2fo98}86xpQ^FUaBWGog?v1{2F#;!_jT z@a?byIpx+I*(&fVlw5(8;uhMc)=G5{Iro8rp(BKp5-QkxqF!HkmgCYhL5O>H>fCei zp697l6kq6U$uhQ)qa|5cy|uQnnk{c_Wt(rVZm(}Htz{ym4^=kdqw2!6RC!S9Eu(@~4X!o)0Ulb+9(wqILc z+u8LCz@kHJs!b981w{0?2sL>uKu4Z(inLFynE7n}DN&xwu1-oB+Ch_Y?j!i)fKyXD zWIq#X$2isIurP+h*^IMx9n_Y0ti6n-^z>a*IXnf=bd)O`lj4czl7+}ZCQ?^PPcs5= zS)N7!V8Tzs|5f`>-~E-*)AN31@N}GCi9b2tSAsQMpXNvgJshe1+~+PdzuX+PkB)IZ zwcWgK!?%?|=Rtc1gTGlfqFd<8t`xRZ0Oq62UWQIsEzIX&d`Ij&-MEpwgD;N_G_Hj5c zs5Y9#Yu!6)O+9Q4dN^4+b$l|sKTTuGIOCu*q)jo4&8she{t7`9YrL}J(7T(ui0<9n z8G%7H=iF$623^z%MdAG}Xw}@;LB%NQY^lmMul=e){! z-pnPQ+A4};`k+qM6R)GOV%3o6>8ogr5KmEn3eHc1Yl5A!n&O3pY&3moe!4L~H;3Un z&lKa=t=Hg0I&MnXA5rhyCHDGQpJ)w(G+wcwwFfNi&~k)KM!7lZYtVF`k$EH*DRpE=jOaJjkDZa1-RMctkI?d~y?KWL9y9o#E$0n%=?A5znfZ``1) zG^bJ&4>BC;q)8LPJ!lO&)LJ+1w}#EVcDvUco*cJvLjM5kOnZ-;z4pWQpo!}-2Cczk zLg*tG*Lh&=WcV23A318!&*<@G-0Xo>Dy*}iPyiCaJ5tbE@~?qrWA4$dmGopEE$`vZ zmu_pneZ;G8la&;Q$x%{TO=}&tV}VuG=u~puTyF06o7$mqb%*&TsWVowE>3K0=E@#l z(A?B=gAm)wcF~T&7I$`6mNTWjzIHRq8VhrCSLf%~Subn1w|sj&=;C?`x&((Tmb7tq zZ3U|&q^KRa2W0()bDFiYyS=vY8fL&G|IJqSq}_Pt+?m!ZVZd1n^^Qv=Xz_;sX-;7g zl9zHC=lM5Jm`2JpR;doKkha$Aj559=0xL!5r;3T{ZcWL#eKKl4YF-4SbnSywqbWc+ zIeibaFN&15I46YGaaToWRG@FkBsf;8jF2Yhj4WXm_5&y@jwMHU7xQ&HTNm5w_c4#T z`}+3g-T5i%-ZiWn(Ky;e#}>QgM>NuTwfW__ui&#KUv6d~PD^x1#eC?StpNuBq{DzX zlgdLt?@@gNN2 z(dl>F7);W3ie~?i!|2Ya)jMbn4mg&sYv@|TsFTA5-$it}xzcZ9sh&e`XT-r1egn6H zR&L8fwy}j(NB4>nJUnXSnxY5oY)Gr?)3Z%lQm22P<$s?;({O<1g#Q_0?9$N7PWYk_ z#os@ET!Fs0IGzQ=RFgsV$D^_u!?pQ^muaBWIc!c@voTVE3WLll4CjyQe-y;{dil#MA-Gvb3|ax{a0ksS73E z*ui~jn>gwWf8B2N?zJz>HgP%67n1gsp>Y+0Gz_mpeXS>3oG=M+LVbiX4zbn5T*wbT z&9RV7-xcT?EE?697PZ>ywYraoonh7*4j~LtlwwT6pi$>)QINKCaU;B@*Yry{z~8rTz(e z3-JkeV>*#?sK>puf-7&fbcFLi2wAVRO`XGwxa_B(hJzCiZG~Kv5hY!D=VH2F(xP~qzFW25)daH2< zd)YF2DE388I@ne8`GtimS6*J2yK?Q7m#)72@=LGGy-dkdm&!AEmzqcGq=RnG!u-{j zufB5S+SQloZR%3+?qi&E=BZ!w^0k-gVd|1S<}fFnR~l$j@$b|n{>`(b+jM8$W49hK zTaRHq$NCW=&OWUk6eOlY#0+U=U6`;;iNBiiub^2!_!4%GTE8g(o zF>X5?9bU#-K*R0fv$2ni6!PR-G`2>^x67La(V@<^@W}hz@>%6$^xhrHtS%&Y34%;W zy15Q8*gH7gK(BprRPO3mGZgC8FieJeo>Zu1y2LIN#qB_ZvL-20z;$vW#nO$TQBu}1 z7|a5tLb2~RZXr%JXEM6D73Jr$%1{RTVv&$P3n1_HWa!rs8i6AQBik`EwHBr0XW7V9 z0kO)`-XGD;h&~Y0-NNyM&Lgn)bF2ac-H6eM8M0&B;Y|#^tS)IK#GwlarXali!0}sN zMjcup!Nxhx^`8EuDmsqx5ye^uD97HWhh{|ybzy7Hu+a& z?4`x1Q-H8=d2w_uVJ0qc3jQHVg-xaM!`5+r%E9vfToj$hxnvyX;ABP4=*s|RGE~oD zdyqpBIYu1IioFt|Our%tF|s2;i5Jy54Km7^$;ge3_E zOwKzQv|-j@qjNh2_UHoT4aGV)8D(OWvxE=0;QDn1;7bd7I2k`RZ~Iv6l!coziVg5BQZqYmdi?T%~~VZEjKjIh>AdK>p|3a zj^PLXJaL8QhkVH@{Q5MNZPGiAF_AH~ekygBAekH$H7g({DDAy~ZY(CEvho~DjLQ<$ z1+0gw$lOR9p|SC^CfQR-q_%2hi6Zw{&JlXvW|VkJs84Q65?U&ktdqquuX-!1kGt*SIoC|Lx?%(RR?v=T5B)WD@NFjMw3L^4*tn)I5 zFvz4~3qt`Tfl4X+K&63<&^XkTqE9H8n#w6fG3@-H6-+f*e5-C_RszTbUCZg|Xkx95 zMNrwz;LJ5DgfqoYfWk~*t4*x2(9~C~0wWnp%UB`^b?H4dRMoE0N{MIrLO3?)5()gi zdr7tlNNrPY%pqXRGtAA)S&ZXMy%@Pn_<*nvR!2idB!ms$LP>?4;N^XIc}HKCJW+b> zF4Cz+a?uowhX9R%wKf#sJni{1kdIqkVwB(u#Qnb5mVDeA)~xpLldWYFAwu|;^5|I9 z5X&SHEt&@7BBY?IitXdnYDA?*WxJrXKsunYihxuacDV)enNQ~nv+VJ13LpgHJoMGQ z+BKq4CDWiM7>_x7^Wtr$qaz0N^-9}190g`d1H#CR&{zjJ;jm8l$(Swx)4>|&7e}iC zszZG04@klxPS;~}JCkkU%N)6BTRq#1LonImMqs9OUkrbQU2S1jdwCDt==nMJT*)-5 zBXs09Xvl1}>PBF`l^9_xc%^g@ls+tE_y$HicTT65g)S!HzqFHWZmn)KvaM`%bbQc( z%CSO!GJ3d=lj?BF_hjW6lcre2z|a)A_u5`A&8GH{4wM82z+H|(ANt^ODhf0(uTP(U z$qs!Kn(&{xbcq&&F5RFF1kD?-Hs_jOY|@-Oj(kti`E$y`wgPNr!U=V%AlXyUTx@2C z-68fANGS-CPJ9!&bLHefjdO$=;di=(k5ouVlI5Bq(I7NQ9B51~>qd={8i7go9yJ7& z=#;O(*pza!4@}r5g z;R9#e=NpI$WSzKFq_;mc{r1AUU=t?I7nA0Y1TG8L=G@_aXVKHm&o$?-feN*pxB?)| zSeS0CU%JLxY&&|L%cK4=^4aKF`K zM#FadJ<39bDcMmQhZB)P_d1eD%9wuO8j?U%v9nHOByXg5{0M*(1W5!rXwxF@M{s#{8!B8L1x@v?ig=bwh z0tu`eW&K|J5%!Q_LC2n&d@eL^#AO~E{dVc!@z9u5!l8Z}en(BXYujaVn>61<`@vCK zUZ}e`ZzS-%AOxu6x7NFfn@p)OG(7tie7~7r?LCmObR(DRJny`+-h*;w@knZ0d+9cQ?6K>@tu8G(Z>i-NuZ z$2mRNLuq-6kaX`x%Oxlg?XMYMOvdBBz(9BK1v-7@5M3#3t|rGt2Pp>=0g6DbpK8Ke z0?A(lhn$Y4%4|Rt`iAO#E6Npk=8U{s>B=2YACp=%R5&~KWIB_Z!N%p`Nq59`P*TFA ziNW)XH_SaJVq>f_^Gp)+hq4n15$e5ITC&4}&B=U8Buth^!8k_@vXDw$VGg6FhZ#D% zhH|@i8-JW7fegU#b2U8~%0^ehm(-!hu3)@TaZe#cZZw|j=LH1E0uSG@tb(=qvWal6awIXyD)ve0HgVv?d&!BYu}wX3bUukcA=^H3G@DSwYjt$|6)mIsug`n|r3 z$p>0eDOHikiBTkwdsg1cNdw`!Q6W`zjH{D!l_z8w4ddYxkn-$ zEgT^COp@uoJ6^`!#f*;isgBsKTMvX^{=Vw9jp$d|3dDV~%e)AwTW-0Y4 zhLB1>ieXmQq1x)o9CL6~sDtd+n{>@lO*&}5g&SUW(TUYqs(Ph~D$GiGSG3K~XIH2* zZ(x)DUBzsAy zSl3pN!_(CV#KG4H%0XyWGT$mA0RlxvXptZmoQx{ZYDeU9o-@EMt=b9np z`4ab>1X{D6ErbAm!L@GFq+AXlm2fCUNE_u-l3{uY&k&%XRwcu1i$x2PONa;g<+OF( z;x;DBuqjimGh3pYNBP{SrRc`UdOHh4b@^{(Q96=v*ZQ@@1f{6quDSi5JGGP(40+ts;1o(ztcl8(S4s2vi=Qb*Y*A0J8tS+5x@Xf=<{ox(A&HSQa8UoZpK|9&^VQ|Wiub~&*v>jlTR42V z1U}oLyWoB4IUN`2%YmPpbO8eiG)3JYy4Myvc(6^NJ*}Q&T{kJ0ypcXF-SGpFSQkRK zl9H!s?t{5*V9*SE{lIcrO&VWHYbs1;`NjD(T=LH|_=Z%c2nJihV76(Te4y-&ww=sU z0a)c0n9Awak;rEf6*Z50rzc;I=`+PyV*w&|YONO5-a?XuIjXPht=ug6oixxhf9M&>+!qTHA6dD`iFF>IBl8a?l%EC&8lN_ zOHR)M5ce{bV<_c}+lK2`5iL+tx!^*&+mGM8b}+}Y7I_9Z8oV4$efRMUCKrQ!J*Vg7 zkn}hx=oclFMe+D}hTTOtdx(?Ng_Gr$)y(94BF%16g=_4XLfsVCro}*9Ac|`IecBshXVyM#yCS>l)9xnF!@r7zja0fb3hG93SBMfXyd4?N5oVTYXBORs z)PJ~7e2@0%2@gLs6mf8?1MP#t4lQLg)D%?nsLxxZ=z*l-loNj9yUdUTqN6^@^CLZ- zag!45pxnctdH-;7myQu(b5${MA)io? zr8zHz=_9p!#niA9lsCm5WW+AUh_bVtlRZcoGK*l)mPAEZMmJ{wbF+>{UG}A8q&h@O z;%}gyNWier39g>dmE`@gM#MaK-QNHRdv2CgcV-W07^tM zkCQZ0oV`_JFWBI2>w$KtUB`92qb3_$Py+=P$6fvA}SAb0|U1Df>Ds7m3YL1rzg@7vHueC9WTZ%dNz~B2x%uKxU{Z z#wUIHg-R>dffqb>431aOxFn&3B?^Vm8fWrg#-;UT9#`zhnxfcPAm_iTtc$<(aF6TCBqH^K|1k*N!qrl%{z^AIfU1j29K#(nFkbTk}{| zkuBAiPhWc@xzGifOZcM?JVZB#PMP2{L))vnceXdsAI8m;`}gU%0zDiZ>%;M5dC&t1 z$ismHB!L31Io1b8qZCG?hdv*PpeH6k55r^X+T*FM#~|=1-F-at9I>7w(sQ`SdjmRi z0XPgYNJKn2a(I@MQD1=`9S)Ap*onoxrTgvU(V3_S2^{%36O~6e#D%Ygo{0us<8@XV zLINFoyL3DC8P5lOeEtK6PMQ=>@HtN&&0^+e4r5I^5Y`wr=o|_rBMv%;hnTd<7MU&oF|e>sfK-Mz`@Q?#RWR z@Xs_J^JC+9&>!LM4y<+IW0P`f?W?%ravC4M95i+x^VAfy(xk`=tkoWRV{$hy$PyvU zUeUK+L6)%fMX&AU4A5c-%YrnGuQXxG`}dm+hbwN~JB{JL+!*1S?Ju9HGTZm*R19up z#=*1R5W4OU`0y4TE=#3jR=oXCrkyck(td<*WI``FT1lFZf`e_mR?^Nfib+0##3-8k z!*mxeFTR-3G-3nay;@$~qAL@#txcS2TixElT;3|X8l?AkX?eIfJz9q6PmhIh9}$7) zf6B4WGRl^j3g}-WE=lb3ZenM_;62RpaZ`H!Z94p2^ViUg6uTvanOWl_WJ75)*22Bk}5G4eY^&Z0}u04tz*_cfP4XPe5!-+ z?D)#gR(;h8OnZabNVX%u)1PEcil(|YW(|D$mwGRlsf#`+gNx^JH~w(A*u1vz(o6VM zG3#oHp?9W4voi68&k--JuWv3dWjnaraQltbZT{XK-MQ(~snD89#~@emAAXkcAHD>z zaJ6v_hZ}K8KHusOOIPyd*DjqVrYMNukSZNnyz~!#*xsg9kvpU>7I2<0-~g24|Gy*DaIY zz26?hdp`5!FCo-^Xthu(=-F!F1YH+==;BO7o&*id2_HVhE}b*fN>bC0QOr`4?0EzFCK*Z^-^bNV$@4<{0j6d$QNkD$cZwU zrt&>)(g1oDrqvJztI~2QF;{>DNtX2AxQleV%sM4e8~ zW6uu8KOSYDx6dMoSA?@ocXU)p6eDxj{n}O3IYmnfmOKmR1jFcpI`;&DL6tn>j`;EL z45TPm7H}i|I1~kPDC6N-q=PnXcf^32t{~>!Ww;W9XHas(X-MlDM{+6ZjC}zzm5oEA z(2Lh|^OO^5ODS5#J3vh*TbYDT(M>`@>26&uvbx|_ zxH!+hO3s&ItY&JISSm(ulgUjcbzeAaNMV=u_c6W0aAa6|^GFb(8Q6Na%TNhV^8uEp z2fZE$hc~Yipqpun5G5;RMIhG{DA`gZ$X42>o9Ti?99x=k}@uh2Xh{oo(IKa6h=kV7BP%&umu*pn!g2~lxNZ<$B$|YC7*#oCM z#78PALBAZrk9I2->mDgm2Yf}>(VnhF;X&Cz5Pp^S^IZ9Zr<6POZhV5&#p$&<$Vnz?VBt{Rs{6-J5 z{6>Y5wUbj=Md>5N{sFo@*t_S=*`tB7*(dgSac~N7jcde)bWC*5R#C9U$u61VZp=)!jt}H2L`d3eFu2Bq zC=|eZWzf?hhG_8vAz#Nb39aJk`}W=Wz>HQRSG_2 zUy~CpCG&NVVq(6f2v*+8;-9S!(%4m6N?~yb&u(I${d>GrY*CrMhRv}{is@{d?!Z3j zw$<=GstzJBb}uy|q!S7{MNXr!mG<7rJz6^7y^nS5`~B{L2t$Drdq=pz@|-0piTRQz zoF#>I#+RaJuk-D<^3y~ENhPNS(V`<&sgA%TlSg3OcxYKeWOdl%lWlM9W;d61 zR-tm)Ft9?u;XKz^3hBrX7<(3jXUe>w13Em;`e#{eE@r(2FIgbzj1``XW?_B z^YqUG{d0x>!Dz}DDH|nTleWV?gP0J}k(o>gAM=y~_$2Bx_pwgF*hjC&)W?{J;rfNo z4DqF6-UL@$%VjvmRSa!zwpn3u5u=GvYVq;aAquSI;e(H*?*osa?Sod*^#Lnr`d|rq z74;dZz^g>=a!fa;rskWUeie~qFk0EWCxQDeb{bAM-+v$9XP0Dd_NK7!2_K}U2r+C_ zU{@mR_pPy!Zfm>YzmNuKW0i|&__i@(z!HDoo52-=N`x&@+}c3;PwQ8qN!pTZQ8^Q-g)Yc=8Yn5|18LzvmhU$V}bLGxqK5yEgP6>7JF8<31ahV&Z}G(Plqhd z_R@B%CoQc|t)s!(3cyaFGg#6Ya7jg{wO~Q5qlYs4N0D=@n7{(f^2yTzG)gG9uE|lH zf7Rz=UR56h`pd1e9L+PJbn%`LozPoOFOP^rW^sBN&L7H2l-ZMcP<;%u{rVWW#n;Cn zJ5NH>dXwCoL3g!y7isKr6M|)8LUj!a0p0MRc(e>4FV4mwdImz62vr>5XQJSZFt{I#lAF zf4%aSv#05+i3%^13lpGt`Vhq}=LVNy`H8nZT+hTdZY(b1V!60pa}!Ea(2F#T&@3)u z!Y*L+lCr}=|0u8$x+cNkh~erZIO;IL+5l&9M4|1wh8c62yzGymQzJg zdyiJKao&(KQdDR%ijF>{^CeV`fs#AvhzKn-xS1%PxS~`&V3FiD zkIudOya$cgU9?!n%rDyd)HoW<&L;N-^)!TNdCd#t)m#;Lp;j>!c#Pg1f17IEp#xE! zUbe@dT&kl_+mlf(`$er`Z;rN5&w1Y1YJg#66ijir?RJ~DJ&C9^8wuo;EQSUL75I9U zZfM|E!^}KrXK7qC7S61MU#1&*SG&Yr-SCyet@Bym3ko1*4p{<}^2#D8Ra`-zMX+ks zl);;FY);vEqDx3RV;Q-?BOM7-w@a9SrgM&j8x*A&=b=fAIvRH3#J>6vUo6Gt{cK}3 zYAWflMd<>sH5C>EG;_A>wD0=#Jtqkq*oA)HEmrEwWn`Q~pIVA4$1dZDSYQS$nvW$n z%Zt;|YIF0;|H51KR~=H`Bv@)r949$hse}8WQIv$MOQm2%b!@RshBTOOhj6b>*Dx=4!UnhY3`ZF`4Jem_P9mfFna~OR zqXuc`8$k%?q2c0U$|ZOemN3y>2|LF*PNcKCd_1GCqF%6d5y{l%1k8`A($_<;yDlVV zSvf?=1}kc}^P!2C=1t=YKJTd_@Ef?8fIFkqOO9DFulC{czzcDEZi_kT+m{k5iQTgCwgg+Q9$$5L!5GD5lgA{2nR!^$MgKX zmU((y;77V`hSFg%NV1?*&a%)0j2M*HYyrr8r<@6?FdwHz$Xo;#-miKA+8kl@3yt$H zE8P?;RqC-TfcnamOi!Oe(EONmc#&=^uo);;C8y*!_mD;d(^w#TjtV1=z)W4NUtdrL@&qH`Ms~Av07>-Mw3NS+mJA5= z(IOK+MxtVb4=7Ns7s-kfz)9rbg1Yii;hUK-(~=u6%2I{lhckUPl%1QmcV&dymlqO& zPE{u=7H%9tMDxXZrgW=sA>+)9T3zf?4kiKOOfj$uM4J#OL(JVV%C+h}Q!;N^t}Hgx z1XbghmR1o>U5d40CU~DVZ{vaxe7c)I51SNb@V|M1Q>y;aec*=9d6z@svhX zNuJ8A+&Yx;wXL|3vZGhV^OhdZSqsnh8RAT(bX(LVI36$Cf*ag!mZ6cC!{s~AT31*X~!Eiw-4V{(fQ zy2pJ%3c1=2;fF0Xva(7N#=oj?LSO?^R1=E9h=XLO(s-vS8$^|K^{aGTIcjnnukoVo zq^cLfmy)ZgxrtpN#n1Cm)56oCT~y7Ox-C^tAZ`sWnxNQcGe&QUR`+#bKbiB{>pTUH zIUC+2RkF8M<|lb)B29W%K-#Xch@w9&RyA64?a6p47Z(-A7L+%^1VN5XRJIeB3lq%F z*5TtyFPv}}&R)pJ0Yr+Vqcjthh$g2og&`{vZk>u>ryHjc)t_n9?RgayZ*#rcKcuPK zT1YmfHzA(&w7ACVFv1LP*WIW&9>IqegHW8PnsC1`?Jwur^_FH_&5h^e^klZURm; zbll?i1!zihJUhbazz2JsgU;x>1hP+9AbwD-N=m#ID7l()dovs z)o90kjP!9{-_=7k_@J#!bT-!a?6?TLfWR~Vh*O^G%iu79#Rb7BN!?y0?_T7J(VT{` z2(azMa^N`}81n5Xbx zZKAJC27}94JR2Oe@m+7+PEK}+&&<(n!mX~?JaY}vn#yd>dNxy5vpnsOC4;;!EGw7m zNpR4`Q>Wo4N7IFtr$W1|qMwB9WD}n47|A?dp$mzXC%1$;9yYb|S3x>xL=$kb66bVF z9Wcn18;2x#i&h+p62#_9LS7X-43kZt7Vm4Qi?rn;5h2zoAg?q=<-?dhUy4mEI22)M zA>p97l0e&bIlA*wM?@Jno#Qk+mP2~@6k-nLRd=>#jRz6(N>~A-i-R$$uR{KeRSUca z8Pml*Cb%Q7m*3OK^-_QethSJ=b0ML`*n5`uyb^{nw!vhxgY}q$(5#f)0_du)ybUx& zT(^5tuaPwj3bhlo&4yO9Z8mVPZRRAuj*80ShS@iB&j`}cetRrUyLheFZZq$ok6a+< z6pfu~(P9~!xO|@Tx{#*btL0!s=0>AHy$;&xu+VRV>Yxs_P7WecQI&B#e6t7l?YU${zc^%O((6uFM}>s zxfnFbQqtUn(9gs8BW9aM)v$lqA3SUgic9R#(q&kfG9;zf>EZG{*P}EU!%3__F+~K=F%q?fMy^;} zv{jZG6Br%;dSoO$+g?M9Xdf})H&s`SI&vNWJd9)lO7s>|s#1GS=_V-M3MkQANU2=a zIgMMOLE808ChsAgGBvAtJC>ftDixnMkI=cEsv5HKN@I>ug|Ub=?#v60rq)#@%+ZRqomYcir0dUjq6pUd=x-fLm2DHb zC2y|Gci&@vAm3Y`tZd=Tux|U0mp0bFHLO{L$ajh+Il8FG(TkQNspp@cV5Qxn3)I=v z925&1Q1LG|o)Q~+gOk#$7YdP__kWOyBU!tT<)cqCv#vlhGju-78wl%RcYe~t45 z+Yt2^IK>o!JnZ&cqnTOx0bKkpP_CTB+EWF;0&84;UM49F)r62T3K1VPJ02T)^SPAf z3I)zmc>g(~&qta(4)X5vNJ0oD&31V4yFj_qN>uCWOl*bjB}|W`r2Q(Mko@Y)n8;TN z^Id^6v)+y!;_tu4d4esZjbrpCCrECh>wt3c4`|AR_kO2WK8rGonVa&Q$gk7uqu`dJ z!GVYT93dzLL()?I?gA!Xllx4o^5TgRi*ptMU3>%|M8P#TjWp}!ECe}zw5%td4dk&C z#9!KQ1AI!)<7sK6_N0mAgmTIy^0-2UY4v$3@+I;je5piKF`iUu9XX(o%)`#;zMJeT zwn-jsD~OGI-P{#vpUQ3kpi&c!Rpz1j8jR$njY3)fn08yE6QA>TU`{Mq%Dm1aD-g_w z1Vo+5KtLS@Fc3Gf8h~h+5Vo;6U%>YpcnxUoC$^DG#&;O$@Rt36RwiFKH>W9J>A9%Z(1L9CU!Izyhv#s_*tp{`zVy$Q-Q9qdf0q&crNor8#6%FuJyP#^;L zLeY3jISU_1Ar%3pTy0L+r_Q(B_}Q$jGU{5ar>?v>VV9fcm1q(kds9m%ory0iz$0Mw z7u`ZbW>8ssHt!MKCKFWh*g${)sh9K+H$Mtc=p0u`hHZ^ITW%fO_KFqoVFF&JD~xe! zT*vqZW=r!1IAkl=2_f)z@W~LG^5JY+Jf=9A9L<;rzeV8_^R zW2o(O875KQ0Jp%?oHWi1c1*H0ixwiCaGZ&?8X=ylZXf z9SD99r6jL^!h(1`D1N^(Ucp~4{g&w}h~6c|$2BMEIf&U)Wre-=G>Kes^sO*o&v^CK zjMpncxG9@HJY_k&*v28bgDU4X$+zY*!}JEZI%*HgjXr)f8Se(g3Xd7wLefQyL}U&C zYwGeqlk56~Tpo`{oNm#WJ)HPwFks3r@MOGyqanY@(FbHXA!zJ{-(<}dy;@Vp#wH)I~wlK!!AlApatLUQR;5)DO|YC>(|RzYuLkPMk=Hjl=h z3V;_p1Jea$Z5f zy`ohK!Qx-94ROHnf{8PPoIFMWJ|Q2%nxygMoa9Q)QQ=50#TiSj6xUIzQ#?@63kB-4 zRD=onIPl2|7^1niI%N}J@$0~bU?{Sn=|e2{dn0eR4$W;>W!naz5;Wl$X9Qb6BAa%R zl_G7IR`{llIz8OSebjn1-N0i554cHXcLmoBXfGXGtq}m_LdiXhE%`GJxQHLacDe^3 zk3#{L3mk-Ez2I}_sQ+PvLlB}PqiNYc8w#O}!8G84SVxzzlPLJ;1oc_(nS69Z3jXM` z6m&;l0~?n{cNhDIaSdr&e7S%{iTGJL37^91%{#AUo7*d^ z+u6?A#%t@V+1l-`b&nQ_N=)gS7!m(tx`+aUVlIca;nbtgR%%c!r5Ioq1ep*e0nQbI ztIaT!zy|>DVSQPZ#c2(1qBWmDl3MJJGAeSQoGK<=vH|E19}TGjJHi(>TQHCH7ZjLo z&_UuowugtN&eiSh&FuxISWXR>bRw7Uun(PmX8O_f72wc~u0L-TAZCb3-Q4@4MaETQ!LI4_yX(qSY7`v3Il0`1Y{mm+f_{F!?w zUImcS&r{)yV4+t$}1sX-Z%s z>P@3Ab?JkuxXPcWyr`QOk2b^_MDfVE2R=@xj}I6mkh9HF@zS zym9p%_Z#DKILdZWkauMWT79!m`JPm85q2$w8a{bFoGTx{@bCq(4XgJk69)wfck`O0 zL6KJP>EY#WnXH7BHrA}K)hpvTmS_(=V#xM;} z_y_?_cv`1$wt0G7^gFy;zuc9AOg|?(RwL5bp{SjHzSRVuO#WCor$Zp)^fXn^%q4FO|wqn1bjrWh{^=`fp$)*mM6m9 z)Z=6yZ>D_iS!bl{qj}b}ja!vrlOjJG!5F5rBjZG-3FESK2Iqkf^HxExv_R{)tL zeo8#o`Jnm+k@u~};^@UKPYjN$)~(uFqdb;;jK+;|O)S@f%W=0!vFfq%Vvm2B@mOZT zbs}S-JuV#KCPCOZIckiBx1MLyE&K(}WZ6%wJ9nxcpnZNy$B*NLnjkJb(H`4`Vp^D? zkTa3eCn}$_Anh?t*SCpD<KxY?#t#wRj`TF;-zFy^;*k8@jHTISDCnoY4c(NPFN#IzEHeuE9Dhr~uTjU&} zZ1iurwHk_Q;2Od^r{<7=e(v1(sOI5tgPr$|PwS1R!>duexbwsPn1%60jPaO|rIHi0&MC7_1+i|Gj@J{MxwlQ~x4%KPx=d^fd z?n<7Palsl-OX#$CfdFT*(bEcWT09ZFp5>mlT&Kk&pFM54PK!5*KAvt&u_orp^{Xdp zdm{EF^Lk?&;1 z(O|4b%BNa#frH3jja0Y&p+H!fis>zcB>cs4% z{hXXzROf|dBhzpMcM4rb6m(twGzCTMOx>ofIt~MOxyw`cA#l|?NV$S1My(Sq>WDBV zX4D~35G9Hnb!cGYQrCTzrLr~SfS)VQEJ~OpLyBZq1eQ8NM&ZSav!znlMl`A0^t6+h|;CdCSlbx&5O0fEU- z&E)A+;bqXFZR4F0{x7G|`6%M(erKp#1KoZgFC*LNX9s-Z^0?dDZ{P2Caqf~jQf2Ar zSg}%?Y}P~GPK;fyx8;1K8v$`{;K+54k+?`Iv>W@2?;H>M_Xe$_CLO>XHm4rFa&7vZ zqt5=IKkOflnh!d|lU5hVe{x8FTEXum_o(dixbeUbNC2Rv-(9K=WX z{2VJKNsU8DT0AJ_0-%~q_uzt0Hp_arRc$aDb+Z26590ePG4&DvW1`B!HzTlY7~_#t zl5XJTG7*ePMDpQEkHdcR;^2P14be+RcbB!mP!Ro~jZ)$xjD{#lucBr>utC2+;tW)? zpDySSkCb)(?fG{(wx|G}Ye@=SHxltFvUY~#AZbRWh$vkLBP=0V--<;nVcfu=z{-3k zQ+vc7saEepI65-a(o`;&>_z2q+vQvROW)<;-}~6!XA-ZCZ_n1okySq z(BBjsOew^$cv05aJzcS*e26e*tgN{;J+z6y5L5mDbEU$#!*1b&PiIl}kRt|<-4tD$*c+yvR znzGblltYA?OQ4n?FlxmpH!?pPHtSK$jkb zcP^Zz$#{eb1!*$Q(C!$K%lFR|Q}(I)L4)qw$ZofW@1auY#CMk)H9GHkvX3Jrd@vXP z;EQ(zxCbO zd2?fTdvl$xr$GKXSA7}W)}4*z-S@Ml^{v;J-p^LnUR&E$oFdJe>q{GNyq`^iQj0DV zOmf}XT3TLB=DxoARx+=;H0zspSGSY6ceb`Fa=BQ7i`tpOjUJzVb>q(Zdh_B%yiR4} zH`xd^`Rw%cr5kvs$Z+Y#(O$NHGRWxKo92z?{B-k+O{zSv=B7|#p#1D~bFqmVE3xL& zIoQAdp42Pu8X>{hpRuVLAINdvr$?w#Q~MgX9glm+XVB`Y{fY?A^}P~zLcB;1=> zaqM7;<{mA~%{As8&EwzoN!b{N0-AeHtn2xmO-PLb1*=p}#UQ2~J z!)`Z{hdQAS-H4A*$Vt_czEGS*f=~BoZ#cpoWvCsyT_an5Ff#c~|0*jt8r}s821(*^ z!%?Uc?cL+U#XRJLlDM-V3d`%>_y~U0n=iZdF{|LK@+xVuoTxXtV35jJs4k-%+AaA5 zuuKuEN;swH3cqTvcoIWVyRmx(r?Tax-P=n$Z%kzyc$#irLZ|?+CBBv2UftPQdTn(l zOeKE{Q#S70Ufo_>4ij&0ZmjMuZGS0DUEclDR)oF0xxT)%i^Qp^`R4WO+zugbQQ&I4 z+_*-reS7IG`cXcdqSWb`Y4U?mYGjDlxPys;D{hRY_M{>03EC)%$G8oNnjoyGP}E0} zr5Qs=nL|i%`j=0K_})kRK+XLkum#m_o-CV2rGBLQhz61ZG)6kkb+b1y6z^kTB-YCN zd7bV0>=ZzV+DOR<@Y76~BwLu7!t0Jl&y-{o<}53Eb&^}3J}Iozr&ZcP>op!#ADE9=Hz}^y!40k(66x_9=uQkP?K2Rd*$qPVIE9A8WC_loK z0N9YiI9-&^@tT^ER`=F^)EFXxCV7@Ggo5TKRZO=q5J*S}ssyfrF2sF+;>JJ)wY-PP zJKv@i0248G3rcD3bVFKG8r-7*bIQnJhsB0cXejQQ^X>NGkg+`4UG8n-mgT}cnV$nS zYnR|n%)vRvK8Rl&OFzUsBf{$pW0;w;Zej?n$0*sSnU6MgG@9WzcX-?#$6Xu#Bw0!M zM3m?@uaF(B?Pw|2dYutw;6+<%l_4-@_Dc$KF-)XRSLf(Bw|}GIGR*x0T9!-FmS(sH zt2CGINGi<%UXZT!6JHlqqCO{5nSI8kf&g;EIBxdn4UhRlvoHbMfI)es+QUJAmME`= zgIELOC1y!^PBg3wcjaxNbX+}NYED6eRG>4{L|GlsKJ)-s#kGLorZ%K^6~a2g2_p)U zF@0RdD7)1{>{TPiUA9Lun@|QCR(kjrSY0DQ0qLN^#wMN&L&N zjhBXs?JbZNTUhl*VkQDF!rW(R5#&q1l}v(?DKD?ioHnFh7#de_b`T3Y7}@?XZWy%& zI!HBZ5d~p^0g9sasY+Q4*pNNh78liR%F5Z8UwEbQ@J?cKJQ=Fh&8I@m zjbx%>a4}s0)U*n8dDaoL7arSKd8#2;;eE0Kx=h`R8T`)OGs&1tK3}X9-~8K!#nP2? zGt1IGpxjj;pqdnEI?X!Jy1A-PDpmzG1Pqtmd_1CQT6!VZ$akZ2j|x$`hJk7CWAx)q%1y^0Hs1h87SMT zmBoz;tts>pN?bj^E0Xq5@~|*)W5q7`uSZpM=n?{tEfZI~jcX=Wu89x@GcipokiB^v zt?-r=I*$X4ZN$(#fT%EH?eedjBve>Q%H5zYiCBb!rBM-r=7RNElD%6@o2=ECko#WRq)X(ZNH7nLQ{X62JPRxT{b|95hwO`>3CkZ*nI>>RI z=Usnp#q-x4Ou^IgYt&=l>vLzb+cHIu@7ajCVAsw5gV7jRbN zo}hE#=Zu$H>0uB>PqtPx84W51jT`7A3^p-*Dhd?T&O!h?+&WkpnvA#1vx@W!r^6+= zPlw79(@g_3`{lkuW{wxSq5lR@=VdM;jZeXVSg4#{MW?GDRr2X8SO}b|f_?Lxw3Zb2 zG!-nU0~L^1_r-8d1$s2&O(2dF7S)Yc&|vtM>KQ7x#CdPFI^Mc& zX$)2xYOA2BB0|5ef-VcNX_+BRteFxAtK#QdXQ^-1Ku)^Vc-%6Ns=}&>mNn2y{AfH@ zxeGb_Pg)+F#Ov~xJ(l~zc!?^Sx*Eu*s;zYVtK#SzR}}hcpiNj?RRPb_zW7Hvp(?gb z=v%RC%5;u-ES)9fj$qXJVW_x2V~Kv{X_~r_c2TV(VXvY@eRHOqvqoHI3sz#)uh5O_ z3C9o4n0;RJSo-&RXSm)-UsbHA&Pv1*!*gPlzLHo%srbMxl25k^QdJSxi#0YrnQE=M zhLqc!98bGHDuZdmQXOASkQh_gimek`i2b@F=OR70;hROKf{8oupciJ7S{}IqDOcB8 zYU9fTBsB9uq)Wo2shFs;Kho{KakZZF6B-7`Z)H$xJzS%8QG5YcYRMbfoLk<)^{a=S zcK3h|J}3Z;MYUutw_k)WxiY~+Ti}Kt&li^yd*@E1%)-uCe;cg z^YCIUlLHp!tun2g934GwU`GBuaKlau>@l3B%{-Wyn&Z8Oe1f^b2BT2>_e-FtteAtw zo)}n`0`9?+vEz}lrim=}CpJ#-={=q_y?*YQ<_+4tijTAIH;_cX*n~`55_xCpF{Pbl zW8x5oMjM^8o!9Yoxs5MvY`Vwo758`-8;cZR`z|&UU73?j4^uPer>EN3q}*hkcKY%O z_{BwRIN@&=b=`cf<; zJGn7HZgMQq{-nWEwx5fsq!AN4h;m7svC$vx(q*Rkyp>+J6tHI1YQLecDS?Tn05PL?2mGl_@>CP~mZJ zA2mbYP!G#hv?aF_z^EZOul0wm!Jx$-_v`d%mp|85Q~@4X!G^rNPylrTzl1nY5yND+ zdSwEL8e%aVY*7lA6*CCcT$+pS$AhBdF=COC(^#VOuomMvYns4T{E z;iVLfs01+!Q^vKc2&`9WnncGvsL)aFVJZtBw2-W7jvkG1fJV`~(xc;A zsUhqzgCXJ~_}1gtHTp2Tj4Tg(?#ceV18=SBjfra&)0`&)TP|#;_kRA; zKM8IdDG`X{82<6D$0;?5T$c#J{NaprjfKUeergqLE#`dw8s}1_8<^cZIXuL*Gpw<^ z4Z;qG{t0?y-dYC}_v~K!MQ9(;CdhMsA5Nm&AR)$P%&~#f^*F?1K6UDui-gX z=p~b^_(^7sw;$6Ztkv0JyMGwn0~7~_@pR3(V#iefiId4+*>x(NM%ts>C!;pLm#u2_ z!q?`>2xFXAn`lR<1B3|bj_qqGrGa2J;=Oi~!iR$Mel9x0$2cH4(oBC#gNs%Ctw>@X zeB6=6@xSgU3HEtMbAH(P8k$qwouUQ6fXwYb)2+zZ5lq$1rP2MRIl5N14SfWKMi{+& z&4d04t(w}WKF1L7P}pe4fD7?Dkj~R^TCz8~cC`-91fY(*9ZVUgDS;E)xrwc^brmE- zP@Qo=UqUw^?Ht>7e5)1guhZ@b?xyFSJR*xX)gN?;l^$ZH3s*PW_^?l#4==m4r9<3A z5hjrn;w$R+Y8!{i;53Hn2wQ=wHycf>z+7yvT)`wS2-m6QGJ$+N?W9>a_T?^ul@pV& zki9W%W1BP`0Q9saFmx*A3%qhUzXjl*ugMKetr#%dKpaWHw(8+PvX+6PSy2ousN zqT`sCM4<^OIV?{m*3)DKa{>vj*3x7&4As$sw@p}@5Y;P^tW-}Xk0YkYI?l*AwoXP$ zhMkBs94)gYJ?B&wSZ|`u7$kbY3?2?y1Wr z4mTR^Rk{H9%$YsG3 zUDcUInTJI8hkDWN#<vP@otlny`zmC6O)x7aAqI{#3YA%SR>jQ4Y=go(Ca)N`h>D&tP&kgrGxQtU^-J-3DzIdvZE;*W{J_+ zz_p5nGT3BleIqGTjJaXh1-Ddm>g_m>D9kC;AS&>(O$eW;j~eK~q>J$-Cl6S1ph!uX zhOUq;jZ`X;^lo&-m(mswa&j2qUQ!**JBO38U8wm8L`b=YgmUd5#OPpgu@cwolM$YE zQ$u1i+Wi z+CJ;%69?hSA1A>>mp)$rQd*OVU6 zenU=IH@UeDvIm=pkTHY$6TeVj|KYW(`94g>w1G%5s{l_Ot8#GU6nf1JDSco?;unp# z)`x9goT6j6y=igWJlWZHo-{R6gsNRD&>JY_?8ep!Lpv!19BFZr4f$27Gzf0xsb9P3 zXPHXI$_Us^3_j(Ej$h^zDY6%b_750v>yNVC3=3RjVa@1ENXAUXxcrEPI z)FeeW19&~O2}BCeLMoGpK@bs001l&&0?Hq;SQ5+0YT#=8F@iJD_UrNIh zpzvWslt)=qcBHC>hF!=aJiC@~qHSmBUeJ<1d=KB zC~U&gm1r>XKJMhQjXwo(xnOa}R{pEmT8B-#bk(rd%aZHuL6|BScds9%KTn2`&5 zY=G^2M>s$E$_WN7WgBJdR7HiBN{VC96BOo5dzoQI*tF4*Z-SKf6vWa5FbpN;O45_T zU2Ysn;ZhS;h>qY2WiG^9V~8ntVc}OmO$jmg4#>%cw6>(aI{cBDU?mIW_bB}`RUq&h zPSg-n{6fIPzo^t&b;UZ*2dr*K5O3f^qu^y>|D1?cn+q+C`1Mp9kxfY}YC@i_Q(T+b zUb)#*fP7lI?BJt*u7$3}Bv$2Q(gmuV0Ci$1%T+nX_@nUQTTFe-polfmw0L8ot;aJd zy!5Y%U8`Cip6@cP%Qoy^B|ZD@{SMz7n!9#kpX`JJqLb#_Zmcq?v+W-eago?H=l-B5 znB1#RJGs+QHYV3BpZh?E^taE_(02MqtzJiO*2{MI)8;qrNKR{=is0eF$>006b}ong17clM#mdS66KI!x(Des|B+yN^DBmgbk$;E z-W?+#u)(Mr|Js@WZ?$ss%x1Ja@FG}4Q7{~?3Jl-DF-;9mQdHUlid(v*nLLxyVoK3q zu%4odM9RcG)5$d`Pr7?d`C<5`Qi|sUSwW6rp=lQ?nrrWhX|H+iS-htUGG{6|eSl?z z!&i1W;8FXCKFTsrpDxcZdAH4X#$ZL1KGO;pYG_Jx3Q3ELGl+0U(^F!c7{3d+%hVj- zTLeN>#O{!tfn}2^!21%6C11y!0k>lL5=A5TnXcgDjE1!3B=7K_ZG3!1J3yvN-ycCwzA&+w0%}-edl#5&6`0qBqZe zvoNcbXup^$J;Z5eIaqvTXLaya2-?@ zoMYh`J*-=3QF6!PG@HBOfa2RIa-lB%`~Yh$s%2jZ3pmz5_lISz!M&3sY$@Tc=WGNr z;O2_6JRLrH+KY>U7`Y~&1}m>n4T)D#sfTSOAB37gO<2Wij0>uw76q@W5Ze4Ir_W&1 zWpdL0cf<-%ftDbWnyN#18tRI8+DxhASy#wN)n6A;$)9p#qBq+9P^?`EGE$QHA=)`W zQsk-YN@X;km@iFA{4CBiIWOOEqbe4CmxP(za%=cfDSp9~T&-2Qk_Q!;wexOg*EI}u za&1Li6V6ma%t+N=A7Pztk~Qlbi8^k*_C4I-q0Z#GfgCrf%McYINi$y-i};tRpBAM( zW#l5vd+q9cNxOad@<<^-_u05ygzt+CKC2R zY%fOAwpcz{=k}hoAC2%`h5POO_uAAb;z|zh;H`n9n{AIc?=uD#6S2z*V-oP4syh93 zCiMTGyZ3;us@NX?=Ux>H_TIUoBB7?xMHE7S2!xn~CgLRxh@_E1vGBy+3wCUvg4jEX zz4zXqVnLr>pY2(&{yux=%xSkIA^2VY^`EuwJ?Bi>vuDq4Q_dVt#*)`!7;ag7AiKSl zrE6YRch{5MyL`;?JRCzg0Nu^)+ux*@sQvSW36k5IMyL3KaO(&x{ONt>-Whdx9oNeG zML1epUz>rmeJ%6}dAqAJ6wPahRdSj@Wo}`_=Yeun~#4T-;rnZim+g{XRz+l^v}b^gVb=yww~NXJS#rfV-LXTy98#c&R=}9*MnV8A&)cDtWSHbj~PBTC>~V zewen9k84mbAGu3xn#ucK}a@%#$Ur5N2|Eu@yN=?xH=ZK$ccBS>$j zSuGZ`I!z9kOAB6O(NZp#(c>k2mkG9Tjwcu~w?ZGXAS%l$4JV6CI(U^u6FR84l_X)DjolLzX z&6uGeiuj81eQmq#)cuZU63C#M5R0KNY~qm6q$$Iir*oD_+C4l@~Hbkv?+t8p4>E`elAp%hG@OIsdI2HuuW-3FA2QHflHHff{dhrN0ZlMTi0E- zT1(E<{cH)Ijuy0)#WnpM8_|Ta&?ZM#bBkc>Z&z`f6OeIoX&RY-BwBLVx>Cut=Nge& zm@Waz`Vj4;-MT(R8gyleojtlTd&7Rc(kdK`VGA5e{8Vg@{pq1Ct?ZsopwwRNoX>b{sK2kwrntfd!Q zle0jMI!y-AkD62Spg~QzLDh1Ac0;ACYYmP|aVo59Vyq&2KAF8E{96>se$$LEv&p}r^2JwU<;oKzw_6?`zHU*N? zA?Gne%9a+%)(kf_9WaA@5|HT%!8Xm#e6(AMnK4Remb?|=`p1JgHoLsJp;DAYRYj?6 zR`ThHP}!82h4L8@@HpN0X)a#j+%gF(`>99*RhB@H z_{_>`jw(w=DWp9&yc%Rb;~j>Z&mcDeb`P0f@pp%QCwNE?zQ)ZAF2j|I#PJF{vrSKn zA1Hdb$b8K&OxC236I4XfT<%I#t6=&_*h2n90to)}zvf4eV(kLs&ZxK@+fHz@8d z9fFxa-B5Z;eh%eJ!^v*WqQ# zz`_mEwie!V2E&wNNF&9qx^+vY*Ww}_GHCMvB&<+}t4^_O7Z@&}+yU(35CY*kG|t={ z7`R!}*;%)oZKRBF7@~)0)tVN!qdp;6+lotxb->ZzE6&iRs+N<;T>rtDu`^s_&eM1J zX@Z%K_I0Zr>*mX}JiRS?#guQUbKJIuGCJp0gkp6&-5SEW!PXp(H>Dc*KuH7kHC3*b z(p~=0U$l`YnG;A@=x8O2Q8dAFxHW_uP-@4AW?Mp1qIh~Ll$c2cKz^N68>d3T_5o4{-%c(jhfu zC0I;PIqFz*cG2j{O8?14>8ZGGG-|o;+;%0lg3&~H#=;(*6vowYz(r5bYYOX9-v}0s zpI~j*!-zE4i1h$4py$GkH4am*>^KM~xpXLGG~&Dt8^|N#w4Sl`ucR>KH+`l*?P6|8 z9}}Fp6x$|a#a7Hs+N{zrpA0yB(bmaD%TGzm`6dw^jBDK~Qj11-mNYFuJ0+j@WC&3BuJk@GORV-9#}?j zS*4{$X&4?B&O|v{H(b}~%K52rNSYE{a!84hH;QSwOH!^TB%m8yPDojKSeGa3nS{lI zc0n_Im<*;*rHYEBV*_FoOb#tcB(%RMpdi)*#&oe+$4QM;IuQ$EA7WfxFy`<6VD>c2 z0hfVfvb;+L2RBB(eDt=cCiZb*FRfj7>|~lgO<@>eMJEu`)sGhm1`a z2iv$*3OfMI%iN*_*sQ5Bw>cmy8+Dt@o6PnYy|cik^^nm@@GZz-y3Lp*Pq34F1Rw32 zSn0Xe+mmQ`+_S$v_bFkLGfZMnE3rCe#_$GQ%E|*J^sv5#0zN+nt}EmfKWFbn$|{1E z#m@dFR%84qKSEaM{Gi*CD}ZZiU||Gh$ejwkbq48gLx9tr3CVC*Y6RT*qXaW+xiKNZ zluMX%41;emgJ*5SMT6u@K)^?#gf!E+)(s8=wr#TWhNcg~xqJ-b?tBjUAQn*SF82dT zq6-Vzb5vE9h7E${lOrmGkX{doVz@oNY|gZr0q18JZ-`+4rf!%A%_@tO^>vAluAEOp z(lpbBCa*4~AhNp*lrr6ERw@9pt1alS+Wr$kOq~`^K^avwl=J=B5HuZMRh1YYToOv5 zaTB1qE=f^cU6XdFQ)kg{O6WYk#TT-h{tOCIijhu&%k7(4X(yyq91@siHIsNlD=MnZ zK_T+I{!mEG$UzB9Nn+k-3wO6~;wmA{?Yu&7<|>#eFm**zd%7x7XuOfw7_pqessjVH z^vOlq?lRnCEmCg(zsO$y*IWWGK@iK-e)U5 z0eIN0T}wr(tlHyjT~;F`GMy7kTfnbs^t)7P5HKPeLe2w_)E5rr7NhF&hw-4(q8Frj z%8tU!__!fhC`CuPy;NVXjg;>88cyb^VkUTSd~_3gs0;a`*-$+(jil)5+ZJ=#Ioy^q zI*UDND)g@`fsGoRIp%zd>PhQVchK(cOhJ387RvmO8?j5pVvaV&vCyKdGUU~2W9QWqq+5VA(D z5%Ww`CWgQfDCla^MSwCD?=goiogSGpbm!Z;-%H_RQ z4Mf+-Q?whlK9UVT(4!}8a;j9 zKBJnh1~XSTc6znPda1S!d4zWdfv%lteVN2@Wg^@pZ(pwO3OunD+L|G?-ty=lKc*Y2 z#i1E=@QutJc9g-JyBM2xxaWZI+V6T6j;Es`F+0_cGZ0IwXVf)RHO-XI=;@;b$v77eHu(5Q(~>n&Ri7xA*M5_IJ3ESmJ}OSWzLkbR|{3LQHgVL>adyY zHA!Y_(5X4j)xHtWZd4ubycKUBvz^ri_M+-!o@F(`KC(Mizc_CZ6*?F&_C_dSO4=LV zpNC8QoT1b8w$)%+7g`b^v_qc=!J!RRdVg)`oCx0~)x+f~%Jje3#x*&DU|{ zcJerh4o}I8B!Wq8CUk1nM`yeJ?sN@l{|BX*xGMpkuXG5mp$@&MspjJW`z)Od59mja2dKzopsL_aVC%9;^65YW25_7)?$XIG zH-7oCVMhnPPJ?-!N28FOhB)o_RcGswYK?Z)2P_HTbeT!hs#wnF zLD<-1l)i?R(i7oX{2c{m@eE%@DR>x!Q|+^hVpz)s8UZ9BgEJ&cIJydzQbMF0{Xt`s zL9(nV+1$+$%%aMnTn_LgC9Oz1D$%(}!&+p{FcK|+f*$D(j0%GbP)B!RvK$uAWUWqG zC@Gffr>zD`3(d4#VXq$V$MY*HjmfZS_UiVE!ykJ0l_R|7G9*E&b>l4ndlf)QsbYB4 z@Re(~!}PY#j+U^G;j5O4Q14maNxm11>d>j?7`N<3O*HbJUUmvqj{PIX$>>8{#PE zQFYb4Y_02z536fxs?#HDTTJ4e#&dCiBsDp%_hXBOuexv&>V&JXE@Hf-PChi5-~*+g zqScD_>SnWYn_M@_2O99X?C>Uxv`$UhUY!!;i*R9IV?!)sIFHhfW-}%)jUH=NdFoGR zi;}`f+BT;lEeL$Nq7Ij7o^c#^+cBZ5uB5E0qN<_N`H*5j>*`99V(#>7s@KdD_{JKM zM8%SZ?jd9Y{ngN3Q;`BVW-n~vTIgA)zpN%{O}~ZeZm|~(Y>cimF0@CmhN`v%GO9)= zw!%<*)2_BeGF4_fP$avBCR&*XTsnye5g~wl3lwQ(4PnkrXhSmgZ6$2+Z4fZ$k^njJ z(1dow)nnjRLP^CKwudd4G{Tnx#6Q~i|7f>s;Oo1`HPH3k*<#FX2elwWEpTB=({X7S zSX53r=}lU5V8T_Crp*{60g(<9qcyZ<6er9oMk|kwd&8u&HTP{&h#CwfL?I>vshil) zE=%M#AXOc1hE}pfSn28cckoZzVcJpzNS?(0rBM>C1iBvR)UFn!AM_+PcUST9VMPRS~$p;og9A$+#HtJg|oK`N9 zv#CvOp*`!N{?s*C9Fk+GX|*2ePY(SbsJq=PYH>O5Ia!z#-AwU>M&9QFfUk1)z4*v!x2!#7eSuD<7^Anlet{EH80R8pX`( zcxid?Ml_sT#L_jnR0menZ7u0RuLtUQ*rl(^%V%4Wntv>rWZ#9n;AhIROl~)Pnh2L# zdQDtf>|3387eIsb^vYPm3Wc3@l@_x)GhtbLjz-U?Wc$8L<3e_C+`cnaP>;Bt6n5?? z?e8<4=-VJ5&w7ofMYNJbb}%%HJ;^&qR}nD0>4=dcx6_{uDP3MILWzw?4=&lDtkr;8 zopF8Qu7xQj+M-G!u5)o1E)ePSh3xx+?&nVBCBo1v+u<}}czW4D2_@PtPKf3U1h%fm zsu{JF75a5WxY~dT#0Ac72&M$;4kX!{Ly@}P1TP!aFA|nFZ2ZXhsJx+t@%*ucW4cBn zJz|k4zYS6*N^9+tSFRgFaZnpBuhKAa@c7f0kdd*aM!}Ep?A2V7F$W(o@RZbt3 zovr$0sXm!1XQ0X%pmK6lPL|5aRM`Vn_5hXLUuE}I*<{O7Sp!wp0F~8WW%W^6IVvk# zWf7UF2C9ldht036odG}8RaZ41R?}Eo-%wZ9=-%|q>@~1gj{7J#pt267Dk`T_uss_C zr&rgNHnkH*c|+6OhFXA#t(3!AV-?cRGpcH5#A@p}GNrk`zOJDOzOAa|GaG!LusT-O zTvc7s*z2&`SaD@jljMw#8d}UjF?mHpOU4x${u-HIF!F#*Xqwqq71vjmSMkldCRA7> z=LE&-rpvgcsiCeq)=<|Bh{{G?8#Lj*B8HI1nr2ot#^m!JJk$uBJ}N%GI4_=)JuJT@ zUXnjHFJ2Nur0RGHr&nxpU309wv{q1VZmf*uWcMtq;swyE8cx8E&1Lr_Z;9j=^rN>k zGjr5_mGkPWtIDgI_KUImb8cNjg|43Y__`Uj9K~B9+1Tqdr@XwHt(U!K#=u2?tOIYt zq+$uPZpI-EGmdkEEqp_SYA9NEb4?i^Ly={(@`kE<`GA9}sB12(u8hSexp$M%a3;1#%v?E+ z6?uro{V5W|_l=#>4rKdSOs6PU5u%9X$QP$D8bnLMFk>kgWFXrIS;lswni^c)m zeHc1Ce-bk3i`Vxi+R>2%`YVS&<*vNCvb2Gl%y|RK<*!WsO66~W{ON>#a@SY>`p937 z{AJ5umO@cEbc=PzFBihfjfcGRt1wz(z zZn^4UyJC91(-qwKy3gx9xf`2bAUZ&2ko&Am|D%Z>I?0RU-k)XYBqvKjNql(zNd1sk zSe!p*T!FrqxUN03vioLm$?2b=vU+9p@7rf!pPar~l|6F?j8Hkf`ebGg$j<50uU}<% zi6FGoW8~PFCLmz$6~glwz5E`t-}}Gmzrsp#IFPek!YPyF8ql(x#dCCfWd5 z^D;?klOpEG7vBT_1W(%+V=R_0g7c!qkOi!o1GJmAZocF|Ua=-pXOdhxIzwqsOw4G< zuKL!&#)%eGooIcr`3*dOirF{d#5k}$d#qb13zE7by){Kgb?nN;GuQf*9yc zXs)WLY~m;?7_F^td}HZ!J_AvX+uU9^ytGliKHV;1F(3pHefY^-8PekXc8iZS&Zg=* zr>?3Zqid||UVAa-%gBfweRQmAe6A_S7sbV!#aHMWjbs?t)jV1URU)lF+9Q^kA+BuR zJU(F8*eJeadqy&bhW?j+P0V0@?v(pdoqm)L9u8*T76(!}N0j)cbcV{ACH}9_`HuK- zK*lG?cd>eS8!((QP2rCT>U{P+xxgFC7E*E~^fX1XES&Vjlnk9*4auEN=o8AkubdB- zBe;C$mZSmXz55mdru*LAPUJug<*_e`w4pv*#3OYY}dLmeP=_>t3wPo;U^h& z+8GR+!#8D@rV{tvXhu7-^;((NAQ@($e-b*^&20|(Ppr}{%`q|hWy@AT5lv@g%|pE{ z7^lP2*$$tajoj9lcPf%+3iU!7#N5tJlgB_yc&#{1iMHf*8>EMd@|3P+9`mQE-Uo8r zbmyb8=?LWkb(yF2&|6c)QqZ20oCdn>5PPzP^RWdqS4gs53DSZj{HUQO%jlwLc-5yP z?RPKI6c*`73q5#a5+Q!O@r1F6_9-xM{`;*fpa>dz2QLz@d>210|C(bM}l|xn*!$cWUNLTYFH( ztLxG!jbPrHRW0cE_G47sf)+zar4oa4SYlBYd=NhD3#7<3XixPC2akjreC*=yODDU}g2NytGOgE>&|J5ePfvNihc7kMa$la1vUFR* zS5T+p6}L90+dnvs_|kHMs9U}G*7NJ_y$n90C^`%Q-p3J@V4tO`pc%tqHqBP{B z$rgi@IUMpPD;ywgvJ44dr%Ia1qTnM!vV3-6nG#b@L<^MTBZNt(7BqS01(M7%tNz!6qeU za^`E2pCOhqyU{2Kg%a}zzpRs(9{RLS`nJ1*=d~&kVo~5@Jm~?NW+VZdz8D9#G@Eb1 z2mLU^E}jeLNoBHprt;*ug9k1rHd6Omy6K-_ww8Hof~ zYB0V*gPCOVIZ?@=c}(w?v>HL??K!L>gt!LMLR;Her;Ib*7Pb;;DYFikCUk>K1v^RS zB9f35v)hD8N{DwsBqnJLT~9MH-7;!oiYb{eLzPf@%Q;;1yqT-ElbdNA`F?Xk^+tmx z#(UzQP{fB%VO?WlQQLAm3zfP8%3DuT5W4PJ`ylr14OnIf&P$?(B(iL%0Y^5Yv ziPhrko3cq)hib(W=@H?P_l+}axofU1H+PLVeg-nHN;vuESujm?ws2FONp4Rort=-! z%F-IYHp50#mB*cg!STH6%9|*M`Vx z8mQBVP}5lIXfaPBnd(x|$!8tXRjN#43Mf!%?EL9vVAh&!iO5x@K+Zr*ks7WveKw!< zv7b1U_Z|`_2Fv+geEA$c2B!H*`q8&vF0p8c)8L;>hX~V?_MXOC)?m|78+l{vh8Ek_ zWn-C&_mimH;r~H{D(j|q&1j*LdYHTwmDEk2Za(YkEvO|O=Dma1}nVzQ$o*al>DNvbY01zW;6 zo;ydh3UB<>!$Ft?EvIc|DA{V<0y?@LSH(Hn&2D<_5}zns>)J9mo=GF8y>=4W)kRue zb%_s~uiy0vX-kusSla*EWvFZ*DY0a->Jn?Qx>QS|KJC~=-?qtXs>rFYeGJ*P{Q9D7 z8IL}0jK5?EH{b@Vb|42Mbw~TS+Yt(0w;7jPP|{}e-&pBd{vvt`NCBS(GSP!2YY+Lep9hrt zAw5cEm?1A$>I|&-$>@xgw5AH>bFy?^lwx93MQKy1X@^riZ{b$pYM>zb;9>0yPCl1g zOR+JfWtG)BMo;^h$BtbS;W`5-BWP`Gf@jtpt3LwL8M4N@RMiS0&6Zq&TR*b2z7g$c zch>sz+U zYKFhB0Xc*^5`1qn27u$rdDFGgN!O9F^5!P&lB?u=)!0JT2iMPm>TI*Rd6jA!IULqS zh^r-`V^@D~$wZz((MQoXvW^hg?kM%cZXY{_d&^1#2-~)bRgs>n66Vl%9_PR-{qR~m z_Nn4HWS4<_q%~sNrCc+d0QW|APLewfZ3L^8{ATTuhpZYaBOu?ikMQ!rBh4|$T7{q* z>=!RNLv_|~taom^0v3i7*QmW?FL~Dobyr$m*En6Sji?8?HkG>9Y>6nZtg6;mlaK5( z<&k%_l$gS^2H_mQo zl4u7VE;?G!l`)~9tFI*3Yqs17y83GJ3A*wK4ssE6^;OW-H(;T!g09?XboEW$4Cj)S zDK~5)I*h z4&&udYgOL#nNp;>jdNNu-??^~XVDW)t#PqgkM!FgRV*5!L?%|;yV$%o>lry;qqMB5 zx~j3MsvQ2StVZFq)#YOrrlGMCP18^{kKz;Z{id}rpUE|!p7z~JlILj*(MAEwku@gZ zR%JVnMgdP45$nRR5$~i5p>f{6L>XIS>jSTer`S+F=4PC4XPMP z4yV@|s>-O?;S3?pjM93UFbc-x&1({m$tf<`Dr>5m3QPIqj*WEUit(`V9<8I{qnssY z8cMe&oA@Xrlm-SAChJ>4yJZ{wFvq$X~(ad708g=rbh%>VP{UqW?Lr| zdNgMFAFPpcM5z!uRwN?@r)nIQ%Ex6X1y__Qzv>1rdO+YyzBB2dw>v!9+ zPULAF=&{8^W8F9fN@;1RKpz?{?C(uDUS|t%rNe8GI75~2{&|7SAa+wj?ErFI17mz5 zyfo-5154=?bDLi=&zD@yKGNKooXzAATAoEe`?54hFZ%Q72%V{8SFa+6A^Z^zUnE5N zac^ucE2?9Wz;I1-*_g`G>5clS3rYG3YhnmPV~2B)fXqPpVd|o~dS@7(p)}<*buosB zO@%`!$y(Ylqug=wxSca)s#U2Xk+E)5rn;vTb*qrWph&g{9B9BJ<>h~=A3BG44X)QK zPmbPZVZ`%N#)_8`>!O{Nu*#Ia4vyQb?n(wCz!93p+93H@ul13sm6sXziX035eZbAg zowY>0eb*4pIh)F7uY3l9*7@_=rujg6_$J8ex+S$_qb&{wdn~W+`fkDxL2kgC_gJlo zPEXb4Vxhd8Nz_t8%Y5zkyKhDdS_G5zf0zq3T3TE9So0soAPK{!;9!3CRI5-AUuEg!-|I_B!Uy!$R$Ea)=zZO|3=FdiB2i?qH1eYL};!Px{PBI(SLQ+V<+(Ix5C3 zDX(spk*esGbr@E2AY&=UtdXLc4_P|N&SaFB=^G^a?paLH%2zK~m;&9{8X{bv;~js@ z&clY%wCy*&S*rP`EU@T-`N|4M$Ow#Lnh)AHeZ20|*#=|TV4>S66Xyl8p8^BaETR@? zExnr4BAaV#iLQu?(;Ii@tU6A~fqafj0&Qgk&H!8}p`Q#)O>|U=I6-Zm842+~d42u5 zfbdR9T1NmVye66HY3wBc+OrEr{5bfr-5_LI*Et}xTfD?Lhw(V1@7G5dw5f(=>=OAj zoZQJ2np~~ShBEp%++9!Bd}%xde{ORmsje`~)~}z0mz|8P#TrDcHvu?T4(-5rat1 z{;>Gi(s^;cNz9XcKYF%is}&5D41Hy(w7QZdf;tX8lvyt!z0KG=zOnDCs??0!yfl?NW?b&* z;&>s4+ZN~LDwwtDNKt8BIbODFH$z+jYM(0_n*@ye=+q(4nml$S)=f?4XzfyW{koB1 zoZ$#32llImIS<)TlQe-%^xo8>Q^w9TI*($J?T9Wm#bteyYT2>nr!eM+P8S8yYQVu} zr>oWxd}9Qh*h+lv3 zv(7}n{#ZMI)|iwKp7z_zz7!FS=2_6b{nnw8m2+6Lm7@zw8|FLy(1^UDxrMRPGIPXr zS!H>toE}|}J1jP%vMH~$p?ZGaysDb323W*$_NcSd7R zjvjAgH}$G5FH^n8Rm6G^k9Foa>zwS)`qrGd?cC>%D<~c}CeL{qUyz?WZn*R0J&df0 z_0AjBSRU(LRFaz&>pgZjKu6Sd)`z?wb{K_6R5%ZF$_Hfjs;?*`ZemWXcP%?wXVk@d zQ*>fIma_Mu`LW(5g|Xh8=2+KIR4J#055myb)HlU?>n(8g;20k(2QY(scC7cvF=6~U z51A9`+k*dy;THd~+)ZxojQdtPos}QKyuNc$C5PlTRvyOGkqo*Ud)1fglsY%XX`;>8 zVk4_kH_|qaU5!<>c)L{f`}nAF<3^jDqFT*e ze3Trh?%d0vmPL7mOm%+G$lS4Wl&K*w}Rdj?;udDLgD$x z(`0Z<2a4Ge!APlydYnj@Cj2~idUJJkJ^Lww<&wwFl_M=N&>pyih?=rSnoI`jnp^JO zV_@8PHUm_ank1hNr?^lZIq$v6kMslf8k|MmK!ue z`5gWWe51lrz`bMmTRd z>tj{qH6-4^lxW8rcC)hcy^b64&Yj$)St7W>UQw5p}yFpzj3!xkC11JQ6_EbJvN6@7d9#t zJ*-jkE+@Kg|?ld>i&v|+Gt5c{d!bXeYjIpE&tG?fz)!(N~KQz-ivzzx}S4b zR2@(eRpW}3`itMOQw=`;|Ee0Le(kK((e!uI^``!9mU=mUITYA8D0S^&2KH>{Dmk8x zMbsUuyu5Pv17&aHx8-t^U*dM#D5{>O?GKWF$Tm?m`E`j^>g*lORsI_r%zbo}Qa^pH z)E~1Wsw&eV#_|>cDrE+W9|9eNS7r zJR_o_mmq`f{s?`U8DYL_cKR7*Wl8z(1cw z)G4dI`sD7&ZqR5icxq#%#vkdynf9KSZ+U}>KjV8Z?);m*`;&H8s^6_j?f8aL%dU^8 zSD^1!mB{^bULLuN{s}+sYhaa6M^+lm{eZQJG?o01(}owHh^QSqDAlwDbVQ$2(zXYX z>j76$54v&(XftI9^6;Tj<>>lTE>x=LkrB1)HW4+9zM8giME#Jb)OY+&`YNJ!I2c{d zZySEU6hr48=%|K>dW_$`)0EoyrHK01Xr-PT2!Edr57Q6Vof%Qp=ts3Es!rGmdR<5y zyu1%`{m4@hb>Tir&3Q7SHvNP;CoT$n{7v0fBUtJbepZAEU2Kwy13&H6+bT-ea z!Xfn8!D~$Fm*|tsTcYY4cP*_TYmHL9cpipKjt1|WiSM)*KhhRs!-~1CM6YhOly(C5cHn<;96CN6o=xnJneej> z?_F!sS1mTzE#c!Mv1w=3Mb*exuqT&A)Xd)SBKEpyPE=)VhM$1^6hlvcSn^%4o`uk4 zH~OXLX%V#zw73i#_`^l;Df;TqDaiGvN}Y2=MBVo~Iurhj=S0+Vw5`W`5jARysCv0R zs!oN+;^^H?@{}5cK7K4OqF(!*{wRV^H;Jn4mMK;GB6Xaq)Rf2QU-Artwi{i5J*C|L zsAI?=bPP88J>q}Ff9bw5s#pV4uW^-dV749 zkoIj1FDDD<-GY9+H(3h&H_VioxNTy3pT6`1x-XAD>)tb}8sApxz>AgI=~mpqHkvQECKuzj!?Q z;R=&JqMJXLcYoDoo31{TpdyWJzS~z(B(?(#C7G#;rU^Q z?+?8sqV_*lsZVH2?+ws>=T1EA=jN_CCBP;py2*-M&Pr4Q>vW$+!ubd%)zG`fEyHV+~r*4Yf+&!X-r`Zzd0PK>4-VU$I zeRQe(EA`oiQT5-Q4XlmMim2`HgbwhPgjM*b2hq=4?`O(O+_sxW)fwAG)VIe+)bDRe zj2BLN486U;d-mVm+a;pzAAnBy3p=+xwyng}x$9H-U0dKg&m{dmd>ih!z*cku*Pr0i zKWn^p&VKM3o^SHrG%u>2eBZ0R4!OUrn+Inl zeI#M;ZB5)H@@}}Jmu^zc|5NCE34b01k04hEy%te>O^&MXR+;>lz`M!98*75GdH6#T z?%D|$_fj4oM8XbEpZ^zLpH14u*g+d6V++o}ckjfwCLH!UCZevz@4OfrVZ+uFqG}iX z4;$wBXkg>y`Z99t50g4FM%g5y=41Ch=*Kvi@ld+(`vjBv1A3!7{4e1vr=PyNI-+u~ zFmd+(gC+F&vtAo+d>>nMiBexbYIESH;-7{?(TPgMkVzXhpf5T<6j5jYP2Zz?&O!%t z>2FgLulrn&-Qg$U^ya9#{;!BS7rt2qUlk*>_fAJwVUPUb+U?ErhZjWD$jy~H4gaPi z*N*7^>l_^=`9G-hmr|;%03JbaU4t%s1N|@>f9o`K{PbO->Vav<<(#M*)J^JVY>%H= zbfKx|OJvE0ne^R{__ojBYaK^h`EIK!D^jY@Zj1|`z#k>OA=}F@<+eT8!@ur?V48(H zbsl_#&G`x6$%aqBakE(wHNFfz_!YWg7-Qi>mHHSwTN~bgGomhE5>X$$M4SJPs44Jn z4Z2jq_dnnpZX8iZK!a2FK~GLo>M-nD>_7uwa&7ji+yw_c=(<8lTdrM7yr#kChqsUvEfURKYY{g21nH2P2kKp z=ABqXWlUtQ0X<^FWJhPp^Di$OoEi_tSEda%yifh#bycdq!i!rwl=%dFAPH4XjOpHC z4F7OM?S}5}O?)r>)-Kbc>Q1NsC0}nxX16Gz-J5ziNZQDI(L1!|d1$cp2l)Hwk%)zAe$IYwp5F-9)J;n48%1Vdl1OiK^A*5w+rJ#&hVRjV@+f+@CVY zPLFx~7_Y59nsIV1{x!JV@@hn7lkcMrjPt)nXI~Xn%TA4|YHaCFjJ+RN!{o97_l&BPCS5dL2KIx>mu511cS+a9mf-{2n(Gmh}+Q52Fj$(#2* ze*Cpjb??#G&ML3`JB)!Io`fwQiGRZV7Sb+s{=hojR{P zj(MSXP3k50N7e92$Rp2#&#)zw>VOTh;jBBEmqORhzLd5g-)H=bc2=QF@d0*Nt<>-T zRjQD_yIjUZ$08H=8GJ9?8F}4@u^#@%ggqI{@axBKoMR6K{!aAKF%9UhtLe8Qubq-6 z;VpcG(-{X#IP4gGQ8%6!RY!k_z53KV%m3byVA+w-{Qe;(ZrP(s4Z!BuFy=Vs#uhLa z(tsa-HoEP0rB)mnRejN^`*uQZZiQaZ;+7*B>r|p&$ZNx?k1^i+D5Ca8Z*Mo5`6OsE z|HgG1zT={u7`KjQJ{{RRj^Fa}%>CfMu00mJ1pjt;n6VCa?+su~xFV{a!Y<4^$>4m2 z&t~-*tlY5d0rytlJXqvCA25x1rK6amV{EnSw#<1oREId-3v!dXzRUJ@##<56dwluoADX)mT$`KeKIheG5RKdF*k+Y@Q3TakEl!NpC5hm5kEW^ zQSryUTt{DouKd+Je{m*rPWVv=W2dk9U8#}-kw?ex^GZPT1>V!*kKsG)&$IBN4Y%A+ zS=#&lm)K5p&V&aTN4yZ^g-2d8xqssFBeE&s3GzzFz7yScSFkM-zyF;cj3KoWW5ObQ zgDE>OzvS~ZdhB4*zCafI;qq();ifu+vj($p5fsz6`xhYENr@jx^DC zVKW`NkL~B-ZSya|r?}kdcZu7)j&abo_<;_uuA0c)yH5t!oNr40TxRO*g?-xQMg#XH z$9DeoT|_NMZgyMCIFL4;d2d7=4-dWA!Pc61{S;n*<_yM93$a&sDfIyQ=yK@48#eVw z^v48r|4;WQ^-O5qWpU8U0D-m_l z@%RPx$m$IID|qZiaCjNI?&;&*7vaN`&WWn4(8*6AKi`D((k=tMzUs*Rp^F$}b$~YD z)on2Ae`}QbaChdo-r`3ceTO33=*N4e7>q_9%2@4F+JgRBgKQtXhk^GTbY4rmghRmB zA6}Uge3rDI8SngXKt%OzH03X!<>lFr_!U<%Hw>@YkT)8CG>-1NfHjjQ#+8RE_3VjW zTMjsj`SK@NxBt_YFxPiNI%JO?9?W1)?`hXn5%q~rp1qXxcRSKY+bIvHgVFN`Z^SsN z7d)_pvKKNYamHmwqXYLq$6f|+X0DXBczFH39R7j-r}bf84xKFF?kBzU>$adQN^!Cm8u-L7$7!y}jDiy~kfAS0D=s%|9t(%$aIQ(k~M?_c~Jlx#RCT%se zcp4ki4_UsNHV$9FSdhNI3AwMNt>+^T5?0Zd1@wQ%>WDg&yf^hyYQZ-i4J6Mq@PLHZ z;lZLACT;CFeA$)2>c(2?DCQOatJK&hnP0=UZvwrOg_nxa<7*=75d5E4@UOmg+Fu1EL$PpKt))3#NN8M3@Oq{J?7MAYUtnX>Z#;z8bhuVoQ+tE2Dd z_G65e?WNhf(n~!0*|<9{f#>jP&$|h~_(#ShpEE!2*vXGhq8-TCiO->f=nEUJ?1?_P z#5~=PUHS|8I1WAhJ^Z>mytFI4GZ?rVE;M;gc*tCfpv%>#;ZLvh@OXarsM?Wy`vb4j zakd6?J^BDIpG|rAJLqU1eAm9qS>G7MIun)7Zo^U7$_K8nPu}&;tG)Y^v6D7b zZ%=!!G5qq&IOdD4F*r;Q`6uThr<>;5Qs%ndF~R3675#S>dJ4{bkYt^-@O{|-^L<{;+JMlv_E1Ud|hsJ}kP_pF2N&}GO-Y~6n%>bGcA9kL_# z6L}cPuckk1`m>a}Vk~RjH?Y=#kCV;y-ARmNXR&_W#QOIF_6%JbRl9=o(|4d#kezEC zA0dcw@M&-GknqwVbG510UeDeT#!2Io&{gv6v8_^Hp6&JB_GJ-u=X*gI-5V`5?|S18 zjIoD%&&lq#DD~h<`tdiI=VN=C+{Nbx(Y)Kb0zcj-K;}^WQ{ggyJOqj|(EIEAf3N0~=fMH#E!d z9#tFQ0~O#ON$9u*Jda;HVQ1!3_eKuTrIUI`)z$b4!yQ~EFQx6wl?^zIwd1exZ_ywA z(D?=bleurk?$|KI@d@p-Tz5MJT{eMn>SOeoBNr#%?azU3LJxm8mHzrSW2)V-ap=#z z@Y~kLna{*#_S-s`|6+9Xl9%}*i#_S%{h|K{`2HK9LvJMQCi-<2WsWO@FUr|t@*p~p zvCU$~_x&E;XgZa7;=}MAKf|8=jGy*6I%ff6u+vR@zC0pW=i&I68$12~BfennM}{_= zE=5m6%hzWH^KbGpymtcr3O-qMbB~T4e+%Z5r=jGrVZXPOx&VBd(3A6vOzb}UFjoDN z@y*>{zOGA5+U@xE;gEwZ>+%8i;BAw?BXhi)(@&4CV2>2G@X=1D#PJ~=^JyP^x!GPF zA2U9`_iOV!AA3Inof{7CTxennYVd{NtIfJG4uDT3?2r8T!{;H}eyNl1EciEn8uNYF z+zus-hnz7<=`N=H7-%7(aUk<}9q_&Ahua+bFL&hXGju|Ce8a)~GLVCc@`(BweSGs9 zj9+@D2_Z?8Qj zh|6GX*{S%X{!noWV`BXE`op5?9{TV*^y|~`)IRuj4{i`qLo49V4*1)vu|1CbPkS~9 z*AH*?W31(Tz&zP+%r9Mm--yj#b{un71*{?c3mc42XTv8?v-g+!Z8!tIN)~?o#KaCh z&s-m-y%MIN&urKp|Gn`-53eCz&HbIg{1<*!#IY@lZ}jryIO7xx!(M-9jNK9c=)kA& zj3y4A0Q(V`ogmk{@4N9?xt_m-ksT#gM8faK67+SnL9q; zFR-&KT)<=02Z?$L5LgVcjJ>L3)ur%OR8lpb!k-9K7#z?Z|#1t$@$WFkA@O+NCW!-e7xLkD(ejVY}o2m z_SI3pgl~3WJp7eXpJPWPymNxN-j0qq2HTS^jE2sqqgyX@?AVge(VOFvm$(JJJ?C=+ zyJQG^oEJ0437x;E{m~;$naqjkE_@aVT^-+{&k)AM8{?Di&b~HBCl7nh9ltx^wRA9)#1t=);att-gelXUv-!sStQ(9Whzvj3-$hxwPF zFW+I^3;Vdp@qZ-m?<)+Ra=)Cp`|I)TRsipmOHBMJ*xBA6N~#Gnpy!e35p_HE0Dt)b zcp=`2v0RL~Kgtyz!khv3lP|yz$CvyWy!~MU{dENX?7NRD6+4afA^37AW4*5nqH241 zO~MAuMK7n0FCAUjLr98j`LOKF3A`V1@8w8z^>#3ZkD@D}`N^xW3D9C=Wa?tZ@EbD@%jCB$ zW3ffRy^T5X(bZAa+*{VV4gQ5wfamxD7V_j_*gyDoa(Bj9g$9>HocuP=8szfRJ@APx zWey#GY4b@Dbr8SpDj3_r+p)pSkMsMwfIar(7*oLOUoi&ii=X)eFdz6eqPAKaQFCeQ zc-lUSITr~H(BcJb^wJ3PZOHH}r+!I$+To|QEAVgWiyUaT{6Y3K&ScF19gz79_F@Ed zJQ^R4c8x)9jzCBKmP5Tq0Q-uFI{!81VXls-w=d!y9m;;XEk0}m{fQs?&Cg2xJD+`~ z=$AXn@GZMBjyVxsz}USPG<_3$dkS>vJD%}U5B9Hbiad=+2Qx<6=7^|z6@K313g&zI zvgh<#=tsFN=Ey#ch{_?}hWg3&&RiSd6$v+^AG#k6PFv$6T<`IhNyWcMetTg1=Aye- z;0Npmox|Zm>ioRk#2+yqTedu$gMC%BrSNnE{{-%vpI7QU+Og~|=F^aaSLy3}d47gp zs_=fXm-eY+7bNd$<^g`I!+u{0ZJuBs1G?oU#%+V}B~IG}-f;Y_@yaV-*2UD)p~2vE z-TCL113^5qoUt@0xi! zIq-LMi`C0rUcqAMio|717^DLpCx1Q;xAF|e_Fz58PQVSP&&;GmJ z&hyIH`0V}g6%IA=|3YuPxhyfyWcYqknMaQYuQ&HU<3n~h*5vQMyScuMOh_oa%UmD& zEuy}dja`Aa{hJN7TEoMpRu5^DG}RPlV3Sn#CM0`sRu$5mmnp`t3wy<80RB z@K5$bUjF?Cc(MGJRbIpB{u@16s!^aNa$@9riDs{*C zv~5H7nt{`w;Bj~nzfY0*&ge3H*0Fb>V{gQ#MW+6n6v$yvw@mJ#;Nx1(aeR2Pmz}NmzKgvA4Q)}{!>=gH+xo)&ChSeCQ{GNtLXDy$X6zNSnfrB zENJBMwA?OFnz?qvVQ+t@8+bYt?)S%lBtm-$=t@DuozZ!-pZmcFd{FxdVNS9v&& zdoGL>^VplRkBl+}$kp6T#!}ZX=Xx{sH?q(2Wc1`T=7Q?*-;nqGzQ_{z?LCA(#UJ*E ziNARD#_9h)@Jk-FJEU7gb=VL4hVS<>_M!$I|1~;9LjAr5!ZYZkUflP>m)r}TG5sCZ zMowja1p0Kv)dv5|n;45Nz{g-N>&+Y3x6z%oGI*@dNd|`eKXZtOgFJTz$4`Ly61HoX zZzP6&6aVt)QHeaA&UkSYzU~=5KiTADy%gW^m17xua<$e6BpKQe=P z4ESr|48~>f%F@S~Z>;8BuXoWGU$Exek$D)-|INagvn%u|*QDgHP+;V-5)&+>Fol{9foE{Mx_&W76&a5bV)O$l9Ls z@gJ}~64uZ^N23#txtjG^Xh$0sJB1 zqX*F2;C~#ne-}BEu;5GPlwXRd!)UiZ><(YPI)*(un+Mx-%MHjG`YIfLzdoW~n9N?3 z%T3C;;CvD~q4YFl4mtmB9}e&wKfJ$;wmmeFcRyZa{=NfaLhQno%Xvoueb;v?Yg@#h$@Pv)kTdA^ueHF#MqM}B z)KhyC`#Ip{QW#2rtuR`3h^)2>Y{n+v@zIwqnn z<+s5(?9+AVYOrFgHIliHKJelj@DlR+$3)iTxk~8j@QcmszwXk>YxIBYZJBJ+?0*mO?HEJ(!(?pFExVwv>(MK$0obrAq|0o)y*{=AeFFXb zq1VCa27E6Gr!Hb&(lJrBA$nKBV)$;sH2U5do1d|iv0+!86!`lTd-NQAZNtFh4ZNn) znZLO!h`Z$3bSHe^=S-f>p!eH-*yljrf5AKcaQRf;H$4g)a5MT5`Zwx`+{KoLw?oK34g1H!WPbar`+GYIdIWA&G-+yUJ5?&$)DS^uVpJ}OIq$9 zyx%Xn0R3_U*E9LO!7nlgJ0H>wv!)RTUu=r4u;JBMunji8<{tJH(NA~2ZPG_!H(uG9 z{SmM6{tA6L7@fNMV&+S+M>)?SSI~0hIkt50x_<`a#3fO63_is3j5#;llkp3BSi-~1 zl^w|V;2_2g$--=STf)Zp)HYnUJ7c(Gy*7LbjH%G9coFZ)-^M!5(>E$oB1fce*ZOu2oLfo162jgg7%&;|c`g#E5tqO-7< z1@QkG^7=#mZos*Xv?j*0v%Hjty0I^5jd?yKAH9B@DYyO6=!{$8uWcBsIevyMb?|g^ zcaLM&3okM_O6)$!mV_JNg_jL=GifcM|JNH!+9dquW;pnzGCP)LB$@7Cys# ze9LFq+Y78g3)ma|GyBWlz>j|m-G2gWac{Gy4_vG8bvtL7a^e3w)_6Ec+G?kba^GcN zFKxsOc=u4|-hM!zypMb#KerQ?D!fgfN?18fU(~=;&?E3tmsnJlBAahu7bn7hr_N`b zfK2>IfBo+#<}o*5Z#1$f;m#*mzq)|^WmUmG`gt?+d^P^UVeoGsWa6&pnHT2y1oYPl zCz@8hNU?@n)GZJ~m>LVVYc*ZNb;{e#H#+1QyW z;QBfC@pPxXl6oQiHx)kmqXT{%_?`42K1My`%2C(?^ywkrv$oV3y93{R)*ZfN-lPvc z(&_lH&mgl0?1O)QKkM^D7(<{BR`A;xT3v}B`~deK)5lLTws=+IyYL>um$2+5%sJ1+ ze$eKFZegs)JjA{Wsh8h%m$SzZUYGC{dgl+uR;T3eH4QsApoO518y?hn(8a-K~xQKNV^xlui#A@zm4q(sl zUCeV_>+zE(vGE=%A@9ZGs&G^XIl`|HIM^woI)+^z~s#RX; zj>!6wf3c5jsTcPe{^dCIw+(kWdb}U<_4Mpun~t4}f7H?7b0__4!*Tua*H<$h1J<|C zFpvEolQOk7Sl;G8<1^&ras2-uc>fUEOhj*0O=4c@2*wETYB==1&BV<>2hPBEwc!|a z+62ahyMW8DXD|f;T`q6DK(R^ z$9V@CoL>A5JBKZL8o7EK-rW_skWh&HU+M6CGrl(;)>aQhS=;H!`YEtJ{*}45$&97< zWlRW94q`67_wS4ou}jtHxkkptLpB8O0~phfU~GkqUsJ-^rx)u9=zvY|70$uF4{qiR zuq7VN&Vq0ED`U;@1cU2OpL_H&G0^yG6L%VYWy2Hja-8wPvhj>@H)Jj20qo${jO#m7 z_j2Y@4rdOv3I74#(1vnwl`xNdeWBqw@Jl84+k)q(*a!(9I66k|&p#iY#4nX_DmtOx z73TgzbW1a2!Dut=Ws9K$ql_abwnHgX4RSU$Gpn?&R3@J%h!2rmzdk9 zN7eof9^hx6WZo7ZX7-7UTd-SO!m|S&!3V?_SUVfpr;RTzVlHMG^L*H`>!IKBFR%}{ zgKq=-dhg}zo8Q>m^%?q^d9IhyBR5wt{uyX+S+m%y>!{5+BZa;^_^x0(zkq*M;ZyAP z7IO{I>2++qAPcM55KLD z`L}&oW899hCAjx~2tO#_gL5YH7YF#-TkPnXiG8E0=gsVe_4)Em$p2QS!nYp)AK96h z!Mk)PBR`JJO8wpcYw-E+Bg_eG>eVA@{xFvIA9fvhA&--mu&4J~-d(~!zq%{$t1icX zKbtw+b9qmaJT|BW5Vli039u`$r_o?7NXhVbq_GVTu@u!H?e@gIPjw!_WaclJCN;dDokIzr;4LoB)sFKicp({?xnp*YVzr6E3x} z!Rx2}v0E1~pTl_gS=w2D8MMEb@ydASk@(Fz{S@>jc@54OxF(zg-JRo5x zqJnUs0%6Z|6P99QF;ZiyYZ4|;Zdj`JtsiL+== z{jQAd&SNZlG!zGzV^|BJy%{fg&*z{+ zZMX$rquY1h^VZuabr8Q5RgC4)Z)c)wz64f1{ZkL#=T66_KIq|V;mCDM`gnDJ?9Rp5 z+rK$4X9Ly&nS**38Z7z3tHYLA0grt0I`2#Wz<$-+@K<)gSFFTuzZzZtGi%@fmi21( zv8+t2uiI=3h5YdC4-0{F3%0k+)N}SGCVgI+xqgSQefC%A7kKTalkp*sV;pn<{!1_B zIG;fN&tQFWU_?d6n)3IrftS0OvUk%K3Hc594No(7IfilAL}&v~J~NWD-LN%Bpl{!L zfc={LF@{GE{e=EH2fq3nKmQ>5@2pRF9}W560~kMoZ#c}MehL3`cwrv09eWSG4G;eD z9DL1vw?*jKi=(RBmyBu8^&oW4G5C2g-rbwf<=4yD?}hwJco2VJ&;DNi>3Kn1K0Y?8 zp6h~Nbb_o$Vmsk`34MUky#k*O9=H)+w&AHh9xRD_W!tFgh)?<(v_2Bsa9|E=^vLK% z!0N*D9;dP%(Sfxg;Oz;o4%iCcnSOh4OZK1d!ai&Irwm=aKl0Rudxt?(Y{uXd-Sb4FB;ZD@TcC-;+=+DnGfHK_ruWrLy%<&&oCa4a2$NSJ8k{p zNObe12F?ulAO{|J8@_)6d0BycNf=S*;ix0{`wH4g*eIL!)91ZEMptm(8=8Lx%=0(r zeWPBC#lL2JMtjbv$BxkMzp>BL@s&0J-lkPl=te-Jve0Quxz!gknv8xF!IJiXQ{Yvbj5$bIH%C+yAiD5{|#bT+gOIPb`Ip@r}n*{;q3T zYenuPWS$1yptpqg;HhCHyw7$7{Nx+UHK zMB$fWey^PaT}N>~18siXY4;iUQum|NKmL~eN_D0#`9H{aFV7pzmwyv7E;RTxY=@3P zSB}PBuVMTr;U?s$X#_eWn=u_cyZSZ8>$|ePcYTnaOS>}`hbMP~2R7k)?O4LH5%tiEI$PSm&quN@jbD5CG4Kz3 z{m@9>RlkTi!&R*1<7>n}f{y24KSTWH2bx2_e*K|8Ch>lE?3;wQZ(#m>5@Uq_F?NDB zo&UhcUWT8HEwJI#KbgZocZb6d_|d;FW{%F$1(IHe{M5W-a=yB;DRWIV`w`KPzg_P^ z=x{kcp(FcVY~tOe$Fu&0Kf1?etjV8%EsN1d_@l4FpXa=ao}9^ky`iR_Bj~HgvBx%y zxq^AyoujG;@wc62Vjtl7xJ-0s4{Ry@dDu%PzBvL9^kqF^2i8QLy#JdVZ1Yho7-OMt z9)jo2L>GT>H{&hzn}piF@GiFQ9%Q2&zB~KYVA;`cvabX>#qe9lQSU}qGpB(4p9sHR z(h+~<0OrupiLY{hE_j?b9Y2z>+~aq1ZX5dRqU#tt;A3twgL%~z*i`s#b7X427nn=J zw;Q#+sc$N6+rEtbJJ=HmGZzN&(2@KNJKn^96}K^o*K0?hs|N(*7a-@Sz#~7QL%W{{ zeb~n!0M!#O3&z^SZ^Z&Rz>-Z?H zHc-zl?pj0N+xv7f ztvuI|w9Q5NsYTknEx}w{BYSt+zdhJcgE%jw3+2%HE^C9xf4^(?VUR9pYt?aU?Z39o zN|~~i4YUCb&@+`NlWpCxH)`0PW&K)N`c>#OA;-1&QYX_MV-1QY^`cbfGXuzB;wsLc>6Y_+1Z4cwFebJYpwEYKd@_krp`bcFMf4~m&DUOXq{SWYG?f_jT zW0KbQh?}D%7RFBHzU3FmbA`}L<(Ff# zmST+&ad@MK-}bsG@_ln0_S#RZQ=m-jdVswFUgq@?2uGEe~i9wLY*r{{m(m>aFcdX zj2RC0)9Ss&?IsReg08;*fX`ju6`!Z zf0(7YV&3*F^FFlyLVjIFe)pk_&@Mhm(yzIH=;yV)tn=hv|7VP8 zaZM=w5l#HnzN`2@B0(NM8l|26e4CDPcX^+Fyg2Q?TL#+fRJ2{`nb-M?apc~NF_)wq zp`Tp}VT(*>?hBHW$VH@ITGo4!KaO(9M!zn3#XB%M7?n+M7;MFDQI))B_L38E4RDUYExbIVR+~(t>f>^YOE#mk^YvtEzkBa*@vwh{c0iI zU(m;+4o45M{{8HykQZZ@YFoL8vMZ$FV!0K+ho}S9PDsBK8Pf~KW_*Gj>0MusPZeyT zys8b+W}_aCLbTKWNgk2@nvAYV+p~`GC(7|<+Aks5Gcvx_Rqhv@K>qmA=lzrMK_h*; zkvI_g*+w?q)$jkvMxP5OZOPkC#Bu0g`UE~aLl{oko`W6tnl-RFjLQ2Pv=wZRY)0Qw z-%kzHJ)TAzXe+Hpu(p&k+6kLv@p{@swihTP&SjX#WelYh`O%FwEjd}8muIC`Vt+Sf zz0n$6_#2dawJ6irM-w_S{zp5YiK|8WF?W`XSGHmFZ&&lIA>~ZSYwEwFI9urVQ=TSl zmghd8qlFx2yzMP@EjF0<5ohFG$E)P=F1QWDzcRI?pZQM9Mjv>t5Y;>l6M&G+Sj zeu%vZLPsFu*E7esU52X|c5Py9#&oF*{kJhD5+L1(-}#j5OypZmCMxTGGz2A;kg-|!H!W(SFkOJD3S+Krx-WZDd9C9f-1UT$rFo4=G{@>?sn={GaKMEiJV z1#8*9)m{FUhj<>@FcCC}R~CquVYsCl`+m zjg4~LlXfqezIg(AC@GQrTSU1W#avN)=6#84a#FG-Yv6C)dVA7-Ho)eLbLO4Wv}N;s$-hO6Gt$0f-bkOFG`E%7=<*WuF|KDLf6%)lMlrWf zm~-`J{1d%*S8W%yYi5RPdx~<&rf(;Xt|qT%QO|Bq(&I9p>stitX|(GOYgMR|ChFJ@ z^!NJttUsZ?UzvmrLRe;QVjPYz1{J4&&iPf?sY0euzilO(+Mm;o)tkat#m_vyNt#@x zy=_l_K0R^Kl zp7=VEo<7w7b1-HDB zGxJcYzIsLa8EEe{>6K3I8`%C%97{|?&rwga?_`Zd9JYX}(}nxG>GkVIWo7-CiFcdj zqTRbB)1wyps98DYQ@S!XFq83(42`kGF05;tPJJlKxXc=KB{oQU%2g)n))>lRYII3hEOs!Y3*fmq{CPkdW-B=& z<^L?CiDe)C7VH-xbA0u%mba-V)AEvT_$OrUP`QnwT-C%r$Vy$y^9^I!xZmbS8-<>@ zLAq!%3mq7Tp2|zSu2kTekW!>Qbt=aU!oYrIbjM)q_T;1v_NFhk$T#RaA+s5W67qU3 zHp?>XDcZ#0QF@rIC;4fN&Tw;KOm+x%@hj4r^z&@WdK&u5du#AKwc3}}+-uv}Ggv3l z%&7cG+b$$cVe-5)ZFvRh;u?9BFD>8E98Mo11AYF>%)$A{bK>{Ha-N-6^Sv$YXXjVE zr{*Zfv!Tn>u}$G_EoDc@$Y<6K@5j>fC#IGjpThX%Lb)=3OWhbP-Q+IA+!5igN8We7 zD6bd4h2OERhknFi?zanlKLY#Xd$aDZaI=;45>h4~Yg$b5K95f_zw<%vkEXmVBP>;R z7?lP#?Tx&Oc+lr5)dO2MwRHb9l75Ri&Y0;5`m(fszmk1SU zoc;!Vh;8DwjDA&qo+Ush6njTK>x0eH4_ltT^j2)d71%N-DWfB41A-@FU*lil)#NXB z^j{B|M=U2pmmwXt3pUuB+4QY;%5Y5n3BLw07O_Z+fxg{G`4Ez6q;xxrI;e@$IOes< z>#?i!W3Nb)T=f5pfAXvmI^?fTyt`+iykfjFYyGjq3RBjO-eD|m2lbkAn|>y9`m~je z*!Q8HILaB)Z$+PQo9SrNaZBbYbmdLc*FqyOojuEn1W6KG$k>q1s@eK*phl3hL93?Au(FMv?Rag6P-6_L75A8wG(&)6Wm~*1dNxuL) z*^_*qM?c^I<6CLuHR-mIKmNMkji{G@C;JZ)pOVt8+ey|8(f(K7kFLl;`$0WDN?Cf^ zhcWdRx_^%fF`wCASdk!cEJmD)MVO^X{8uN^~&o zo2|TBBmXUPVXi8Uz9IRRgM96th4Cw!IL$xGx@l}2A=|L29usyUfmP)8A?06_s^qm0 zV>RZxDgQ#UuHza13fMdGJVU~`#KJ4gz2)JZvFPj3*c1)XAp^PZa&$!1N9beHer9j% z7n}HdP%b(U&RI2?qo>~IEy%Nw^?1IW`jwwLcZIgfN7bXFI?+~PvwejhLZ%Jn**T+q zz9mesPh0Op^1LVYtjSJMze(pU#C0BH{TX;y4Eo_AVXMLYpHfbREK_x>^^e0(PR4(d z6XzZBc$WF%oo?v#7#WT@;wEIkJ$Y5hlJuF{$^9(oE+MJ&^K2pM_xK|DgB^4dee^y0 zsv!BSNgp-Mhtuy$Mfqw_44dXXV^2S0|B%K5cQ8*&nI7dVuLvR>z0s{%(Gh1$P=|?I zow@WYNIy*irpf&owD$wZ!<*YFYuqO(7@dl3-Lrx2R=Y;q4zhC=*eG^t67u zi|^}ULkJmk-@38>tX0$NFWLtoNhesxzDHi?@xgjX3BrC7lAiWoNVwVtcMp>P^I*Fy zpp4hpO1Q>iV_?@FC4BDaJkR^oo88PqVt2Wq|J>uTeaY8yl*j1KtWCR0nh~C~4;T-l z-@ULXw7?#FM?ZZSHUageIeOV^2x~;{pj&$}o=88zhk9MB26L6`2^;BD!jtuUl>2Q> zShG&~_+z5@HVyOV)babYj~f?KzBbYC*-pJ}%bagk8Ft&>U&rg|WqUmHOvblX(a(H| z9f>aM?@zlzS!}*QrkQZ-@`iN(ojHHqgmVk$&Et&0INiA40U7PWf9&oIhcIkim|#{!3vHeKXB z#Q&u8^iRl(!RUj1_*wf5_PLWd^SQh^NExDC6!Hdt&S4+hN`aNk-DHqQPSK|N{7S!& zKE{-B=$>Y_F75ZrV4KZntm(~J#vmf>&xwEYAJQKo@3LN_4yxtqdLr}oq|cx9C!+o9 z)G>GTH3vsqB7LI6BkP)5$49%CH$}%sSi*clEhclrkdSb{I(4Fg`&rE5XnB)wczB4j zlF2FR?=Jq24$RHDU3rtbvHBAb9vSNs>HjGp=4hY5FWw{>KZ3&|Vxs>iAI#0e96hjx zuCK+bkxdijkYGo7dNm3;JZS~Mn&rxYyF#i&_5Nr|NauS{)_tYw;t;$@~Ke%t=rFH>`+(! z_CmeJOsiPg(8`k7GCg|WE}5&}dNIBb7LI6UquBWQx zXulv^uU-7>bdL`Y3-k-}2@eU5=^h&86A>Bi8}(_YLZyneD^~sVSL{^ui%|WQ!E^De z)18X~BYi?m0l^`bD3eoMts2hVLxcSy!=u8fJ$-|tVthi#^BDi&a8s@Bef_!zhxvuX z_*=S1MMnmQ1=b26vLi*ybQ~sOcw~HvWp9`zHpTpki-`^n364&=z@@Z*D8PVN{}hX_ zUo0kfWQuub^(_U9UTk!5s3m0^O{_QHz!VIk7>RJ~8U0UPkvM;gZ%oQ{MTB{tvf)!b zOu;nt6N#9D{>er?1wD+SlB8q+qf)#-M^8LB<+{UYnUw9ohR`EUF)b4i6Xq9JW_oWf+2q1E1&=^p9bU*vPOH^f1&X+R?227l{@a6YOsh1=b;C|J17}p8$)T z;&Jfkf5`(s<_0X0DOWS4cPSV^8Dl#w^iLBmG$tfEILgu|MoiwNV9@-mjlNyb{+Fx> zNT$L1r&0ZzSpHLQ#Nac79!zaHB-cOnD9SH9(vrfak)NoRDVFMfRxM=b-9L?_80Yu# zrPCD^9qh-@oyBo1^q+bd72y*Z#iRqB*0}#M1DIuCdLW8L0x6(@Q2##ECC8E3e;Pf9 zFgZ?w{0r}N6`KN{k@(Tpshbp?p0RcVQ?A%1+pGK+DaRa-zgo~zAn9y;vybXO4Vk5H zcnIST7|4~>JpXT(0vJ;bh!BpK(2jvL7=ye9ra_hE#UrS^Z!TPK_ z>KzltB!hnid0iPLfH_LBkTWfOY*FAq^_e~I6^=a7wpYOWzi$3|yw69D3)v2t;VzS! zrP;=0;|*bKcc)($*B^uk0 zxHqvK!78#^Y^&f|0NbW)1KFC{ibYIqKrEK3#t(~wl?nNH2!ZWI{)_b%AMn2t+oZ2} z!xP&c_*;Z+sno0*WjiG&Pm-{`n2J?_Y&#G>Gut-lcq=8_x?Csj@fGpmlw!ueifo7C zo>Pig5S*RuNIQ zwi&p-1=}TTTd^&bpOwyRuMn@UY@ZS6PHY!)eHFGxN$&!L}fvU%L z68`(KjU{rPZ1><_54OFC52utggrA@*9oP~CC4}?c+1}=04Ym`AWLvgENHS$1_wUGd zDv>C~wiNfT!?qFW*qH5h?knQ>g7hoFHj+#($JUAaiv_INNWThfhmt=|Y^#!vL{)La zzmjZ=G*ww7ARzAL#5bF`^`Z@VGlhfz7QdjZ(t0+{d~)$Likhc3QN`>NmBfky^q^i^LVpkwb2YWqi_0n-u-WrC-Z) z$CB{x{nUKaqGc+p)drFNpR&+dmL*X*tb2ONp{&%XWLtcK{aE;-6D}b`A z!%F#(O6YtPR2B3~M|4gSdh|RE*k$z44UW%2iM2t8H$mAJ58*A49RC4@>4CfL=)BSB zO&(-Xc;H3J$GOxr0>?afN`iZ>=YNs8=vs7jd6Z*D+}{i0tz@_zjS{bcA4_r50A08i zJzN|e{f=Wiz@-?`_ulw@k@G!Klv|14{*ttH#AP`;^cL~he2#Dum)~*s62CpUt}~7E z71ASuFm6QQ4j>LhQEA3KSJLn_<{po6m!7og$Tbh}e+2H1K>+Ta60SOghlfU#Q_zI- zX9&|{ly5b3aeDmQ$o;Z%PKZd$EBJR6IBd0L#BrhP@y6OVigr=7MKl#w9sWJ{{Q)k) zW%v=Uz)x@$u0c9H$jQBOL2eNCLmtQr`5-?OfPzp63PTYn3MME9#i0b0gi=r%%77C% zLs=*X<)H#p1Q)0Tm7xk$g=$b8YCuh>1+}3Ld<~-f)B{(j4-KFpGy*qh4DQebnnE*Z z4lST1w1U>q2HJuLv;$A@g7(k>IzlJt3|*irbc62D1A2lPyuk;2!4Lew0s#;RK@beW zhUpC<5DH-s4iV4?A|VQ*AqM(FEW|-P^n?B&%Gf{{1cPA+425AZ97e!M7zN+JXcz-y zVH}Ky2`~{R!DN^M2{09=!E~4bGhr6YhB+`7=D~be01F`z7Qtdz0!v{TEQb}a5>~-# zSOaTe9ju29un{)FX4nE-VH<3R9k3I2!EV?Cdto2!hi~Bk9E3xVo^qT4GD0TE3|Sy6 z2wN^Y;3`~$B)ASY;3nLHyKo;Kz(e>M9>HUH0#D%? z`~ttib9ezS;WzjlUcqa41Ao9CZ9KvfX^utO?IgiWv+w!l`{2HRl=?1Wvg8}`6n*a!RJTQ~p*;Sd~#BXAUs!ErbNC*c&F zhBNRToP~369xlK|_#S?MOK=%}ge&k9T!m|p1lQpP+=N?j8}7hexCi&)0X&4C;SoHB zC-4-W!7uPDJck$X5`Kf<;T61wH}D6%g?I2C{)7+k5&i-(2x0&uq=M9t2GT-0NDmo6 z*j||+Gh~6RkPWg!4#)|)AUAvkc_1(3gZxkc3PK?$3`L+Qn4lPles>8d38kPklmRDj zhO$r&%0mUH2rf_wDnk{h3e})G)PR~$3u;3h_!{a$J#dBk&;S}jBXEPp;0{foDKvxT z&;nXQD`*XEpe=YnJMaWAXb&Ag*oK{;GjxHj&<(nSc*?&gn86!-z!&_$A1n|6fe-}2 z&X2L9(4Rc^F%!B!`02V?bEP}@IU?XgT&9DWw!Zz3rJ76d5g59tO_QF2c58uK8I0%Q}FdTuSa14&a2{;L- z;53|p@8B$)gY$3!?$NI1z=qEWxj?-9hzIEv9xPY#g6NavhXPO@#DlsO!38QoWe|O+ zs!$E8Lk-}8PNf#qhC1*y)CC?kS9l0r5ibmE0AhTn5r~%>GzNEQ0=(EmX$H-q1+)ZS zXr{D=HqaJ4pdE<*j~BFu4$u)gL1z#ToARKo!b9;256CJ!aI5qL@e&Ph@Bv@&1AnkU z0Em|d1VJ$L0`U-h2!uiyghK@Mfk+T9%!q~<=nJtB2l3Dk`ojPi2!miS41u9A42Hu9 z7zyG*-EV*gtCcY@7RJGNm;e)D67cY?bzCli?Npcs(_se8gjp~f=D=K-2lGKZ9Lz(< zN+K+R#jpgH!ZKJ6D_|wiRaRC557H`YVI8c84X_b5!DiS3TVWe)haIpJcEN7g1AAc~ z?1yjR033uva2SrjQ8)(2;RKw7Q*av2z;|#K&cS)O02kqV_yI1#W%v=Uz)x@$u0ax9 zhZ}GcZozH119#yb+=mD75PpV7@ED%JQ+Niyz_0KeUcgKE4St7L@EYF0AMh65!F%`< zKEOx#3l#e61~5V@NDXNqEu@3=kO4A6Cddp~AS+~p?2rR;LN3S+UqK$o3;7^F6o7(I z2ns_HC<-Ph2F0NSl!Q`H8p?nZI73+|2j!sxR0J2O1eKu*i1FxZP#tPOO{fL6p$>cv z49_U_z!mC4184}1zzrIMJ2Zi&&JM&{xARr z!XOw7LtrQjgW)g&M#3og21dge7z^WIJWPOzFbO8Z6i9%nFb$@|444VCU^dKwxiAmr z!va_ciLeM3!xC5u%V0UIfR(TcR>K-t3+rG#Y=Dih2{ywP*b3WVJM4g+unTs>9@q=} zU_X2d2jCzag2QkGj>0iG4kzFwoPyJE2EK!{a1PGH1-J;`!w+x?F2j#-1%867a1D~+ zI^2Mpa0_n39k>hk;66Nnhww8zg2(U#p29Qu1%8F+@B&`KZ}2<3g4gf{{(!ge4&K9` z@Bu!;U!X9?mI_is8b}N2AU$M&jF1U3Ll(#i`Jn(5ghEglia=2?K`|%}C7>jT`MT0j z2Ased%0f9P4;7#yxIiVS3{{{iRDsW1(u!wi@SvtTyNfw?db=EDM52#K%=7Q+%)3d>+Q ztbmoU3Rc4!SPSc5J#2uDun9K97T5~gU_0!9o!~^fwTta;*aLfEAMA&3;Q$e}GGH8GeK-@Dp5xYmfxj;Rf7< zTW}lhz+Jcp_u&CNgrDINJccLm6rRB^@GCrr7w{5(gWus5yoNXM2fT%M@E-nz5AYHG z0tMUJ07fx(1*stoq=j^l9x^~i$OM@o3uJ|CkR5WsVK@Ru;TRl;6L1nv!D%Q%8l7QV zkZmC-3`L+Qn4lOGhZ0Z{zQgTVI0xt90$haep%mv!!w>9dXM36LZMXv$=`&d8*~E;R zb*3viR6K6a!|rUgV<9{cEsmPaV!cY$D&}aDxjlQ8KRZ%|*A#^N^)`!FWmx@nD(&3O zEMDc%!_hO<0XMOI@c(aIeeR7GPA&Awc_Q7&cS`WC0Z&VGOk`L`pO6@fb@GaLn}~U= z&)+9)?YSZC^1rA7~Cz9VD&qD}hLvU)&^5XCqq zOyq>Wxl*O-Rn3)^f4b0#wQx3zro$;Gq1 zTV<0=>&AH6B)oWI@x)a3?p)l&U;We9uU4gs5&pg$>r~a`5*8j39vE(N;nGeKHL96h zx;8htwD&N%@N__Uq^Bi^l#pKeom1FqZ{NwO9 zX{?36HG5rRinDUSCxBI|BIFUpJuM*?9&Ya5+N+_5c>6`g2tVtY@K0ydC~6M>V^hQMb1cv%J@lq_-?FBkT#Y99zTB4%r zm}*q1UftQ*OQCL?cXf9*)vaf9rhPL{cduq`TQznz z)#p_+K9Rkx@AdNWax%;1Mql=f*VBBuiC6oEZY|YYIh*R(`z9ZP{qH?%=HAdl^NVJ| zNwhkZ#ExvnA_P%3a+TzIwWQv}L2YHOKnLP%itLqe$-ZCW8@DIV%wa z#+>XKb1cfh-!Imm+!WS<-DUnth=rGP|Gk4xSKD2tU15Jv+=%DULP8=~ zcy51P@<(H%Euj%K3%Ylo9SHS}BFZ@6Ua@}qJ`K#L<6`Bhk8~mngZjtX9MR;k1c`^L z%)F7tTJUT_M#83sG|o!6LaDUA9Z7edoNI#N;7%=nwmJ352~C!GLfhevHhz5WfRmx3 zBwFJmVkRSIiHqO`JgP^yNhUIsJ-ge{LfhWmS@{%FX9e#f#hO5^<+iSCvcBI=tO7J! zU%X&lz29;7{$LH?8b;;DEiL#lf9+H`2uN+?^iUyxPJ`vqyLKxj==n0#8+9PNxgso=^# zq5CViMpz%v>1HtWFqKxb7W2l#t$h~{cXN{tZQQzvd+H~p9sB9UY+}`SU32?*GCYoV z6!KazUN2_$ur3C7a7xjzSa54CAdYU$a-FG7_E`NCSt*=;sSy3!E7eTU?(CSU|MdR< z@_IEC|6dv(|Boyz?KYT*n#uHk!GfB@>d4%4>EheS+Xedn3wz{=#(i`LBgFI*;=Y?v zCf-kOE6?H?S(s(8&XDKgec*3Hcn@?e?^dtOd%I)#{x3bY3%qZ4mJi?HF!Mh2DZF2L zrhdO}-SmB1e{J{2#_)~6L5$E4wx!h>{j=~bpMAW?Jb_Wmsf@-nW#kGsfrl8?JjJL> zXTI^oz503cuH9LD&t|Am`6!05Y-B3$2zHcv7wnG|;eE227>I)}aX8BA$Xy}yOg)T> zsUqL%>czXmIri%UMqYLrmAlS-_oOiI$NfQG+om2{e@2OV^BoYvrAdUBJb!5iqi49u z(oCM~u~T!wC}0#LN#YR$q-3H|$wqvVlfWP4(GnFIy*$ zxt)0#t;)IEBCG67OioKUyy9u%`m+r-}f@%2H6>;B>d)FL%3-bqYl#y0e*lH3L zDff)c7}>ka2woq)M@%SjMhw zl&GkOQe z9vPG&bt8IN$nUd2SH?AI-{l?pWHJm3Jj)yv^(( z$ApyS9qB^SKC^DDKS#t=vnt!`>HFeP;gQn)ddh_t-vwwKM!a&$W7;)hJA(Ic*T2RL zDSY>LyzYN#W@2)qqaJ7DTbt+$Px7JiTE0`o z5b6ou{X9BJyPMqh<6Z3;c?Y^HtHwL@)BW+juDe?vDUXkTp&y&JUf&XOZGE;kr z5&G49vw`%@W})7n*4>Cb;|I#47>-5!0;nrda=+Hw&(l=6IYJ!H9_9O_tbB~lLOP;P zEW~Xe^}5z#?t`xUinQtGN`1J6pXmD0GnfV9edGml@NG!)$~zt31aN2c8%90hdwVUI zU4|U+#*1_=kB(xQ_+cpJ%}Dk+z9-v~QRv!~?{So2@?q5kzHf?tR1)}BQ(n?*2FEDN zC8^g3kMq64lFX_cGbkB8kl$^X-KfgD&(TF&qRFdye21qz-yR^(uFoJ$EI~NL|G$%V zuNhOvhJflqg3VVYIuM0YjR%W1(wVBvs*EM?*w0K_ z_3y^amkTpkkf%T2?O?0PE_9oaIMV3{!ZnjL)}-qJ!kK^$r7akKlCV);lhB9V2x9=# z11r)=w_ah)=+UO^pk7Vb#`m07>V9Z`l`Wy|F(4NdQC_yfiMcQl6zD8EcVJA?3yhu-5Nqla9pP{5lLGq=-SiZ4A zTFj#jd^wYHioW{Lje4DdS+rif&;AE=CgsmumGAKpxANBwO0z6R<$MI+sG^LS(Yxv0 znaM;SA9m;a5AVqjPs(X}z6Z06S;Vv4V+^y5hsj^uG$L)&Os75NIRS8oi8X%RC%v}yCRQST~H zj;a46y7E0IXf?;EvI z4CSwpyrxsm&(Bw@PClUf+{v?Y6^u&M6=slUF+0}NsO0M;-S@^uy1$O}_rdm=Y+nw9 zi!(O&-8YZCsmAv%$-74AF<0twzUBsWpbSIF)a31RW~Eyil?4x&&0C|#rxkU>`j`rS zHsQKh%4N~|`u*k|G$?tOGecZ~wi>(1RwB_$0k^r1aGxEHe&CxrLYkDdb*1kwj@Pd* zAINv6C(-^T8k8f6%#2fB-)@p_gGHEB`M`O<1K7-F{g^nFrji~9&8^rL<&mGGb8+8X z9!=zlpbQ(hPd@4(`n%CsdEL+?gYrvHX0%C{g|ri^{F3+2)^ErCuCoow*F%_9B`z+h z(0%Ce`*+BT-}#<3`ts~A)J5uM*+qQ6EXb(*G#lG{DBl$GwZGT;5Zagfq``R7WDc{r z)Uz9uJs~IhFe9DF4C;FOYn<0n=k`fAvEN&rD(xqtx6v(62#1i%Hf2P*V1|7X-{GOI zYBHrGIt`nA*jM)ci}N*TBgSN)-7I8Kyu7t5&;hhdLR{3cD)xO>iwp&xvqvUY?b| z$I>(lB^5VyCuEz!u@|BwBzfjiu zaBddupe9{t3&vx+7o}h0D8&Zy-7Dk}ryko%=S=ib z(i@a`+P#}K#J6pAKWyD;`|mr-y_e{Xa+H4|Pt<&RzJ%|oEs)2w-R^*odZ%sESO*6Cl1^Xrw+f3;GRjQ5>?r(3rgCGDbB4UnW9pJ7LFC!u^MRzZ*%h^H?fA|RdbDFt#`<$)HMUTq z9^MI^>64LWLc%8L$DfUo$KLOt4PQk4!!~_hm+$9A6K47`S516FuoGhq=n+l2s5(>p ze{)`jDXImwGI7x42KRsN#7ZoG{n*=vj3;0N2?>s-Pj{6*`~kjuj_!Bictz~i(%yXg zO3i=a&PA=WS=tlt40;&Exu(0(JH+J-X^{OU_CET!pxUnz=aZAsJ4xFF`cZdik3#JI zTg7Q2+%}r>NF81~j&!WVx4gJtR&?s^ zZP=*kS^2}*M3DoGZEfJY$$kc9I6> z(c|t;TKf4<(bcxexsV#nwtjr7la+O zpYr|o2kInszg9foM<33rC&KS2fxYzf@N}qa!maxY?D!Q%W%mHu&S3retMq{mbfztD zihaU<77;IW{wdN!Nbfzmzw!txmhPa#<{Okg>OB_@V_fK(JUe@@QEA+n`pEyfr~<`Ng`_xQoYGZ??eGmp1BT zR%~a+a~gG{|GgM@%lPhNIODRUpC-qnS$#NN6aA^JwhG}_KNY3==*SwX+X;}QKY+K_6rb8kqGf-a=_W&OOiXGvzvOgmSd^b~TM z`)bk#J0oe0{Fg{t6^lS;6Bcjc?YaTIK=~DNupxa?%0QMN`9C2QV~N;`gS=TayOVL0 zWt2CelM)z5pqxiDhVX8_Q5iyCeR+Gni&~X_Yz!-Ju^kig(r<0acsg}&7%cC=*bnyW z+aa_|l;5-m=wA&(_t(~r)84MX`0d`Nw3F0U)` z4SuS9^zV% zu1|eb?LPeq(tMEqZ_ZuH9qrF4%AzJ4_Hr%pz44f~6P+XE*mw42;ov#x`W2hssGCBL zs&1=nMYnCUkBd0}^;X>v*D!HJN&>b)x33sqvavPFeg#q zVx=_WaMfrx>z$_0%s9ZHnff(DYmxTUsWXw-H|c06X!Ca4q_gvIR+M9(QX$ z+Lf`-xzxeY2Bl3G#)#&TUg*yCYM$-KUhcmM|B4!vW1T2F-!OiTEfPWc#S#C)V`yvm z|8ABHgO^P^{g(O|z_`wJ%BqlRcC;f{ZWOwm7J_}GAIYukRPhrbIOAM~fqRMWk64L#hN`$TMt`D(t4W0}M02j#>LRLknF zPK>?V)WO@+|{XM6)ov)tr-C*iX!MF4SiQ|Obe0!QQbT+Ma*Uz^P zDC;N3(|;ODd$o?_LHTEcLibS+|2cF$4{M@=^Jv?Swe z)SqV#dMSS`J+Csc-!*|gR$9`AaFwmg{NHU>E*D~q>qp=o)f-Z`(T_X3$q+T|N?+{( zaY6swrf#=j{z=Gb()lgNg|s8QwsN7b{eN-pHT|8J_4sCMl)Qd^Z{1B9j;~zI*f3>H z6Ze+bqh@s1bmmN==~s5;se+MuT<`yqAYO%BARGYJr|_k%oR$Man=T*Uq3%qV~%MpaTn|W9LyeD{U8X(ZltAIpv4) z?_G^?Idrm+9mn+ZtFmw{{ho-k%!k}Z2cUBwCosl<4JD+~uZ(L|r+vvv9UWyo^x4n5 z^4PXZq@V6v<@N||gRRtYp|4WfpzN+D{Vnkdy}ceAmUe3*ed1sXPc&hZAA3YSx+kv` zPmBv`i+wGmmw~y#o^rnr=aNW^6SOfksLM-;W8*>e1UNn?vF46x;{hdLH%Yh&0+&nb9X%x{y~c%wMfW_x#RNTP29wF8U0W^?Qgb@?SD2 znb*l{#qZe$`hLY_d~06S_pvqTqgBz*X?s4i_4Lz@ZJAA(!=|0O4!ig_`XoOyKCiZu zcSaEp>e$HB=pgb!lZ6$~C$r_hy|haosUO48!!IbWg(yn}C_8oWH}z2IX2iF0>q)vS z8H+u=T@S~ZLPjMI?!LyqqQkU1$nAi7x;yR6f#;;7_Qz&heL3?Rb(qH@jfJ$KjI|oe zlW()=J7Yg@4>u@@8ySE45#3pVxi1Ut66MxW_Rn!VLb~I2G9*#&>Sv-qLS8+mUM{+W z&L{4dYtj~BvzBPU*a+imt9E_vZ{^)QrDZ}7w7~X@mG|hnkaZ6o8AoE<2RrgN&TG=2 zwsPMB?VrBgxk3Ys%P6BI(e`pnUup+cTVW zCtX~d($?KG@Wi`OX_trgllssULTfUo-!X0AG@*sKe@duKDxi+{O~pM|BwpOwbvB;^Wtb)`uc4*e12SB zA%A~(Aj3B{r`!&#tDjw|9_xxu6;f2SA2b&OZFJa1%8U@h4azk-rZo9HKazAu4-F!( z$3p^b!`02q4JGgtEBdh0GRBJIKM!Api|Eh3*p#vQxoYI;e8!a?p(8R=Zj+4Y9sF#z zPloN+(Q>PWP20ZNWPjX0*#5t8moJOF&l;hFXj8Ifmu?1OPyL|?U;}8)DqMKbZKW7qp}2Bp|Kj4 zE{ljeV`a6vGk5$H`xgCSE5*OF{U`ThXm>PmRc%7;zt|RRhc4?#KlLzqrq+vZcG$W= zH=&20_aMK1qEA(jHV*w+47=^Enej~8%o^G4-OoZtC!PoDVg>T}YtsKFwtp&g=vvOL zBVT)S%`jieg&%87_M-#o+ssjI-xrjP=rN2FcgJ>oNPG4gJM9QMXApg`aWX!Sd)eQ! zCpKm}HUEFZ7IeEK(SOvhJ9KwWiSpcLYTV+Cx4AdteYCl0+tVLX`y@X3<@K#d3n5Xp8OKYD?L|IpQqzCATCX0W6Ut#5 z)&*zkfxn+Yd5u0^e~JD}1#E^5jBD;GYBB6J z(rkEL>E=->Y^c(VN&mr9*NqteYr#AY;TO_L)uD4^4a&iD(jOPvqU2Xdg6D3vV;1T zxs3EHVgP+Q%I%7Q_F<_@TQ&xp)K>gQ(-AR7q^R{izH}Lx0L= zTI}s4+8(w3d!MrR*VezJ!_4K}WSs0B<4X&$8)>tb4P(rz4Rc6?X@jxpG`W9*wZGh7 zlkt?R{&DPh@+*qnZcb-=z-IzZNox zwA5tI5V7&~2oN-(%WIbnvZStT}1IdL8Bn+H(Bi1LkQ+lQ71|>T)cp2xEz)<9^cr zaTxYUgh5$4$H;m`=DV>;lang7nM(>|E_IPn2|Gyr$KEQ`Lb^QHK~F<*q+KNI0Bp)~ z*&fU@fF{{4vaXK%3wibx{oyCPO@Veq$kh>YyBQrZkhbSb(vox@hi;vrwquDuqc__o zf5is$cHf_+-|byl<2;8kPSW`W@i+F9*Hr3+?!smf;-uOR)m-Tlr^6;K#JVuq`Vc=GeR-96FWSch)&3D~->;P66#L5=yI+lMw-WzG&z8qW)6Tlw5@)3ZlAit0 zBg$sl1MKB}lm&B9`f?`5{?kw1=g$%Hc&~WcvgM90SXV_{JjO}?N3b7rhPMw9k7e5!Poo}O zB(Hb#|0MjK-0;%RJy6>P;WmkJfOp}v-wR2bqpV{$lPWwsO86YZ*uDM;c=Hy>r+75ohki^NbGR7jiE^Ps9EAIpYp% zY{>7>IO}PV?th^!akymILd*(pC8lQB$ChBgY@(5-fCwUbGpKt zqXy~!ZTAXJ)vwWxS1E(7&{ZBEjNZ7s>~l9=DEFOx_4L@kTJFEbhDJf; zAvPuHuF3IGbjTRos&nset~2LQ8r?!YYMjkJ+=p(nMxV5}Lpro&yhX@R^zuGzyP`4Z zi*(F8Y)9|cFe-uh476>m0WHB;y*GWw((;~>v@1d^Ns>CD=wn_Rh3!KK&$8u5Bfvnf!M(OuBDBo@<;9O2>Vy`wC`Wk@U~K z(Dn*!tv>c)8HGN-r1rh+T~cmVvHpkpJ13a7J-bn<@4}iD>gLZIX%o3mzFp*bMe0{2 z*0AiR{!B;j({?sWL)(=|I&EeB#ueHv>S#LL_D#TMug>@_diW@I&UpK4fQIv5`C$qjJdAo{!y&6{02Sg%~()4_8axRd3EX%;Va=v zo?;K%N~bsaea+;5HOh-SY1gi-K}lPN_6^(bJncm&I{qm-L`Xy_>BC8MQbqPFVoMf7 zX9QejZe$GWBhaTSm&owXkESm+2pfa3tjlXyw^5F{GRj!BQPL0bd$OG#2Jyc*VZ4u@ z=V-g~KNCk-H!)aG4-55a9R0;+*t+9w>}2VZ`BH4h3q$C8vejfDy3tWi6W3irmtc3= z%Ig7)hf%l6k#^sch6x3Y%FvHI>x6!~MZIeH9GyhFznOHNN4@xFrcs#$ao9pL*(TJ% z=D^-tLOl-tu2-?63Wl-IWuJ%52hk4eeKP>WnM8U@GY|6o31;V<+Kp64 z{Toi63NcW=J$#wZE@{Npqh2mGDsz7zoU}F3=!}u*i{h%yX29mxFHbZ`S~-^NDe zQZ9M?p*yhq7dI&% zLhkHCZxjAur2RGOnUFz`8B;!IP`VRuTPZ}jyx590I+^X`vtbSO41MJ&?^hd?@4B!S zWxhN!g)omoC-{t|&QZ^w$59t3yFzMK(fu6#t-dd>l)sJDb|NEnDm!s5s`i=o)#SOq z_N-~;cumUwGUE1aC!YN{%lLg-`h>I#3zzeZ0{X6c59YQwK7s9)+0--AZSY(Cqm5eC zQr;(Q9qT`K;Ad5yH=>TN&4`_j{%)~Ip07WJvDu}JF>%j2#BV|^_iL0NTl5z9$!&d)=K9<42n=^UGLREAcI%3Ol<_g}hK5fP4*Se8jGY1-! zxsYly>vYw0m7$`q)s(T1YLvxGlqKrxpPiVKXDh@>Eial|+im`$(oIgv?_Tmn$chWn z#TnWeA*C#GYy6$HEnVa}?YF$J?dU_05sX3yXd>l|=9n6hIl^Ly~TX@A;)_2@_1&#IK8W4^T4v zOSninO#6XyN&1-xW0U&WMYt6*AGbpKOt-(k>mSy`pZz2~$8N?RJCaOYt2v!FLkum!`tkZiyU7E@q2X#i1%-!^T?U=S*PTZ;u zllQoPk~J;pmILK@cBl^HZG?UC4c5an!3G`5xGe46$M!~L4LUfO_UO-<*nhZjH`AtH zChb;Zr?qBIfi`j0VeBIEw+P`HNn3NA^cp)`yQ|#pIY8N_KHEyq2TWd7RIsPrPecVb(_ZkKU9>1pqu?KNV5=vmT@wqUBNZ^SXT9oThK z=u;FGZ?(kE$xi<@20O-t4Nse-$;jG_e{9wNi{rPbKRwa;oqnQUyVyRRhn&C`C??&f zrVWYl#Ae*a`mQ+a?mN=g7w9A*S=8}PvA-iT{-SeYupbJ{B|Maq54l;_l8vA$lAh;71SA%qxLs5RYbl-HG_4lG0GrlU^eLKh4^$a>eT=q%dHHkAL{ zxV4q$1@UJS=c4J)_SVmQTb6Z6x8?tK&C%<_QR> zd(4z!6h})^w}h;rENm=G|AF$eka{R&)hOnf)-i@*lWtGy%WIc^usTsfDq}OmV_TkL zZ7+V+8N}M?*Q_tQgdP7Qx_<<7aaUN=M_7Zgb&FS)*E#-fxvhsuoJ&&UDE3R2($6&s zr0jNO?CmA`p1eJ6uQ75*YVO*I1BhX(XM#=M= z2(OU4hpijy&l>swk@p!lx+9M@E~%fh-5VFp+=4%2h1jll-`bv$`}?WWlW1qU5!Rn+ zAIGWj6=!FVe?2Hif2PHbBYdN7VPizluWUwJfIe;ag1M#Qv^$iWhvg`jjGI)$MjD3= zdy+a^uO#;UUgqar=|i9oRzf<`Y9V&;KKAdD$H(YfTolJk^BlrsitKF0oMUM}h;xGt z^z|5rC^eM(!m9bKF{G>ud4k^glfIRB6ZLg$vyiOxUzgzrdAf-_5fb6V^KTyXr-^%h z%H<3COmERYwsHYosmbl7^mC>fl=F)j*Qmf8#Z2Z+(0jj8Cz99?s>Pb&ZH#lQ(94r{ zZ5`Y@N_A|v924kkm0@0wI^$D@XLhLLG1$nf{OAjq4NCh#%vVwtgLmmyXQHkr4rU$M zBK_F+*q3e5-_{H*NHy%aT*efeUwRtXDj)u$*>yO>q+#-@axx;jAP%EXL^L$ zU$40z|B(7|1pEIb&mWRDozPpsof%i^MIV8(>L@OoU?8@uCIiuF9qAY5CoF%A zXB@1bc1CW~eJi)83C|cm`*XJc63BZeRUf9SBK@D?U>l~U>?rT$RYCMUrZ$jaI{S`x zj<)Co_38>`w*d7*hzIq5p<3o+u)QtRg?&cmb}BG`ieGpCV63eRed$v42`Q6x7)y6~ zPd|}%DFi(iMZefJHQ}yDpS}rwE9&^t_Vj%!GM|7BNRO>BnfASI4DSF-)YEJt<+hA3 zbA}^iSYQ3Dr9HlIq=`SqnKp!_Xa~b<+2cOcfFV4M}Gmg@eG1O@6 z2W&%4{0OU%INVhy4JT7xEbQkboDXOtgxpkhjM$$xjWUT{Dr5{gp~eEaKZAPOkoui= zHe>bdH%q`C!rf%{g&a$*-_v^FAO7?Xm)8%x$oS3^dGYyGdfdg4%>hQ`>qy<>Q^y#$ z#fIrKl70*AR#wVvt%KNr*aC0+Q1^-B*#yR7mNCvpJGPqiTmFdlVKd>4WL@uW-hK0q zwOtR<&x~`OM~|%cr~gx1hUNAg{a*bu^Ntkqvc)$0cs`>1?82rf_#fOiu{^8u5bJY zkPamT43v^aQcAiTBm^W5hi;G(P$WeGk&rF{B?Lse4NAc70=-dG#11g9-p@K~?|biq zKF|9;@BRDdcU|weuD$n)x#pU4%rU+r=3HwR_blE0^e3XT!Tn2q6Sn7@LvjKcWA_Qp z#ZwFY@A9~I(Z`Oftm%E;vrGK*M~iu0bshhGwjAzU&q*p1r8oHwTh_+*gX5X1S(nsW z?CG~{s_@+JY*>^^!s7yD`X;t$8+}^MzaD+FeDZT_*BxvO9_}3?4^q>!`*b{>(y@b; zllTwnZE%BifRA_%qJHqLFVpXFbqTb+C=p~oOFr>=mGeruiKcK$d&YM7XzE)2-6+`_9o>+QZ@ zu+6(~C!_qwC>`Zbo#J07mJuf`iylq+`&ngnYk_=@c=&n!9JUGFpFb^5KM)+8xl@5#fHGnc;8ryGA(}Thu&a#4k+0$h)^(Tk|gQ zz4leohhh)IZMoTa>c^++&Np~-wcME4si-mh+WzK~@)Qqg&qw@zQBhAP_Ky}2iSFfF71|bw*cszQR0`?Xs?U;ZuH*oa1S} zX*PD?0DfkE!TTr4#6$Ws>{_wi!(!Qc;E??Wu1%dvoZ@!_`MX=aUl)|0HntVv#BZ>) z#V)wIC+z1^I+P2hMCk+!+3j=e2Qlg&Ay2L8d6Mnz5#DEZhVcBD9^vnIeC^p^!WXjk#Ql88 z$>N|I{Fj^MIFHf)2hC4bO_h+UMR@(ekH~V7@Y+545>S)j{Du>9m(9gt9q@)so^0gZ zZfwl}c>B&%)@v3O!^5GA@M{ja`iq}m+xR{7sprw?e?E2msJ)ldX!j53LPQqE(Cz#m zz-==4`wQgSc8Pf~c5&*25?_dE=f-L%SRrg*>_}|uZG8Dk z1M;P8^7L6@d)M&yqjch$=vMgq;3oc-dZM&@ajcCuu%rFYSZ~Az&fOg?LH8dB%S?k$ zHLJ#sk6#tuuP{5*=@BvwV=}E_L-+28W zVDqxDp1$Ou0vULh+#jPa8|YU+4Tr|sn0&z3mv|RY+Vc8u%*&jG6}HRZ`8jpY&*FKb zo5kW^iO=-s!C~x(e*eWj_u(t0(cUM1H2!y)6D-EZ!^=Zw^~#R28I8vgRF&XM5<_>|@Or17-!U-Hi%cy`2ZKo8O1A5X{Xi7$IKTN|Z3@MYj< zaw6yG2iv9?Hk)wb*Vwhu#NhrRZ@NM<`thGe5S(UfXY6} zcD}|Z+7a$Qg!hy9@6Q#KAJ3C2;hC3{i~YA>pEoiu&9Ch?p8SyOXBv4{eUY5uK6Cke zjl_@faSr==nY_hUTEVz}bteAE-?y)4-vWAfll*x{F~SA06W$d3osYeipUf6SY5E^> z7_j?t`hg$)+fq5Y2o?nAhti+H?}sH{Paj_M*dXf>;p3%^u^Q5?;1fo4KX&x*Tg#@H z|KgA4%VbV|DqEJ{81YA6C!cd(hm-xR*Q*oWXMnLf${t6l`AT`)yr~mPIlk?o@aR+a zCzpktrPxyA+2xh+_^4E5;1=@&ycxUu=rnl#9Qz!pdq)A zUAAs7-RMc~W^YY-ZL_znE5WDy{MJ_PoAyyT1@^xKd0mp3zfwaE4JN*Bd#-jo+=m}2 zmOHw~d)wgGqQ}J!e9R1elYsh7O4*L& zgTCrc36Fo77(Md$-}Mb)b(NII@1^GtkdccpwB&u{lm7gAKU~qS46nlO9DIIb@Mi&W zTw1Zj4dU`AVeNI^u?=5WG_j@~e>Q9uf1i=}B-;U%{2?}OFYFV4-eb<;0X`b}4``|} zjHlb!lC5wzo{sM1o5PNHdZU2%+V)qrT>MdMPlkm17t_ddmEi}j59=C!OdLUO_P~b? z`gnlMR*vX*${MVJTp+JENe-(r4EQ}|`-*iaBV&4d@Gjw4TNl5YvZj;i!gF=- zHYfS1f;YbwGS^l&Wx43y0Y22d&Ii`t(tXxxVerk%(8aXcQTL`b;$H(pU!!pOo!q4T+WzVq2Xh3-1%_G8dw@jAvsBO-c zuiV6S0e#7?9gue&4KD|?{fFYleexAzq@wZ<{IH~gd?fncrreFUa$1#-pX$D)R)^=VhfAf_@mX)O#z-H2jU-TSJ?r+`oLUvHl0N zi5&OW-+Ux{nKDHrOeyDY~F|c59r&q z#`{h(!Y+O(mlDu&va#0jEyL+*c6KgKcajVEs(od6{p`5@O&~WrA7F#q!&P>$!{At3 z>gV*Hk{_a1%QM52apKf~=6x8}wd|MJ`RG=*<>A)dU(0E^X0Ui9O1&bnYp_3cUU>Z2 zi0IkB|E4E*Z$A|~UXb0dmyyj*!**pbuk)8Y@<2J}!sG}(m${xVvcTMz&p*-d)%cgr zdN1R1IUSC}*GDgU2S)qU3EO;*_{3AOyS)!=Pk3y4Ik~|_VO{TDMGsobGcIH^KM0Sl zax9>~4q6NM+TZV)rA2uDomuAl>D&qaT_U?XoV^KX1fM;iPwJ#>L-Iji>FyEBzQY&Y zE5{bGKlAi2pe#$m-^;%jRkW5YDXjOVkHWKE^QUZENpW>RUA`CN(czI3lXw62b$wg8 z%ZRO9O?CsSvnKovz7NxZiYLOlSIO!1=QDoEkL+G6)}Qixp*#^EqUF|DJFaJ^|95mA z|D*IkWwz%D`6qJxHv1LORhi_s?g+Q9n`L}@ig|yRA51N_yH9}tpW|rT+1UNh$KiQU zq?NJlppTO#hzXKBLpYRdFXhMmWDRWg)Cs?R$X570x*guq_vgpQDxS{<##4)_)|Qgd z4t$a|Ti8UuuaS}BMa|>Nq1u#XR%!$PyOH%qo0RC4D&dnVWSW08>vs7+ zb|6YMdxv!_TO9W5%E{u}jh;0mX94|0|1YQFy~X|HY1a1e+#fJHpyTpwztXk4`g*&*sHS|zMA?+fAa$JclU>asB`oSt zj(tzp=FV}L89Ni(dVi+1E`h(ZM*d&<(r|TKG5On*){yb($DA{#&o?+!-hAOaYkRJZ z^qc)C#-IMI13#jH@jJ@LCGTr`iQ(w|hw@KJ$K{&ZSR+T4wm9~yJjy7TcDM%HYX5uk zwV<9j&3)hFj}&$NZ~BshtaZIZJpn)IWUcPzQ6CUrFExJ>iRri9WvxpyG3!KYtzNPA zfUi(Eg6XXy_9NEIlv{PlUA^n&?_qa9zqSqeAMXA4-#@=$&Rt&vx*cyichtV-Vq7uN zv|Hr{_&Nv3XZLOVX?|cpbsYQn`Q*)nm-bk5I*L7D|9>LuulSsG-Kp^@+mPyv^2;K; zwmCTt1II13K27Wt(7#q#OEe+e{%B0fI+6?cs+T_88bE%MQj0~&eLPLu5!*}CHg@i( ziQ(~%V(90L{lGuNb9JWhu_wtde_|dcQun6Su{wgSSpi0%2e+7G+#R;70KaxsRXJU{ zaQ7}bkv?IW;CltR&TQOr_!RYdm0k=cF9BU)KXn8PS0CX!yVt0O=2!4O_aW<-n$VY_ z{E#O-=fU6pva&n@Y&ON}}<81qD`W#Phvv;NF_d33AKpAfhe_xm%U+VAMqv`V%sm$%n3D5Of zE9QSVW!;xwHHdD!@AESs@t>%(b_Dc{x(AP-Ya``~JBdvqe$ta?$>(r+T(Q_+>_)e; zA#d(!9$r_VRQMbJ-Q2D%{N4xd@+w^FzsV9zNjbE8)*_bN%eiwodsouS;J>9y`_E+_WjV(mHor(D%A{?7nD%~ACwX+uG}u#3#|ZM&EBu81$h*!obegy$Xc`Eu&|qdat- zu>PX_+JIhaDfa%DEpV?zP094v=9t*n-fZLT_}zy6tj*^fQ`|eH*|HTqjNfW`M)oDk zRxvxC$5T~UUPz4b!Ij1b?oOR%ZeN>o4wV0dduJndF?!9Sq0y~`gty{iyWr?XW4)N3 zeKb4PmldvW+CRpleIHw^LMQXnu|4p6%L?mH==-~~`5@Y|Xq!BoHufthK6n0ceriB- z>32L`8Hwkj$7;-#tN7gWn|Sg*d)rPtpFv-u^eha%@3ZJ$%HLu+W9^$(BiufGg_sOJgpGoxp6`$!(%Hv-H|GUV!)6IHx=GO!MR}kMG zF3JzWw<)eYvp99amzT|pM;lW)i+QLBUR}h$RP23}2BZ(SQ~AB1kA>#LIeL24UTZAI z@C7269+a=1A$HxgY}SwE_inSC?A}`;KdQi^#wE?C+#xrxNPZ)uyv{?Ozc9`@@hZbi zc66~g`mxjrL#KPr84kX9E^JBF*TXu3y)OKadfKvcE8P)04<-BGtFI2@`m#zf_F84^K#yP+L4Vmd)73Ki>73x;k0cwtzm|C@-@KR`NkIkgLpeYdSf+0+tN9 ziy!QhzK`eT)bkk|7EjrShx=Lar1w+e7XC{>OMArHS}IOY=I6mT^#!zSQusT9Tvg^D zWTR`j@0ZI~epgR63Ql~8FHu?y1INIrJo@!+Y0re*g!gnR`$BE7T@H3k;J5!1RpW2= z;EUW3?*dvP4;9c)%lIs7`BQA-lo7EuC!h3HA7<1mBPTnNUwjd-@vluI>uJQw2P=7= zIugr9%SV5gEVNFdaq5J3*!FCU+49n1iBrZXZ#w^@IYkVSQOy6gIk=?oT=4zc zI?v8W#=RB$+3}+H)EsmCN>~=jZ3g8wlbwL>`#Sl@`>|r z%j7C*?nwJ<82gT|ht~(+`7T-4BaS%Ye*574RQ|^siLrWvGCT1rprU!LX~`en=Zll( zcm4>sA0RJlwWa)?)CslY>`i!;eu#N)>dM!>A}s&aaB)i{&zSj3cv&QNzrv%v6A|95 zjO*JaK48~Od?gsT;AeQqH>tN)Ty>3S31C8jOZ4ncKF>J5yjXfCA8|cj<|G-tj}7Sm z5dT_z`8FC~e)M1G%p;ZzTbD6C--QqM^AfSu-mo2W-c#4TauKVeJ&652MLq(`d|z00 zF&&Ijv6<$zjrEMjW5+JyNlx)!>fb$U1VjGn;N3lsgjYOR+**HrSU$3L>|?pOJ@lH~ zW>{oSpRKHGJBglLPA}resmPc_&wZlKo7FvXn0a&82Xu4`{1=~YR!_!R>p z<4583;(FM9Nq=(;*LIjNqaO^a7hXS)FLOC%;}^X~t}4__*{+X^n&)8;ZY%=Rt~Tey z=44pOPi|w}mx}|QmETGmUXy;8@#z(-yDq)_ujuJR`cpV8TkoVbL+pRKr(s2Q_Jf`t zBTHZ1DX0E@tiJQto6oKp+mF_rmtBvihA^+ooY=8L@Z>Q%^3tkUsdenr*vNS1)2{)| zV&^LM4X+(IBUVT3tmj^{rcPK6=P$wSV-Y{=*&OT%zuc!#QoM2#tEt#HHJiMZxb_|5A*ULJT0lFWkhf*SmQ1q-ihjO_2QS`W|2Fenak?9n9oxrs4a5^4__-&F?wH5kkHHLfMeE}aah+PcmXZ5_oKaQtsH<-K07#?|^O-=e%TqwqvI}`RajxU*V zyC~mmgk5N{Rj0Pk-ylODwT?N8Qj0; z@S!7y_8FOfbpH{fk_P1;F>+L|{zLOu=`y-!m;OU~4jR>~cb5?(hxZ@SH(}_Ip1l(i z+qP@dq-CSTgf{gOo3y;WRkH^5|D(G5tGsv8;Dp2`DsE7xMdE){+t6rjt^U8Lt^d#w z+SRJ(^;hKe1(<77Y~tKP#75 zuT}e&?f#q6;hiFNc4*SFLivOSZQ8VIlhA6&ps@)Z`VVnnWYX}yy+1dty&D%9^QujY%?1-d6 z!3ZUe7}mRIsEI~DvFETsqecWD+e3zq>^FSqUAB7l?l~wZmk=BpoJ4QO1lP7`TPKln z)z^C3+cB|m!r-Aph7RsMd_=;Coo%?GwoQO5joUYBkVx~ICk#&N zuiCcBK%3ZqWbffgBZm&Jp4ebe@4=-K+YL{m@}&~%3<4!Jt5r*^*ROZafyN_RFfrg| z;>fYX0(|~Y>i7>XPZ}|zf8QaAeTEMmoZOs$SJiXqkP##Q-PHf2Pyb0x|8aBv*1rJo zdh|^gGr0HQp~J@}j0tr!p;zxgy+;NR(7UH0jO%y1vHyo7_rJ%1m-G04 z+Uo!L_5W`B|LoGg^`M_1@J$m)FPPxG)KK!Hw+Z9JUb1*Z0yd2a13}pp0Y~vWZM~@d!>RTNpe& zES*Inyr|?|>KDSY!O@M{)NgWpZQ=Hpg5D@~xGVvBzO%{E)dG0QvSqmhjS|Q4^hO>D zg6F*qt(6B~&Ra;*)I!6fv3o|#?vG0jMUVZcFLh5#TH(v3LlRT&mA$JM4NE3n6C@*Q zcmVAVi#oGP;5{h;l!&ht{YqjD8>jEb!uw?CFSt$$Ydw@k;;v5g4w59EZa3*HaXYxVaoOMj?>ywk0-A%7%!mQyLx+*2*x!3#MrTB5_Ol;O~p)}?3S2aTXdL zJ&UKbgH5!);lYuav7?2JYdjt4ATi&T4jQ*-iW`Gc(i(I-pi28JUL9x=?7>*Qhvu4K z9crOxW-r$*Y0@o8vb0z1{MR-=me3xSH|{P4C13F8(4!JuX-&vWaJ?6qsQHkduO1&) z_P^K+{(SI@$fQ7?19V2B^wfKjcG?)wpnHU4*W>SV7U~UA@*%1cJyF<68Vx8Erf6Hk>96U8wdTpG+Ba99|s%>ugTObR&R9cVdY*}E)f_h z6C57~v-7R=!espT5nl>V4X>YE$HS8iC8j4?5R+aa67QSd>lpb+eV+v-j;~oF8C=t1 zf(SmAxhGZftw!~>P(l*<#8Jum+fC3vjpy{T+wbA|piuM4WY?|cW%khhDPuVicGfZR z0H4y*>GtF_i?%i1!QPPXisW#+1Yc^roK6RN<~DhMs}~=XHtAiR{ed$_@3#m{l6k0d zZ^4c)wX=)_^sJrkbzRu6E(JV%+C<&P`-z9~?~*p|kmRj^uWL=T?UU#oV*;$Eg-&B7 zt&PcpADZB0i*7cywU?QoIE!cJyhOHuq_o8T{5h^8^Vz?*pp#CN_Sw|Hi}GN>gV&hA zt}MyCpZv3xZ^Q44cy0AAsF??x66HKq%a#WzUyo5qI8A&WxRl->UIY%5mJg(FD~t3t#C&kruI%uUxX|{7#FSikfg(8aqDeoQFfk@Eg*{ z#^6IbI@p+Oh~Vq(>Dd17OypHHk=wz8v)Vnlm&GaCJv9e;VkmrElR!NmS6GdvW^ z|M{6MC`#UP{z}KjsjqkPC6v=*-o{?E@(KI%Hks&;7ktAP*snrsV2<(u%^(*SO^$6D zXcBb@T|dHpRkNVrSr5I|=WpT5wUbSLny3pX8{Z*g5q#X|#jE-srKcVxyXQ@?OtgrZ z4hOV6iH`=822_u=zfU_hdB1jXMjNsy|CgD3%tl~65QW#tx1u`=#Bb= zKLY)whyL7V68(D*3dW7^I|um{>n#2nWTGv*@vlT4$l%%}4-(+-Ab5LG`wBPrV2b`c z))ls-0j_G{5p}OLg+2|8;^dJ=em8tnB*>A&&#T{lWHZ<-?ul z?*=daZf!!XSiX>>Yw7fu5q#&4@Mdp#>|6xn=HvgAmtteExR^=%tHLtz-yO8A;DFfu zo;KOlc$5dd^mUcG2N&`pBUtePS$h3$a< zi2gQVvje)3A9nr=HkeHRc{Mzt6W7zzfVLbBe=iLTf7{N7O%uZFT9Jc4w!8PTz$ar9 zjnTrMY$|M>QJyax_-T&)-Xr*PqVRetqJ-V_`aZJK?->(lWU8@xl3Mt4(Q;v#;AMyb zjcjP){z|@;^S7=y{=4~^_CErOWgeWHRlbmwmazqL9bv9y=Ypv?qPlR0%~El3DGk{-6g` z>FW>1@aF5)FK%9Zn2oDT?nhXdQc~=oU7LGEYh;Hn<3sQ#e!&a;97}WV~rtwiV_FFFgt9p2^8S32$Cc#$JY* z{lfjjzgg^e&I596_%?lhW}6o%{vOk>E~bY?jW5= zcz~>vyY7YI)g}*J8>{=vxxYRSO@zY(@XciMr(&XK^ldD8`0zmsLb7;iOIi!F=*7Di z`O-C$tN!=bw5L7Hwg$$-xA!CWjh-x0--3~DCZ0Rt!AN=nOP|-4w+ncoNmj94UklU4 zMElF|Mdn)c2*W;}>!p0^d}dKt%b0qp6ROa!fU?hu@juui&?d-BybaL1wG4CD-+Yqv|Y9f7|V`7{?f_Jd3~hJ(CRgNfTV<#Q@`d zjA`F=VOzT;X_J1QgJs={gk_GW4)52ba=0ISuWJM2=0$IU&;cG z-25zdx_f_qL}v?p-dD#MGNP}2+40nU>7BM-g6A94)5S;mDYx<|`6f58QFrb40y;Xp zX+1e0(|rzDOyk%=zR3p#{Snj=KIc|`Gdx+H*`fva*`Tjy$Z;ZBy|@H^^s(4^8k@Y% z1G}xs3LUI*IP63J#_+jwtUsxr;+u#&CersS`7mpXS(pW92i3AD_ARnYCO7XA>*g1m zvdvrHqf0RB_dy=MT3`X$X$!D6^Pipx`Plqkd>-wgDsjjs%{&CduYIw+ho>U?aa|^h zC&|`6_T+t7_oe=i=Ob-&&p+pQxJucU2V?C!b&>Bl9S`ZnYZdT4Qcv!Gg=Nk*qNDU+ z;e~Llf}_Lq{~>xe3^rb(*8#P(IJW6{aU8rWcXxO!IR1_?%DaNi;nU~9=Ub0^fmc5H zHnI@B2WZlg6}Jahuc?@ z!CJ=q_rYxaYaWc?>s_m!9m;=7z8A8q{dS7kX7W>E_dDu;pN`(q)gtq{vHF6oV|?dD z+FxrcKRz8@-7cqjRNwe#)Aa9n{}``=@-wT%_#Es9G@DLOe8yrR@x~_&EgmWv9`9E= zcI^jy!(%_}HwJjppA5Xnwl8QTu7-ynrUaR-`rc=Y~;=f00>s`jH z$x<(kA+Ns$c>uaT#l82rZu&bGW`F6Sh4XA{Ak+AeY`pfU2^S$^<%`LDU<@a@MdeDNZ9P-2i;RQWx4jY!g?g98YeEwx( z0~io2HvE>(&poVfW1=kxf9GuUfK6+<`Kdfd*VGBM-;#qE!6&1m@pN5NJYB#PeneO1 z;xRc078PHr$5)vLUv6S&t7?0D7N9U2u*o$$$WzGy~1_A&ZyOq#Eb z@glg-doZhc6FByi_OmUw-6;m0&yK_MtNO?TUQ9^HpWX|_^lLYrzu)*5nH{!p8Gbyi zf0xtC?AD9g)EQP!#lOAm!!3o`3ikX$Q*qxLUOeYmr{~3uSHny`cy4uX?8pE96+g&8 z?y(*SJism_u{SWc)q=m@r`PlJSAG3Y^8@J6J!Gn08NSgGeh!@4p$!3LiO6uUeFq!} z78gb-6`wXrCol8!3e^hF9KzQfY=1^r5ztd`t8vcoT=YBmQ>LdrkSDH9rbfXn{RyZJ zEcvoIKVVbxZo)jiLqKn7W0c;9V}~BMh;k;IaaHVir2+g?`Rp|0H^*Y}rSbU1*mu*P zdyV}cL*(aP!q;o$Z|G(Nn0YXQrz^x&wOk+2I_00ZhwlQPYP;`-+R29#-g%I3y*=E1 zbhwvD(YI}RyvUi&4QLm>2h_~DfCj>x_xMsd>3NnC@tNHDJTnhJ# zz_)-_J}KrZlsX}QV-Fj(_Ta({{vlloDAR=GpX9HqIm2V0)_~PJ>2pJTxKB98J@`{4I!%A3(&vMCk+YS!kKYr}vQA#c4STz)qd#4arz};> z-CP@%i$5N}{UThwpUmgmE+^(U7i`a(Pvs-HRDds8r)kP_o8Wp!d^z7#PWm|y7>MtV zwU)1x1Bj6W5QBhB3KdZJ-$GGMO)IdZ*TgnoEDY|zJr(X zXM;DJ`Il$%k&hO!b3ek>1$>Htat=xU(Or`KCYlEXS;ocZDP2PVYI2c^zLbZk?Fl=aVMzXJN9 zCp=vryQbho4~nt}=iyD|jdE=C?dmLitIhoVPUK~>F`gBczmAV{V{w?AmX8G6OHT@q zZ(;8O+G@NnryV!M?$wBXMrkMf`6oKxD^^E|IboS^;rHeAb`stC#*2=B=2OG5u5@Rq ze$9TEZKTt63Xs2g{I>7Na9uf&LVRaB{x)nM0~7BSTdg>upRm7AHg=kCl%b!z7;J6e zzFEl2YZK|;T`BLpHgC9p+?X8pskNFvLKe=alj5!G!Miy9zq5=uy$QSwd|z=*xi)N2 zr?4-l=wX$JUbST>z8x9kM}vFAGQU)}5TC9G^v?Sp5}^alU}Ny0%T)Zk#J4)buBPwn zh43)4?;~D30n-AS;eKE89RuooUGPVU{5kS-cUKP^WRBe{I6qSC5zq^8D4;p( zgX2$=w#kQ*zutELC^dRqeb=(3urN0rznm7d3y(cdX1*pLRoeuA&K@f@1i#*|9qvEf zJJz1H`W(=}`r+@7RoFCro4q$yCOBV-uduzihma2NTYo0k@;+m3<$G-q)2<0hn15wo z7mtxMxFy_wL;uHR3Acmqvw2h2nLCk;Wbm?(kzw1%9G1V98|?#!Ym|{+dD8sT68RNv zpHF8x;9EL+vvZ1=aEpg;BDOPjhj44%0b{UEewN=-tt#KDfVuM;{$O+v%uruT{i}}$ zb7pv%9KCL~!?Dd`#P($C0&HpL#Rflxb^Ue%&tHRwbnq!Y<>WqIHpPy<(-KbKEe8Bb zu0A58(RMrwmoBHWyT}Mx=u9Wek>AhBV9wm;rb@Bx*Av&7@UR3M%l>R32T|%U(R|*m zVwUydL;ly`JH&qUZR&OK8UM5Q6pM(dYC5-Z8Xt!JNc}jUC9aNBIpqlN2-`G@pR|9M ze62qA8|bA%XOw?fJ|;1C&%SG7+tGF;<>fcEHJ{Z_ZsJ?9(O!Aas<5E7hfuPKJ=uh& zH(Enb+k6sim<7{n@^uzIL4Wu$0X;`=;_28?@x)m9)rftJKNoDDpO=!4X(AXLE!UN= zzXxUpbT7I2wFB9o43lq%Bl;G+5U3VedRPAfnu$06L{0X^j-JBDA?i#Mr?X|*g;(ye zMx?9<)~0!I`LUG!XtC3AeGO=7Me*xra0h?)7?*&Wu|3)7WkBoR4v#hJEqBjX&Yhoq z;%|;k56_M1*B8hwS*e;)9NGYe;m`L+y;Np~IH?pHz8I#m3ESymlx81_ZP&~h*1ze1 zhl63zF8;;rhs2^{h+@yfF2|=;BfD(svnxDA)g~+-K!2|l(HiAoZj@Ieqf@(t=c8wC zddi&8vvL6JR_D&fx&U0#*PmMOy{B5k)6IRei@WK{r?CD(zDSgYu-{R-FTeF8Y~;0Z zZ4b^>|5Tp;+3=d9&&uU)<^M00U((;v^!=CPDcf^THF;}zpGvOlm3zYLeu?1BtAS5l zEId|z3O`wY|0}we4A1W)PtQk5O;4X3CCB)od=j2_dOEyr0L%#Jy+&azXK#ZENpk18 z!ZxjI5gre|553_*H8!u&NPn(0Ufgz<+^Du*PZnAolUmH=sy!N3-lHr!;CET%$>P@ll#6L@uBAOmA+dLUSDvP zIV0nc=NdSNuSNRH7vn=7K0w!^Vt6@=P4KAj*K8F%JA+Tf+3~CB^0X0h+GKK!T0NI>;l?Rruvql9zttL-B zJF)Y8p3L*jbsv$lKIqqYeDi@dO1Z2#8v?)T%T;BUZ({#@Y4^QkWCV=Q%SYObH`~eT zRqk=3ZrG2*w_4|+T=0jA2_@LzN7=*4UQV!(9_{A?TuIhDuz_@V(Mmb6mM~(oIico! z!b&hTi~bLA&kb#qsi$D6r)7B5o4eT&B+Awae_GUJ3n9Co_!lL2u z{ANByA7eB=n;7|!mu-v;ukT9Mv)3gj)A+qL={&n|@>;n_zWfbI@=t5bLuf}poy*7H zG2Gs2?2FWi9iQf20j(f=0exX?ipXIVxi8$$w2=)|ce*=Z&x5dIn>hzMy?-Acv0B)s zr|Hns-PuL_e+pjwT#TI<6<*(muO6i|Pt#Fjc1nM@!16X9%X!1G{q#Jb*X+LvpE^Ak zUNdD7tln+yR!_KnJsrD6ZXCY@y6Y;uJ;q1in^%RU=f=w+4U&VWlW!?^#~W610R^DL=TUVATl^v&%lkA1^du3_sYz{wJMV7L3XBRB8U=YnM7FS=Z~J00#3 zyYAD0p&Uh9P+VW4G>EU9=NW5@jNhoc@q{g0sGfjsCNp(bnqM%+XZUN!kH@YH&R=m* zjx2**9htB9voRjQXI^Bj5q<`A5TTPB`bai>3t8ZAFaU#I?H4GaB$v#0rLeZO#}c!6%6cJDMz ztdH3zuX&suEFJctIDSOwU3yu9ygf9Jt!p5kNLQ-2CxgF<9b51Z2k^&Xe(;CU72RXB z@yt1q+|uEC`^B*L@{jTTM*5tgj5R)aZNrz}nwZm6-)6W{d3|`_F>Bc@d<&?ccE1s4 zLypt$xlj1xh8NAH4G+sqE$iiuFkqpv9j;xoYS4#KWbwFM$w_&kSG^GFWid|;FX7+=}P7??sLC<*OPo(=YMNPm%3X=JrFK^EXN?W3aBw#6i`lmxn_Y_d>KEJ&DoJx z?6F)df2Vm5IM^7@KG2JoofPBrMV^P|wzBMb@ z^{Q+Jp4K#uGhjge?ADq*FHc2ZQ(vLJd&Fbpc6VoaAmjgn`qR!8Kk5HjGJJ1&wl$6X zb$345S~=tVc=Us{d9bUEwH}{892?Kz-dXkY8@L|O3wOubQ;uy3=&wlmTV4$J7q~}H z{eOoK7tptK@DvP4(;>XJbq;p35r0*=a>ji7)qJhl{3GL$L{AUX^JTxn>!q%Nn{VPr z@0I-b`DB%h_lxMx^7o8IMDMnetI6VwfTrW|{z=K3359L%g+YgBrAjC|TrPF8ywvmZ z((vYVJ@$@`S^$R^eI2&FSBX+bf=q4^D^{d4#pIbD z%b|^AdIp}?dYxave_pFC&t#W#Dk5)92m7CdiP`C#_$HSzx^#mzX4}OUaN-&#7a&$<(@)V2I^FBhcOyPY3E&w@XMP77at zKN=gipuS-@M`}H9UWi^t=@T|+;-j&$C+PcF{R(J2+tKBmSit>uRfbhx$&b*T#W3Rb zE94zpTl>IIdVeI}mEK*~-aI=!D~ktN@ju(G_(exvB2Vv$RiC|<%(9;|;Khzn))DAe zz3S|Pu{^DwZ^&}Jv0`fe+{%GoEEVC&Yfq4`onf2y;>oXD89resaC_aAfY?h2}#y*e7>C4DQ-ls|VdE$6xJ7cR%z=QxlFp9IN{t@_9LZ&7Xg& zg*;z(a(_`Clf5~5H*DS_*1)Ip{m9lFanm*YPsZc?fc3(?~vy)Hc`ra#2idv z@sK`sg+aeHhaco;488kTF?mV8@5k`@XLj>yvj4?Su~cSr)HB&%ItHntKTR?ZIG#M>eGiy5lD(NN#_n*n9Aw0&2wO?+%ai*};dQ~W z#f{%bON zfOYLA^0nK@Z5fB(B6v|-o1@eSQX1C>^h$T@VAF_)p0u{? zF9+D%A|3e)ubAz}tHM7D=o{nTj1SZ`fvqqGU6=TC zXEtka9`iMM&C5Bz3GWl@%Ae4e(QHayb3m0Wc~ ztA63{6XfJ_y6ScP&SDMK$L#$KcIzqaC&MR>ip$i|{tnM(vH1_US4KQ;^elfCuD?Ov zCTr(Xd6gUJ)Y>N2u1|>dD|(-*M_MDFK0n>i3D_2Ip&JXhJ#XB%|jH`I$|YSd+I3&J<^#<790rY?+4_o85O&B|aZ4 z>i3Rg>BP!(;`yHDVH@h(0_}>#gP&Ak+qCKE-TGS@rqH8)L$z(Y_Mc=|+RKyu3_C{q zqXBr@OnY*W-P;+4ZF%90{@ov316Q)$?@v)zTU*Hd45PbQ-_*l%h;Vr0 zv-CBmJRX+)g10X+4<=59r&4X5l#Wn#_;Jqr@-Z!E0mz7Jgq+EImUmcZys?OULx10_=IH zI=gV1PQdSxe6!&l*)rqs3cdW(y~@#>X5=NH9LBBMO7Zt%Yi3@d!$pnbWBh#kC2!%^ zEX5c1dSqpg`;~`mCvG9Pe|$zyPPk@;bwXtF2uvHjj~(b^y*r%wf{r~)HkPP+b9rNm z4=d=$wollQapY7T!Jj|BIF&z_$(+_9^Q$+6Z5lMm+BAF#sLO~{3AJI-Uz_=Z@H0wF z26%D#A~7W#dTBlR887z@Gp`(?Pjs)eHnhc)iu$pJj&%{w)t+k%vhvaL!+86TcO#44 z<_>EnBK*iLwx zhD^S=z&r#QTtWUj-(f9#WByrl@k(wvt1gbsB2NW9pU{-dYfD@GA6gYoX>&Px@G9Ay z-NG7$BW#ygG#6P*2WzrrvPPX;ujQNOoqrZBz^Tkd6 z>}j`L@P0Y=8UB1=9iPc~Uw>RKNjvvGm)yOChHxjKPv~Yq%kUzgkBmt}_Pt^ic{N9nI|VxJz-Jvmx@IfeHR?&Uw{ zAU|y3hI!%jXXw^1bZ_YsWL!PxPl?s0JwJx_HtJCV_RGTZtm-2bKq*}RiK zOFwRcv*T9Kg*oO-j)iqb@B9oo3TVG;^L57OmU0ecc9Hv3q{AN=pO45~)ePn;Q}MMY z8Urz1&xqdCrC(3b_khy4$3IcyvMKM`_(OBO5uQiO*NE^wx_<>(E0ZYaY3u?TM-BqY zL?;4z^g;c(Cp`CRR?pLr{gwQSwrp_01J*FLmJ7N-zDvMUa@uv3bHrtzxa=Y}HJ1 zPp2kL)SrQ36pbzB0 z?jjot*@wE;-R6@6flKM_|2&ZGbZwCy{F<^b)AeiEv>F3L{yluN99&hl=DuXsCfqtZ z{9Q0IJl}`zPleSTM~U0$+DW_&=!TPYHO}@2#}fHr0iEXCT}h6{kgHFw5nsZfAM40z z{v~c=cOQqdQ7UkgT*q{45BiZ?+wB{Rmovd>m=LAkc3GSCJOkze|}-77qoTp;eN(+%PApLVg|<>dOwTFWwGEaM)fZ{R@pw#I$4 z_)NQ+<>yDOF(3A%=kWHz6}p(hJeRQmhjSZ4WmZQjz@9}K~h8t`V>Mltseu@)cYk+sp5{Qb8xotupRm(#Xk z;jud>$s2ShFU$GEx5~j4fw64dZIAHoY@1@zjz+7DZTKkACo!^#~Z&uhuWsm@{fbLt$o(Avoe|K}L9Op&@CW|wY< z<*VKEu8;W;e7NQKa&8Hqv6CDRz1&)XEU~js6!Rii$8%i4e`WK#y4QWSf1e1m23eN~ z1AdY-yM3iR!9H^KEj`A=xk=u2pv+J3zhrZDz^jaWk>%{#nK5EBypK}#?sO-DKl`%L zv;Hx@4&5mxC(|3m%JI~ENa}G>+39f+H0R@Damq^EU|k;ugw52 zqm&w!{dq%lFZP>Je*?jXox z!I$}DdEq10)EwnMu_LFqdG_%-e4Hq!nGVKl*RpEn72nY|W7dxxY=Db3VZlb;+Y3hc9>9oBjA1OP3VR{pDTCKD%v-qPpU$Ye7nhZ>YK}X5ShR{a0?X(t2-h4q{d4|tm)DG=@z;9>$ zT_yh4j!f?=|BaWNvxT3|h8OI4Kz(6VrL@+x!rtTklMnsvD_z7U2PbYamTjw&Tl!K* zTh{P5qIAFeyz!iTD_Q?34S%C|@NN=qh)}UOTv|IXJpLSB_HW8pQ1(pZ{0}|CI=^pb z-i|CTctjk~nOsCLFR1Pueg*Vfc0O2z;2C^lXN;d?cRza2^NV!3*hn@GhUOSRA8rln zd~*jpsHwjGyewh{IySpiQ`_7zpu=;lGS6^i|w*|UkAPFR?*tAzSc+|4euA!R;F%j zJLziA`Dow7_A&mAd(ShlyU3Zkzl1dlCiwi~SpjxtK@&b({;=%G1z|lI#2blpB}(m1 ziLL3-0KBRDq5RPJ*!_x6lqY1Tci~x-I+M*P<<#ys+p(n|S%1_!R_4RI%!T|F+b>)I zKO;Qb*xL1z%>}`kT*mfTm#|#<>#XPclD*cK5@a%<&G_^l8+bWwXBVQBRU1B79hT`# zce1h{0WE`H8|Xol^6{JQ<2y#_sXyiG-lHqGk`=hHu7Ft7wKK`@<?}j)L z-s?5^-Wp~{=|aRWJC#AMDNXdKcBCc8_nIq$VY^_`aXwI#uBXpqVAJR%^GkFtO2^sl z3+!!enEy}ITYZmK^ZaymaXpZ0{SvN+Y-@}U*XJ*ld$3{F+wMp zIo3Pio{#n8(A=<|zAeII9U7)i$p3*{W3I5S;JYLI>JDcLkd525dj|bTTI+;1d&+?qou#_<2OVSO^34dhPe=T*A7S_adePL__y0U>W3=>Z ze3~s0KRY;9rz6b0Q5@F{9(EA>@^5O3`3d;QrYqJ%1FR!K|gV=nB2>Wo+m4kzZMc2XOi}^V3mqK$%dd%(_h;(Jd(;rCHZY%6kN?aT2lNUbtfV>jmlv2X=DP({ zdJK7Z!@P7lYa`9r#Zzg-()s_GhLqIgxCO%9Uv2R z*}f>#;w?xCL~tu?%QW9KI$W z@O9Oj;nvp?+to9o=UX%J7x2CV|KNe{@R-k#g4W6p~HzkQXM<^gNF#>;_>mJ{kO2gR0jAa|qjuz)crgpc>}5d+#ZG5j6l zURhU#+nG=DSyF!*NA|KOWlvBn(pV!mp`jvhz0yMn0~oHFQ3+7x6C!B=TH11UR@@x zA?s~lq$lL}b-Bk;bUK&uXnc@t<%6+&jQ*dR`=g)zdWQWv-XpB*d@g=>1PeZ98-MRE zW|!&}(26LI$P zHSPHjo}cN(zZA~~)afDf`iDGAKsP_mn|vtw>&4u3Hgj0!u^VH@FWa1O*;mZDqEz9R#Rme**`W8=D(~Yk>#vhR-ojhMZaWOyf zIan|~Bb+0*Gw8#^e3gatsmK<(G{<_7=4>!M>Pi-0c|2_6lpm9CmyoxUT$`~S1VaMK zWsILolt0KXx1AL0&r!HGbe&CBJ?9Ctsf8>+Xv&o@Lz*sJgW*eHf*DmdTdk>t@me-AEUiVxEyHn$7!@ch6m+5XEmkgYQQ74V* zjN_>j?xAy?Blh{_1|g4n{luQT_TWTq;;TG?59`TvvHAGXP~Wt_qqwN=yVip7qkpZL zf`!RD`x^1_`Psel#>V4~3t}SUJiosdZX4tlM_5C#(cF{q+{p)6Jkd35{0L*z zNNke@mRAy+em}%~!$SVyRo3?Kg_=|{7s<}PO`bEkPqBQlz9cv1vaj#z!=rh0kWUuS zl89d!Y&Rma7weL7?R@1gdAP6KgUy*;Q*Nm?9q$s9k|()BYy<g{Oj-$GZAL#Y88e&~`Zyz6~ zV*na)bnan#v`?r$0@p-7B08d=I0!5f0z7JXSoe{Uzx!e zi8oj5HLp>IkAF05W7+$y8>Yv(jp0`98`Cm8e#cSR2rvGLuI7gaR3Ap&M91><;X{cf zgFk-lPyz0A7PnVn&)DCQ?)^Bu>PS|fYG^&-JN!~udI0WLxLM4<)I3>j_LzQM`cKAbj4YZ*Pi4vqWsw zuP`G@E8xr=n0SFrkEg2I^}z))Q_$K`=NlP^!^XAn;aI5##x9@+Fg;4U*p`CEc-3+K zRRPbz(!c32tmj2`sVbk8tvEiI9e~Y+>ab~dvKMLDVfr<{1Z?{Q|MsVBOHlXev9UG} z#OvGC`Ac4Fc+-e6wf(1Gl`-Mog)p(n@H^NxES;R8;-M?9qeCynV8{$4Iv`2ZVtCa<{~ zZKy?td%VCtW|!xQ@crU#e6qu_ddE$&o@PO;ueopLGnNbYe}U}*HDAwfo=n&HuieST zm9QvE_g<`x!SNr-(#sLOS?xY2wWDe}GE@r2)_0HgzT z9J>V`kdGD}jKv#rO9%PvN#xYH-27Rzme}vecH#qevS4BP2=`mdC-|O@t%St^Ez`!g zv+)tOTBkRVZ+TUCJo-J1OkD}f*2011e9rFt&9`CF4dkZEHdu;BNryt7@0jad)5h^~ zI-wuC@x5k$>(@)0pJ*!&5E<(|KLzoX_K>d!hL{I~)&E3o*pi=NUh(DO*;n~%ZK+{ySCc%x#ayL zzfIWELGOmwJ&fOj*vh;+t*wF?0Tsl9fCfb5zuc4j;@QU6*aq~;ck~wyK7t1$7qKPq zx%#_&F1l84wEYY4@HcZM^r`=^;+cYcv~BX4i#;1BO?mOQN?i(TMC-(KG7!v5|ve);+GSJj4R z4_iy|7#~?Xj`L5}592Gbf!DGL-;ty5*s$$0`IhWq!&>C~5&8QC?7(Dsko9mB&US>Q zZ3e{J9<+NzJ8Q<-$}9Qt@lz`qIy=yBlALUbe&@&key!yz_#6M4!%7fA8ke<$Vs+klEG&PB373*#2!xDNE&`3O3b-i_< zaQpMt=29vfV_0?wUjyp6#~J|kYpD8i^iWS)&yd~C2Rm)<=L8)tf={c>2lEFz-6mcm z8~88z-x~?-Slfs2yDz$pbDHmyd!Eqrx)VyNWybyiuB1!TcWG8~!EV ziLT~2BmedYUtjs7pVP4ee1d1`lDf{ps3JFt{p!F!IG72qa>An2UEtsC?5FmhAMf4j zTi68cc&`*(zJ~8kH{)rw>z2{wLi~i+@j8Ps?+SkgRgiq`P>PkF< zxAiu`|MK3avNcxQLrdAvO9=_Jr*oIqi5cwgApbX)he=tuk;2YoZr);kObd%>zR`QeK<&Wx~ zFfuGNw<%jjwssF-D~wUI6?`Xk9Uzl4zcDX}rJ{C_5Rj&jWOR}F4n@??s?wIa|9(eoy~bHRPAtKM0?GD*)rZ7AFP1)HZ8|^d(B03x(|o_D{q7 z^S`P40Y2DfHsf03@so9@yUa;Dm*u(ee%qe5F2AJQtWQAc;A}v5R1$B%?5mB}@E!1} zO?ZCe%o6Wa0(#>GYd$80+yC@^r?%fRKfEqD|2!OAV~p>}EoTGIqg3o));QT8 z^_2OYUHD3ta_D0}c(ZOl-xuEk8s05-O|XA)ow;DP?7yNl^eBCY@a*sS_P?XmwdJ*M z<*PMdbI3prWAsZ$_ar+f#ZM#Wn`6-5^-Ey3acj_ot&PqtkhOq{=)<&IQ?@gD-^G8z zi)+-62cP7Yt5!Bj>F0#kRLApxKH$rgf-NVy$I6T~egS<Ngc-?XJ z1ylm=T~2r7cdZ_LW!E0tEiM+*Y_HFEEn%%6oqKJaH4V?O4PDuu*|9#iVZ+B8yT{x+ zpv3OUKM5Jjgul`6S;p@z?R>oiUuA;$p|w0xUH8c+K8KU-JJZt~WHHfP_VBR&hikLN zVy_1DCTW#vg~s9WZ8fdADM?@9)aA6WYS@mS=*wL<$~9{D5_p+vSy*yx6}V5n1KKA( z_$#e>iqYb9c=p&Z`I0`?*eEkjzaD@MQK~r6vz~R}@$+)K+Wy4*;e9%?EdjmUCHW`e zj%wnH^>p+)^BL^iS=)d80b|(6`Mt~yk7KX+5IG*PE@(a(*-l=Dg7Hdl*ELhvsV~I+ z*WvR3pLSE_$i>#>_&rCS@y=j!^c@{|luz>*d5Wi7%gM<Y#Ts%Q@mXqSvd-`U?*@*@ z(syh^>CAkP9{NoWZg_{Sh{)}iwXC;08oNuiY2=r@7dPf_(aq9$efCDSB*FS?I&f+- ze*=~dXi7(J4EuQ77`~dmlx@n!lcVlk@neMCDc>QW``O5R#;fW?zSskNnH%^x3&V5K zJKvF%az8kJ6&Z=AY~97q>~iUd9OYD3Kno)_Biv)#=;fP_{=L5J`u3JOu40SIz}L++ zJpVF_tu4!s>LvDqUAf3wlooFOdmX{KDSW09J!0o7-#yJdG0fe-u3_A zd*@y6TJLhN^_}y?Is5GR)sFKFeZ0PzxKlg)RM+^H3_q#;2CTA%^(bFM?r;0kd;*#2 z-c>&?@LRv)lHJ#n1%79i*FPIS)T3t``1l~b|FL$<>9-feokz+VdlodFsv<7RD6V3Q z#y1Gh%aANX-Aab<2Yo8<{r2xH4$JmuTYCnohOb+&+e66NEcf|$>7jjMM7FF+E`E(I zoweJTxh0>JY*RCmuSja1Y{Me&gX7{RDc?n3*UuMy9lZKPz7Oh)U+QaD_VEDwUU!c* zHhr_(xa#Qve5AG-NZ*RHby>AVcm6O)Yr0v3O}3loKS=)5tw{Ld(_wU%tUSU7J|S*B z8q22KVeOR;#XM=Bw*I-3E^Xm|7Zx|pEn#l`UeC8I)2^SGTUr^dW02#!4~reNV;rB~ zCOQ5I?{wkc#qPKI#;}avurnJ<@Cci_)^TzLGwy~XT>3A{2BC=EWz=ijCo~>z+#8x%6 zhiel1$9|+vH)RuN?I!E|-S>P(b9U>}F6Jw1JD=>_rk?LVX5aFC;k8xS&U>_5%Cu%( z_-=r;o{!ksAT@HYX7#NDsb^<#YSx@&K)*-Qrecv-`~aIDNnP~i9mmZD_7|I9Wp0Xn zXmFLi3bn&~UY4v2ji=c^n8i3hH#=L>Je}A*Wy(t~veVyDj~j;=GknsQp0zNS`Y8L5 z&prh8d#VP1ch;0P`J8*DePBOcSg$d3YxWVkxz;n`qpcCnw_k@Hnb6VrfNfm9nqSQ2 zx3{yf)xG={BdUpEmoALf=lxfVi?W9$yVw1*)fMad{^UAy%hjzRT2EV?W+slRl_(|{elveusFK){4%N3=uyF+1qU%4*bLF=gFqxlz`8J3|8|J&U6 zCnnneu!M|{Gq&Fzp10|n@SNcO#T#2o8o}Nb3f3>e&(|~z)@bE@v-ov`{k8h^!Qp)A z#OQUAvcFU;d{wqyv<#8&g5!#&;WZWMX^;{|oIk{z`rf)}9eeZW;CsE;0CDpN$+1Xq zMmqJrIgfqi+r#sNzZuEYsg3skkneIi$X>fJ&-#n`nbY?1RxzGzC)Q8)55YBMv}=R5 z;dwdtgk{`$DH}^?7KuOJ8?No2Wuv-T!{J*#s$pC~Hmi3hvt#MaWX~s&kH!4wOXTId zDSX6|FrO@e4VPNoZeDF9o>E;yl2O3;=AR>B+2LA)>NN<#h1~~ApJbU z9+vBsT{|_p#e7t~^B@1~PqrfF*7%{0{QaOoo}Gv{*Q@SLlIO(tk=5dKs0dk|%P0K7 zkB@(z-N_#2-;-^-iJuNq{5bPAhs{s@`mgN&_2TXa!}E`*_kd!aW9OG5Y1lnt+Tmdy z&93##4xM>+r~6C~KP%YXyw<|txfyf8F6!z&o7kOq676AnjsG{!D9`q!PAw|f!+AvA zwe6|}>a>+DQIFBu@2r0B^{{m?dOEt4vBhD(nJ`#s-Gu-w`idm{00=XVhzHr|{g; z8Pt!j`&zwkza;!@rSdh@w;z8=@2+RF=ZL$+x6QP{4R?pC1@OF?J zx;33l25AX@9Hhmw#lQv6zl`Z6pDVS=;m^sRvR;=ggCm~we-o|>&-uH*?b*;*$l{P5 zVgCl_JR+a;>|G=c?`?n8vhbe4XE%Hw>{SZiPt~tSji)AzF^Aj1+MoPxH15v%w7DZO z*}^sEZ`i4Ep%h=ZE&P{b0_WUbWKx z*IXgC(jJ-E+}|Du?>kt$QqK3sZx)xXH$QW0SlSVp!g}l*5+3u+@Y{FE`W>9HU|O`E z&6=8v=wlCx>nHGMk#saU)`@4=Tak&g1I1{`^Qdd%>B%kT#BSpc8nb(@-@?y4^tg7Y zX}yBY&$(F~n8}g7T1f9xrd!4GkLlBv{N}fM7^fO4m4+!>S@-fH4^I!ZfJf3Pvzj`X8Hg6R3*F0W{{p)8t`JL^2dMjmbQ&H?e zAK$&qe!;t}$=_?7cU;}R2yE(KuPw(W_D&uLR4Zl8Xry|4CiWmx|1M3}J}FZvGFd#o zz0B{5_mk__f(_eu&4u^7r?2P#&xp6^Q>GL8nJrl8y#8XjTlLL?Sz)f%kd;ys%s*}k z+ho)L^T9RPUU}yyZ$bLFg*jG!D_;MU>TMiNhjy(G@0X7csl+w}saGre|Nf0{J%55f z{h6vd$hK%o8DDXj!5daHhk5E zy)UjG(v9=HI=!e>+*n+_*D3pB+GFi;;~BboUjiRRmxt5W_Off(-SoRm?_xaxF_rF#5yx0Ed``LTK^X|wf zZekO2FA)Q-HNRp!7o=uGJXgp5Uq8}wZ^k-7T6lo1r8E7>&Wpwnr`@Aqqw`lOpZ6cpUj|14I_}$U>w>7axq(2{D$^Oov@)>JBgx;>?10$(S>F`x;Hey7^$fx0P zJDKdouO^c9NLuF}sng`o%n?@bTUIU2WljzA{#jju^kqZiJGLoEx0MOM8*c11ifjZa zS0}p4{xwXNwd&uV|2SqzjCG^|)-mYHjve-moH6fp&KRe4wCv%T(Z6pPgWTZyWqtWW zb7F5g_fqli;p@${Hsvpd`0Xi|zk9iL* zvQG^2TAISYhM%afGNw#hoFAmDeB+`I#Wk-8e&p5z3(mNP=h+~>A&&? zKin2xQ$pE-^cnvXNhQfbBrQ5-?lj5w)gzyT#~$V{K3~n|ljUogh5fYRNio2e;p+wa z%;!&H&-LS@bJ>KOFO-Rm&5aA#s$uLz!S?B68k;{DOt(sDn`gUO1K&cfZ&YS&`}RZT zf-li0WsDVek)NVsQ~EWK-M;53v6{aByY!p34bt!IN{8RftzIG4?j&D&7o?Z2J%5Oq z;66cWMFwB`G@4h=rN&uhqwP}5{kHL+Ps}EF+Bz5jp3^dEj|CK{e$#b zaek9*T|HEc#x^{-O?+0woTB@lrT4Sh`-A%RAvSfbSo9J7P&JQvG&b&1vb+#I*@f=e zjj{6E15nO7e+xRckiPHHpXL<4>}5aBEMxim#h&zVHJPe-LwNtl--GV`2Oa;F?fG)L zF}M46)^<%6gza|n8hb?e|5|KU9`?9Irtr$q8O%#1_uro6zN*yAJ`i#dzet(L;6pRS z>gAQEw%FoF@na@_?&@e8-k_X`V&nMz$~s!SyVdn#u21Oqw^_|Sk?)nIJkw_G{Btt- zw)P8BqQ3aJlIO^j`@YJa5o{98b5cJ0FpMAi@+ZY_7xyOj{}22_cd`;mFC_O#hZ6jvaufMP>m5T7C)5M_Y&-Yh39Nxb?AKnWwr~TYYORyUzJ-`Ob-A_ou@=_9P#3vMux1iIwTq>tuQ8gBR8+ zp|8E*2dw4Qjn+LwQTg7kj^fq#$k`q2@>kc9=R;v%6uj6Nq9XZy*&I)DOnrd7p3ED~ zBe=_+S;ky+=-XQ2$*%gjfi`;}y#MLntk*mdo_|XHQ>O;%ojR568h&!`D8EPdgg8Q5 z)T&^<_tKSz$vB;waLa)G`j1!#OyPY+em+Xhn zso(hS_m0~;up&6e{6%tH7`baO%&X8a^3HYIdi6f#>J$C!l`cM`H>uO^WFPd)+~_wK zl{KgTi+Q|vt!Iz-8y>AZ&%9QA8Bboy@)L*HakAMeBg!;=<>CEa3^yBY}3|>=2Wh+_pF_<(|7i%s!zWz_J|BO zt|d1gp0Y1>hP^!ON{su@V7C^LrS~@SUyp_N4DS&B-9Mil%&4u|%B~$RtoQLc<|J;8 zi77^ZR%hW?$k!>dAEfJzhhJVFzD}xQ{v+O4G@JcX$Ly0{E>5O5U)9r(*~0q-e;enp zKfIy+$L!ENa=o6<>n7jtj57<7-}guPoGi6-4AMe6lz&-Rrr(t9bYA+-zh+8L`S9+%F#Z_Idw9hRrn#bG8 z<=RJoN7hJWqDuBgAV#x|zvDiT4#n-GOuwMnQ5kva? zq`2YW2y)&_yNS2Iz29>=V$NQ9?0cXS<&WE6KAz7XNk^BCWn4`OO%ie5|e!WE<@6abbZY4A1 z^*(L*mbmN98?4ojvUVg6Jf-c%)iTe_=1$-@&ume4<;=1y7&DnC8fT4=udl-nJq?m`iUPl)WYM)5jD8J@p ztyD&BqEAZiH+QSeGi7x?**aFvUij^7v{?90b4IP%*7kFi+x=f#YkvTnSi6qj1Zyf5 z)XsN~uy;5&8=sqfYT-9M*umH9h~;jxG^q)Zzsu=~b@snhXbtgfH#n`s_pn6cGhvAQ;UQ`r^_6eBA4A$5OiioTd& z+^JmGh|{;_)GzDFb02dWOUSdb{;*3-ar-v`B?@v|3_c`@Jm1yRZtOu@Iy&!F@}vEObcucn(wRcR`it?!E!H2j@ozs^ z8!0bN$|^3A|E{BA`AOEcK5-c9WHo}6_1R!r(XyKi&O0lunam~Z^bX#SC_ zziMU9dxZ6n5_B$BoW06i9J{z}ee_=E#JdaFpMvWBcPZlu^ZL`-YBAAU?%(|`&wDLo zr^$ECW%g5$tJ7pDNL$#w+CD3)KAkT!$4bZ6PxLHU7q;zEdqTiU-o z8sC1%H_`3)+~+~^*piEJBNvS0aTJZrs<{;$0x{Qh!vd*t`<`rz-(;?e82vk&#eP|L-t z{kBEV30~#uDvs7iLE73>JgZ+We%yZFjr?29Xdc^MH4gm2Ua1?-pZc#qOH1%ki;cy| zPI+}qo$h3(g0!n8yHZ%W^xa1b%zKvhY|JRJVg+M`D}@{SX>SF#z#Pj=`OTeZPJ_-i zX{=r!(?jj`X=~Q**D?m>t2i_G``6U|=ICeXn~NC_i+Sr<`>GYq=bnzCObpjHry7Ny*H^a! z$?@l0KBhwsV~HxpYWn=n&#g~&v)*06G1<;U?-IVcV{4dC$6v$uchZX)E9BEWear*u zSEamlROfu5&XE*b+cTq?#RZRBv#n@sP3|J;*mgSo2wP;le&T>NXnn9jxzbIGo)bCu zJ2HJnd=#Ya-P|+Dd_g_s-&;(ogY0n3tcM5 z|0FJo>QcwrVyWB768|xujs)q+b)JpUMnRhYV|eb$(dIw!Xe-b2#oO0$cX;lzW21R} z!7isxv*}jdC&Eu35SNYWVGXLkb-+37Si3Nf>}%NF%zV|O_R6KuyWpzvH?dJS`i{Ts z+|OQ@$M^yAn*CaFS}Y&1iwt$9%bEBte)TZ9e|>$rn8xauE}uD;PxSjG{6|^#tUg_5 z`_j>gGIz7RC9OA!XP%+kZTRmZ_qjj0=%pR*KVS~d{kH1QE#Cj3Y;z8XL&(GL`sOiZ zSjX<9PTTcu5&q-A#oDzAJFZ=GoUvd37Hc2c_1g#OQnD?M+ecO>s@s=g8(z6HJbq6% zgY-4O5~O84jgO0v{cY#p{^ieNaaGoP!nUlzZvVD6eEocUcztj|x<29SQdz?9BAKjN zX?&+njh2|loNmmq+PF%aq)baQh3{MIi{0;OTlO_b4|j{6_gEWotym)mzcQySfA~Q7 z-PudS`(}t0r-~zzmWwO1(@A!2Bfs38e5XveiWO3)_#xprx%h>1wSw`l{@iU2W2omr z#@Xw$&Nzcyu5gbj`hVw}#wo?clUMN{CB?4vrN9;TsfsBnbxhxe#FIlR-Wy;I*Y ze7`b7c;3%qq#!*_R|=}zpZrli^1pc}JE;Fw4l*~p&%8x`>krCSf^T_(oadn@R}8Rj zp2ss~YwQK>L{`;1NZ;o%rjpNq1a>9a*5zjBi?f#%)TKL_4N}Ry{ImW!*NaW&j~{xN z%nlUu@PS)DBNxT2VY^4l6nnWj$W%6>Xk-6NV3=_aJvf^DU6$*@t9~77Evy2l&>>x1wk4;Bs?CY+e3$viJ!z8#&+q*XG8M8 zO&{k8%F{4B@0lI`m(zIhC7b$!D%Sj3{7XJY-fCY>zYE)Z|C8Z0#rU)j>3fl6c{w*J z{Ct#r?lTARNa66hPwIN6$+&2Tb}g%pr<26@w-_(1GN01K*xC3n_wCw;?}%+_EtEgc zp>ByO`uZw*nKGT;6D`v{+Vm=IUO!LDGpsS)7=6F3oaaeqijBlsb58MZFWI-lj{it@ zZ&b(KY-@V*({6|H1|3Ko#~!*zVe&qOY;Szeyy183Y$Y4t?Ch^oIyNA zHZmmJx8SprK1-br77stEC6+z4Cj36mxG_i{u=znMuT6S2wB9r|yx%ZB>F?6I8>64k zn<4(8+d(?=X?XSx$+j_kXB;Y@39YP$Z8E=;&fHR2^4Z*IYX^R`dro~>1&V*B-`!h*_|Ne+a{L1#=L{E!&~b9v@y@N!eX^i zFzCKlS{d9`wJ!&LI9bpHxjOA)ot?iDl!W=R{s@J0Na*H(HKW746qAW{#db z<)#;(J6@L0n%HQv)!h7rKK+zjzZKX)`tV*}@dtbR8hgGqg$9z zo2E=9wu{5~(kkMyghYFU7l&odQN|d6{{CJ1 zkkxl^+;e`r!m~S(u^OL+Wyxk9qQfQ8wn&}dhy1_{vKgcn4Z>sa z_tD$Ucd}z!Z?--xR?KEx(J-?) z0|xTH+GeVlD0M1Cfvaw?)-x)7%w2SQXbS(3^ibG0rN6fhIE7te`=8cdEzj{^{8;yL zep_md=d{`4X@A($N`9YX10$(!ti9J+waX%7%oO4ooZSq<7ambj9wFbw_E#M ztV}O8wpVni_<;?nnP?qaKixHe&t`{)XYssLH9FbKo(D2NAlXI)*9U1&vj6Ou!lwnF zC$1Jlu|wU|=`%W=GIcd?mO35RZ$WC(iyU^)@Du2GK-V#XldQP6&;Iete@ z-G46SnOX7U4%a7HySsa~If1vW6|U5-`l`0N^vh>_PcI%_OGmZoi{xc1-3`+Ei^F5z zhUed&|I?*&__{gY@*2O9ILutLcr!>_T8Hg0U%wpvj?P`jcCIjg$NmN1}T}c4HYEcrp3SH&7Uz;j<=r1Hw39G9j??=ta6wAnrG?0K5ixEddk@6G36?s zEH|w>SszpXAWf#rQwCW_Naf3$*NK+neg5a8r1Pi8JgG0wvMmGKg!kON9K9m?D)U30c~|CX+VF|P(R2S)hP$-mHu3dH-@SD; zyIPbCpVW4rh@n&2)M=c%0RF0%w|n? zuz7&t;n|N@HwOIF^H&YUoV(bm2gFZX{bol_^Wcv~^Gqb$LHb5LyVf@*zmI)gK^Dai zy}iG)n3(xpHoqG?Pyeen7R&H^r?2o-HpIdnH}{)q00 z1uDL&9PCLSu~|)e)gzmAofJB9{^lwEbZT!N;`(U)PO=jl&xR)~W$N#e;P^sw-Kl)I+Rk{4~9>G4U|J zH?1G85X02^(fEoD>5?qJcjvO^K^{}4cI4vP!sMAgt>|h@s*Qqlf(=TYYA%gl`x!er ziEaNfzq(g2f4<1xp(fF5E-mTVyc&Ujw%<)mkTQ*WM7-SB+z?yRk$z@ohwf?@UOTm% zwKMYg5&L~tQTuY=!ieyD)cnUXJ7#d#--#qKuK0eTL^M=wXn) zA)gqGU-n>D+zp4s(7ka}hh^FEW@cSG3RAbqgR^BdoW*SuTH@2=^qlxYXs z`B@yh$v+g@Lmuujr^60zo1jg|@5ZL)38tElcK?oJ?32AxY)_UdW(@NwvqYK2bCI;F zqq1CV4sT}o*&4Pu;aK?kpcrMJ@m}t>?0O|_&yK%Yna@zyAnoRF+8zqeU9PV)vw!2> z5u@@eLF%8}HdU9i`wQvx73{g#ygZv9q}*g>)`R-(S9Y7;m%Y<^*==N4)m*#axLp1b{`q$_v~)#5XZGUxxVBEYZ%S>s?~lYI)z{OPJ9+gBiM?*4;UYk z&)K<+-^W-_Qnn9`xh}ggJa5|X;W0~*@E*anufA?Q{&nN!tHd`i+UqgUJoGK*;a`m8 zY_CG)@Vb_{#nR%B9q$+)E#R}nCrKCC+d+RmQNNqw{Vz80Xf5|H&lZoSmzS}7k#tHw zv?dEdnw0EkBHyJx)_gMjzY@yEpIRbM2_{J87&uX{W~ zkL!zh3X<_3zvN@-M_z6D{07enwi3TCGl$yL9-u^JC#xmN$=hsDm6weHjXNsxtLGN` z4TKTq*~r^l%3j>KWiPqhAU-WPH@x@#$~K<8Sn{rCR?k^eTHyZ)RbhJ#GrYF)-JZu#o>O(Lt4$9-+p26k=zn(gU9XMy&I_;0dxtoa-Y$GtoU>Uw zcQTH8-ux)L+pdE#KE3O8oG)g}yN_`{*MB+6-0U9l-W=Q<=AV13vCo0<_0TuWSuHd6 zRR1mH{MNkU#lhx4$<1j#@BK{PcjjLo4$JV=x8Ze>zjr*N4E-YS_&xrxsP>Pf+H7`^ zN~e&44U@y~f2Gf3>zcz#)}Qdq@NdWZ^3v}q(+Acdrje%?v`=q38l)cc!@P2l!|MvA zk7>MH?EHl|W*?jD-e(K4E2s7CRDGuH+RUW0wZuT=|I8|DJmmU%K5YXVT&A?~No%oH zrs!R3-5$P95M!L&5&b;%t6k(KNDod4kH2*n_mjIsefvcgI!0Dgr|!$6pLG^1ES_(z zDOa$k&w8P_BS!z$Cr^=dsBz>~^!O4veLRJKEq;Oww-2vbHizGCBc`lkT(jPsNOE69 zufFir>iXu4*yh*8fy3F0KRVhs-8X$qF=el9%pIhxIsL|=z9~zeBIz#jb=G~FjWjk( zwq23$BF9w;!82)exS9PlDaOjT7K@zWc`k9tY5n^+o!N7_xyTV>ktTFs{4womF}Ly9 z+w@_jzR0Y9JBUexG@^hpkb9?0e~_#6)jbc(4;*#P2D(^JyXH`a)9Uymd)(aXceV2a z4fs3vj%mzhlHH1zlF6*raOWCVle26U=_h}65BUpHKV#b^Y{|#uDUt>^CwJdlt4g8c zk?*GH$G9Tm19CNBma!PU{P>u14;NcxHrFry{-vHd#jnCE%DC6ROE)Ul-=*4{wT-@M z&*qh7qn~lV7`FbX^N+FPjZ2uvsbbI38ha#iIZq$A)*i2ms}8eGYkYU~26HED%y{zh z^QZQ#j8``LJS&#{9~3-~PnK7T10S-FsvcX@mp;;=2RGT*WzMY#y?iMfeLLcL-!Xjf zHv3Cb#Hh{q(0(VZ6&RZ>oXh5tg&;j*yw*({H2K+_slL&*F%8MspTmu1yV8a0%;EBv zo#|33b*%2QPv0gF@_T`e`idXQ+0*Y>vr%QzN98ieI}`nRH#u$y-Uq3N8{CrD{1_j; zeyDv>=9P}W>9^hV^A+@VusCT^cJotvjiYb4FuyPd@rL&MyOc*BdD5vTc^dxJh39n0 zOGX}uUiIREXg@!5+C1YDc2ZrwCtEYw;{Thp{cdv+3FZyNXF)o?$ZvjBIREnepBCb@ zNc!mU$gBUmV=KPz)r@{mfn2taH-4d0k@QXzbMnI??>yVW4>zN?L3%!gt!u7750d-Q zHKNysXN7<7{noY0f8tMZ2YWyB2{Ft;zOcX8xNO)4Ta6E@(U}^?MxE%%FNMQvuO!R& zXEpaWTCA~DzdpwAHf0Np%L=9H^OX0Dyk1d~tyAV7=s?XG#(7@nsv~arz&@U~`cb(L z(5Jjd*gW$$mm3>I(pGli8=t*Lzox%zZgO1s-SHRyTF)EVgf{$W$}~^RS4Um?7ctM$ z%KbNrE6G65z4q$8A(n2<&NwILW^)gG_;ojV&Wator?z;|m}WQ|wb8hu&Pd}~eQ{!J zH2){rmV3-6N75#?a~9nl%Qt?^zxRGptWQUSbUGU!94MSrLY=afH%3_PxBqsC*YlnK zIA#vN@f8_(xI}o~MNR!?6@3fRQ8w{ZIkq@Ck5a}VLAv+~@nakN1&&*XlV6E-)`Z!e zPj(uAh}ZY;vnKnR{ce|A>#FWKf%(QP&Wof4d}olxlD|lrGBB*uoV)$D#qEAyoPA#= z4!pcCU%pvfaAkPzl5ydAU$?V1M-NZvr)qPQf3)&;Hg+=?^utf)bM6h#FHE*xn`L~@ zj#Zs2<~D{*nX9$hh0iXa~eA|%zp+yc)Fwg3@61}WT7R!yW}?W8B6_d zF)_ovcSP?IT>Ub;{##bx>9=bW*zTJ4n6Q`mHtDzIHu_PVb7XXQU3q0F%QnqnJIauw zLwsYNYR2&Uqxq&ILv6HwnH|Q;mBMmGOKN|&cImg!*qo72%JIj+!0>e@k`k#ww=eJI+mHTjIB zD$15JwYvo9g-7AugC(CiuiT;O5{pdZm{}er^ zp4f5d9P<2_J|^RPlzB^{edfja(yifny$?mN4f1}8Et&M2^I{`+5@VmTr?yQr-_qik zC&VJF$?_Ybod8 zCLLFtP3hqr{d0CCzn6<&j^`^1xW^pp?_}w%ciFplJcG_2{8Z2yjQmrknOn(TQ8Fj5 zH>cV&m#nK5*qJW((+@U$_Ce#wN%YKx`5XBBF>yt58NOI7J|S1d`GL1D3G?1KiOi_$ z!?TTFnu^O;MDJMU9yWb_v-Wa@il59^MAGB@)q>${r5GjMJo5EcD>mChN${33s! zAr~=h-M>q5Gx+nh{3Cz!6&(xGmj}sAcQKbb+&WB*ERIZ>_9=VHGR6AXf+1QNDX;qhe7h$)Gv*GMp8}e3-{TZyEw`r@v>8!_HVb3`KRq<}J z&3Ct(net8-zRsX+OTEV4%cn>uvN)aYsY^jI$>1mWaW*~ngx`hC#7<7J*T6hnl6rph zjeRI1*~2c{Pyg;F-=pZ!d+L?xVZQ}D#l6e&cgEWlcU@T59*zxqmc^f)6>JoCl+%pMZ^UM09X>RMQ+VVN&E<~q0|HOCs zzFZb_PEGXxMm9w(mgPC0^|Y?t$lfgRLv8)HLZ9Apr?Gr`zrn$7FYRjonSR^L@0X@u ze~N9I4)Y9!{JI%Kyul~sj4>BJfSym}L;D#6R5Yi@hJ8HKTp&O9qw!Bh{W)v4Jq9<@ zWAgOI3iHU<856Q$C)vQdXY5njO77I}ixQFA|8x9*y#2MvoIGctaBpHYdiV-v;wY@tz6?@Z-W<=2aQe6H!NP2LG}8$XlO$0 zsA5CnN5&-BgYIHJwEN~I%s74sQ9F` zE8pY^u_F^JUnp+>OWzJkI4|O9m}6q>$TZAtLTsRcX_(>o#JK*kqZ8xPFw3xu(=fw9 z>`wdz*6M#W2Xafp;w4TT%f2KHsT@CgWSSX;pw1)X2c}tmVRmU*>+?o%;P@eFR>VmR z*TC4sxU|cV@roUpcKPX(G<76lc4^utgX1O*iW{4hW=$Ao7e8inn&mi&B(h;?mS3PK zX_;S`T^e>u+^{svY*g$>LY;;g>W(y(=}AIDL13D7@94ORX_nWd@k#L`DfXB&IBwwh zv>S>9;d$zj+y7R+G65^AFrQrlX zTtdR=v>VHv&n=ZL_;040E}TL5FLDrqrYgq&G7T|g9ltX_(=t*re29 z?SIi|L&wJtjtc}fRmuL-tP*2~#7#Iq``kC8V8ZhS{ZI0mB+!V1@qE zh8s10WKw)$+_>>^qX(t#g#W4S&O7}JiuS)`H{@>|)_+>ne^blQ+)A&i}mu}K@ zdFK2uFzv+lZ%38?Max;^8JsL=Y0z{ja=Wmq|7pqMCX5+r-a&wzFgXnbcT{Zr=xA?- zYlHt<(+iAUu*errb^rBYxT+M4I*0Jw(b#`NTtcE^oga?IS%-WG_G!fY(Wc=3n#=lq zR5;;i$KgYM{qyA4PmlY<=RvaHC?-2Tw27dMvkXo;LE>dl<7>MnxTe zurMF%XuUipYw&qCYnzVWcIczL+tS+-5j;$PrI`(%Q<{0cJ zxENRYbEV@Q`E4$Ae9`-Ij=#&_-j|rS^4L7)7(Dc8A4g1So67PzF1*Zx;EpfaeB#zI z-ITAtV~2}uPH}ADy5Jtc=E-1BL4WyGcAVjSU&VZDAHb!K3oQQEbo^3%+dGz2zMu_H zDZjlVG55K6fTK13m|(v}dyQ7j@ts08k2qfCyxNWzyS|O%y^hxTV@enB;GW}a>eb8f zj6(NtT6#>_yX%@b2KzY_F(!+C2xM=NayE3_ z>wXm-1KCmJm>x3fmi$^1#UwzHW8QahOUG}tdkx3OWqyt0J@RkrIKh22eau>!lyD4w zfU~t@6Zdt>|1rfoV}XKy6evk@S~e#`%(L2OQJJvqTPI|Ud8U4b^Zn3Vf#1<^(~FaD z*R0W4zg6=CMy@TWLFzr|2V$y{2bHiNHKx0Ay`_zx@9#lCWqrrzcd2Lx{o7JUlo;tj zJ)ggB+(XdB5oUej0PT`t2=657cG7c79Jiww_c@bvf(2 z@8sRtbv-HWYuaP1GH%f+*Ql|_DA+%Jdkf)upnYx3I&r=GWSS$uynvLcYZ?6?FuP}hCx zp*|YmYBWS6G{!}^%sq1Bas)OdFY+Nj3ZNhg;R+N+5fnu+6i4u5{UuQfrBMb~qAbdx zJSw0fDxor}pem}NI%?o5)I=@RMjg~eJ=8}aH&>$}8lf?opedT6Ia;74TA?+rK^wG1 zJG4g!bi}pjgwE)KuIPr~hu3jup5IE3pczu?A~#H`d`E+>85gKi1;`Y`}wf2oGZ;HeoX! z!4^Df~u&7>Ii=H{VLQ% zE!0LGWM#Lq;}QfmEGI5SE?kD(xEy(qAHhFAD1<9e7)4MN#ZVk2P!gq38o`g?T#2$M zhw`X^il~IjsDi4fhU%z+AdabtTBwaWsEc~2j|R9J4bcdV(F9G=49(F3Ezt_CaShs_ zErK7mX^#%*h-=XaozVqd(GA_v13hsadZ9P^pfCENKL#Kc12G7L5r-idieZSyaE!o6 zjKXM)!B~t#0uqsg@tA;#n1sogf~mM3H{eE0!*m3(#7x|TS-2Uu;8x7WZJ2}GF&B4W z9_C{K7Ge<=V+roWQY^!AtiWAZiB(vQHCT(gu@3j(UfhTKu^ta#10KXfco-Y837hc< zw%}20#WrlmW7vV6cpSU%1a{*|?7?2_!+spVK|F;+IE*8B8b@&q&)_&t;8{F}lXxC4 z;6=QImvIWO;8nba*YO74#9Me9@8Dg$hxhRTKEy}(7@y!%e1_Bb9ADr|oWWQ48sFes ze24FG7C+z|e#B4s8Nc9H{D$B02mVAbh)9R@$bgKk zb=1IBsEJyrjXJ1{dZ>>ExEc-72#wJMP0XyLBQXl2F$QBX4hcv^62@Z! zCSnpMV+y9?dfb2;F%8o(12b_GX5nVsf?F{gw_y%$$6VZjd6yBtC01cI)?h8}#yZ@CdvPD`$9g<~4R{a_;bCmVCTzwd*n&r~72B{Kk6{OP;&JT4 z6WEO>u?Ksx5BqTd2k{gR;V_QiX&l8dJcHvnfoJg?PU3mIfEV!+UdAcBf>-exUdJ1F z6K~;dyn}b~9^S_X_z)lAV|;>7@fl9zb9{j>aRy)EYkY%m@g2U$S^R)=_z^$hXZ(U+ z@f&`}ANUi&;4B@|BLgxb6AG{m--}hw;s>0=kN62c;}`sj-*BneJr^!RZd{H$$cuc) zj{+!&Lbw8jQ3OR%48>6bB~c2cQ3k<-E@e>;Y+Xw;A#Xv_|^!G(F9G=49(F3Ezt_CaShs_E!v?yI-n!2MJIGd7j#88bVm>L#C7O} z-spp19;F}pV*p|?5Q8unaTtQ37>0NZ#|VtXD2&D!jKw%4AQ4Fzj|rHFNtlc&n2PIh z18&4LOven&rmn{f+n#cbS$Ik+8jaR=sMJ{Djh7GW`#;7%;XGAzdm+=Z1`h1FPt zwYVGWa1ZXqeYhX%@c=g9K|F+qu@RfF8INEK9>rE{!*)D|9oUJ-u?tUNH=e{E?8QFp z#{nF~Q#gdfID)5f6vyxkj^hNL#dA1`=kWqw#7lS?r|=41#cOySZ{SV5g}3nz-o<-( zA0OaDe1wnj2|mSVIE~No1-`@?e1)&^4Zg*9_#S8R1J2<`{DhzJ3x36K_#J=XPsEtp zNQd;ufQ-n5%(w_ya51tX8?xgP6duYNHP7q8{p_0j@?vG(uxEK~pqC zbF@H9v_flKgEnZ3c4&`aj0NZ#|VtXD2&D!jKw%4AQ4Fzj|rHFNtlc&n2PIh18&4LOven&rmn{f+n z#cbS$Ik+8jaR=sMJ{Djh7GW`#;7%;XGAzdm+=Z1`h1FPtwYVGWa1ZXqeYhX%@c=g9 zK|F+qu@RfF8INEK9>rE{!*)D|9oUJ-u?tUNH=e{E?8QFp#{nF~Q#gdfID)5f6vyxk zj^hNL#dA1`=kWqw#7lS?r|=41#cOySZ{SV5g}3nz-o<-(A0OaDe1wnj2|mSVIE~No z1-`@?e1)&^4Zg*9_#S8R1J2<`{DhzJ3x36K_#J=XPXrU{8ITc~kQo;t3ob@hWJ7jb zf*i<+OOXqgAvZ2Z9^^$nMD;xGh5F%0n-ju9A%Q5cOe7>jX8 zKq8Vb9uqJTlQ0=mFcsJ12Hc2gn2s5kiJLGBH{%xEirKggb8tK6;ttHid@R61EW%3ahaOYjHQ$;U3(J`*1(j;{j~IgLnuJV&*KHWh?np(PT>{2 zir4Tu-oTr93vc5cyo>knK0d&Q_y`~46MTx#a2lWE3w(()_zGX+8+?oJ@IB7r2b{x? z_z6Gb7yOFf@H_s%pTTRf`ycodG2(!9K`bEdPlxo#fQ-n5%(w_ya52(5H=AQ#I2hRGMxaN6QD8JU1jrv6`X8to zUbd{x$X4@jJ@t5OwhFyAdmVSLdg()}Ntw6)%E^~@d-{Uw@B4a~x|0FO2cud&; zjVId8`@iwQ7-0WD42%W(9gaRCY`-6keGC{6>cIps5j22f!ExYtZ~{0HOaiX~HrXj) zDwqZw4Eq7EIg_umz{y}Xm;>g5Q^2X9G4VN>qk2-PO}-9$%;_6x=6ka)grtsy&{`+EuzWEJ<${xcujUcCW+N;Z?4E@I6B z?o|`BO@~r%I@#-ZpC{(|C{kKV&CI99YH3l+sXcpiEv@=|TIQjQaOPq;c{KvA155Ha zJR5Euxt`A%wd8v}_9D2|d>hL-vq@uKe%5;QI?i5*&a$_*EA{5_X9Cw-Oxi1GU8_me zF`-->I)M0Ryf8M#BR6`j+WiQ>(b& zGf8_xesArOtqbYbY|G*8K(*!9|IjYQHJg{eDgD>cau$#adwuKDp7PuO(-qs-`W&NH zlD{Q++e>XQeQ$4D?999rIc$Hw=#0GBk`{8G?7xc}TYS3nO*)!F6M@wc?nM`>@TGbC zn?g>{rqwwQoD+RvHKR#uG2ozf^uL|SlVhb~e_v0UYq?iOyrxK*W`>KohwF)X#sWQG z9FY#E|Jm=76jv?(S=#;^xb8w~=UY#sNYTqGJ1={pLVhw>>GM|VZN(SV7R zOFzv;8@My;K}%8>_un~Mwdwc4_bYL+ZdpwY=A!&-uWZCN{kw3f&6`(s$!Z>cxER}O zx?Vc=^nFsq)U(vi&zw+mAw$|>EXNK(kEUA3uv8m|RnPKlINwI{?O3d_Ot<_dH5q4&il7a~3j86w8N;C_(!s0O@+evk_c#92iYk-EzWkHWgrp zuFF$hLmn?;Qq{m&$CB@Q$~}>i52tjavB%}*^DbD@aj=KtIh#n$Jygi`96)aVCTrC zRpmHmgi39^=x0kP>QY$eFX>2;x8|Sp{~B9E4^VCUb8mq5mCH0L^DIi>T&Z~|wxV4B_2rmrplZ`EjXx>M83)&p z7bCCHu&7DnU3nq>d|#$_8`2+w?<{*g($TJ3N5?xaa+})Sw0!nf+Ui^_w%j(0=&o<~ zeBD>tHanWPBl1;VXI`<6wdi7M$r-Zy1Q*2^IhxK~$82aq-d|jOOu);a+SK!06?bl4 zn#S(74l_ed{H34c%O3WBUq9@f_ndIs;~#yf*UfWw znVjwXK);oL-+u74cW=J@uMgdO)3Kg2Is0YreZTXG!Gn*#;}=g{y#Io;4MfPyZ0wTW z_r7rNK9g^{VbRC0*=N(Zww+&GrTw2L)w&LD@9MGI!K3+b^5Vg(*j0b|bKza=$F7I1 z+ZpTHtaRmC+~a=KSkua=Hs9l!+kwG%2tCCe$Q8`M9JyA|uWE_KBltIxKILaQnfs9K zx&1P)19>kdB3n)t(iDLmsJj z@jW0ekoLLL{`XAAF6SWbK|3p~R0HiP|1i={D~NLUzkJUx3c&t%O)tz;2T`oD>L89@ z86M@*A651$#X-~G9djV4_WmD?@ASs`uXnlS_UAr!B{BWIaH<8>raunfn}Aa6h0f1w zdn!BKv#9&U{A-F~Z@X-2K2|r6VHQBn)vT@0To}vb1_4(s+Qv2Yp1?(~wmSf7#q-?N z?+@g}K;SOA@zL*|>l{+MF0`|5cf#HAULD*v=nsL>;KRY`_hn$3_XlU*9|ETF?Go-0 z>=EG6;5_#kU>d(F;kF?oa@(TKlh<2{F&@1vxPjQ#w8t+94l}zD+xv5IaQ(11VxNS5 zM{r*6YV2v~YfAjyhwV)N+Tgq|uMhi{&<$|6hTWYDVdl6Bdp-8m!5xOZy$K;VqN{B^ z#Tn_dBV&K--)Ji4-zUbCfo;VnFmkpp+n#a;kh6}H$hEIb=?Yb8_cuo6 zk5xvF8cj!O{~pTJmtzlQHW6SJ{l_ua-RAQd{~USGW$bewzLGfp?~jvrTB+pk@gspf zRVf#L-43cGrtf~14Y}I%-;M9R(elfuZyYHv?V0~v&n4GXk$&aUXPNPT0M{D?sxAM2 z;rlemWoz!C70aOG37t;*7MBb*%Q|a6E#Ge}`eR4>;*6K0FVf+*-hO6L7jA!TAOsX! z@J)mNOHm(fi;rE>3^6rSwyZjH`{b3l$6VBj8!#@%rts+tIm-#kX*$+PyUs7_C0X-* zWk*qGCCzzj#E4kRH$AW6K$12*fGa6UPeThXzt{j@@_%ipN*Nv$i+&bekw!OU*F zhE$ySUe@81Dm|D;drQT>f3crjJRnK=aBuqcTPYtc-4ADT?)h)6d(l!J(!Fr4=I%nr zYQMTVDcYNJ)HiLV6w8H<;(g6!9nMMWO|182L?;(KgMao=@Dr(Hh{%EfNh znVojsmg1MWcg@s1cCG1fs+DS~7+;#o`rv2IIf9Jj>+P4PmHhhVjrr=y6@RJNd*o_? zW3SQ^6zih*VR_V3KLTpOZCkCkwN$4mQtsUAyme$I&z)Lv)JWy2$4vjEHo0zdSUCgdvJrX`-FXbXm_Dbz*eT9i}tk(-)>-*a+SQ-U+S%e+18f z_kj0;e*;&7tAO=r{n_KL1@8yf0iXNafc^mZckmzJM({!KpWr5NGtlot=nn&Xs^33` zz6IP0J`O$sJ_&9Ep8}r-w}a1sJHThb=fLN|o!~C;-{1@2i{NhHb?-sn3%(4#65Rdh zuY#|E2f)|CH^4W+x4?tIb00>3J8avj?el-)`y=Q_!DHZY@B{Ee@FVbJ@Dt!Qo>LVI)Q z6oXFs;{>ZXZ?$S=FR%lkdGJ)ODF*En+(7isVH>aX+Z*%@+wJ(Y=tvuLo-=h4OK5H_<)E;Kg|<|~wiu7AfAhR;?+z4ei6=Mp-H~MTJbA}o zyWS7vgTQl5*WOwS?gDbAZ|_&^L2}CXK|QeN$e9;=gV(U7C(f4M6-dY#i;u#PJ32Ve zor}FY`jp^~-fH9j^!)9H^(DVSXqr)txM#7ImFHZYq%Q^;&ELwgcJ~3+tem5awNykB z^*K={?X|if=LfeR_UnSXyu|OVHJvfro=LAR-dmf+Tf=MEzA9Sl#kcO;-CRV%nz@*F zxk11(DwZYr85in7ZE*St1B~5@u{!w~v-Nu+ zxc$-TV0!8()r}MM+X2o0e1C374P=+#w0Fg>NB0iyC~W67%AUb#`+KH(^gh8Ik6nwc z3=U3v2zEXCfZ$HT9*V6D4^F!dyB<9%xYMx5U@M0Or#%+C9&NAXfBu`NV>FN%!S%xK zmNNwx!&orwQ_a^?ZI9pc8vFEoMmc}yQ~Z+9=Vw#s7e44%89id$^KZY}d`7_)<@?S?r1EzXfL` z+KkQrteynDp4_q6a#sas6dMARYfAj`@E2Umt@WkfH5j(-&@Y%T^X@Q{deBb6IaWG0 zTK*J;9V0ELvLEnVF#*^MC&u^P&_*WDT^yVvm6EuY%U$@qG`lf(oVx!fyuLY3VosfN z%30bpi!=VpnOkjTJdmpe^;2azJ@D zIPKqHE6)XIZa{G6r8c-rO8hPj&QZhb5rDJ1 zvGxCIaED^QCHy`{=uUZY$42>7a5hVKYK}tR5uB%e5&Ho2-N7A+eJ8f^NO0PZ2KVFO zyxvc+9ZjDM&g=aF`#AJ-!D&B*t@MZyM0-aIgY*o}>kYu3j;<}?24b&+8x-7l?B3YQ zq~Nq)6WpBOyxv-D=?x{^x!4}Nu!MUr_FT9tOE^bB{%6+)*MNPB1oE}uv>yoWq2Ok~ zJsjMo62IRC_vhed;`f)}dXu44Z@Zg0q+f7#*n0&xti z#>&&fUJ?2XxK&}lE%Xw&jo8ZV!TEJ%GtSxCXM_7r_<7EEgL^DE+rbZlbEr<`t-)5h z1vde^dvJZx)%N}TA|)TQI=ugwp0+eF16UIC+#Y}5)gY7S-qF^1kaLgigR?>#fIY$a zUh1`zuoYW(;%q5O8i74`1@PR}Ao-mW+=deFJZ$A6pr3iUIP5oscK-M#VA^jF&I;HV z+!ZI+jHI#+DMmXRSyJbS-&3kW1&&`?(0DG4};V1M`1q~8kO&8dw>2MTrK)9 zVRt8S(^s5T>DMDT@3T)0EJIpd%ej(v#0-TDcpGUGPLIo1P24{f8Jkj__wJ#`Yv3W|84oU&8IK9^po7a{2p5W zMpy53pWt>!D~YoY6-@P?o&9#`-RJH)(bTPX;cUisynlSRU)UCv^MO9;d*a$!4$D8P z;qZB1$UnSl4I_A5k~1ZZuzKPnE~!1t!<+$W}pgrv-|+@Yn9x$Io6WWMb$z*g|-U!g00zhBK?U-I5`sj+`sx7C*WDSVekX3E7s z|CmT6asS73lT`BexbfyDGmMl^zj6d_Px_aUu6u7v`ScGhoXUJU{@F&I)p`%gxHcYo zGuAibTgy+O8(ph3uAnp)Xg~0-DA^6cd5I4McT;eV8aD^G4b4ByY+LMlj-{O;BZWId z9zQtr5!fTJm0N<-z7^YZKNXxVck*!n`mW%P#Quy2knaYk{k`BG56-X8@Zmi755XOW z?Q;gjKVg~j+{NJ&*)BNG*&Ta2x=#tW2lfKEzQK*h-T_-VA~@|MgF7KOqsvLyj<9n} zIG=Ag7x&qQc`?GeV`ciE4Xy!u61MV%;I!S%Qoho)eEV~aSYB*@*7|{<+VwTsfzNCs&f8o3qJ@{d;edL@6M_D=51#V z%ze=&eqPc}ei2-HMm85epOJZTcOq!I$o3IUcL}bJ60+ z8XQ!%EVxy{+4t52m!7%lcXe>rh2I3Y8-lwPUHOje!x?GrYEK&g%%S&GZ8d2tuJYve z0LEMGG)L4=TNwpB))zRJ)pjIN>z78AX~CJ{nZUfv3eH}<2{=dkeF^7#0fWHv!Fj!j zT-f@bgf@+Cz&Bm21)uxKIg*?Nli^Hh*)1GYa>|R?<^iZ6leo7+tyM3g2QMYYbn^Oh1t343mOG z&5PIG8Jq~bp5up{GtOOrVk=30IT2iI*G@jIYu^Cq0=fd%MXrf_r^L4a-1Ty| z%eMgB?Q*ATCt&RG-4fp^=?Q#))*Uc+zkF}j_e%BveSzFlKY~x>2Y3$>#mO5$ufypbcPG-MKe!JY-Lxkcr^UklAj>N986mU7h(TmH5J|eV;Gw`<^}(dAWb#lYZghUcuJ?wV*TCm*yRV z9l3I6>|VF__PTTNm-ep%GJWk7@mZ47zxG_L{Qif%vb?ze;ks~FP;DL#px{0oSIVdF zO1iwb|Kz$nO@GUK7e{?R{lRJ+tMo}}S6lunFI%-+N78?}|1QLJn`#XI`Kq?Gz{Y-? zi0#Tf)_@a}!2eHd5F?lCBiNcss^>AgT&Iq!z;{)^{s0Q&g+Vh518w$$S* t;n(^v{B^Wp)QXm07MWWybwq@=tOH{vUTN)QSKA literal 0 HcmV?d00001 diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/Defaults.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/Defaults.h new file mode 100644 index 0000000..b108cf3 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/Defaults.h @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////// +// Defaults.h +// +// Default constants for use in MSAPROBS. The emission +// probabilities were computed using the program used to build +// the BLOSUM62 matrix from the BLOCKS 5.0 dataset. Transition +// parameters were obtained via unsupervised EM training on the +// BALIBASE 2.0 benchmark alignment database. +///////////////////////////////////////////////////////////////// + +#ifndef DEFAULTS_H +#define DEFAULTS_H + +#include + +using namespace std; + +/* + float initDistrib1Default[] = { 0.3202854395, 0.3398572505, 0.3398572505 }; + float gapOpen1Default[] = { 0.1375414133, 0.1375414133 }; + float gapExtend1Default[] = { 0.7832147479, 0.7832147479 }; + */ + +float initDistrib1Default[] = { 0.6080327034f, 0.1959836632f, 0.1959836632f }; +float gapOpen1Default[] = { 0.01993141696f, 0.01993141696f }; +float gapExtend1Default[] = { 0.7943345308f, 0.7943345308f }; + +float initDistrib2Default[] = { 0.6814756989f, 8.615339902e-05f, + 8.615339902e-05f, 0.1591759622f, 0.1591759622 }; +float gapOpen2Default[] = { 0.0119511066f, 0.0119511066f, 0.008008334786f, + 0.008008334786 }; +float gapExtend2Default[] = { 0.3965826333f, 0.3965826333f, 0.8988758326f, + 0.8988758326 }; + +string alphabetDefault = "ARNDCQEGHILKMFPSTWYV"; +float emitSingleDefault[20] = { 0.07831005f, 0.05246024f, 0.04433257f, + 0.05130349f, 0.02189704f, 0.03585766f, 0.05615771f, 0.07783433f, + 0.02601093f, 0.06511648f, 0.09716489f, 0.05877077f, 0.02438117f, + 0.04463228f, 0.03940142f, 0.05849916f, 0.05115306f, 0.01203523f, + 0.03124726f, 0.07343426f }; + +float emitPairsDefault[20][20] = { { 0.02373072f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f }, { 0.00244502f, 0.01775118f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00210228f, 0.00207782f, 0.01281864f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00223549f, 0.00161657f, 0.00353540f, 0.01911178f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f }, { 0.00145515f, 0.00044701f, 0.00042479f, + 0.00036798f, 0.01013470f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00219102f, + 0.00253532f, 0.00158223f, 0.00176784f, 0.00032102f, 0.00756604f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00332218f, 0.00268865f, 0.00224738f, 0.00496800f, + 0.00037956f, 0.00345128f, 0.01676565f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00597898f, + 0.00194865f, 0.00288882f, 0.00235249f, 0.00071206f, 0.00142432f, + 0.00214860f, 0.04062876f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00114353f, 0.00132105f, 0.00141205f, + 0.00097077f, 0.00026421f, 0.00113901f, 0.00131767f, 0.00103704f, + 0.00867996f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, + { 0.00318853f, 0.00138145f, 0.00104273f, 0.00105355f, 0.00094040f, + 0.00100883f, 0.00124207f, 0.00142520f, 0.00059716f, 0.01778263f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { + 0.00449576f, 0.00246811f, 0.00160275f, 0.00161966f, 0.00138494f, + 0.00180553f, 0.00222063f, 0.00212853f, 0.00111754f, 0.01071834f, + 0.03583921f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00331693f, 0.00595650f, 0.00257310f, 0.00252518f, + 0.00046951f, 0.00312308f, 0.00428420f, 0.00259311f, 0.00121376f, + 0.00157852f, 0.00259626f, 0.01612228f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00148878f, 0.00076734f, + 0.00063401f, 0.00047808f, 0.00037421f, 0.00075546f, 0.00076105f, + 0.00066504f, 0.00042237f, 0.00224097f, 0.00461939f, 0.00096120f, + 0.00409522f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { + 0.00165004f, 0.00090768f, 0.00084658f, 0.00069041f, 0.00052274f, + 0.00059248f, 0.00078814f, 0.00115204f, 0.00072545f, 0.00279948f, + 0.00533369f, 0.00087222f, 0.00116111f, 0.01661038f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f }, { 0.00230618f, 0.00106268f, + 0.00100282f, 0.00125381f, 0.00034766f, 0.00090111f, 0.00151550f, + 0.00155601f, 0.00049078f, 0.00103767f, 0.00157310f, 0.00154836f, + 0.00046718f, 0.00060701f, 0.01846071f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f }, { 0.00631752f, 0.00224540f, 0.00301397f, 0.00285226f, + 0.00094867f, 0.00191155f, 0.00293898f, 0.00381962f, 0.00116422f, + 0.00173565f, 0.00250962f, 0.00312633f, 0.00087787f, 0.00119036f, + 0.00180037f, 0.01346609f, 0.0f, 0.0f, 0.0f, 0.0f }, { + 0.00389995f, 0.00186053f, 0.00220144f, 0.00180488f, 0.00073798f, + 0.00154526f, 0.00216760f, 0.00214841f, 0.00077747f, 0.00248968f, + 0.00302273f, 0.00250862f, 0.00093371f, 0.00107595f, 0.00147982f, + 0.00487295f, 0.01299436f, 0.0f, 0.0f, 0.0f }, { 0.00039119f, + 0.00029139f, 0.00021006f, 0.00016015f, 0.00010666f, 0.00020592f, + 0.00023815f, 0.00038786f, 0.00019097f, 0.00039549f, 0.00076736f, + 0.00028448f, 0.00016253f, 0.00085751f, 0.00015674f, 0.00026525f, + 0.00024961f, 0.00563625f, 0.0f, 0.0f }, { 0.00131840f, + 0.00099430f, 0.00074960f, 0.00066005f, 0.00036626f, 0.00070192f, + 0.00092548f, 0.00089301f, 0.00131038f, 0.00127857f, 0.00219713f, + 0.00100817f, 0.00054105f, 0.00368739f, 0.00047608f, 0.00102648f, + 0.00094759f, 0.00069226f, 0.00999315f, 0.0f }, { 0.00533241f, + 0.00169359f, 0.00136609f, 0.00127915f, 0.00119152f, 0.00132844f, + 0.00178697f, 0.00194579f, 0.00071553f, 0.01117956f, 0.00914460f, + 0.00210897f, 0.00197461f, 0.00256159f, 0.00135781f, 0.00241601f, + 0.00343452f, 0.00038538f, 0.00148001f, 0.02075171f } }; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/FileBuffer.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/FileBuffer.h new file mode 100644 index 0000000..06af54b --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/FileBuffer.h @@ -0,0 +1,117 @@ +///////////////////////////////////////////////////////////////// +// FileBuffer.h +// +// Buffered file reading. +///////////////////////////////////////////////////////////////// + +#ifndef FILEBUFFER_H +#define FILEBUFFER_H + +#include +#include +#include + +using namespace std; + +const int BufferSize = 1000; + +///////////////////////////////////////////////////////////////// +// FileBuffer +// +// Class for buffering file reading. +///////////////////////////////////////////////////////////////// + +class FileBuffer { + ifstream file; + char buffer[BufferSize]; + int currPos; + int size; + bool isEOF; + bool isValid; + bool canUnget; + +public: + + // Some common routines + + FileBuffer(const char *filename) : + file(filename), currPos(0), size(0), isEOF(false), isValid( + !file.fail()), canUnget(false) { + } + ~FileBuffer() { + close(); + } + bool fail() const { + return !isValid; + } + bool eof() const { + return (!isValid || isEOF); + } + void close() { + file.close(); + isValid = false; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::Get() + // + // Retrieve a character from the file buffer. Returns true if + // and only if a character is read. + ///////////////////////////////////////////////////////////////// + + bool Get(char &ch) { + + // check to make sure that there's more stuff in the file + if (!isValid || isEOF) + return false; + + // if the buffer is empty, it's time to reload it + if (currPos == size) { + file.read(buffer, BufferSize); + size = file.gcount(); + isEOF = (size == 0); + currPos = 0; + if (isEOF) + return false; + } + + // store the read character + ch = buffer[currPos++]; + canUnget = true; + return true; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::UnGet() + // + // Unretrieve the most recently read character from the file + // buffer. Note that this allows only a one-level undo. + ///////////////////////////////////////////////////////////////// + + void UnGet() { + assert(canUnget); + assert(isValid); + assert(currPos > 0); + currPos--; + assert(currPos < size); + isEOF = false; + canUnget = false; + } + + ///////////////////////////////////////////////////////////////// + // FileBuffer::GetLine() + // + // Retrieve characters of text until a newline character is + // encountered. Terminates properly on end-of-file condition. + ///////////////////////////////////////////////////////////////// + + void GetLine(string &s) { + char ch; + s = ""; + while (Get(ch) && ch != '\n') + s += ch; + } + +}; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.cpp b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.cpp new file mode 100644 index 0000000..db1550e --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.cpp @@ -0,0 +1,1349 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSA.h" +#include "MSAClusterTree.h" +#include "Defaults.h" + +#ifdef _OPENMP +#include +#endif + +string parametersInputFilename = ""; +string parametersOutputFilename = "no training"; +string annotationFilename = ""; + +bool enableVerbose = false; +bool enableAnnotation = false; +bool enableClustalWOutput = false; +bool enableAlignOrder = false; +int numConsistencyReps = 2; +int numPreTrainingReps = 0; +int numIterativeRefinementReps = 10; + +float cutoff = 0; + +VF initDistrib(NumMatrixTypes); +VF gapOpen(2 * NumInsertStates); +VF gapExtend(2 * NumInsertStates); +VVF emitPairs(256, VF(256, 1e-10)); +VF emitSingle(256, 1e-5); + +string alphabet = alphabetDefault; + +const int MIN_PRETRAINING_REPS = 0; +const int MAX_PRETRAINING_REPS = 20; +const int MIN_CONSISTENCY_REPS = 0; +const int MAX_CONSISTENCY_REPS = 5; +const int MIN_ITERATIVE_REFINEMENT_REPS = 0; +const int MAX_ITERATIVE_REFINEMENT_REPS = 1000; + +string posteriorProbsFilename = ""; +bool allscores = true; +string infilename; + +int flag_gui = 0; //0: no gui related o/p +//1: gui related o/p generated +int flag_ppscore = 0; //0: no pp score sequence added to o/p fasta alignment +//1: pp score seq added to o/p fasta alignment + +/////////////////////////////// +// global scoring matrix variables +////////////////////////////// +float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +char *aminos, *bases, matrixtype[20] = "gonnet_160"; +int subst_index[26]; + +double sub_matrix[26][26]; +int firstread = 0; //this makes sure that matrices are read only once + +float TEMPERATURE = 5; +int MATRIXTYPE = 160; +int prot_nuc = 0; //0=prot, 1=nucleotide + +float GAPOPEN = 0; +float GAPEXT = 0; +int numThreads = 0; + +//argument support +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +argument_decl argument; + +extern inline void read_sustitution_matrix(char *fileName); +extern void setmatrixtype(int le); +extern inline int matrixtype_to_int(); +extern inline void read_dna_matrix(); +extern inline void read_vtml_la_matrix(); +extern void init_arguments(); + +MSA::MSA(int argc, char* argv[]) { + //parse program parameters + SafeVector sequenceNames = ParseParams(argc, argv); + + //initialize arguments for partition function + init_arguments(); + + ReadParameters(); + //PrintParameters ("Using parameter set:", initDistrib, gapOpen, gapExtend, emitPairs, emitSingle, NULL); + + //read the input sequences + MultiSequence *sequences = new MultiSequence(); + assert(sequences); + for (int i = 0; i < (int) sequenceNames.size(); i++) { + cerr << "Loading sequence file: " << sequenceNames[i] << endl; + sequences->LoadMFA(sequenceNames[i], true); + } + //allocate space for sequence weights + this->seqsWeights = new int[sequences->GetNumSequences()]; + //initilaize parameters for OPENMP +#ifdef _OPENMP + if(numThreads <= 0) { + numThreads = omp_get_num_procs(); + cerr << "Automatically detected " << numThreads << " CPU cores" << endl; + } + cerr <<"Enabling OpenMP (with "<WriteALN(*alignOutFile); + } else { + alignment->WriteMFA(*alignOutFile); + } + //release resources + delete[] this->seqsWeights; + delete alignment; + delete sequences; +} +MSA::~MSA() { + /*close the output file*/ + if (alignOutFileName.length() > 0) { + ((std::ofstream*) alignOutFile)->close(); + } +} +///////////////////////////////////////////////////////////////// +// PrintParameters() +// +// Prints MSAPROBS parameters to STDERR. If a filename is +// specified, then the parameters are also written to the file. +///////////////////////////////////////////////////////////////// + +void MSA::PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename) { + + // print parameters to the screen + cerr << message << endl << " initDistrib[] = { "; + for (int i = 0; i < NumMatrixTypes; i++) + cerr << setprecision(10) << initDistrib[i] << " "; + cerr << "}" << endl << " gapOpen[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapOpen[i] << " "; + cerr << "}" << endl << " gapExtend[] = { "; + for (int i = 0; i < NumInsertStates * 2; i++) + cerr << setprecision(10) << gapExtend[i] << " "; + cerr << "}" << endl << endl; + + /* + for (int i = 0; i < 5; i++){ + for (int j = 0; j <= i; j++){ + cerr << emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]] << " "; + } + cerr << endl; + }*/ + + // if a file name is specified + if (filename) { + + // attempt to open the file for writing + FILE *file = fopen(filename, "w"); + if (!file) { + cerr << "ERROR: Unable to write parameter file: " << filename + << endl; + exit(1); + } + + // if successful, then write the parameters to the file + for (int i = 0; i < NumMatrixTypes; i++) + fprintf(file, "%.10f ", initDistrib[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapOpen[i]); + fprintf(file, "\n"); + for (int i = 0; i < 2 * NumInsertStates; i++) + fprintf(file, "%.10f ", gapExtend[i]); + fprintf(file, "\n"); + fprintf(file, "%s\n", alphabet.c_str()); + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) + fprintf(file, "%.10f ", + emitPairs[(unsigned char) alphabet[i]][(unsigned char) alphabet[j]]); + fprintf(file, "\n"); + } + for (int i = 0; i < (int) alphabet.size(); i++) + fprintf(file, "%.10f ", emitSingle[(unsigned char) alphabet[i]]); + fprintf(file, "\n"); + fclose(file); + } +} + +///////////////////////////////////////////////////////////////// +// doAlign() +// +// First computes all pairwise posterior probability matrices. +// Then, computes new parameters if training, or a final +// alignment, otherwise. +///////////////////////////////////////////////////////////////// +extern VF *ComputePostProbs(int a, int b, string seq1, string seq2); +MultiSequence* MSA::doAlign(MultiSequence *sequences, + const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, + VF &gapExtend, VVF &emitPairs, VF &emitSingle) { + assert(sequences); + + //get the number of sequences + const int numSeqs = sequences->GetNumSequences(); + + //create distance matrix + VVF distances(numSeqs, VF(numSeqs, 0)); + SafeVector > sparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + +#ifdef _OPENMP + //calculate sequence pairs for openmp model + int pairIdx = 0; + numPairs = (numSeqs - 1) * numSeqs / 2; + seqsPairs = new SeqsPair[numPairs]; + for(int a = 0; a < numSeqs; a++) { + for(int b = a + 1; b < numSeqs; b++) { + seqsPairs[pairIdx].seq1 = a; + seqsPairs[pairIdx].seq2 = b; + pairIdx++; + } + } +#endif + // do all pairwise alignments for posterior probability matrices +#ifdef _OPENMP +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int a= seqsPairs[pairIdx].seq1; + int b = seqsPairs[pairIdx].seq2; + if(enableVerbose) { +#pragma omp critical + cerr <<"tid "<GetSequence(a); + Sequence *seq2 = sequences->GetSequence(b); + + // verbose output + if (enableVerbose) { + cerr << "Computing posterior matrix: (" << a + 1 << ") " + << seq1->GetHeader() << " vs. " << "(" << b + 1 << ") " + << seq2->GetHeader() << " -- "; + } + + // compute forward and backward probabilities + VF *forward = model.ComputeForwardMatrix(seq1, seq2); + assert(forward); + VF *backward = model.ComputeBackwardMatrix(seq1, seq2); + assert(backward); + + // compute posterior probability matrix from HMM + VF *posterior = model.ComputePosteriorMatrix(seq1, seq2, *forward, + *backward); + assert(posterior); + delete forward; + delete backward; + + //compute posterior probability matrix from partition function + VF* part_posterior = ::ComputePostProbs(a, b, seq1->GetString(), + seq2->GetString()); + assert(part_posterior); + + //merge the two posterior matrices + VF::iterator ptr1 = posterior->begin(); + VF::iterator ptr2 = part_posterior->begin(); + for (int i = 0; i <= seq1->GetLength(); i++) { + for (int j = 0; j <= seq2->GetLength(); j++) { + float v1 = *ptr1; + float v2 = *ptr2; + + *ptr1 = sqrt((v1 * v1 + v2 * v2) * 0.5f); + ptr1++; + ptr2++; + } + } + delete part_posterior; + + // compute sparse representations + sparseMatrices[a][b] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), *posterior); + sparseMatrices[b][a] = NULL; + + // perform the pairwise sequence alignment + pair *, float> alignment = model.ComputeAlignment( + seq1->GetLength(), seq2->GetLength(), *posterior); + + //compute the pairwise distance using expected accuracy + float accuracy = alignment.second + / min(seq1->GetLength(), seq2->GetLength()); + distances[a][b] = distances[b][a] = 1.0f - accuracy; + + if (enableVerbose) { + cerr << setprecision(10) << accuracy << endl; + } + delete alignment.first; + delete posterior; +#ifndef _OPENMP + } +#endif + } + //create the guide tree + this->tree = new MSAClusterTree(this, distances, numSeqs); + this->tree->create(); + + // perform the consistency transformation the desired number of times + float* fweights = new float[numSeqs]; + for (int r = 0; r < numSeqs; r++) { + fweights[r] = ((float) seqsWeights[r]) / INT_MULTIPLY; + fweights[r] *= 10; + } + for (int r = 0; r < numConsistencyReps; r++) { + SafeVector > newSparseMatrices = + DoRelaxation(fweights, sequences, sparseMatrices); + + // now replace the old posterior matrices + for (int i = 0; i < numSeqs; i++) { + for (int j = 0; j < numSeqs; j++) { + delete sparseMatrices[i][j]; + sparseMatrices[i][j] = newSparseMatrices[i][j]; + } + } + } + delete[] fweights; +#ifdef _OPENMP + delete [] seqsPairs; +#endif + + //compute the final multiple sequence alignment + MultiSequence *finalAlignment = ComputeFinalAlignment(this->tree, sequences, + sparseMatrices, model); + + // build annotation + if (enableAnnotation) { + WriteAnnotation(finalAlignment, sparseMatrices); + } + //destroy the guide tree + delete this->tree; + this->tree = 0; + + // delete sparse matrices + for (int a = 0; a < numSeqs - 1; a++) { + for (int b = a + 1; b < numSeqs; b++) { + delete sparseMatrices[a][b]; + delete sparseMatrices[b][a]; + } + } + + return finalAlignment; +} + +///////////////////////////////////////////////////////////////// +// GetInteger() +// +// Attempts to parse an integer from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetInteger(char *data, int *val) { + char *endPtr; + long int retVal; + + assert(val); + + errno = 0; + retVal = strtol(data, &endPtr, 0); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal == LONG_MAX || retVal == LONG_MIN)) + return false; + if (retVal < (long) INT_MIN || retVal > (long) INT_MAX) + return false; + *val = (int) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// GetFloat() +// +// Attempts to parse a float from the character string given. +// Returns true only if no parsing error occurs. +///////////////////////////////////////////////////////////////// + +bool GetFloat(char *data, float *val) { + char *endPtr; + double retVal; + + assert(val); + + errno = 0; + retVal = strtod(data, &endPtr); + if (retVal == 0 && (errno != 0 || data == endPtr)) + return false; + if (errno != 0 && (retVal >= 1000000.0 || retVal <= -1000000.0)) + return false; + *val = (float) retVal; + return true; +} + +///////////////////////////////////////////////////////////////// +// ReadParameters() +// +// Read initial distribution, transition, and emission +// parameters from a file. +///////////////////////////////////////////////////////////////// + +void MSA::ReadParameters() { + + ifstream data; + + emitPairs = VVF(256, VF(256, 1e-10)); + emitSingle = VF(256, 1e-5); + + // read initial state distribution and transition parameters + if (parametersInputFilename == string("")) { + if (NumInsertStates == 1) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen1Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend1Default[i]; + } else if (NumInsertStates == 2) { + for (int i = 0; i < NumMatrixTypes; i++) + initDistrib[i] = initDistrib2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapOpen[i] = gapOpen2Default[i]; + for (int i = 0; i < 2 * NumInsertStates; i++) + gapExtend[i] = gapExtend2Default[i]; + } else { + cerr + << "ERROR: No default initial distribution/parameter settings exist" + << endl << " for " << NumInsertStates + << " pairs of insert states. Use --paramfile." << endl; + exit(1); + } + + alphabet = alphabetDefault; + + for (int i = 0; i < (int) alphabet.length(); i++) { + emitSingle[(unsigned char) tolower(alphabet[i])] = + emitSingleDefault[i]; + emitSingle[(unsigned char) toupper(alphabet[i])] = + emitSingleDefault[i]; + for (int j = 0; j <= i; j++) { + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = emitPairsDefault[i][j]; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = emitPairsDefault[i][j]; + } + } + } else { + data.open(parametersInputFilename.c_str()); + if (data.fail()) { + cerr << "ERROR: Unable to read parameter file: " + << parametersInputFilename << endl; + exit(1); + } + + string line[3]; + for (int i = 0; i < 3; i++) { + if (!getline(data, line[i])) { + cerr + << "ERROR: Unable to read transition parameters from parameter file: " + << parametersInputFilename << endl; + exit(1); + } + } + istringstream data2; + data2.clear(); + data2.str(line[0]); + for (int i = 0; i < NumMatrixTypes; i++) + data2 >> initDistrib[i]; + data2.clear(); + data2.str(line[1]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapOpen[i]; + data2.clear(); + data2.str(line[2]); + for (int i = 0; i < 2 * NumInsertStates; i++) + data2 >> gapExtend[i]; + + if (!getline(data, line[0])) { + cerr << "ERROR: Unable to read alphabet from scoring matrix file: " + << parametersInputFilename << endl; + exit(1); + } + + // read alphabet as concatenation of all characters on alphabet line + alphabet = ""; + string token; + data2.clear(); + data2.str(line[0]); + while (data2 >> token) + alphabet += token; + + for (int i = 0; i < (int) alphabet.size(); i++) { + for (int j = 0; j <= i; j++) { + float val; + data >> val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) tolower( + alphabet[j])] = val; + emitPairs[(unsigned char) toupper(alphabet[i])][(unsigned char) toupper( + alphabet[j])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) tolower(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) tolower( + alphabet[i])] = val; + emitPairs[(unsigned char) toupper(alphabet[j])][(unsigned char) toupper( + alphabet[i])] = val; + } + } + + for (int i = 0; i < (int) alphabet.size(); i++) { + float val; + data >> val; + emitSingle[(unsigned char) tolower(alphabet[i])] = val; + emitSingle[(unsigned char) toupper(alphabet[i])] = val; + } + data.close(); + } +} + +///////////////////////////////////////////////////////////////// +// ParseParams() +// +// Parse all command-line options. +///////////////////////////////////////////////////////////////// +void MSA::printUsage() { + cerr + << "************************************************************************" + << endl + << "\tMSAPROBS is a open-source protein multiple sequence alignment algorithm" + << endl + << "\tbased on pair hidden markov model and partition function postirior" + << endl + << "\tprobabilities. If any comments or problems, please contact" + << endl + << "\tLiu Yongchao(liuy0039@ntu.edu.sg or nkcslyc@hotmail.com)" + << endl + << "*************************************************************************" + << endl << "Usage:" << endl + << " msaprobs [OPTION]... [infile]..." << endl << endl + << "Description:" << endl + << " Align sequences in multi-FASTA format" << endl << endl + << " -o, --outfile " << endl + << " specify the output file name (STDOUT by default)" + << endl << " -num_threads " << endl + << " specify the number of threads used, and otherwise detect automatically" + << endl << " -clustalw" << endl + << " use CLUSTALW output format instead of FASTA format" + << endl << endl << " -c, --consistency REPS" << endl + << " use " << MIN_CONSISTENCY_REPS << " <= REPS <= " + << MAX_CONSISTENCY_REPS << " (default: " << numConsistencyReps + << ") passes of consistency transformation" << endl << endl + << " -ir, --iterative-refinement REPS" << endl + << " use " << MIN_ITERATIVE_REFINEMENT_REPS + << " <= REPS <= " << MAX_ITERATIVE_REFINEMENT_REPS << " (default: " + << numIterativeRefinementReps << ") passes of iterative-refinement" + << endl << endl << " -v, --verbose" << endl + << " report progress while aligning (default: " + << (enableVerbose ? "on" : "off") << ")" << endl << endl + << " -annot FILENAME" << endl + << " write annotation for multiple alignment to FILENAME" + << endl << endl << " -a, --alignment-order" << endl + << " print sequences in alignment order rather than input order (default: " + << (enableAlignOrder ? "on" : "off") << ")" << endl + << " -version " << endl + << " print out version of MSAPROBS " << endl << endl; +} +SafeVector MSA::ParseParams(int argc, char **argv) { + if (argc < 2) { + printUsage(); + exit(1); + } + SafeVector sequenceNames; + int tempInt; + float tempFloat; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + //help + if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-?")) { + printUsage(); + exit(1); + //output file name + } else if (!strcmp(argv[i], "-o") + || !strcmp(argv[i], "--outfile")) { + if (i < argc - 1) { + alignOutFileName = argv[++i]; //get the file name + } else { + cerr << "ERROR: String expected for option " << argv[i] + << endl; + exit(1); + } + //number of threads used + } else if (!strcmp(argv[i], "-p") + || !strcmp(argv[i], "-num_threads")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << " ERROR: invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < 0) { + tempInt = 0; + } + numThreads = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + // number of consistency transformations + } else if (!strcmp(argv[i], "-c") + || !strcmp(argv[i], "--consistency")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_CONSISTENCY_REPS + || tempInt > MAX_CONSISTENCY_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_CONSISTENCY_REPS << " and " + << MAX_CONSISTENCY_REPS << "." << endl; + exit(1); + } else { + numConsistencyReps = tempInt; + } + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // number of randomized partitioning iterative refinement passes + else if (!strcmp(argv[i], "-ir") + || !strcmp(argv[i], "--iterative-refinement")) { + if (i < argc - 1) { + if (!GetInteger(argv[++i], &tempInt)) { + cerr << "ERROR: Invalid integer following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempInt < MIN_ITERATIVE_REFINEMENT_REPS + || tempInt > MAX_ITERATIVE_REFINEMENT_REPS) { + cerr << "ERROR: For option " << argv[i - 1] + << ", integer must be between " + << MIN_ITERATIVE_REFINEMENT_REPS << " and " + << MAX_ITERATIVE_REFINEMENT_REPS << "." + << endl; + exit(1); + } else + numIterativeRefinementReps = tempInt; + } + } else { + cerr << "ERROR: Integer expected for option " << argv[i] + << endl; + exit(1); + } + } + + // annotation files + else if (!strcmp(argv[i], "-annot")) { + enableAnnotation = true; + if (i < argc - 1) { + annotationFilename = argv[++i]; + } else { + cerr << "ERROR: FILENAME expected for option " << argv[i] + << endl; + exit(1); + } + } + + // clustalw output format + else if (!strcmp(argv[i], "-clustalw")) { + enableClustalWOutput = true; + } + + // cutoff + else if (!strcmp(argv[i], "-co") || !strcmp(argv[i], "--cutoff")) { + if (i < argc - 1) { + if (!GetFloat(argv[++i], &tempFloat)) { + cerr + << "ERROR: Invalid floating-point value following option " + << argv[i - 1] << ": " << argv[i] << endl; + exit(1); + } else { + if (tempFloat < 0 || tempFloat > 1) { + cerr << "ERROR: For option " << argv[i - 1] + << ", floating-point value must be between 0 and 1." + << endl; + exit(1); + } else + cutoff = tempFloat; + } + } else { + cerr << "ERROR: Floating-point value expected for option " + << argv[i] << endl; + exit(1); + } + } + + // verbose reporting + else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) { + enableVerbose = true; + } + + // alignment order + else if (!strcmp(argv[i], "-a") + || !strcmp(argv[i], "--alignment-order")) { + enableAlignOrder = true; + } + + //print out version + else if (!strcmp(argv[i], "-version")) { + cerr << "MSAPROBS version " << VERSION << endl; + exit(1); + } + // bad arguments + else { + cerr << "ERROR: Unrecognized option: " << argv[i] << endl; + exit(1); + } + } else { + sequenceNames.push_back(string(argv[i])); + } + } + + /*check the output file name*/ + cerr << "-------------------------------------" << endl; + if (alignOutFileName.length() == 0) { + cerr << "The final alignments will be printed out to STDOUT" << endl; + alignOutFile = &std::cout; + } else { + cerr << "Open the output file " << alignOutFileName << endl; + alignOutFile = new ofstream(alignOutFileName.c_str(), + ios::binary | ios::out | ios::trunc); + } + cerr << "-------------------------------------" << endl; + return sequenceNames; +} + +///////////////////////////////////////////////////////////////// +// ProcessTree() +// +// Process the tree recursively. Returns the aligned sequences +// corresponding to a node or leaf of the tree. +///////////////////////////////////////////////////////////////// +MultiSequence* MSA::ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + MultiSequence *result; + + // check if this is a node of the alignment tree + //if (tree->GetSequenceLabel() == -1){ + if (tree->leaf == NODE) { + MultiSequence *alignLeft = ProcessTree(tree->left, sequences, + sparseMatrices, model); + MultiSequence *alignRight = ProcessTree(tree->right, sequences, + sparseMatrices, model); + + assert(alignLeft); + assert(alignRight); + + result = AlignAlignments(alignLeft, alignRight, sparseMatrices, model); + assert(result); + + delete alignLeft; + delete alignRight; + } + + // otherwise, this is a leaf of the alignment tree + else { + result = new MultiSequence(); + assert(result); + //result->AddSequence (sequences->GetSequence(tree->GetSequenceLabel())->Clone()); + result->AddSequence(sequences->GetSequence(tree->idx)->Clone()); + } + + return result; +} + +///////////////////////////////////////////////////////////////// +// ComputeFinalAlignment() +// +// Compute the final alignment by calling ProcessTree(), then +// performing iterative refinement as needed. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::ComputeFinalAlignment(MSAGuideTree*tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + MultiSequence *alignment = ProcessTree(tree->getRoot(), sequences, + sparseMatrices, model); + + SafeVector oldOrdering; + if (enableAlignOrder) { + for (int i = 0; i < alignment->GetNumSequences(); i++) + oldOrdering.push_back(alignment->GetSequence(i)->GetSortLabel()); + alignment->SaveOrdering(); + enableAlignOrder = false; + } + + // tree-based refinement + // TreeBasedBiPartitioning (sparseMatrices, model, alignment, tree); + /*int numSeqs = alignment->GetNumSequences(); + if(numSeqs < numIterativeRefinementReps){ + for(int iter = 0; iter < 1; iter ++){ + for(int i = 0; i < numSeqs - 1; i++){ + DoIterativeRefinementTreeNode(sparseMatrices, model, alignment, i); + } + } + }*/ + for (int i = 0; i < numIterativeRefinementReps; i++) { + DoIterativeRefinement(sparseMatrices, model, alignment, i); + } + cerr << endl; + + if (oldOrdering.size() > 0) { + for (int i = 0; i < (int) oldOrdering.size(); i++) { + alignment->GetSequence(i)->SetSortLabel(oldOrdering[i]); + } + } + + // return final alignment + return alignment; +} + +///////////////////////////////////////////////////////////////// +// AlignAlignments() +// +// Returns the alignment of two MultiSequence objects. +///////////////////////////////////////////////////////////////// + +MultiSequence* MSA::AlignAlignments(MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model) { + + // print some info about the alignment + if (enableVerbose) { + for (int i = 0; i < align1->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align1->GetSequence(i)->GetLabel(); + cerr << "] vs. "; + for (int i = 0; i < align2->GetNumSequences(); i++) + cerr << ((i == 0) ? "[" : ",") + << align2->GetSequence(i)->GetLabel(); + cerr << "]: "; + } +#if 0 + VF *posterior = model.BuildPosterior (align1, align2, sparseMatrices, cutoff); +#else + VF *posterior = model.BuildPosterior(getSeqsWeights(), align1, align2, + sparseMatrices, cutoff); +#endif + pair *, float> alignment; + + //perform alignment + alignment = model.ComputeAlignment(align1->GetSequence(0)->GetLength(), + align2->GetSequence(0)->GetLength(), *posterior); + + delete posterior; + + if (enableVerbose) { + + // compute total length of sequences + int totLength = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) + for (int j = 0; j < align2->GetNumSequences(); j++) + totLength += min(align1->GetSequence(i)->GetLength(), + align2->GetSequence(j)->GetLength()); + + // give an "accuracy" measure for the alignment + cerr << alignment.second / totLength << endl; + } + + // now build final alignment + MultiSequence *result = new MultiSequence(); + for (int i = 0; i < align1->GetNumSequences(); i++) + result->AddSequence( + align1->GetSequence(i)->AddGaps(alignment.first, 'X')); + for (int i = 0; i < align2->GetNumSequences(); i++) + result->AddSequence( + align2->GetSequence(i)->AddGaps(alignment.first, 'Y')); + if (!enableAlignOrder) + result->SortByLabel(); + + // free temporary alignment + delete alignment.first; + + return result; +} + +///////////////////////////////////////////////////////////////// +// DoRelaxation() +// +// Performs one round of the weighted probabilistic consistency transformation. +// 1 +///////////////////////////////////////////////////////////////// + +SafeVector > MSA::DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices) { + const int numSeqs = sequences->GetNumSequences(); + + SafeVector > newSparseMatrices(numSeqs, + SafeVector(numSeqs, NULL)); + + // for every pair of sequences +#ifdef _OPENMP + int pairIdx; +#pragma omp parallel for private(pairIdx) default(shared) schedule(dynamic) + for(pairIdx = 0; pairIdx < numPairs; pairIdx++) { + int i = seqsPairs[pairIdx].seq1; + int j = seqsPairs[pairIdx].seq2; + float wi = seqsWeights[i]; + float wj = seqsWeights[j]; +#else + for (int i = 0; i < numSeqs; i++) { + float wi = seqsWeights[i]; + for (int j = i + 1; j < numSeqs; j++) { + float wj = seqsWeights[j]; +#endif + Sequence *seq1 = sequences->GetSequence(i); + Sequence *seq2 = sequences->GetSequence(j); + + if (enableVerbose) { +#ifdef _OPENMP +#pragma omp critical +#endif + cerr << "Relaxing (" << i + 1 << ") " << seq1->GetHeader() + << " vs. " << "(" << j + 1 << ") " << seq2->GetHeader() + << ": "; + } + // get the original posterior matrix + VF *posteriorPtr = sparseMatrices[i][j]->GetPosterior(); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // contribution from the summation where z = x and z = y + float w = wi * wi * wj + wi * wj * wj; + float sumW = w; + for (int k = 0; k < (seq1Length + 1) * (seq2Length + 1); k++) { + posterior[k] = w * posterior[k]; + } + + if (enableVerbose) + cerr << sparseMatrices[i][j]->GetNumCells() << " --> "; + + // contribution from all other sequences + for (int k = 0; k < numSeqs; k++) { + if (k != i && k != j) { + float wk = seqsWeights[k]; + float w = wi * wj * wk; + sumW += w; + if (k < i) + Relax1(w, sparseMatrices[k][i], sparseMatrices[k][j], + posterior); + else if (k > i && k < j) + Relax(w, sparseMatrices[i][k], sparseMatrices[k][j], + posterior); + else { + SparseMatrix *temp = + sparseMatrices[j][k]->ComputeTranspose(); + Relax(w, sparseMatrices[i][k], temp, posterior); + delete temp; + } + } + } + //cerr<<"sumW "<::iterator XYptr = matXY->GetRowPtr(x); + SafeVector::iterator XYend = XYptr + matXY->GetRowSize(x); + VF::iterator base = posterior.begin() + x * (seq2Length + 1); + int curr = 0; + while (XYptr != XYend) { + + // zero out all cells until the first filled column + while (curr < XYptr->first) { + base[curr] = 0; + curr++; + } + + // now, skip over this column + curr++; + ++XYptr; + } + + // zero out cells after last column + while (curr <= seq2Length) { + base[curr] = 0; + curr++; + } + } + + // save the new posterior matrix + newSparseMatrices[i][j] = new SparseMatrix(seq1->GetLength(), + seq2->GetLength(), posterior); + newSparseMatrices[j][i] = NULL; + + if (enableVerbose) + cerr << newSparseMatrices[i][j]->GetNumCells() << " -- "; + + delete posteriorPtr; + + if (enableVerbose) + cerr << "done." << endl; +#ifndef _OPENMP + } +#endif + } + + return newSparseMatrices; +} + +///////////////////////////////////////////////////////////////// +// Relax() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior) { + + assert(matXZ); + assert(matZY); + + int lengthX = matXZ->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + assert(matXZ->GetSeq2Length() == matZY->GetSeq1Length()); + + // for every x[i] + for (int i = 1; i <= lengthX; i++) { + SafeVector::iterator XZptr = matXZ->GetRowPtr(i); + SafeVector::iterator XZend = XZptr + matXZ->GetRowSize(i); + + VF::iterator base = posterior.begin() + i * (lengthY + 1); + + // iterate through all x[i]-z[k] + while (XZptr != XZend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(XZptr->first); + SafeVector::iterator ZYend = ZYptr + + matZY->GetRowSize(XZptr->first); + const float XZval = XZptr->second; + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + base[ZYptr->first] += weight * XZval * ZYptr->second; + ZYptr++; + } + XZptr++; + } + } +} + +///////////////////////////////////////////////////////////////// +// Relax1() +// +// Computes the consistency transformation for a single sequence +// z, and adds the transformed matrix to "posterior". +///////////////////////////////////////////////////////////////// + +void MSA::Relax1(float weight, SparseMatrix *matZX, SparseMatrix *matZY, + VF &posterior) { + + assert(matZX); + assert(matZY); + + int lengthZ = matZX->GetSeq1Length(); + int lengthY = matZY->GetSeq2Length(); + + // for every z[k] + for (int k = 1; k <= lengthZ; k++) { + SafeVector::iterator ZXptr = matZX->GetRowPtr(k); + SafeVector::iterator ZXend = ZXptr + matZX->GetRowSize(k); + + // iterate through all z[k]-x[i] + while (ZXptr != ZXend) { + SafeVector::iterator ZYptr = matZY->GetRowPtr(k); + SafeVector::iterator ZYend = ZYptr + matZY->GetRowSize(k); + const float ZXval = ZXptr->second; + VF::iterator base = posterior.begin() + + ZXptr->first * (lengthY + 1); + + // iterate through all z[k]-y[j] + while (ZYptr != ZYend) { + base[ZYptr->first] += weight * ZXval * ZYptr->second; + ZYptr++; + } + ZXptr++; + } + } +} +///////////////////////////////////////////////////////////////// +// DoIterativeRefinement() +// +// Performs a single round of randomized partionining iterative +// refinement. +///////////////////////////////////////////////////////////////// + +int MSA::GenRandom(int m, int seed, bool init) { + static const int a = 5, b = 3, n = 7; + static int rand0; + if (init == true) { + rand0 = seed; + } + m *= 19; + int rand1; + for (int i = 0; i < n; i++) { + rand1 = (a * rand0 + b) % m; + rand0 = rand1; + } + return rand1; +} + +void MSA::DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, int si) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + int index = GenRandom(numSeqs, si, true); + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + index = GenRandom(numSeqs, si); + if (index % 2) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} +void MSA::DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex) { + set groupOne, groupTwo; + int numSeqs = alignment->GetNumSequences(); + + vector inGroup1; + inGroup1.resize(numSeqs); + for (int i = 0; i < numSeqs; i++) { + inGroup1[i] = false; + } + + AlignmentOrder* orders = this->tree->getAlignOrders(); + AlignmentOrder* order = &orders[nodeIndex]; + for (int i = 0; i < order->leftNum; i++) { + int si = order->leftLeafs[i]; + inGroup1[si] = true; + } + for (int i = 0; i < order->rightNum; i++) { + int si = order->rightLeafs[i]; + inGroup1[si] = true; + } + // create two separate groups + for (int i = 0; i < numSeqs; i++) { + if (inGroup1[i]) { + groupOne.insert(i); + } else { + groupTwo.insert(i); + } + } + if (groupOne.empty() || groupTwo.empty()) + return; + + // project into the two groups + MultiSequence *groupOneSeqs = alignment->Project(groupOne); + assert(groupOneSeqs); + MultiSequence *groupTwoSeqs = alignment->Project(groupTwo); + assert(groupTwoSeqs); + delete alignment; + + // realign + alignment = AlignAlignments(groupOneSeqs, groupTwoSeqs, sparseMatrices, + model); + + delete groupOneSeqs; + delete groupTwoSeqs; +} + +///////////////////////////////////////////////////////////////// +// WriteAnnotation() +// +// Computes annotation for multiple alignment and write values +// to a file. +///////////////////////////////////////////////////////////////// + +void MSA::WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices) { + ofstream outfile(annotationFilename.c_str()); + + if (outfile.fail()) { + cerr << "ERROR: Unable to write annotation file." << endl; + exit(1); + } + + const int alignLength = alignment->GetSequence(0)->GetLength(); + const int numSeqs = alignment->GetNumSequences(); + + SafeVector position(numSeqs, 0); + SafeVector::iterator> seqs(numSeqs); + for (int i = 0; i < numSeqs; i++) + seqs[i] = alignment->GetSequence(i)->GetDataPtr(); + SafeVector > active; + active.reserve(numSeqs); + + SafeVector lab; + for (int i = 0; i < numSeqs; i++) + lab.push_back(alignment->GetSequence(i)->GetSortLabel()); + + // for every column + for (int i = 1; i <= alignLength; i++) { + + // find all aligned residues in this particular column + active.clear(); + for (int j = 0; j < numSeqs; j++) { + if (seqs[j][i] != '-') { + active.push_back(make_pair(lab[j], ++position[j])); + } + } + + sort(active.begin(), active.end()); + outfile << setw(4) << ComputeScore(active, sparseMatrices) << endl; + } + + outfile.close(); +} + +///////////////////////////////////////////////////////////////// +// ComputeScore() +// +// Computes the annotation score for a particular column. +///////////////////////////////////////////////////////////////// + +int MSA::ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices) { + + if (active.size() <= 1) + return 0; + + // ALTERNATIVE #1: Compute the average alignment score. + + float val = 0; + for (int i = 0; i < (int) active.size(); i++) { + for (int j = i + 1; j < (int) active.size(); j++) { + val += sparseMatrices[active[i].first][active[j].first]->GetValue( + active[i].second, active[j].second); + } + } + + return (int) (200 * val / ((int) active.size() * ((int) active.size() - 1))); + +} diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.h new file mode 100644 index 0000000..9d4ef7c --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSA.h @@ -0,0 +1,100 @@ +#ifndef _MSA_H +#define _MSA_H +#include "MSADef.h" +#include "MSAGuideTree.h" + +#include "SafeVector.h" +#include "MultiSequence.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "SparseMatrix.h" +#include +using namespace std; + +class MSAGuideTree; +struct TreeNode; +class MSA { +public: + MSA(int argc, char* argv[]); + ~MSA(); + + static void getSysTime(double * dtime); + MSAGuideTree* getGuideTree() { + return tree; + } + int * getSeqsWeights() { + return seqsWeights; + } +private: + //print usage + void printUsage(); + //do multiple sequence alignment + void doAlign(); + + //for sequence weights + void createSeqsWeights(int seqsNum); + void releaseSeqsWeights(); + + //weights of sequences + int * seqsWeights; + //guide tree + MSAGuideTree* tree; + //output file + string alignOutFileName; + std::ostream* alignOutFile; +private: + SafeVector ParseParams(int argc, char *argv[]); + void PrintParameters(const char *message, const VF &initDistrib, + const VF &gapOpen, const VF &gapExtend, const VVF &emitPairs, + const VF &emitSingle, const char *filename); + + SafeVector PostProbsParseParams(int argc, char **argv); + MultiSequence *doAlign(MultiSequence *sequence, + const ProbabilisticModel &model, VF &initDistrib, VF &gapOpen, + VF &gapExtend, VVF &emitPairs, VF &emitSingle); + void ReadParameters(); + MultiSequence* ProcessTree(TreeNode *tree, MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); + MultiSequence *ComputeFinalAlignment(MSAGuideTree *tree, + MultiSequence *sequences, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); + MultiSequence *AlignAlignments(MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model); + SafeVector > DoRelaxation(float* seqsWeights, + MultiSequence *sequences, + SafeVector > &sparseMatrices); + void Relax(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior); + void Relax1(float weight, SparseMatrix *matXZ, SparseMatrix *matZY, + VF &posterior); + + int GenRandom(int m, int seed, bool init = false); + void DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, int si); + void DoIterativeRefinement( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment); + void DoIterativeRefinementTreeNode( + const SafeVector > &sparseMatrices, + const ProbabilisticModel &model, MultiSequence* &alignment, + int nodeIndex); + void WriteAnnotation(MultiSequence *alignment, + const SafeVector > &sparseMatrices); + int ComputeScore(const SafeVector > &active, + const SafeVector > &sparseMatrices); +#ifdef _OPENMP + //private struct + struct SeqsPair { + int seq1; + int seq2; + }; + int numPairs; + SeqsPair* seqsPairs; +#endif +}; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.cpp b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.cpp new file mode 100644 index 0000000..a95efe0 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.cpp @@ -0,0 +1,151 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include "MSAClusterTree.h" +MSAClusterTree::MSAClusterTree(MSA* msa, VVF& distMatrix, int numSeqs) : + MSAGuideTree(msa, distMatrix, numSeqs) { +} +MSAClusterTree::~MSAClusterTree() { +} +void MSAClusterTree::create() { + //generate the neighbor-joining tree + this->generateClusterTree(); + + //calculate sequence weights + this->getSeqsWeights(); + + //construct the alignment orders + this->createAlignmentOrders(); +} +void MSAClusterTree::generateClusterTree() { + int i; + ValidNode* validNodes, *headValidNodes; + ValidNode* miniPtr, *minjPtr, *ivalid, *jvalid; + int mini, minj; + float* joins; + unsigned int* clusterLeafs; + + //initialize the valid nodes link list + validNodes = new ValidNode[leafsNum + 1]; + joins = new float[leafsNum + 1]; + clusterLeafs = new unsigned int[nodesNum + 1]; + if (!validNodes || !joins || !clusterLeafs) { + cerr << "Out of memory of the reconstruction of cluster tree" << endl; + } + //initialize cluster size + for (i = 0; i < this->leafsNum; i++) { + clusterLeafs[i] = 1; + } + + headValidNodes = &validNodes[0]; + headValidNodes->next = &validNodes[1]; + headValidNodes->n = -1; + headValidNodes->node = -1; + headValidNodes->prev = NULL; + + //build an initial link list + ValidNode* curr = &validNodes[1]; + ValidNode* prev = headValidNodes; + ValidNode* next = &validNodes[2]; + for (i = 0; i < leafsNum; i++) { + curr->n = i; + curr->node = i; + curr->prev = prev; + curr->next = next; + prev = curr; + curr = next; + next++; + } + prev->next = NULL; + + //to generate the cluster tree + int nodeIdx; //the index of an internal node + int firstNode = leafsNum; //the index of the first internal node + int lastNode = firstNode + leafsNum - 1;//the index of the last internal node + + for (nodeIdx = firstNode; nodeIdx < lastNode; nodeIdx++) { + //find closest pair of clusters + float minDist = 2.0f; + miniPtr = headValidNodes; + minjPtr = headValidNodes; + + for (ivalid = headValidNodes->next; ivalid != NULL; + ivalid = ivalid->next) { + mini = ivalid->n; + for (jvalid = headValidNodes->next; + jvalid != NULL && jvalid->n < mini; jvalid = jvalid->next) { + minj = jvalid->n; + float dist = (*distMatrix)[mini][minj]; + if (dist < 0) { + cerr + << "ERROR: It is impossible to have distance value less than zero" + << endl; + dist = 0; + } + if (dist < minDist) { + minDist = dist; + miniPtr = ivalid; + minjPtr = jvalid; + } + //printf("dist %g mini %d minj %d\n", dist, ivalid->node, jvalid->node); + } + } + //printf("**** mini %d minj %d minDist %g *****\n", miniPtr->node, minjPtr->node, minDist); + //check the validity of miniPtr and minjPtr; + if (miniPtr == headValidNodes || minjPtr == headValidNodes) { + cerr << "OOPS: Error occurred while constructing the cluster tree\n" + << endl; + exit(-1); + } + //computing branch length and join the two nodes + float branchLength = minDist * 0.5f; + this->connectNodes(&nodes[nodeIdx], nodeIdx, &nodes[miniPtr->node], + branchLength, &nodes[minjPtr->node], branchLength); + clusterLeafs[nodeIdx] = clusterLeafs[miniPtr->node] + + clusterLeafs[minjPtr->node]; + + //remove the valid node minjPtr from the list + minjPtr->prev->next = minjPtr->next; + if (minjPtr->next != NULL) { + minjPtr->next->prev = minjPtr->prev; + } + minjPtr->prev = minjPtr->next = NULL; + + //compute the distance of each remaining valid node to the new node + for (ivalid = headValidNodes->next; ivalid != NULL; + ivalid = ivalid->next) { + int idx = ivalid->n; + + float idist = (*distMatrix)[miniPtr->n][idx]; + float jdist = (*distMatrix)[minjPtr->n][idx]; + + unsigned int isize = clusterLeafs[miniPtr->node]; + unsigned int jsize = clusterLeafs[minjPtr->node]; + joins[idx] = (idist * isize + jdist * jsize) / (isize + jsize); + } + //update the distance to the new node + miniPtr->node = nodeIdx; + mini = miniPtr->n; + for (jvalid = headValidNodes->next; jvalid != NULL; + jvalid = jvalid->next) { + minj = jvalid->n; + + float dist = joins[minj]; + (*distMatrix)[mini][minj] = dist; + (*distMatrix)[minj][mini] = dist; + } + } + //add a pseudo root to this unrooted NJ tree + this->root = &nodes[lastNode - 1]; + + delete[] validNodes; + delete[] joins; + delete[] clusterLeafs; +} diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.h new file mode 100644 index 0000000..30bce05 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAClusterTree.h @@ -0,0 +1,27 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#ifndef _MSA_CLUSTER_TREE_H +#define _MSA_CLUSTER_TREE_H + +#include "MSAGuideTree.h" + +class MSAClusterTree: public MSAGuideTree { +public: + MSAClusterTree(MSA* msa, VVF& distMatrix, int numSeqs); + ~MSAClusterTree(); + + //construct the cluster tree + void create(); +private: + //generate the cluster tree + void generateClusterTree(); +}; +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSADef.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSADef.h new file mode 100644 index 0000000..6a3d178 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSADef.h @@ -0,0 +1,26 @@ +#ifndef _MSA_DEF_H +#define _MSA_DEF_H +#include +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +//maximum number +#define MAX_INT_NUM 0x7FFFFFFF +#define MAX_FLOAT_NUM FLT_MAX +#define INT_MULTIPLY 1000 + +#define SUBMATRIX_INT_SCALE 100 + +//a tree node is a leaf or a node +enum { + NONE, NODE, LEAF +}; + +#endif + diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.cpp b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.cpp new file mode 100644 index 0000000..207d25b --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.cpp @@ -0,0 +1,327 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ +#include "MSAGuideTree.h" +#include "MSA.h" +MSAGuideTree::MSAGuideTree(MSA* msa, VVF& distances, int numSeqs) { + int i; + TreeNode* node; + //system configuration + this->msa = msa; + this->distMatrix = &distances; + this->numSeqs = numSeqs; + this->seqsWeights = msa->getSeqsWeights(); + + //tree structure + this->nodesSize = this->numSeqs * 2 + 1; + this->nodes = new TreeNode[this->nodesSize]; + if (!this->nodes) { + cerr << "TreeNodes memory allocation failed" << endl; + exit(-1); + } + //initialize all the tree nodes + this->leafs = this->nodes; + this->leafsNum = this->numSeqs; + this->nodesNum = 2 * this->leafsNum - 1; + for (i = 0; i < this->nodesSize; i++) { + node = &nodes[i]; + node->left = 0; + node->right = 0; + node->parent = 0; + node->leftIdx = -1; + node->rightIdx = -1; + node->parentIdx = -1; + node->idx = -1; + node->dist = 0; + node->leaf = NODE; //setted to be NODE, by default + node->order = 0; + node->depth = 0; + } + //initialize the leaf nodes + for (i = 0; i < this->leafsNum; i++) { + node = &this->leafs[i]; + node->idx = i; + node->leaf = LEAF; + } +} +MSAGuideTree::~MSAGuideTree() { + //release tree nodes + delete[] this->nodes; + + //release alignment orders + releaseAlignmentOrders(); + +} +//get the tree nodes +TreeNode* MSAGuideTree::getNodes() { + return nodes; +} +//get the leaf nodes +TreeNode* MSAGuideTree::getLeafs() { + return leafs; +} +//get the number of nodes; +int MSAGuideTree::getNodesNum() { + return nodesNum; +} +//get the number of leaf nodes +int MSAGuideTree::getLeafsNum() { + return leafsNum; +} +//get the alignment orders +AlignmentOrder* MSAGuideTree::getAlignOrders() { + return alignOrders; +} +int MSAGuideTree::getAlignOrdersNum() { + return alignOrdersNum; +} +/**************************************************** + create the evolutionary relationship + ****************************************************/ +void MSAGuideTree::connectNodes(TreeNode* parent, int parentIdx, + TreeNode* leftChild, float leftDist, TreeNode* rightChild, + float rightDist) { + //save the parents index for each child + leftChild->parent = parent; + leftChild->parentIdx = parentIdx; + rightChild->parent = parent; + rightChild->parentIdx = parentIdx; + + //save the branch lengths (i.e. distance) from each child to its parent + leftChild->dist = leftDist; + rightChild->dist = rightDist; + + //save the indices of itself and its children for this new tree node + parent->idx = parentIdx; + parent->left = leftChild; + parent->leftIdx = leftChild->idx; + parent->right = rightChild; + parent->rightIdx = rightChild->idx; +} +/***************************************** + compute the alignment order of the phylogentic tree + *****************************************/ +void MSAGuideTree::createAlignmentOrders() { + int i; + + AlignmentOrder* order; + //allocate memory space for alignment orders vector + this->alignOrdersNum = 0;//for alignment orders, it starts from 1 instead of 0 + this->alignOrdersSize = numSeqs;//the number of internal nodes of the phylogentic tree + 1 + this->alignOrders = new AlignmentOrder[this->alignOrdersSize]; + if (!this->alignOrders) { + cerr << "OOPS: Alignment orders memory allocation failed" << endl; + exit(-1); + } + //initialize the alignment orders vector + for (i = 0; i < this->alignOrdersSize; i++) { + order = &this->alignOrders[i]; + order->leftOrder = 0; + order->rightOrder = 0; + order->leftLeafs = 0; + order->leftNum = 0; + order->rightLeafs = 0; + order->rightNum = 0; + } + //starting out constructing the alignment orders + int subLeafsNum; + int nodeDepth = 1; + int subOrder = recursiveCreateAlignmentOrders(this->root, 0, subLeafsNum, + nodeDepth); + + //check whether the function works well + if (subLeafsNum != numSeqs || this->alignOrdersNum != subOrder) { + fprintf(stderr, + "The alignment orders constructed were wrong (subLeafsNum %d, alignOrdersNum %d, subOrder %d)\n", + subLeafsNum, alignOrdersNum, subOrder); + } + +} +int MSAGuideTree::recursiveCreateAlignmentOrders(TreeNode* subRoot, + int* subLeafs, int& subLeafsNum, int nodeDepth) { + int leftNum, rightNum; + int leftOrder, rightOrder; + int* leftLeafs, *rightLeafs; + + if (subRoot->leaf == LEAF) { + subLeafs[0] = subRoot->idx; + subLeafsNum = 1; + + return 0; //if it is a leaf, return the index 0 + } + leftOrder = rightOrder = 0; + leftNum = rightNum = 0; + leftLeafs = new int[numSeqs]; + rightLeafs = new int[numSeqs]; + + //check the left subtree + if (subRoot->left) { + //recursively tranverse the left subtree + leftOrder = recursiveCreateAlignmentOrders(subRoot->left, leftLeafs, + leftNum, nodeDepth + 1); + } + //check the right subtree + if (subRoot->right) { + rightOrder = recursiveCreateAlignmentOrders(subRoot->right, rightLeafs, + rightNum, nodeDepth + 1); + } + //save the leafs in the left and right subtrees of the current subtree + if (this->alignOrdersNum > this->alignOrdersSize) { + fprintf(stderr, "the alignment order function works bad\n");\ + exit(-1); + } + + AlignmentOrder* order = &this->alignOrders[++this->alignOrdersNum]; + order->nodeDepth = nodeDepth; + order->leftOrder = leftOrder; + order->rightOrder = rightOrder; + order->leftNum = leftNum; + order->rightNum = rightNum; + order->leftLeafs = new int[order->leftNum]; + order->rightLeafs = new int[order->rightNum]; + if (!order->leftLeafs || !order->rightLeafs) { + fprintf(stderr, + "memory allocation failed while recursively constructing alignment orders\n"); + exit(-1); + } + memcpy(order->leftLeafs, leftLeafs, order->leftNum * sizeof(int)); + memcpy(order->rightLeafs, rightLeafs, order->rightNum * sizeof(int)); + + delete[] leftLeafs; + delete[] rightLeafs; + + //for the root of the tree, subLeafs buffer is set to 0 + if (subLeafs) { + //copy the results to the parent tree node + memcpy(subLeafs, order->leftLeafs, order->leftNum * sizeof(int)); + memcpy(subLeafs + order->leftNum, order->rightLeafs, + order->rightNum * sizeof(int)); + } + //compute the total number of leafs in this subtree + subLeafsNum = order->leftNum + order->rightNum; + + return this->alignOrdersNum;//return the index of itself, starting from 1, instead of 0 +} +void MSAGuideTree::releaseAlignmentOrders() { + if (!this->alignOrders) { + return; + } + for (int i = 0; i < this->alignOrdersNum; i++) { + AlignmentOrder* order = &this->alignOrders[i]; + if (order->leftLeafs) { + delete[] order->leftLeafs; + } + if (order->rightLeafs) { + delete[] order->rightLeafs; + } + } + delete[] alignOrders; +} +/******************************** + display the alignment orders + ********************************/ +void MSAGuideTree::displayAlignmentOrders() { + int i, j; + AlignmentOrder* order; + fprintf(stderr, "************DISPLAY ALIGNMENT ORDER***************\n"); + for (i = 1; i <= this->alignOrdersNum; i++) { + order = &this->alignOrders[i]; + + fprintf(stderr, "GROUP (%d depth %d):\n---LEFT ORDER: %d\n", i, + order->nodeDepth, order->leftOrder); + fprintf(stderr, "---LEFT: "); + for (j = 0; j < order->leftNum; j++) { + fprintf(stderr, "%d ", order->leftLeafs[j]); + } + + fprintf(stderr, "\n---RIGHT ORDER: %d\n", order->rightOrder); + fprintf(stderr, "\n---RIGHT: "); + for (j = 0; j < order->rightNum; j++) { + fprintf(stderr, "%d ", order->rightLeafs[j]); + } + fprintf(stderr, "\n"); + } + fprintf(stderr, "*******************************************\n"); +} +/********************************* + display the tree + *********************************/ +void MSAGuideTree::displayTree() { + fprintf(stderr, "**************DISPLAY TREE*********************\n"); + for (int i = 0; i < nodesNum; i++) { + TreeNode* node = &nodes[i]; + + fprintf(stderr, + "%d(%p): left(%p) %d, right(%p) %d, parent(%p) %d, dist %f\n", + (node == &nodes[node->idx]) ? node->idx : -2, node, node->left, + (!node->left || node->left == &nodes[node->leftIdx]) ? + node->leftIdx : -2, node->right, + (!node->right || node->right == &nodes[node->rightIdx]) ? + node->rightIdx : -2, node->parent, + (!node->parent || node->parent == &nodes[node->parentIdx]) ? + node->parentIdx : -2, node->dist); + } + fprintf(stderr, "*******************************************\n"); +} +/********************************* + compute the sequence weights + *********************************/ +void MSAGuideTree::getSeqsWeights() { + int i; + TreeNode* curr; + + //compute the order of each node, which represents the number of leaf nodes in the substree rooting from it. + for (i = 0; i < leafsNum; i++) { + //for each leaf nodes + curr = &this->leafs[i]; + while (curr != 0) { + curr->order++; + + curr = curr->parent; + } + } + //compute the weight of each sequence, which corresponds to a leaf node + for (i = 0; i < numSeqs; i++) { + //compute the weight of each sequence + float weights = 0; + curr = &this->leafs[i]; + while (curr->parent != 0) { + weights += curr->dist / curr->order; + curr = curr->parent; + //printf("order:%d weights: %f\n", curr->order, weights); + } + //save the weight of this sequence + seqsWeights[i] = (int) (100 * weights); + //printf("%d\n", seqsWeights[i]); + } + //normalize the weights + int wsum = 0; + for (i = 0; i < numSeqs; i++) { + wsum += seqsWeights[i]; + } + if (wsum == 0) { + //in this case, every sequence is assumed to have an identical weight + for (i = 0; i < numSeqs; i++) { + seqsWeights[i] = 1; + } + wsum = numSeqs; + } + //printf("wsum:%d \n", wsum); + for (i = 0; i < numSeqs; i++) { + seqsWeights[i] = (seqsWeights[i] * INT_MULTIPLY) / wsum; + if (seqsWeights[i] < 1) { + seqsWeights[i] = 1; + } + //printf("%d \n", seqsWeights[i]); + } +} +void MSAGuideTree::create() { + //do nothing +} + diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.h new file mode 100644 index 0000000..97d538a --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAGuideTree.h @@ -0,0 +1,119 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#ifndef _MSA_GUIDE_TREE_H +#define _MSA_GUIDE_TREE_H +#include "MSADef.h" +#include "MSA.h" + +#include "SafeVector.h" +#include "MultiSequence.h" +#include "ScoreType.h" +#include "ProbabilisticModel.h" +#include "SparseMatrix.h" + +class MSA; +struct ValidNode { + ValidNode* prev; + ValidNode* next; + int n; //the index in the distance matrix + int node; //the index in the tree node entries +}; + +struct TreeNode { + struct TreeNode *left; //the pointer to its left child + struct TreeNode *right; //the pointer to its right child + struct TreeNode *parent; //the pointer to its parent + int leftIdx; //the index of the left child + int rightIdx; //the index of the right child + int parentIdx; //the index of its parent + int idx; //the index of itself + float dist; //the distance to its parent + int leaf; //whether it is a leaf node or not + int order; //the number of generations dating back to its ancestor + int depth; //the depth of the node +}; +struct AlignmentOrder { + int nodeDepth; //the depth of the internal node + int leftOrder; //the order number of the right child + int rightOrder; //the order number of the left child + int* leftLeafs; //the indices of leafs in the left subtree + int leftNum; //the number of leafs in the left subtree + int* rightLeafs; //the indices of leafs in the right subtree + int rightNum; //the number of leafs in the right substree +}; + +class MSAGuideTree { +public: + MSAGuideTree(MSA* msa, VVF& distMatrix, int numSeqs); + virtual ~MSAGuideTree() = 0; //abstract class + + //get the tree nodes + TreeNode* getNodes(); + //get the leaf nodes + TreeNode* getLeafs(); + //get the number of nodes; + int getNodesNum(); + //get the number of leaf nodes + int getLeafsNum(); + //get the root of the tree + TreeNode* getRoot() { + return this->root; + } + //get the alignment orders + AlignmentOrder* getAlignOrders(); + int getAlignOrdersNum(); + //construct the alignment orders + void createAlignmentOrders(); + + //construct the guide tree + virtual void create(); + //calculate the sequence weights + virtual void getSeqsWeights(); + + /**********DEBUGING****************/ + //display the tree + void displayTree(); + //display the alignment orders + void displayAlignmentOrders(); + +protected: + //join two nodes + void connectNodes(TreeNode* parent, int parentIdx, TreeNode* leftChild, + float leftDist, TreeNode* rightChild, float rightDist); + //release the alignment orders vector + void releaseAlignmentOrders(); + //recursive implemenation of constructing the alignment orders + int recursiveCreateAlignmentOrders(TreeNode* subRoot, int* subLeafs, + int& subLeafsNum, int nodeDepth); + + //system configurations + MSA* msa; + VVF* distMatrix; + int numSeqs; + int* seqsWeights; + + //all the tree nodes + TreeNode* nodes; + int nodesNum; + int nodesSize; + //the root tree node + TreeNode* root; + //leaf node + TreeNode* leafs; + int leafsNum; + + //alignment order + AlignmentOrder* alignOrders; + int alignOrdersNum; + int alignOrdersSize; +}; +#endif + diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAPartProbs.cpp b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAPartProbs.cpp new file mode 100644 index 0000000..f9c3f25 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAPartProbs.cpp @@ -0,0 +1,728 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ +#include "SafeVector.h" +#include +#include +#include +#include +#include +#include +#include +#include +#define TRACE 0 // 0: NOTRACE 1: TRACE +//proba like settings +#define endgaps 1 // 1: engap penaties enabled 0: disabled +#define PART_FULL_MEMORY 0 //0: LOW MEM OPTION +#define REVPART_FULL_MEMORY 0 //0: LOW MEM OPTION +using namespace std; + +#ifdef _WIN32 +#define OS_HUGE_VALL HUGE_VAL +#else +#define OS_HUGE_VALL HUGE_VALL +#endif + +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +typedef struct sequence { + char *title; + char *text; + int length; +} fasta; + +typedef struct alignment { + char *title; + char *text; + int length; +} align; + +//////////////////////////////////////////////////////// +//externs related to scoring matrix and input arguments +/////////////////////////////////////////////////////////// +extern float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +extern char aminos[26], matrixtype[20], bases[26]; + +extern double sub_matrix[26][26]; +extern int subst_index[26]; + +extern float TEMPERATURE; +extern int MATRIXTYPE; + +extern float GAPOPEN; +extern float GAPEXT; +extern argument_decl argument; + +////////////////////////////////////////////////////////////////////////////// +//calculates reverse partition function values based on z matrices +//and also simulaneously calculates the propability of each basepair +//or aminoacid residue pair i,j +////////////////////////////////////////////////////////////////////////////// + +VF *revers_partf(fasta sequences[2], const double termgapopen, + const double termgapextend, long double **Zfm, const double d, + const double e) { + // printf("revpart\n"); + //rest of the declarations + int i, j; + long double **Zm = NULL; + long double **Ze = NULL; + long double **Zf = NULL; + int len0, len1; + float probability; + long double tempvar; + int Si, Tj; + double endgapopen, endgapextend; + FILE *fo; + + //Init lengths of sequences + len0 = strlen(sequences[0].text); + len1 = strlen(sequences[1].text); + + //Safe vector declared + VF *posteriorPtr = new VF((len0 + 1) * (len1 + 1)); + VF & posterior = *posteriorPtr; + VF::iterator ptr = posterior.begin(); + + if (TRACE) //open the trace file + fo = fopen("revpartdump", "a"); + + //default: + endgapopen = termgapopen; + endgapextend = termgapextend; + + //instantiate the z matrix + if (REVPART_FULL_MEMORY) { + + Ze = new long double *[sequences[1].length + 1]; + Zf = new long double *[sequences[1].length + 1]; + Zm = new long double *[sequences[1].length + 1]; + + if (TRACE) + printf("\n\n %e %e\n", d, e); + + //DYNAMICALLY GROW 2D Zm Zf Ze MARICES (long double) + for (i = 0; i <= sequences[1].length; i++) { + Ze[i] = new long double[sequences[0].length + 1]; + Zf[i] = new long double[sequences[0].length + 1]; + Zm[i] = new long double[sequences[0].length + 1]; + } + } else { + Zm = new long double *[2]; + Ze = new long double *[2]; + Zf = new long double *[2]; + for (i = 0; i <= 1; i++) { + Zm[i] = new long double[sequences[0].length + 1]; + Ze[i] = new long double[sequences[0].length + 1]; + Zf[i] = new long double[sequences[0].length + 1]; + } + + } + + if (TRACE) { + printf("in rev partf---"); + printf("\n\n"); + } + + if (REVPART_FULL_MEMORY) { + for (i = 0; i <= len1; i++) + for (j = 0; j <= len0; j++) { + Zm[i][j] = 0.0; + Zf[i][j] = 0.0; + Ze[i][j] = 0.0; + } + } else { + + for (j = 0; j <= len0; j++) { + Zm[0][j] = 0; + Zf[0][j] = 0; + Ze[0][j] = 0; + Zf[1][j] = 0; + Ze[1][j] = 0; + Zm[1][j] = 0; + } + } + + //fill the probability matrix with 0s + for (i = 0; i <= len1; i++) + for (j = 0; j <= len0; j++) + ptr[j * (len1 + 1) + i] = 0; + + if (endgaps == 0) { + Zm[len1][len0] = 1; + Ze[len1][len0] = Zf[len1][len0] = 0; + Zf[len1 - 1][len0] = Zm[len1][len0] * d; + Ze[len1][len0 - 1] = Zm[len1][len0] * d; + + //>=2ND ROW INIT + if (REVPART_FULL_MEMORY) { + for (i = len1 - 2; i >= 0; i--) { + Zf[i][len0] = Zf[i + 1][len0] * e; + } + } + + //>=2ND COL INIT + if (REVPART_FULL_MEMORY) { + for (j = len0 - 2; j >= 0; j--) { + Ze[len1][j] = Ze[len1][j + 1] * e; + } + } else { + for (j = len0 - 2; j >= 0; j--) { + Ze[0][j] = Ze[0][j + 1] * e; + } + } + } else { + + if (REVPART_FULL_MEMORY) { + + Zm[len1][len0] = 1; + Ze[len1][len0] = Zf[len1][len0] = 0; + Zf[len1 - 1][len0] = Zm[len1][len0] * endgapopen; + Ze[len1][len0 - 1] = Zm[len1][len0] * endgapopen; + + //>=2ND ROW INIT + for (i = len1 - 2; i >= 0; i--) { + Zf[i][len0] = Zf[i + 1][len0] * endgapextend; + } + + //M Iy= d+j*e + + //>=2ND COL INIT + for (j = len0 - 2; j >= 0; j--) { + Ze[len1][j] = Ze[len1][j + 1] * endgapextend; + } + + } else { + //in Zm + //let: + // Zm(0) be the current row being filled/computed + // Zm(1) be the previous row + + Zm[1][len0] = 1; + Ze[0][len0] = Zf[0][len0] = 0; + Zf[1][len0] = Zm[1][len0] * endgapopen; + Ze[0][len0 - 1] = Zm[1][len0] * endgapopen; + + //>=2ND COL INIT + for (j = len0 - 2; j >= 0; j--) { + Ze[0][j] = Ze[0][j + 1] * endgapextend; + } + + } //END ELSE + + } //END FULL MEMORY and GAP enablement IF STATEMENT + + double scorez, zz = 0; + + for (i = len1 - 1; i >= 0; i--) { + + for (j = len0 - 1; j >= 0; j--) { + Si = subst_index[sequences[1].text[i] - 'A']; + Tj = subst_index[sequences[0].text[j] - 'A']; + scorez = sub_matrix[Si][Tj]; + + //endgaps modification aug 10 + double open0, extend0, open1, extend1; + + open0 = open1 = d; + extend0 = extend1 = e; + + if (endgaps == 1) { + + //check to see if one of the 2 sequences or both reach the end + + if (i == 0) { + open0 = endgapopen; + extend0 = endgapextend; + + } + + if (j == 0) { + open1 = endgapopen; + extend1 = endgapextend; + } + + } + + if (REVPART_FULL_MEMORY) { + //z computation + + Ze[i][j] = Zm[i][j + 1] * open0 + Ze[i][j + 1] * extend0; + Zf[i][j] = Zm[i + 1][j] * open1 + Zf[i + 1][j] * extend1; + Zm[i][j] = (Zm[i + 1][j + 1] + Zf[i + 1][j + 1] + + Ze[i + 1][j + 1]) * scorez; + zz = Zm[i][j] + Zf[i][j] + Ze[i][j]; + + } else { + + //2 ROW zE zF ALGORITHM GOES...: + //Ze[1][j] =Zm[i][j + 1] * exp(beta * open0) + Ze[1][j + 1] *exp(beta * extend0); + //Zf[1][j] = Zm[i + 1][j] * exp(beta * open1) + Zf[0][j] * exp(beta * extend1); + //Zm[i][j] = (Zm[i + 1][j + 1] + Zf[0][j + 1] + Ze[0][j + 1]) * exp(beta * scorez); + //zz = Zm[0][j] + Zf[1][j] + Ze[1][j]; + + //lowmem code for merging probability calculating module + //Here we make use of Zm as a 2 row matrix + + Zf[1][j] = Zm[1][j] * open1 + Zf[0][j] * extend1; + Ze[1][j] = Zm[0][j + 1] * open0 + Ze[1][j + 1] * extend0; + Zm[0][j] = (Zm[1][j + 1] + Zf[0][j + 1] + Ze[0][j + 1]) + * scorez; + + tempvar = Zfm[i + 1][j + 1] * Zm[0][j]; + //divide P(i,j) i.e. pairwise probability by denominator + tempvar /= (scorez * Zfm[0][0]); + probability = (float) tempvar; + + //store only noticable probabilities + if (probability <= 1 && probability >= 0.001) { + //algorithm goes... + //validprob[i + 1][j + 1] = probability; + ptr[(j + 1) * (len1 + 1) + (i + 1)] = probability; + } + //lowmem code ends here + + } + + } //end of for + + if (REVPART_FULL_MEMORY == 0) { + for (int t = 0; t <= sequences[0].length; t++) { + Ze[0][t] = Ze[1][t]; + Ze[1][t] = 0; + + Zf[0][t] = Zf[1][t]; + Zf[1][t] = 0; + + Zm[1][t] = Zm[0][t]; + Zm[0][t] = 0; + + } + Zf[0][len0] = 1; + + } + + } //end of for + + if (TRACE) { + printf("\n\nrM:....\n\n"); + if (REVPART_FULL_MEMORY) { + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) + printf("%.2Le ", Zm[i][j]); + printf("\n"); + } + + printf("\n\nrE:....\n\n"); + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) + printf("%.2Le ", Ze[i][j]); + printf("\n"); + + } + + printf("\n\nrF:....\n\n"); + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) + printf("%.2Le ", Zf[i][j]); + printf("\n"); + + } + + } + + } + + if (TRACE) { + fprintf(fo, "\n"); + fclose(fo); + } + + //delete unused memory + + if (REVPART_FULL_MEMORY) { + for (i = 0; i <= len1; i++) { + delete (Zm[i]); + delete (Zf[i]); + delete (Ze[i]); + } + } else { + delete (Zf[0]); + delete (Ze[0]); + delete (Zm[0]); + + delete (Zm[1]); + delete (Zf[1]); + delete (Ze[1]); + } + + for (i = 0; i <= len1; i++) { + delete (Zfm[i]); + } + + if (Zf != NULL) + delete (Zf); + + if (Ze != NULL) + delete (Ze); + + if (Zm != NULL) + delete (Zm); + + if (Zfm != NULL) + delete (Zfm); + + posterior[0] = 0; + return (posteriorPtr); + +} + +////////////////////////////////////////////////////////////// +//forward partition function +///////////////////////////////////////////////////////////// + +long double **partf(fasta sequences[2], const double termgapopen, + const double termgapextend, const double d, const double e) { + //printf("partf\n"); + int i, j, len1, len0; + long double **Zm = NULL, **Zf = NULL, **Ze = NULL, zz = 0; + double endgapopen, endgapextend; + + //default: + endgapopen = termgapopen; + endgapextend = termgapextend; + + //the flag endgaps is set at the #define section + if (PART_FULL_MEMORY) { + + Zf = new long double *[sequences[1].length + 1]; + Ze = new long double *[sequences[1].length + 1]; + Zm = new long double *[sequences[1].length + 1]; + + //comment + if (TRACE) + printf("\nPARTF:====\n"); + + //DYNAMICALLY GROW 2D M,IX,IY,PIX,PIY MARICES + for (i = 0; i <= sequences[1].length; i++) { + Zf[i] = new long double[sequences[0].length + 1]; + Ze[i] = new long double[sequences[0].length + 1]; + Zm[i] = new long double[sequences[0].length + 1]; + } + } else { + Zm = new long double *[sequences[1].length + 1]; + Ze = new long double *[2]; + Zf = new long double *[2]; + for (i = 0; i <= sequences[1].length; i++) { + Zm[i] = new long double[sequences[0].length + 1]; + } + Ze[0] = new long double[sequences[0].length + 1]; + Zf[0] = new long double[sequences[0].length + 1]; + Ze[1] = new long double[sequences[0].length + 1]; + Zf[1] = new long double[sequences[0].length + 1]; + } + + len0 = strlen(sequences[0].text); + len1 = strlen(sequences[1].text); + + if (PART_FULL_MEMORY) { + for (i = 0; i <= sequences[1].length; i++) + for (j = 0; j <= sequences[0].length; j++) { + Zm[i][j] = 0.00; + Zf[i][j] = 0.00; + Ze[i][j] = 0.00; + } + } else { + for (i = 0; i <= len1; i++) { + for (j = 0; j <= len0; j++) { + Zm[i][j] = 0; + } + } + for (j = 0; j <= len0; j++) { + Zf[0][j] = 0; + Ze[0][j] = 0; + Zf[1][j] = 0; + Ze[1][j] = 0; + } + } + + //INTITIALIZE THE DP + + if (endgaps == 0) { + Zm[0][0] = 1.00; + + Zf[0][0] = Ze[0][0] = 0; + Zf[1][0] = Zm[0][0] * d; + Ze[0][1] = Zm[0][0] * d; + + //>=2ND ROW INIT + if (PART_FULL_MEMORY) { + for (i = 2; i <= sequences[1].length; i++) { + Zf[i][0] = Zf[i - 1][0] * e; + } + } + + //>=2ND COL INIT + for (j = 2; j <= sequences[0].length; j++) { + Ze[0][j] = Ze[0][j - 1] * e; + } + } else { + //init z + Zm[0][0] = 1.00; + Zf[0][0] = Ze[0][0] = 0; + Zf[1][0] = Zm[0][0] * endgapopen; + Ze[0][1] = Zm[0][0] * endgapopen; + + //>=2ND ROW INIT + if (PART_FULL_MEMORY) { + for (i = 2; i <= sequences[1].length; i++) { + Zf[i][0] = Zf[i - 1][0] * endgapextend; + } + } + + //>=2ND COL INIT + for (j = 2; j <= sequences[0].length; j++) { + Ze[0][j] = Ze[0][j - 1] * endgapextend; + } + } + + //1ST ROW/COL INIT + + int Si, Tj; + double score; + + for (i = 1; i <= sequences[1].length; i++) { + + for (j = 1; j <= sequences[0].length; j++) { + + Si = subst_index[sequences[1].text[i - 1] - 'A']; + Tj = subst_index[sequences[0].text[j - 1] - 'A']; + + score = sub_matrix[Si][Tj]; + + double open0, extend0, open1, extend1; + + open0 = open1 = d; + extend0 = extend1 = e; + + if (endgaps == 1) { + //check to see if one of the 2 sequences or both reach the end + + if (i == sequences[1].length) { + open0 = endgapopen; + extend0 = endgapextend; + + } + + if (j == sequences[0].length) { + open1 = endgapopen; + extend1 = endgapextend; + } + } + + // + //z computation using open and extend temp vars + //open0 is gap open in seq0 and open1 is gap open in seq1 + //entend0 is gap extend in seq0 and extend1 is gap extend in seq1 + + if (PART_FULL_MEMORY) { + Ze[i][j] = Zm[i][j - 1] * open0 + Ze[i][j - 1] * extend0; + + if (Ze[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Ze\n"); + exit(1); + } + + Zf[i][j] = Zm[i - 1][j] * open1 + Zf[i - 1][j] * extend1; + + if (Zf[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Zf\n"); + exit(1); + } + + Zm[i][j] = (Zm[i - 1][j - 1] + Ze[i - 1][j - 1] + + Zf[i - 1][j - 1]) * score; + + if (Zm[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for Zm\n"); + exit(1); + } + + zz = Zm[i][j] + Ze[i][j] + Zf[i][j]; + } else { + Ze[1][j] = Zm[i][j - 1] * open0 + Ze[1][j - 1] * extend0; + + if (Ze[1][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for zE\n"); + exit(1); + } + + Zf[1][j] = Zm[i - 1][j] * open1 + Zf[0][j] * extend1; + + if (Zf[1][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for zF\n"); + exit(1); + } + + Zm[i][j] = (Zm[i - 1][j - 1] + Ze[0][j - 1] + Zf[0][j - 1]) + * score; + + if (Zm[i][j] >= OS_HUGE_VALL) { + printf("ERROR: huge val error for zM\n"); + exit(1); + } + + zz = Zm[i][j] + Ze[1][j] + Zf[1][j]; + } + + } //end for + + if (!PART_FULL_MEMORY) { + for (int t = 0; t <= sequences[0].length; t++) { + Ze[0][t] = Ze[1][t]; + Ze[1][t] = 0; + + Zf[0][t] = Zf[1][t]; + Zf[1][t] = 0; + } + + Zf[1][0] = 1; + + } + + } //end for + + //store the sum of zm zf ze (m,n)s in zm's 0,0 th position + Zm[0][0] = zz; + + if (TRACE) { + //debug code aug 3 + //print the 3 Z matrices namely Zm Zf and Ze + + printf("\n\nFINAL Zm:\n"); + for (i = 0; i <= sequences[1].length; i++) { + for (j = 0; j <= sequences[0].length; j++) + printf("%.2Le ", Zm[i][j]); + printf("\n"); + } + + printf("FINAL Zf \n"); + for (i = 0; i <= sequences[1].length; i++) { + for (j = 0; j <= sequences[0].length; j++) + printf("%.2Le ", Zf[i][j]); + printf("\n"); + } + + printf("FINAL Ze \n"); + for (i = 0; i <= sequences[1].length; i++) { + for (j = 0; j <= sequences[0].length; j++) + printf("%.2Le ", Ze[i][j]); + printf("\n"); + } + + //end debug dump code + + } + + if (PART_FULL_MEMORY) { + for (i = 0; i <= sequences[1].length; i++) { + delete (Zf[i]); + delete (Ze[i]); + } + } else { + delete (Zf[0]); + delete (Ze[0]); + delete (Zf[1]); + delete (Ze[1]); + } + + delete (Zf); + delete (Ze); + + return Zm; + +} //end of forward partition function + +///////////////////////////////////////////////////////////////////////////////////////// +//entry point (was the main function) , returns the posterior probability safe vector +//////////////////////////////////////////////////////////////////////////////////////// +VF *ComputePostProbs(int a, int b, string seq1, string seq2) { + //printf("probamod\n"); + double gap_open = -22, gap_ext = -1, beta = 0.2;//T = 5, beta = 1/T = 0.2, by default + int stock_loop = 1; + int le = 160; + double termgapopen = 1.0f; //exp(0) + double termgapextend = 1.0f; //exp(0) + + //initialize the sequence structure + fasta sequences[2]; + + sequences[0].length = strlen((char *) seq1.c_str()); + sequences[0].text = (char *) seq1.c_str(); + sequences[0].title = new char[10]; + strcpy(sequences[0].title, "seq0"); + sequences[1].length = strlen((char *) seq2.c_str()); + sequences[1].text = (char *) seq2.c_str(); + sequences[1].title = new char[10]; + strcpy(sequences[1].title, "seq1"); + + if (TRACE) + + { + printf("%d %d %s\n%d %d %s\n--\n", a, sequences[0].length, + sequences[0].text, b, sequences[1].length, sequences[1].text); + printf("after init\n"); + + FILE *dump1 = fopen("dump1", "a"); + fprintf(dump1, "%d %d %s\n%d %d %s\n--\n", a, sequences[0].length, + sequences[0].text, b, sequences[1].length, sequences[1].text); + fclose(dump1); + } + + gap_open = argument.gapopen; + gap_ext = argument.gapext; + beta = argument.beta; + + stock_loop = argument.N; + le = argument.matrix; + + //compute the values of exp(beta * ?) + termgapopen = exp(beta * 0.0); + termgapextend = exp(beta * 0.0); + gap_open = exp(beta * gap_open); + gap_ext = exp(beta * gap_ext); + + if (TRACE) + printf("%f %f %f %d\n", gap_open, gap_ext, beta, le); + + //call for calculating the posterior probabilities + // 1. call partition function partf + // 2. calculate revpartition using revers_parf + // 3. calculate probabilities + /// MODIFICATION... POPULATE SAFE VECTOR + + long double **MAT1; + + MAT1 = partf(sequences, termgapopen, termgapextend, gap_open, gap_ext); + + return revers_partf(sequences, termgapopen, termgapextend, MAT1, gap_open, + gap_ext); + +} + +//end of posterior probability module diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj new file mode 100644 index 0000000..5212610 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj.STUDENT.LIUY0039.user b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj.STUDENT.LIUY0039.user new file mode 100644 index 0000000..99168da --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAProbs.vcproj.STUDENT.LIUY0039.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.cpp b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.cpp new file mode 100644 index 0000000..6ff0643 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.cpp @@ -0,0 +1,174 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ + +#include +#include +#include +#include +#include "MSAReadMatrix.h" + +#define TRACE 0 + +//////////////////////////////////////////////////////////// +// extern variables for scoring matrix data +//////////////////////////////////////////////////////////// +extern float g_gap_open1, g_gap_open2, g_gap_ext1, g_gap_ext2; +extern char *aminos, *bases, matrixtype[20]; +extern int subst_index[26]; + +extern double sub_matrix[26][26]; + +extern float TEMPERATURE; +extern int MATRIXTYPE; + +extern float GAPOPEN; +extern float GAPEXT; + +typedef struct { + char input[30]; + int matrix; + int N; + float T; + float beta; + char opt; //can be 'P' or 'M' + float gapopen; + float gapext; +} argument_decl; + +//argument support +extern argument_decl argument; + +///////////////////////////////////////////////////////// +//sets substitution matrix type +//////////////////////////////////////////////////////// +void setmatrixtype(int le) { + switch (le) { + case 160: + strcpy(matrixtype, "gonnet_160"); + break; + case 4: + strcpy(matrixtype, "nuc_simple"); + break; + default: + strcpy(matrixtype, "CUSTOM"); + break; + + }; + +} + +/////////////////////////////////////////////////////////////////// +//sets matrix flag +/////////////////////////////////////////////////////////////////// +inline int matrixtype_to_int() { + + if (!strcmp(matrixtype, "nuc_simple")) + return 4; + else if (!strcmp(matrixtype, "gonnet_160")) + return 160; + else + return 1000; + +} + +///////////////////////////////////////////////////////////////// +// +// Can read any scoring matrix as long as it is defined in Matrix.h +// AND it is a lower triangular +// AND the order of amino acids/bases is mentioned +///////////////////////////////////////////////////////////////// + +inline void read_matrix(score_matrix matrx) { + int i, j, basecount, position = 0; + + bases = (char *) matrx.monomers; + + basecount = strlen(bases); + + for (i = 0; i < basecount; i++) + subst_index[i] = -1; + + for (i = 0; i < basecount; i++) + subst_index[bases[i] - 'A'] = i; + + if (TRACE == 1) + printf("\nbases read: %d\n", basecount); + + for (i = 0; i < basecount; i++) + for (j = 0; j <= i; j++) { + + double value = exp(argument.beta * matrx.matrix[position++]); + sub_matrix[i][j] = value; + sub_matrix[j][i] = value; + } + + if (TRACE) + for (i = 0; i < basecount; i++) { + for (j = 0; j < basecount; j++) + printf(" %g ", sub_matrix[i][j]); + printf("\n"); + } + +} + +////////////////////////////////////////////////////////////////////////////////// +//intialize the arguments (default values) +////////////////////////////////////////////////////////////////////////////////// +void init_arguments() { + float gap_open = 0, gap_ext = 0; + int le; + + le = matrixtype_to_int(); + + argument.N = 1; + strcpy(argument.input, "tempin"); + argument.matrix = le; + argument.gapopen = GAPOPEN; + argument.gapext = GAPEXT; + argument.T = TEMPERATURE; + argument.beta = 1.0 / TEMPERATURE; + argument.opt = 'P'; + + if (le == 4) //NUC OPTION :default is nuc_simple + { + read_matrix(nuc_simple); + gap_open = -4; + gap_ext = -0.25; + } + + else if (le == 160) //PROT option: default is gonnet_160 + { + if (TRACE) + printf("read matrix\n"); + read_matrix(gonnet_160); + gap_open = -22; + gap_ext = -1; + } else if (le == 1000) { //Error handling + printf("Error: enter a valid matrix type\n"); + exit(1); + //additional matrices can only be lower triangular + } + + //now override the gapopen and gapext + if (argument.gapopen != 0.0 || argument.gapext != 0.00) + + { + gap_open = -argument.gapopen; + gap_ext = -argument.gapext; + } + + if (TRACE) + printf("%f %f %f %d\n", argument.T, gap_open, gap_ext, le); + + argument.gapopen = gap_open; + argument.gapext = gap_ext; + argument.opt = 'P'; + +} diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.h new file mode 100644 index 0000000..8d15ce5 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MSAReadMatrix.h @@ -0,0 +1,87 @@ +///////////////////////////////////////////////////////////////// +// Matrix.h +// +// Specifies scoring matrices and their structure +// +// +// +///////////////////////////////////////////////////////////////// + +#ifndef _MSA_READ_MATRIX_H +#define _MSA_READ_MATRIX_H + +typedef struct { + char monomers[26]; /* amino or nucleic acid order */ + float matrix[676]; /* entries of the score matix, 26*26=676 */ +} score_matrix; + +//default protein sequence scoring matrix as well as default scoring matrix of the PROBALIGN +//also used when -prot option is used + +score_matrix gonnet_160 = { "ABCDEFGHIKLMNPQRSTVWXYZ", + +{ 4.6, 0.0, 0.0, 0.3, 0.0, 13.5, -1.1, 0.0, -5.3, 7.0, -0.4, 0.0, -5.2, 3.4, + 5.9, -3.8, 0.0, -1.8, -7.0, -6.2, 9.1, 0.2, 0.0, -3.4, -0.7, -2.1, -7.6, + 8.2, -1.8, 0.0, -2.3, -0.1, -0.1, -0.7, -2.7, 9.3, -1.8, 0.0, -2.5, + -6.2, -4.3, 0.3, -7.0, -3.7, 5.9, -1.2, 0.0, -4.8, -0.1, 1.3, -5.3, + -2.4, 0.2, -3.5, 5.5, -2.2, 0.0, -2.9, -6.5, -4.5, 1.9, -6.7, -3.2, 3.0, + -3.4, 5.7, -1.2, 0.0, -1.9, -5.0, -3.1, 1.4, -5.2, -2.1, 2.9, -2.1, 3.4, + 7.6, -1.2, 0.0, -3.1, 2.6, 0.5, -4.7, -0.2, 1.5, -4.4, 0.8, -4.8, -3.6, + 6.5, -0.1, 0.0, -5.2, -1.9, -1.4, -5.8, -3.0, -2.2, -4.3, -1.6, -3.5, + -4.2, -2.2, 9.6, -0.7, 0.0, -4.2, 0.6, 2.3, -4.1, -2.1, 1.7, -3.2, 2.0, + -2.4, -1.2, 0.5, -0.8, 5.6, -1.6, 0.0, -3.5, -1.6, -0.3, -5.3, -2.1, + 0.3, -4.1, 3.5, -3.5, -2.9, -0.4, -2.1, 1.7, 7.1, 1.6, 0.0, -0.2, 0.0, + -0.3, -4.5, -0.1, -0.8, -3.3, -0.4, -3.6, -2.3, 1.1, 0.0, -0.2, -0.9, + 4.4, 0.5, 0.0, -1.4, -0.6, -0.8, -3.6, -2.4, -0.8, -1.2, -0.2, -2.4, + -1.1, 0.3, -0.4, -0.4, -0.9, 2.3, 5.0, 0.1, 0.0, -0.6, -4.9, -3.0, -0.8, + -5.2, -3.5, 4.0, -3.0, 1.7, 1.4, -3.8, -3.2, -2.7, -3.4, -2.0, 0.0, 5.3, + -5.5, 0.0, -2.1, -7.8, -6.4, 3.2, -5.5, -1.9, -3.4, -5.4, -2.0, -2.2, + -5.5, -7.4, -4.0, -2.4, -4.7, -5.4, -4.5, 15.8, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, -3.7, 0.0, -1.3, -4.2, -4.4, 5.6, -6.0, 2.7, -2.0, -3.5, -1.1, + -1.3, -2.2, -4.8, -2.9, -2.9, -2.8, -3.2, -2.4, 3.8, 0.0, 10.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } + +}; + +//default nucleotide sequence scoring matrix +//used when -nuc option is used +score_matrix nuc_simple = { + +"ABCDGHKMNRSTUVWXY", + +{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 } + +//Ribosum85-60 + /* + { + 2.22, + 0, 0, + -1.86, 0, 1.16, + 0, 0, 0, 0, + -1.46, 0, -2.48, 0, 1.03, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1.39, 0, -1.05, 0, -1.74, 0, 0, 0, 0, 0, 0, 1.65, + -1.39, 0, -1.05, 0, -1.74, 0, 0, 0, 0, 0, 0, 0, 1.65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + */ + + }; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/Makefile b/binaries/src/MSAProbs-0.9.7/MSAProbs/Makefile new file mode 100644 index 0000000..8dc8450 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/Makefile @@ -0,0 +1,16 @@ + +CXXOBJS = MSA.o MSAGuideTree.o MSAClusterTree.o MSAPartProbs.o MSAReadMatrix.o main.o + +OPENMP = -fopenmp +CXX = g++ +COMMON_FLAGS = -O3 $(OPENMP) -Wall -funroll-loops -I . -I /usr/include +CXXFLAGS = $(COMMON_FLAGS) + +EXEC = msaprobs + +all: $(CXXOBJS) + $(CXX) $(CXXFLAGS) -o $(EXEC) $(CXXOBJS) $(NVCCOBJS) $(NVCCLIBS) + strip $(EXEC) +clean: + rm -rf *.o $(EXEC) + diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/MultiSequence.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/MultiSequence.h new file mode 100644 index 0000000..b31af08 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/MultiSequence.h @@ -0,0 +1,733 @@ +//////////////////////////////////////////////////////////////// +// MultiSequence.h +// +// Utilities for reading/writing multiple sequence data. +///////////////////////////////////////////////////////////////// + +#ifndef MULTISEQUENCE_H +#define MULTISEQUENCE_H + +#include +#include +#include +#include +#include +#include +#include +#include "SafeVector.h" +#include "Sequence.h" +#include "FileBuffer.h" + +#define VERSION "0.9.7" +///////////////////////////////////////////////////////////////// +// MultiSequence +// +// Class for multiple sequence alignment input/output. +///////////////////////////////////////////////////////////////// + +class MultiSequence { + + SafeVector *sequences; + +public: + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Default constructor. + ///////////////////////////////////////////////////////////////// + + MultiSequence() : + sequences(NULL) { + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Constructor. Load MFA from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + MultiSequence(FileBuffer &infile) : + sequences(NULL) { + LoadMFA(infile); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::MultiSequence() + // + // Constructor. Load MFA from a filename. + ///////////////////////////////////////////////////////////////// + + MultiSequence(const string &filename) : + sequences(NULL) { + LoadMFA(filename); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::~MultiSequence() + // + // Destructor. Gets rid of sequence objects contained in the + // multiple alignment. + ///////////////////////////////////////////////////////////////// + + ~MultiSequence() { + + // if sequences allocated + if (sequences) { + + // free all sequences + for (SafeVector::iterator iter = sequences->begin(); + iter != sequences->end(); ++iter) { + assert(*iter); + delete *iter; + *iter = NULL; + } + + // free sequence vector + delete sequences; + sequences = NULL; + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MFA from a filename. + ///////////////////////////////////////////////////////////////// + + void LoadMFA(const string &filename, bool stripGaps = false) { + + // try opening file + FileBuffer infile(filename.c_str()); + + if (infile.fail()) { + cerr << "ERROR: Could not open file '" << filename + << "' for reading." << endl; + exit(1); + } + + // if successful, then load using other LoadMFA() routine + LoadMFA(infile, stripGaps); + + infile.close(); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MSF from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + void ParseMSF(FileBuffer &infile, string header, bool stripGaps = false) { + + SafeVector *> seqData; + SafeVector seqNames; + SafeVector seqLengths; + + istringstream in; + bool valid = true; + bool missingHeader = false; + bool clustalW = false; + + // read until data starts + while (!infile.eof() && header.find("..", 0) == string::npos) { + if (header.find("CLUSTAL", 0) == 0 + || header.find("MSAPROBS", 0) == 0) { + clustalW = true; + break; + } + infile.GetLine(header); + if (header.find("//", 0) != string::npos) { + missingHeader = true; + break; + } + } + + // read until end-of-file + while (valid) { + infile.GetLine(header); + if (infile.eof()) + break; + + string word; + in.clear(); + in.str(header); + + // check if there's anything on this line + if (in >> word) { + + // clustalw name parsing + if (clustalW) { + if (!isspace(header[0]) + && find(seqNames.begin(), seqNames.end(), word) + == seqNames.end()) { + seqNames.push_back(word); + seqData.push_back(new SafeVector()); + seqLengths.push_back(0); + seqData[(int) seqData.size() - 1]->push_back('@'); + } + } + + // look for new sequence label + if (word == string("Name:")) { + if (in >> word) { + seqNames.push_back(word); + seqData.push_back(new SafeVector()); + seqLengths.push_back(0); + seqData[(int) seqData.size() - 1]->push_back('@'); + } else + valid = false; + } + + // check if this is sequence data + else if (find(seqNames.begin(), seqNames.end(), word) + != seqNames.end()) { + int index = find(seqNames.begin(), seqNames.end(), word) + - seqNames.begin(); + + // read all remaining characters on the line + char ch; + while (in >> ch) { + if (isspace(ch)) + continue; + if (ch >= 'a' && ch <= 'z') + ch = ch - 'a' + 'A'; + if (ch == '.') + ch = '-'; + if (stripGaps && ch == '-') + continue; + if (!((ch >= 'A' && ch <= 'Z') || ch == '*' || ch == '-')) { + cerr << "ERROR: Unknown character encountered: " + << ch << endl; + exit(1); + } + + // everything's ok so far, so just store this character. + seqData[index]->push_back(ch); + seqLengths[index]++; + } + } else if (missingHeader) { + seqNames.push_back(word); + seqData.push_back(new SafeVector()); + seqLengths.push_back(0); + seqData[(int) seqData.size() - 1]->push_back('@'); + + int index = (int) seqNames.size() - 1; + + // read all remaining characters on the line + char ch; + while (in >> ch) { + if (isspace(ch)) + continue; + if (ch >= 'a' && ch <= 'z') + ch = ch - 'a' + 'A'; + if (ch == '.') + ch = '-'; + if (stripGaps && ch == '-') + continue; + if (!((ch >= 'A' && ch <= 'Z') || ch == '*' || ch == '-')) { + cerr << "ERROR: Unknown character encountered: " + << ch << endl; + exit(1); + } + + // everything's ok so far, so just store this character. + seqData[index]->push_back(ch); + seqLengths[index]++; + } + } + } + } + + // check for errors + if (seqNames.size() == 0) { + cerr << "ERROR: No sequences read!" << endl; + exit(1); + } + + assert(!sequences); + sequences = new SafeVector; + for (int i = 0; i < (int) seqNames.size(); i++) { + if (seqLengths[i] == 0) { + cerr << "ERROR: Sequence of zero length!" << endl; + exit(1); + } + Sequence *seq = new Sequence(seqData[i], seqNames[i], seqLengths[i], + i, i); + sequences->push_back(seq); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::LoadMFA() + // + // Load MFA from a FileBuffer object. + ///////////////////////////////////////////////////////////////// + + void LoadMFA(FileBuffer &infile, bool stripGaps = false) { + + // check to make sure that file reading is ok + if (infile.fail()) { + cerr << "ERROR: Error reading file." << endl; + exit(1); + } + + // read all sequences + while (true) { + + // get the sequence label as being the current # of sequences + // NOTE: sequence labels here are zero-based + int index = (!sequences) ? 0 : sequences->size(); + + // read the sequence + Sequence *seq = new Sequence(infile, stripGaps); + if (seq->Fail()) { + + // check if alternative file format (i.e. not MFA) + if (index == 0) { + string header = seq->GetHeader(); + if (header.length() > 0 && header[0] != '>') { + + // try MSF format + ParseMSF(infile, header); + break; + } + } + + delete seq; + break; + } + seq->SetLabel(index); + + // add the sequence to the list of current sequences + if (!sequences) + sequences = new SafeVector; + sequences->push_back(seq); + } + + // make sure at least one sequence was read + if (!sequences) { + cerr << "ERROR: No sequences read." << endl; + exit(1); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::AddSequence() + // + // Add another sequence to an existing sequence list + ///////////////////////////////////////////////////////////////// + + void AddSequence(Sequence *sequence) { + assert(sequence); + assert(!sequence->Fail()); + + // add sequence + if (!sequences) + sequences = new SafeVector; + sequences->push_back(sequence); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::RemoveSequence() + // + // Remove a sequence from the MultiSequence + ///////////////////////////////////////////////////////////////// + + void RemoveSequence(int index) { + assert(sequences); + + assert(index >= 0 && index < (int) sequences->size()); + delete (*sequences)[index]; + + sequences->erase(sequences->begin() + index); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::WriteMFA() + // + // Write MFA to the outfile. Allows the user to specify the + // number of columns for the output. Also, useIndices determines + // whether or not the actual sequence comments will be printed + // out or whether the artificially assigned sequence labels will + // be used instead. + ///////////////////////////////////////////////////////////////// + + void WriteMFA(ostream &outfile, int numColumns = 60, + bool useIndices = false) { + if (!sequences) + return; + + // loop through all sequences and write them out + for (SafeVector::iterator iter = sequences->begin(); + iter != sequences->end(); ++iter) { + (*iter)->WriteMFA(outfile, numColumns, useIndices); + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetAnnotationChar() + // + // Return CLUSTALW annotation for column. + ///////////////////////////////////////////////////////////////// + + char GetAnnotationChar(SafeVector &column) { + SafeVector counts(256, 0); + int allChars = (int) column.size(); + + for (int i = 0; i < allChars; i++) { + counts[(unsigned char) toupper(column[i])]++; + } + + allChars -= counts[(unsigned char) '-']; + if (allChars == 1) + return ' '; + + for (int i = 0; i < 256; i++) + if ((char) i != '-' && counts[i] == allChars) + return '*'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'A'] == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + counts[(unsigned char) 'K'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'Q'] + counts[(unsigned char) 'K'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + counts[(unsigned char) 'Q'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'Q'] + counts[(unsigned char) 'H'] + + counts[(unsigned char) 'R'] + counts[(unsigned char) 'K'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'M'] + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'L'] + counts[(unsigned char) 'V'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'M'] + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'L'] + counts[(unsigned char) 'F'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'H'] + counts[(unsigned char) 'Y'] + == allChars) + return ':'; + + if (counts[(unsigned char) 'F'] + counts[(unsigned char) 'Y'] + + counts[(unsigned char) 'W'] == allChars) + return ':'; + + if (counts[(unsigned char) 'C'] + counts[(unsigned char) 'S'] + + counts[(unsigned char) 'A'] == allChars) + return '.'; + + if (counts[(unsigned char) 'A'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'V'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'A'] + + counts[(unsigned char) 'G'] == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'N'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'T'] + + counts[(unsigned char) 'P'] + counts[(unsigned char) 'A'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'G'] + + counts[(unsigned char) 'N'] + counts[(unsigned char) 'D'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'S'] + counts[(unsigned char) 'N'] + + counts[(unsigned char) 'D'] + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'Q'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'D'] + + counts[(unsigned char) 'E'] + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'H'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'N'] + counts[(unsigned char) 'E'] + + counts[(unsigned char) 'H'] + counts[(unsigned char) 'Q'] + + counts[(unsigned char) 'R'] + counts[(unsigned char) 'K'] + == allChars) + return '.'; + + if (counts[(unsigned char) 'F'] + counts[(unsigned char) 'V'] + + counts[(unsigned char) 'L'] + counts[(unsigned char) 'I'] + + counts[(unsigned char) 'M'] == allChars) + return '.'; + + if (counts[(unsigned char) 'H'] + counts[(unsigned char) 'F'] + + counts[(unsigned char) 'Y'] == allChars) + return '.'; + + return ' '; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::WriteALN() + // + // Write ALN to the outfile. Allows the user to specify the + // number of columns for the output. + ///////////////////////////////////////////////////////////////// + + void WriteALN(ostream &outfile, int numColumns = 60) { + if (!sequences) + return; + + outfile << "MSAPROBS version " << VERSION + << " multiple sequence alignment" << endl; + + int longestComment = 0; + SafeVector::iterator> ptrs(GetNumSequences()); + SafeVector lengths(GetNumSequences()); + for (int i = 0; i < GetNumSequences(); i++) { + ptrs[i] = GetSequence(i)->GetDataPtr(); + lengths[i] = GetSequence(i)->GetLength(); + longestComment = max(longestComment, + (int) GetSequence(i)->GetName().length()); + } + longestComment += 4; + + int writtenChars = 0; + bool allDone = false; + + while (!allDone) { + outfile << endl; + allDone = true; + + // loop through all sequences and write them out + for (int i = 0; i < GetNumSequences(); i++) { + + if (writtenChars < lengths[i]) { + outfile << GetSequence(i)->GetName(); + for (int j = 0; + j + < longestComment + - (int) GetSequence(i)->GetName().length(); + j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + if (writtenChars + j < lengths[i]) + outfile << ptrs[i][writtenChars + j + 1]; + else + break; + } + + outfile << endl; + + if (writtenChars + numColumns < lengths[i]) + allDone = false; + } + } + + // write annotation line + for (int j = 0; j < longestComment; j++) + outfile << ' '; + + for (int j = 0; j < numColumns; j++) { + SafeVector column; + + for (int i = 0; i < GetNumSequences(); i++) + if (writtenChars + j < lengths[i]) + column.push_back(ptrs[i][writtenChars + j + 1]); + + if (column.size() > 0) + outfile << GetAnnotationChar(column); + } + + outfile << endl; + writtenChars += numColumns; + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetSequence() + // + // Retrieve a sequence from the MultiSequence object. + ///////////////////////////////////////////////////////////////// + + Sequence* GetSequence(int i) { + assert(sequences); + assert(0 <= i && i < (int) sequences->size()); + + return (*sequences)[i]; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetSequence() + // + // Retrieve a sequence from the MultiSequence object + // (const version). + ///////////////////////////////////////////////////////////////// + + const Sequence* GetSequence(int i) const { + assert(sequences); + assert(0 <= i && i < (int) sequences->size()); + + return (*sequences)[i]; + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::GetNumSequences() + // + // Returns the number of sequences in the MultiSequence. + ///////////////////////////////////////////////////////////////// + + int GetNumSequences() const { + if (!sequences) + return 0; + return (int) sequences->size(); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SortByHeader() + // + // Organizes the sequences according to their sequence headers + // in ascending order. + ///////////////////////////////////////////////////////////////// + + void SortByHeader() { + assert(sequences); + + // a quick and easy O(n^2) sort + for (int i = 0; i < (int) sequences->size() - 1; i++) { + for (int j = i + 1; j < (int) sequences->size(); j++) { + if ((*sequences)[i]->GetHeader() > (*sequences)[j]->GetHeader()) + swap((*sequences)[i], (*sequences)[j]); + } + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SortByLabel() + // + // Organizes the sequences according to their sequence labels + // in ascending order. + ///////////////////////////////////////////////////////////////// + + void SortByLabel() { + assert(sequences); + + // a quick and easy O(n^2) sort + for (int i = 0; i < (int) sequences->size() - 1; i++) { + for (int j = i + 1; j < (int) sequences->size(); j++) { + if ((*sequences)[i]->GetSortLabel() + > (*sequences)[j]->GetSortLabel()) + swap((*sequences)[i], (*sequences)[j]); + } + } + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::SaveOrdering() + // + // Relabels sequences so as to preserve the current ordering. + ///////////////////////////////////////////////////////////////// + + void SaveOrdering() { + assert(sequences); + + for (int i = 0; i < (int) sequences->size(); i++) + (*sequences)[i]->SetSortLabel(i); + } + + ///////////////////////////////////////////////////////////////// + // MultiSequence::Project() + // + // Given a set of indices, extract all sequences from the current + // MultiSequence object whose index is included in the set. + // Then, project the multiple alignments down to the desired + // subset, and return the projection as a new MultiSequence + // object. + ///////////////////////////////////////////////////////////////// + + MultiSequence *Project(const set &indices) { + SafeVector::iterator> oldPtrs(indices.size()); + SafeVector *> newPtrs(indices.size()); + + assert(indices.size() != 0); + + // grab old data + int i = 0; + for (set::const_iterator iter = indices.begin(); + iter != indices.end(); ++iter) { + oldPtrs[i++] = GetSequence(*iter)->GetDataPtr(); + } + + // compute new length + int oldLength = GetSequence(*indices.begin())->GetLength(); + int newLength = 0; + for (i = 1; i <= oldLength; i++) { + + // check to see if there is a gap in every sequence of the set + bool found = false; + for (int j = 0; !found && j < (int) indices.size(); j++) + found = (oldPtrs[j][i] != '-'); + + // if not, then this column counts towards the sequence length + if (found) + newLength++; + } + + // build new alignments + for (i = 0; i < (int) indices.size(); i++) { + newPtrs[i] = new SafeVector(); + assert(newPtrs[i]); + newPtrs[i]->push_back('@'); + } + + // add all needed columns + for (i = 1; i <= oldLength; i++) { + + // make sure column is not gapped in all sequences in the set + bool found = false; + for (int j = 0; !found && j < (int) indices.size(); j++) + found = (oldPtrs[j][i] != '-'); + + // if not, then add it + if (found) { + for (int j = 0; j < (int) indices.size(); j++) + newPtrs[j]->push_back(oldPtrs[j][i]); + } + } + + // wrap sequences in MultiSequence object + MultiSequence *ret = new MultiSequence(); + i = 0; + for (set::const_iterator iter = indices.begin(); + iter != indices.end(); ++iter) { + ret->AddSequence( + new Sequence(newPtrs[i++], GetSequence(*iter)->GetHeader(), + newLength, GetSequence(*iter)->GetSortLabel(), + GetSequence(*iter)->GetLabel())); + } + + return ret; + } +}; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/ProbabilisticModel.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/ProbabilisticModel.h new file mode 100644 index 0000000..dd5dbd3 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/ProbabilisticModel.h @@ -0,0 +1,1365 @@ +///////////////////////////////////////////////////////////////// +// ProbabilisticModel.h +// +// Routines for (1) posterior probability computations +// (2) chained anchoring +// (3) maximum weight trace alignment +///////////////////////////////////////////////////////////////// + +#ifndef PROBABILISTICMODEL_H +#define PROBABILISTICMODEL_H + +#include +#include +#include +#include "SafeVector.h" +#include "ScoreType.h" +#include "SparseMatrix.h" +#include "MultiSequence.h" + +using namespace std; + +const int NumMatchStates = 1; // note that in this version the number +// of match states is fixed at 1...will +// change in future versions +const int NumInsertStates = 2; +const int NumMatrixTypes = NumMatchStates + NumInsertStates * 2; + +///////////////////////////////////////////////////////////////// +// ProbabilisticModel +// +// Class for storing the parameters of a probabilistic model and +// performing different computations based on those parameters. +// In particular, this class handles the computation of +// posterior probabilities that may be used in alignment. +///////////////////////////////////////////////////////////////// + +class ProbabilisticModel { + + float initialDistribution[NumMatrixTypes]; // holds the initial probabilities for each state + float transProb[NumMatrixTypes][NumMatrixTypes]; // holds all state-to-state transition probabilities + float matchProb[256][256]; // emission probabilities for match states + float insProb[256][NumMatrixTypes]; // emission probabilities for insert states + +public: + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ProbabilisticModel() + // + // Constructor. Builds a new probabilistic model using the + // given parameters. + ///////////////////////////////////////////////////////////////// + + ProbabilisticModel(const VF &initDistribMat, const VF &gapOpen, + const VF &gapExtend, const VVF &emitPairs, const VF &emitSingle) { + + // build transition matrix + VVF transMat(NumMatrixTypes, VF(NumMatrixTypes, 0.0f)); + transMat[0][0] = 1; + for (int i = 0; i < NumInsertStates; i++) { + transMat[0][2 * i + 1] = gapOpen[2 * i]; + transMat[0][2 * i + 2] = gapOpen[2 * i + 1]; + transMat[0][0] -= (gapOpen[2 * i] + gapOpen[2 * i + 1]); + assert(transMat[0][0] > 0); + transMat[2 * i + 1][2 * i + 1] = gapExtend[2 * i]; + transMat[2 * i + 2][2 * i + 2] = gapExtend[2 * i + 1]; + transMat[2 * i + 1][2 * i + 2] = 0; + transMat[2 * i + 2][2 * i + 1] = 0; + transMat[2 * i + 1][0] = 1 - gapExtend[2 * i]; + transMat[2 * i + 2][0] = 1 - gapExtend[2 * i + 1]; + } + + // create initial and transition probability matrices + for (int i = 0; i < NumMatrixTypes; i++) { + initialDistribution[i] = LOG(initDistribMat[i]); + for (int j = 0; j < NumMatrixTypes; j++) + transProb[i][j] = LOG(transMat[i][j]); + } + + // create insertion and match probability matrices + for (int i = 0; i < 256; i++) { + for (int j = 0; j < NumMatrixTypes; j++) + insProb[i][j] = LOG(emitSingle[i]); + for (int j = 0; j < 256; j++) + matchProb[i][j] = LOG(emitPairs[i][j]); + } + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeForwardMatrix() + // + // Computes a set of forward probability matrices for aligning + // seq1 and seq2. + // + // For efficiency reasons, a single-dimensional floating-point + // array is used here, with the following indexing scheme: + // + // forward[i + NumMatrixTypes * (j * (seq2Length+1) + k)] + // refers to the probability of aligning through j characters + // of the first sequence, k characters of the second sequence, + // and ending in state i. + ///////////////////////////////////////////////////////////////// + + VF *ComputeForwardMatrix(Sequence *seq1, Sequence *seq2) const { + + assert(seq1); + assert(seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // retrieve the points to the beginning of each sequence + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create matrix + VF *forwardPtr = new VF( + NumMatrixTypes * (seq1Length + 1) * (seq2Length + 1), LOG_ZERO); + assert(forwardPtr); + VF &forward = *forwardPtr; + + // initialization condition + forward[0 + NumMatrixTypes * (1 * (seq2Length + 1) + 1)] = + initialDistribution[0] + + matchProb[(unsigned char) iter1[1]][(unsigned char) iter2[1]]; + + for (int k = 0; k < NumInsertStates; k++) { + forward[2 * k + 1 + NumMatrixTypes * (1 * (seq2Length + 1) + 0)] = + initialDistribution[2 * k + 1] + + insProb[(unsigned char) iter1[1]][k]; + forward[2 * k + 2 + NumMatrixTypes * (0 * (seq2Length + 1) + 1)] = + initialDistribution[2 * k + 2] + + insProb[(unsigned char) iter2[1]][k]; + } + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute forward scores + for (int i = 0; i <= seq1Length; i++) { + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++) { + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 1 || j > 1) { + if (i > 0 && j > 0) { + forward[0 + ij] = forward[0 + i1j1] + transProb[0][0]; + for (int k = 1; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS(forward[0 + ij], + forward[k + i1j1] + transProb[k][0]); + forward[0 + ij] += matchProb[c1][c2]; + } + if (i > 0) { + for (int k = 0; k < NumInsertStates; k++) + forward[2 * k + 1 + ij] = insProb[c1][k] + + LOG_ADD( + forward[0 + i1j] + + transProb[0][2 * k + 1], + forward[2 * k + 1 + i1j] + + transProb[2 * k + 1][2 * k + + 1]); + } + if (j > 0) { + for (int k = 0; k < NumInsertStates; k++) + forward[2 * k + 2 + ij] = insProb[c2][k] + + LOG_ADD( + forward[0 + ij1] + + transProb[0][2 * k + 2], + forward[2 * k + 2 + ij1] + + transProb[2 * k + 2][2 * k + + 2]); + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + return forwardPtr; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeBackwardMatrix() + // + // Computes a set of backward probability matrices for aligning + // seq1 and seq2. + // + // For efficiency reasons, a single-dimensional floating-point + // array is used here, with the following indexing scheme: + // + // backward[i + NumMatrixTypes * (j * (seq2Length+1) + k)] + // refers to the probability of starting in state i and + // aligning from character j+1 to the end of the first + // sequence and from character k+1 to the end of the second + // sequence. + ///////////////////////////////////////////////////////////////// + + VF *ComputeBackwardMatrix(Sequence *seq1, Sequence *seq2) const { + + assert(seq1); + assert(seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create matrix + VF *backwardPtr = new VF( + NumMatrixTypes * (seq1Length + 1) * (seq2Length + 1), LOG_ZERO); + assert(backwardPtr); + VF &backward = *backwardPtr; + + // initialization condition + for (int k = 0; k < NumMatrixTypes; k++) + backward[NumMatrixTypes * ((seq1Length + 1) * (seq2Length + 1) - 1) + + k] = initialDistribution[k]; + + // remember offset for each index combination + int ij = (seq1Length + 1) * (seq2Length + 1) - 1; + int i1j = ij + seq2Length + 1; + int ij1 = ij + 1; + int i1j1 = ij + seq2Length + 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute backward scores + for (int i = seq1Length; i >= 0; i--) { + unsigned char c1 = + (i == seq1Length) ? '~' : (unsigned char) iter1[i + 1]; + for (int j = seq2Length; j >= 0; j--) { + unsigned char c2 = + (j == seq2Length) ? '~' : (unsigned char) iter2[j + 1]; + + if (i < seq1Length && j < seq2Length) { + const float ProbXY = backward[0 + i1j1] + matchProb[c1][c2]; + for (int k = 0; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS(backward[k + ij], + ProbXY + transProb[k][0]); + } + if (i < seq1Length) { + for (int k = 0; k < NumInsertStates; k++) { + LOG_PLUS_EQUALS(backward[0 + ij], + backward[2 * k + 1 + i1j] + insProb[c1][k] + + transProb[0][2 * k + 1]); + LOG_PLUS_EQUALS(backward[2 * k + 1 + ij], + backward[2 * k + 1 + i1j] + insProb[c1][k] + + transProb[2 * k + 1][2 * k + 1]); + } + } + if (j < seq2Length) { + for (int k = 0; k < NumInsertStates; k++) { + LOG_PLUS_EQUALS(backward[0 + ij], + backward[2 * k + 2 + ij1] + insProb[c2][k] + + transProb[0][2 * k + 2]); + LOG_PLUS_EQUALS(backward[2 * k + 2 + ij], + backward[2 * k + 2 + ij1] + insProb[c2][k] + + transProb[2 * k + 2][2 * k + 2]); + } + } + + ij -= NumMatrixTypes; + i1j -= NumMatrixTypes; + ij1 -= NumMatrixTypes; + i1j1 -= NumMatrixTypes; + } + } + + return backwardPtr; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeTotalProbability() + // + // Computes the total probability of an alignment given + // the forward and backward matrices. + ///////////////////////////////////////////////////////////////// + + float ComputeTotalProbability(int seq1Length, int seq2Length, + const VF &forward, const VF &backward) const { + + // compute total probability + float totalForwardProb = LOG_ZERO; + float totalBackwardProb = LOG_ZERO; + for (int k = 0; k < NumMatrixTypes; k++) { + LOG_PLUS_EQUALS(totalForwardProb, + forward[k + + NumMatrixTypes + * ((seq1Length + 1) * (seq2Length + 1) - 1)] + + backward[k + + NumMatrixTypes + * ((seq1Length + 1) + * (seq2Length + 1) - 1)]); + } + + totalBackwardProb = forward[0 + + NumMatrixTypes * (1 * (seq2Length + 1) + 1)] + + backward[0 + NumMatrixTypes * (1 * (seq2Length + 1) + 1)]; + + for (int k = 0; k < NumInsertStates; k++) { + LOG_PLUS_EQUALS(totalBackwardProb, + forward[2 * k + 1 + + NumMatrixTypes * (1 * (seq2Length + 1) + 0)] + + backward[2 * k + 1 + + NumMatrixTypes + * (1 * (seq2Length + 1) + 0)]); + LOG_PLUS_EQUALS(totalBackwardProb, + forward[2 * k + 2 + + NumMatrixTypes * (0 * (seq2Length + 1) + 1)] + + backward[2 * k + 2 + + NumMatrixTypes + * (0 * (seq2Length + 1) + 1)]); + } + + // cerr << totalForwardProb << " " << totalBackwardProb << endl; + + return (totalForwardProb + totalBackwardProb) / 2; + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputePosteriorMatrix() + // + // Computes the posterior probability matrix based on + // the forward and backward matrices. + ///////////////////////////////////////////////////////////////// + + VF *ComputePosteriorMatrix(Sequence *seq1, Sequence *seq2, + const VF &forward, const VF &backward) const { + + assert(seq1); + assert(seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + float totalProb = ComputeTotalProbability(seq1Length, seq2Length, + forward, backward); + + // compute posterior matrices + VF *posteriorPtr = new VF((seq1Length + 1) * (seq2Length + 1)); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + int ij = 0; + if (totalProb == 0) { + totalProb = 1.0f; + } + VF::iterator ptr = posterior.begin(); + + for (int i = 0; i <= seq1Length; i++) { + for (int j = 0; j <= seq2Length; j++) { + *(ptr++) = EXP( + min(LOG_ONE, forward[ij] + backward[ij] - totalProb)); + ij += NumMatrixTypes; + } + } + + posterior[0] = 0; + + return posteriorPtr; + } + + /* + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeExpectedCounts() + // + // Computes the expected counts for the various transitions. + ///////////////////////////////////////////////////////////////// + + VVF *ComputeExpectedCounts () const { + + assert (seq1); + assert (seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // compute total probability + float totalProb = ComputeTotalProbability (seq1Length, seq2Length, + forward, backward); + + // initialize expected counts + VVF *countsPtr = new VVF(NumMatrixTypes + 1, VF(NumMatrixTypes, LOG_ZERO)); assert (countsPtr); + VVF &counts = *countsPtr; + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute expected counts + for (int i = 0; i <= seq1Length; i++){ + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++){ + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 0 && j > 0){ + for (int k = 0; k < NumMatrixTypes; k++) + LOG_PLUS_EQUALS (counts[k][0], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + } + if (i > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (counts[0][2*k+1], + forward[0 + i1j] + transProb[0][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + LOG_PLUS_EQUALS (counts[2*k+1][2*k+1], + forward[2*k+1 + i1j] + transProb[2*k+1][2*k+1] + + insProb[c1][k] + backward[2*k+1 + ij]); + } + } + if (j > 0){ + for (int k = 0; k < NumInsertStates; k++){ + LOG_PLUS_EQUALS (counts[0][2*k+2], + forward[0 + ij1] + transProb[0][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + LOG_PLUS_EQUALS (counts[2*k+2][2*k+2], + forward[2*k+2 + ij1] + transProb[2*k+2][2*k+2] + + insProb[c2][k] + backward[2*k+2 + ij]); + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // scale all expected counts appropriately + for (int i = 0; i < NumMatrixTypes; i++) + for (int j = 0; j < NumMatrixTypes; j++) + counts[i][j] -= totalProb; + + } + */ + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeNewParameters() + // + // Computes a new parameter set based on the expected counts + // given. + ///////////////////////////////////////////////////////////////// + void ComputeNewParameters(Sequence *seq1, Sequence *seq2, const VF &forward, + const VF &backward, VF &initDistribMat, VF &gapOpen, VF &gapExtend, + VVF &emitPairs, VF &emitSingle, bool enableTrainEmissions) const { + + assert(seq1); + assert(seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // compute total probability + float totalProb = ComputeTotalProbability(seq1Length, seq2Length, + forward, backward); + + // initialize expected counts + VVF transCounts(NumMatrixTypes, VF(NumMatrixTypes, LOG_ZERO)); + VF initCounts(NumMatrixTypes, LOG_ZERO); + VVF pairCounts(256, VF(256, LOG_ZERO)); + VF singleCounts(256, LOG_ZERO); + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute initial distribution posteriors + initCounts[0] = LOG_ADD( + forward[0 + NumMatrixTypes * (1 * (seq2Length + 1) + 1)] + + backward[0 + + NumMatrixTypes * (1 * (seq2Length + 1) + 1)], + forward[0 + + NumMatrixTypes + * ((seq1Length + 1) * (seq2Length + 1) - 1)] + + backward[0 + + NumMatrixTypes + * ((seq1Length + 1) * (seq2Length + 1) + - 1)]); + for (int k = 0; k < NumInsertStates; k++) { + initCounts[2 * k + 1] = LOG_ADD( + forward[2 * k + 1 + + NumMatrixTypes * (1 * (seq2Length + 1) + 0)] + + backward[2 * k + 1 + + NumMatrixTypes + * (1 * (seq2Length + 1) + 0)], + forward[2 * k + 1 + + NumMatrixTypes + * ((seq1Length + 1) * (seq2Length + 1) - 1)] + + backward[2 * k + 1 + + NumMatrixTypes + * ((seq1Length + 1) + * (seq2Length + 1) - 1)]); + initCounts[2 * k + 2] = LOG_ADD( + forward[2 * k + 2 + + NumMatrixTypes * (0 * (seq2Length + 1) + 1)] + + backward[2 * k + 2 + + NumMatrixTypes + * (0 * (seq2Length + 1) + 1)], + forward[2 * k + 2 + + NumMatrixTypes + * ((seq1Length + 1) * (seq2Length + 1) - 1)] + + backward[2 * k + 2 + + NumMatrixTypes + * ((seq1Length + 1) + * (seq2Length + 1) - 1)]); + } + + // compute expected counts + for (int i = 0; i <= seq1Length; i++) { + unsigned char c1 = + (i == 0) ? '~' : (unsigned char) toupper(iter1[i]); + for (int j = 0; j <= seq2Length; j++) { + unsigned char c2 = + (j == 0) ? '~' : (unsigned char) toupper(iter2[j]); + + if (i > 0 && j > 0) { + if (enableTrainEmissions && i == 1 && j == 1) { + LOG_PLUS_EQUALS(pairCounts[c1][c2], + initialDistribution[0] + matchProb[c1][c2] + + backward[0 + ij]); + LOG_PLUS_EQUALS(pairCounts[c2][c1], + initialDistribution[0] + matchProb[c2][c1] + + backward[0 + ij]); + } + + for (int k = 0; k < NumMatrixTypes; k++) { + LOG_PLUS_EQUALS(transCounts[k][0], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + backward[0 + ij]); + if (enableTrainEmissions && (i != 1 || j != 1)) {//adding parentheses by Liu Yongchao, 5 Mar, 2010 + LOG_PLUS_EQUALS(pairCounts[c1][c2], + forward[k + i1j1] + transProb[k][0] + + matchProb[c1][c2] + + backward[0 + ij]); + LOG_PLUS_EQUALS(pairCounts[c2][c1], + forward[k + i1j1] + transProb[k][0] + + matchProb[c2][c1] + + backward[0 + ij]); + } + } + } + if (i > 0) { + for (int k = 0; k < NumInsertStates; k++) { + LOG_PLUS_EQUALS(transCounts[0][2 * k + 1], + forward[0 + i1j] + transProb[0][2 * k + 1] + + insProb[c1][k] + + backward[2 * k + 1 + ij]); + LOG_PLUS_EQUALS(transCounts[2 * k + 1][2 * k + 1], + forward[2 * k + 1 + i1j] + + transProb[2 * k + 1][2 * k + 1] + + insProb[c1][k] + + backward[2 * k + 1 + ij]); + if (enableTrainEmissions) { + if (i == 1 && j == 0) { + LOG_PLUS_EQUALS(singleCounts[c1], + initialDistribution[2 * k + 1] + + insProb[c1][k] + + backward[2 * k + 1 + ij]); + } else { + LOG_PLUS_EQUALS(singleCounts[c1], + forward[0 + i1j] + + transProb[0][2 * k + 1] + + insProb[c1][k] + + backward[2 * k + 1 + ij]); + LOG_PLUS_EQUALS(singleCounts[c1], + forward[2 * k + 1 + i1j] + + transProb[2 * k + 1][2 * k + 1] + + insProb[c1][k] + + backward[2 * k + 1 + ij]); + } + } + } + } + if (j > 0) { + for (int k = 0; k < NumInsertStates; k++) { + LOG_PLUS_EQUALS(transCounts[0][2 * k + 2], + forward[0 + ij1] + transProb[0][2 * k + 2] + + insProb[c2][k] + + backward[2 * k + 2 + ij]); + LOG_PLUS_EQUALS(transCounts[2 * k + 2][2 * k + 2], + forward[2 * k + 2 + ij1] + + transProb[2 * k + 2][2 * k + 2] + + insProb[c2][k] + + backward[2 * k + 2 + ij]); + if (enableTrainEmissions) { + if (i == 0 && j == 1) { + LOG_PLUS_EQUALS(singleCounts[c2], + initialDistribution[2 * k + 2] + + insProb[c2][k] + + backward[2 * k + 2 + ij]); + } else { + LOG_PLUS_EQUALS(singleCounts[c2], + forward[0 + ij1] + + transProb[0][2 * k + 2] + + insProb[c2][k] + + backward[2 * k + 2 + ij]); + LOG_PLUS_EQUALS(singleCounts[c2], + forward[2 * k + 2 + ij1] + + transProb[2 * k + 2][2 * k + 2] + + insProb[c2][k] + + backward[2 * k + 2 + ij]); + } + } + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // scale all expected counts appropriately + for (int i = 0; i < NumMatrixTypes; i++) { + initCounts[i] -= totalProb; + for (int j = 0; j < NumMatrixTypes; j++) + transCounts[i][j] -= totalProb; + } + if (enableTrainEmissions) { + for (int i = 0; i < 256; i++) { + for (int j = 0; j < 256; j++) + pairCounts[i][j] -= totalProb; + singleCounts[i] -= totalProb; + } + } + + // compute new initial distribution + float totalInitDistribCounts = 0; + for (int i = 0; i < NumMatrixTypes; i++) + totalInitDistribCounts += exp(initCounts[i]); // should be 2 + initDistribMat[0] = min(1.0f, + max(0.0f, (float) exp(initCounts[0]) / totalInitDistribCounts)); + for (int k = 0; k < NumInsertStates; k++) { + float val = + (exp(initCounts[2 * k + 1]) + exp(initCounts[2 * k + 2])) + / 2; + initDistribMat[2 * k + 1] = initDistribMat[2 * k + 2] = min(1.0f, + max(0.0f, val / totalInitDistribCounts)); + } + + // compute total counts for match state + float inMatchStateCounts = 0; + for (int i = 0; i < NumMatrixTypes; i++) + inMatchStateCounts += exp(transCounts[0][i]); + for (int i = 0; i < NumInsertStates; i++) { + + // compute total counts for gap state + float inGapStateCounts = exp(transCounts[2 * i + 1][0]) + + exp(transCounts[2 * i + 1][2 * i + 1]) + + exp(transCounts[2 * i + 2][0]) + + exp(transCounts[2 * i + 2][2 * i + 2]); + + gapOpen[2 * i] = gapOpen[2 * i + 1] = (exp( + transCounts[0][2 * i + 1]) + exp(transCounts[0][2 * i + 2])) + / (2 * inMatchStateCounts); + + gapExtend[2 * i] = gapExtend[2 * i + 1] = (exp( + transCounts[2 * i + 1][2 * i + 1]) + + exp(transCounts[2 * i + 2][2 * i + 2])) + / inGapStateCounts; + } + + if (enableTrainEmissions) { + float totalPairCounts = 0; + float totalSingleCounts = 0; + for (int i = 0; i < 256; i++) { + for (int j = 0; j <= i; j++) + totalPairCounts += exp(pairCounts[j][i]); + totalSingleCounts += exp(singleCounts[i]); + } + + for (int i = 0; i < 256; i++) + if (!islower((char) i)) { + int li = (int) ((unsigned char) tolower((char) i)); + for (int j = 0; j <= i; j++) + if (!islower((char) j)) { + int lj = (int) ((unsigned char) tolower((char) j)); + emitPairs[i][j] = + emitPairs[i][lj] = + emitPairs[li][j] = + emitPairs[li][lj] = + emitPairs[j][i] = + emitPairs[j][li] = + emitPairs[lj][i] = + emitPairs[lj][li] = + exp( + pairCounts[j][i]) + / totalPairCounts; + } + emitSingle[i] = emitSingle[li] = exp(singleCounts[i]) + / totalSingleCounts; + } + } + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignment() + // + // Computes an alignment based on the given posterior matrix. + // This is done by finding the maximum summing path (or + // maximum weight trace) through the posterior matrix. The + // final alignment is returned as a pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float indicating the sum achieved + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignment(int seq1Length, + int seq2Length, const VF &posterior) const { + + float *twoRows = new float[(seq2Length + 1) * 2]; + assert(twoRows); + float *oldRow = twoRows; + float *newRow = twoRows + seq2Length + 1; + + char *tracebackMatrix = new char[(seq1Length + 1) * (seq2Length + 1)]; + assert(tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++) { + oldRow[i] = 0; + *(tracebackPtr++) = 'L'; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++) { + + // initialize left column + newRow[0] = 0; + posteriorPtr++; + *(tracebackPtr++) = 'U'; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++) { + ChooseBestOfThree(*(posteriorPtr++) + oldRow[j - 1], + newRow[j - 1], oldRow[j], 'D', 'L', 'U', &newRow[j], + tracebackPtr++); + } + + // swap rows + float *temp = oldRow; + oldRow = newRow; + newRow = temp; + } + + // store best score + float total = oldRow[seq2Length]; + delete[] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; + assert(alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0) { + char ch = tracebackMatrix[r * (seq2Length + 1) + c]; + switch (ch) { + case 'L': + c--; + alignment->push_back('Y'); + break; + case 'U': + r--; + alignment->push_back('X'); + break; + case 'D': + c--; + r--; + alignment->push_back('B'); + break; + default: + assert(false); + } + } + + delete[] tracebackMatrix; + + reverse(alignment->begin(), alignment->end()); + + return make_pair(alignment, total); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeAlignmentWithGapPenalties() + // + // Similar to ComputeAlignment() except with gap penalties. + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeAlignmentWithGapPenalties( + MultiSequence *align1, MultiSequence *align2, const VF &posterior, + int numSeqs1, int numSeqs2, float gapOpenPenalty, + float gapContinuePenalty) const { + int seq1Length = align1->GetSequence(0)->GetLength(); + int seq2Length = align2->GetSequence(0)->GetLength(); + SafeVector::iterator> dataPtrs1( + align1->GetNumSequences()); + SafeVector::iterator> dataPtrs2( + align2->GetNumSequences()); + + // grab character data + for (int i = 0; i < align1->GetNumSequences(); i++) + dataPtrs1[i] = align1->GetSequence(i)->GetDataPtr(); + for (int i = 0; i < align2->GetNumSequences(); i++) + dataPtrs2[i] = align2->GetSequence(i)->GetDataPtr(); + + // the number of active sequences at any given column is defined to be the + // number of non-gap characters in that column; the number of gap opens at + // any given column is defined to be the number of gap characters in that + // column where the previous character in the respective sequence was not + // a gap + SafeVector numActive1(seq1Length + 1), numGapOpens1( + seq1Length + 1); + SafeVector numActive2(seq2Length + 1), numGapOpens2( + seq2Length + 1); + + // compute number of active sequences and gap opens for each group + for (int i = 0; i < align1->GetNumSequences(); i++) { + SafeVector::iterator dataPtr = + align1->GetSequence(i)->GetDataPtr(); + numActive1[0] = numGapOpens1[0] = 0; + for (int j = 1; j <= seq1Length; j++) { + if (dataPtr[j] != '-') { + numActive1[j]++; + numGapOpens1[j] += (j != 1 && dataPtr[j - 1] != '-'); + } + } + } + for (int i = 0; i < align2->GetNumSequences(); i++) { + SafeVector::iterator dataPtr = + align2->GetSequence(i)->GetDataPtr(); + numActive2[0] = numGapOpens2[0] = 0; + for (int j = 1; j <= seq2Length; j++) { + if (dataPtr[j] != '-') { + numActive2[j]++; + numGapOpens2[j] += (j != 1 && dataPtr[j - 1] != '-'); + } + } + } + + VVF openingPenalty1(numSeqs1 + 1, VF(numSeqs2 + 1)); + VF continuingPenalty1(numSeqs1 + 1); + VVF openingPenalty2(numSeqs1 + 1, VF(numSeqs2 + 1)); + VF continuingPenalty2(numSeqs2 + 1); + + // precompute penalties + for (int i = 0; i <= numSeqs1; i++) + for (int j = 0; j <= numSeqs2; j++) + openingPenalty1[i][j] = i + * (gapOpenPenalty * j + + gapContinuePenalty * (numSeqs2 - j)); + for (int i = 0; i <= numSeqs1; i++) + continuingPenalty1[i] = i * gapContinuePenalty * numSeqs2; + for (int i = 0; i <= numSeqs2; i++) + for (int j = 0; j <= numSeqs1; j++) + openingPenalty2[i][j] = i + * (gapOpenPenalty * j + + gapContinuePenalty * (numSeqs1 - j)); + for (int i = 0; i <= numSeqs2; i++) + continuingPenalty2[i] = i * gapContinuePenalty * numSeqs1; + + float *twoRows = new float[6 * (seq2Length + 1)]; + assert(twoRows); + float *oldRowMatch = twoRows; + float *newRowMatch = twoRows + (seq2Length + 1); + float *oldRowInsertX = twoRows + 2 * (seq2Length + 1); + float *newRowInsertX = twoRows + 3 * (seq2Length + 1); + float *oldRowInsertY = twoRows + 4 * (seq2Length + 1); + float *newRowInsertY = twoRows + 5 * (seq2Length + 1); + + char *tracebackMatrix = + new char[3 * (seq1Length + 1) * (seq2Length + 1)]; + assert(tracebackMatrix); + char *tracebackPtr = tracebackMatrix; + + VF::const_iterator posteriorPtr = posterior.begin() + seq2Length + 1; + + // initialization + for (int i = 0; i <= seq2Length; i++) { + oldRowMatch[i] = oldRowInsertX[i] = (i == 0) ? 0 : LOG_ZERO; + oldRowInsertY[i] = + (i == 0) ? + 0 : + oldRowInsertY[i - 1] + + continuingPenalty2[numActive2[i]]; + *(tracebackPtr) = *(tracebackPtr + 1) = *(tracebackPtr + 2) = 'Y'; + tracebackPtr += 3; + } + + // fill in matrix + for (int i = 1; i <= seq1Length; i++) { + + // initialize left column + newRowMatch[0] = newRowInsertY[0] = LOG_ZERO; + newRowInsertX[0] = oldRowInsertX[0] + + continuingPenalty1[numActive1[i]]; + posteriorPtr++; + *(tracebackPtr) = *(tracebackPtr + 1) = *(tracebackPtr + 2) = 'X'; + tracebackPtr += 3; + + // fill in rest of row + for (int j = 1; j <= seq2Length; j++) { + + // going to MATCH state + ChooseBestOfThree(oldRowMatch[j - 1], oldRowInsertX[j - 1], + oldRowInsertY[j - 1], 'M', 'X', 'Y', &newRowMatch[j], + tracebackPtr++); + newRowMatch[j] += *(posteriorPtr++); + + // going to INSERT X state + ChooseBestOfThree( + oldRowMatch[j] + + openingPenalty1[numActive1[i]][numGapOpens2[j]], + oldRowInsertX[j] + continuingPenalty1[numActive1[i]], + oldRowInsertY[j] + + openingPenalty1[numActive1[i]][numGapOpens2[j]], + 'M', 'X', 'Y', &newRowInsertX[j], tracebackPtr++); + + // going to INSERT Y state + ChooseBestOfThree( + newRowMatch[j - 1] + + openingPenalty2[numActive2[j]][numGapOpens1[i]], + newRowInsertX[j - 1] + + openingPenalty2[numActive2[j]][numGapOpens1[i]], + newRowInsertY[j - 1] + + continuingPenalty2[numActive2[j]], 'M', 'X', + 'Y', &newRowInsertY[j], tracebackPtr++); + } + + // swap rows + float *temp; + temp = oldRowMatch; + oldRowMatch = newRowMatch; + newRowMatch = temp; + temp = oldRowInsertX; + oldRowInsertX = newRowInsertX; + newRowInsertX = temp; + temp = oldRowInsertY; + oldRowInsertY = newRowInsertY; + newRowInsertY = temp; + } + + // store best score + float total; + char matrix; + ChooseBestOfThree(oldRowMatch[seq2Length], oldRowInsertX[seq2Length], + oldRowInsertY[seq2Length], 'M', 'X', 'Y', &total, &matrix); + + delete[] twoRows; + + // compute traceback + SafeVector *alignment = new SafeVector; + assert(alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0) { + + int offset = (matrix == 'M') ? 0 : (matrix == 'X') ? 1 : 2; + char ch = tracebackMatrix[(r * (seq2Length + 1) + c) * 3 + offset]; + switch (matrix) { + case 'Y': + c--; + alignment->push_back('Y'); + break; + case 'X': + r--; + alignment->push_back('X'); + break; + case 'M': + c--; + r--; + alignment->push_back('B'); + break; + default: + assert(false); + } + matrix = ch; + } + + delete[] tracebackMatrix; + + reverse(alignment->begin(), alignment->end()); + + return make_pair(alignment, 1.0f); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::ComputeViterbiAlignment() + // + // Computes the highest probability pairwise alignment using the + // probabilistic model. The final alignment is returned as a + // pair consisting of: + // (1) a string (e.g., XXXBBXXXBBBBBBYYYYBBB) where X's and + // denote insertions in one of the two sequences and + // B's denote that both sequences are present (i.e. + // matches). + // (2) a float containing the log probability of the best + // alignment (not used) + ///////////////////////////////////////////////////////////////// + + pair *, float> ComputeViterbiAlignment(Sequence *seq1, + Sequence *seq2) const { + + assert(seq1); + assert(seq2); + + const int seq1Length = seq1->GetLength(); + const int seq2Length = seq2->GetLength(); + + // retrieve the points to the beginning of each sequence + SafeVector::iterator iter1 = seq1->GetDataPtr(); + SafeVector::iterator iter2 = seq2->GetDataPtr(); + + // create viterbi matrix + VF *viterbiPtr = new VF( + NumMatrixTypes * (seq1Length + 1) * (seq2Length + 1), LOG_ZERO); + assert(viterbiPtr); + VF &viterbi = *viterbiPtr; + + // create traceback matrix + VI *tracebackPtr = new VI( + NumMatrixTypes * (seq1Length + 1) * (seq2Length + 1), -1); + assert(tracebackPtr); + VI &traceback = *tracebackPtr; + + // initialization condition + for (int k = 0; k < NumMatrixTypes; k++) + viterbi[k] = initialDistribution[k]; + + // remember offset for each index combination + int ij = 0; + int i1j = -seq2Length - 1; + int ij1 = -1; + int i1j1 = -seq2Length - 2; + + ij *= NumMatrixTypes; + i1j *= NumMatrixTypes; + ij1 *= NumMatrixTypes; + i1j1 *= NumMatrixTypes; + + // compute viterbi scores + for (int i = 0; i <= seq1Length; i++) { + unsigned char c1 = (i == 0) ? '~' : (unsigned char) iter1[i]; + for (int j = 0; j <= seq2Length; j++) { + unsigned char c2 = (j == 0) ? '~' : (unsigned char) iter2[j]; + + if (i > 0 && j > 0) { + for (int k = 0; k < NumMatrixTypes; k++) { + float newVal = viterbi[k + i1j1] + transProb[k][0] + + matchProb[c1][c2]; + if (viterbi[0 + ij] < newVal) { + viterbi[0 + ij] = newVal; + traceback[0 + ij] = k; + } + } + } + if (i > 0) { + for (int k = 0; k < NumInsertStates; k++) { + float valFromMatch = insProb[c1][k] + viterbi[0 + i1j] + + transProb[0][2 * k + 1]; + float valFromIns = insProb[c1][k] + + viterbi[2 * k + 1 + i1j] + + transProb[2 * k + 1][2 * k + 1]; + if (valFromMatch >= valFromIns) { + viterbi[2 * k + 1 + ij] = valFromMatch; + traceback[2 * k + 1 + ij] = 0; + } else { + viterbi[2 * k + 1 + ij] = valFromIns; + traceback[2 * k + 1 + ij] = 2 * k + 1; + } + } + } + if (j > 0) { + for (int k = 0; k < NumInsertStates; k++) { + float valFromMatch = insProb[c2][k] + viterbi[0 + ij1] + + transProb[0][2 * k + 2]; + float valFromIns = insProb[c2][k] + + viterbi[2 * k + 2 + ij1] + + transProb[2 * k + 2][2 * k + 2]; + if (valFromMatch >= valFromIns) { + viterbi[2 * k + 2 + ij] = valFromMatch; + traceback[2 * k + 2 + ij] = 0; + } else { + viterbi[2 * k + 2 + ij] = valFromIns; + traceback[2 * k + 2 + ij] = 2 * k + 2; + } + } + } + + ij += NumMatrixTypes; + i1j += NumMatrixTypes; + ij1 += NumMatrixTypes; + i1j1 += NumMatrixTypes; + } + } + + // figure out best terminating cell + float bestProb = LOG_ZERO; + int state = -1; + for (int k = 0; k < NumMatrixTypes; k++) { + float thisProb = + viterbi[k + + NumMatrixTypes + * ((seq1Length + 1) * (seq2Length + 1) - 1)] + + initialDistribution[k]; + if (bestProb < thisProb) { + bestProb = thisProb; + state = k; + } + } + assert(state != -1); + + delete viterbiPtr; + + // compute traceback + SafeVector *alignment = new SafeVector; + assert(alignment); + int r = seq1Length, c = seq2Length; + while (r != 0 || c != 0) { + int newState = traceback[state + + NumMatrixTypes * (r * (seq2Length + 1) + c)]; + + if (state == 0) { + c--; + r--; + alignment->push_back('B'); + } else if (state % 2 == 1) { + r--; + alignment->push_back('X'); + } else { + c--; + alignment->push_back('Y'); + } + + state = newState; + } + + delete tracebackPtr; + + reverse(alignment->begin(), alignment->end()); + + return make_pair(alignment, bestProb); + } + + ///////////////////////////////////////////////////////////////// + // ProbabilisticModel::BuildPosterior() + // + // Builds a posterior probability matrix needed to align a pair + // of alignments. Mathematically, the returned matrix M is + // defined as follows: + // M[i,j] = sum sum f(s,t,i,j) + // s in align1 t in align2 + // where + // [ P(s[i'] <--> t[j']) + // [ if s[i'] is a letter in the ith column of align1 and + // [ t[j'] it a letter in the jth column of align2 + // f(s,t,i,j) = [ + // [ 0 otherwise + // + ///////////////////////////////////////////////////////////////// + + VF *BuildPosterior(MultiSequence *align1, MultiSequence *align2, + const SafeVector > &sparseMatrices, + float cutoff = 0.0f) const { + const int seq1Length = align1->GetSequence(0)->GetLength(); + const int seq2Length = align2->GetSequence(0)->GetLength(); + + VF *posteriorPtr = new VF((seq1Length + 1) * (seq2Length + 1), 0); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + VF::iterator postPtr = posterior.begin(); + + // for each s in align1 + for (int i = 0; i < align1->GetNumSequences(); i++) { + int first = align1->GetSequence(i)->GetLabel(); + SafeVector *mapping1 = align1->GetSequence(i)->GetMapping(); + + // for each t in align2 + for (int j = 0; j < align2->GetNumSequences(); j++) { + int second = align2->GetSequence(j)->GetLabel(); + SafeVector *mapping2 = + align2->GetSequence(j)->GetMapping(); + + if (first < second) { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[first][second]; + + for (int ii = 1; ii <= matrix->GetSeq1Length(); ii++) { + SafeVector::iterator row = matrix->GetRowPtr(ii); + int base = (*mapping1)[ii] * (seq2Length + 1); + int rowSize = matrix->GetRowSize(ii); + + // add in all relevant values + for (int jj = 0; jj < rowSize; jj++) + posterior[base + (*mapping2)[row[jj].first]] += + row[jj].second; + + // subtract cutoff + for (int jj = 0; jj < matrix->GetSeq2Length(); jj++) + posterior[base + (*mapping2)[jj]] -= cutoff; + } + + } else { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[second][first]; + + for (int jj = 1; jj <= matrix->GetSeq1Length(); jj++) { + SafeVector::iterator row = matrix->GetRowPtr(jj); + int base = (*mapping2)[jj]; + int rowSize = matrix->GetRowSize(jj); + + // add in all relevant values + for (int ii = 0; ii < rowSize; ii++) + posterior[base + + (*mapping1)[row[ii].first] + * (seq2Length + 1)] += + row[ii].second; + + // subtract cutoff + for (int ii = 0; ii < matrix->GetSeq2Length(); ii++) + posterior[base + (*mapping1)[ii] * (seq2Length + 1)] -= + cutoff; + } + + } + + delete mapping2; + } + + delete mapping1; + } + + return posteriorPtr; + } + //added by Liu Yongchao.Feb 23, 2010 + VF *BuildPosterior(int* seqsWeights, MultiSequence *align1, + MultiSequence *align2, + const SafeVector > &sparseMatrices, + float cutoff = 0.0f) const { + const int seq1Length = align1->GetSequence(0)->GetLength(); + const int seq2Length = align2->GetSequence(0)->GetLength(); + + VF *posteriorPtr = new VF((seq1Length + 1) * (seq2Length + 1), 0); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + VF::iterator postPtr = posterior.begin(); + + //compute the total sum of all weights + float totalWeights = 0; + for (int i = 0; i < align1->GetNumSequences(); i++) { + int first = align1->GetSequence(i)->GetLabel(); + int w1 = seqsWeights[first]; + for (int j = 0; j < align2->GetNumSequences(); j++) { + int second = align2->GetSequence(j)->GetLabel(); + int w2 = seqsWeights[second]; + + totalWeights += w1 * w2; + } + } + // for each s in align1 + for (int i = 0; i < align1->GetNumSequences(); i++) { + int first = align1->GetSequence(i)->GetLabel(); + int w1 = seqsWeights[first]; + SafeVector *mapping1 = align1->GetSequence(i)->GetMapping(); + // for each t in align2 + for (int j = 0; j < align2->GetNumSequences(); j++) { + int second = align2->GetSequence(j)->GetLabel(); + int w2 = seqsWeights[second]; + SafeVector *mapping2 = + align2->GetSequence(j)->GetMapping(); + + float w = (float) (w1 * w2) / totalWeights; + if (first < second) { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[first][second]; + + for (int ii = 1; ii <= matrix->GetSeq1Length(); ii++) { + SafeVector::iterator row = matrix->GetRowPtr(ii); + int base = (*mapping1)[ii] * (seq2Length + 1); + int rowSize = matrix->GetRowSize(ii); + + // add in all relevant values + for (int jj = 0; jj < rowSize; jj++) + posterior[base + (*mapping2)[row[jj].first]] += w + * row[jj].second; + + // subtract cutoff + for (int jj = 0; jj < matrix->GetSeq2Length(); jj++) + posterior[base + (*mapping2)[jj]] -= w * cutoff; + } + + } else { + + // get the associated sparse matrix + SparseMatrix *matrix = sparseMatrices[second][first]; + + for (int jj = 1; jj <= matrix->GetSeq1Length(); jj++) { + SafeVector::iterator row = matrix->GetRowPtr(jj); + int base = (*mapping2)[jj]; + int rowSize = matrix->GetRowSize(jj); + + // add in all relevant values + for (int ii = 0; ii < rowSize; ii++) + posterior[base + + (*mapping1)[row[ii].first] + * (seq2Length + 1)] += w + * row[ii].second; + + // subtract cutoff + for (int ii = 0; ii < matrix->GetSeq2Length(); ii++) + posterior[base + (*mapping1)[ii] * (seq2Length + 1)] -= + w * cutoff; + } + + } + + delete mapping2; + } + + delete mapping1; + } + + return posteriorPtr; + } +}; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/SafeVector.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/SafeVector.h new file mode 100644 index 0000000..f42c2da --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/SafeVector.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////// +// SafeVector.h +// +// STL vector with array bounds checking. To enable bounds +// checking, #define ENABLE_CHECKS. +///////////////////////////////////////////////////////////////// + +#ifndef SAFEVECTOR_H +#define SAFEVECTOR_H + +#include +#include +using namespace std; + +///////////////////////////////////////////////////////////////// +// SafeVector +// +// Class derived from the STL std::vector for bounds checking. +///////////////////////////////////////////////////////////////// + +template +class SafeVector: public std::vector { +public: + + // miscellaneous constructors + SafeVector() : + std::vector() { + } + SafeVector(size_t size) : + std::vector(size) { + } + SafeVector(size_t size, const TYPE &value) : + std::vector(size, value) { + } + SafeVector(const SafeVector &source) : + std::vector(source) { + } + +#ifdef ENABLE_CHECKS + + // [] array bounds checking + TYPE &operator[](int index) { + assert (index >= 0 && index < (int) size()); + return std::vector::operator[] ((size_t) index); + } + + // [] const array bounds checking + const TYPE &operator[] (int index) const { + assert (index >= 0 && index < (int) size()); + return std::vector::operator[] ((size_t) index); + } + +#endif + +}; + +// some commonly used vector types +typedef SafeVector VI; +typedef SafeVector VVI; +typedef SafeVector VVVI; +typedef SafeVector VF; +typedef SafeVector VVF; +typedef SafeVector VVVF; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/ScoreType.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/ScoreType.h new file mode 100644 index 0000000..47de13d --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/ScoreType.h @@ -0,0 +1,368 @@ +///////////////////////////////////////////////////////////////// +// ScoreType.h +// +// Routines for doing math operations in MSAPROBS +///////////////////////////////////////////////////////////////// + +#ifndef SCORETYPE_H +#define SCORETYPE_H + +#include +#include +#include +#include + +typedef float ScoreType; + +const float LOG_ZERO = -2e20; +const float LOG_ONE = 0.0; + +///////////////////////////////////////////////////////////////// +// LOG() +// +// Compute the logarithm of x. +///////////////////////////////////////////////////////////////// + +inline ScoreType LOG(ScoreType x) { + return log(x); +} + +///////////////////////////////////////////////////////////////// +// EXP() +// +// Computes exp(x). +///////////////////////////////////////////////////////////////// + +inline ScoreType EXP(ScoreType x) { + //return exp(x); + if (x > -2) { + if (x > -0.5) { + if (x > 0) + return exp(x); + return (((0.03254409303190190000 * x + 0.16280432765779600000) * x + + 0.49929760485974900000) * x + 0.99995149601363700000) * x + + 0.99999925508501600000; + } + if (x > -1) + return (((0.01973899026052090000 * x + 0.13822379685007000000) * x + + 0.48056651562365000000) * x + 0.99326940370383500000) * x + + 0.99906756856399500000; + return (((0.00940528203591384000 * x + 0.09414963667859410000) * x + + 0.40825793595877300000) * x + 0.93933625499130400000) * x + + 0.98369508190545300000; + } + if (x > -8) { + if (x > -4) + return (((0.00217245711583303000 * x + 0.03484829428350620000) * x + + 0.22118199801337800000) * x + 0.67049462206469500000) * x + + 0.83556950223398500000; + return (((0.00012398771025456900 * x + 0.00349155785951272000) * x + + 0.03727721426017900000) * x + 0.17974997741536900000) * x + + 0.33249299994217400000; + } + if (x > -16) + return (((0.00000051741713416603 * x + 0.00002721456879608080) * x + + 0.00053418601865636800) * x + 0.00464101989351936000) * x + + 0.01507447981459420000; + return 0; +} + +/* + ///////////////////////////////////////////////////////////////// + // LOOKUP() + // + // Computes log (exp (x) + 1), for 0 <= x <= 7.5. + ///////////////////////////////////////////////////////////////// + + inline ScoreType LOOKUP (ScoreType x){ + //return log (exp(x) + 1); + if (x < 2){ + if (x < 0.5){ + if (x < 0) + return log (exp(x) + 1); + return (((-0.00486373205785640000*x - 0.00020245408813934800)*x + 0.12504222666029800000)*x + 0.49999685320563000000)*x + 0.69314723138948900000; + } + if (x < 1) + return (((-0.00278634205460548000*x - 0.00458097251248546000)*x + 0.12865849880472500000)*x + 0.49862228499205200000)*x + 0.69334810088688000000; + return (((0.00059633755154209200*x - 0.01918996666063320000)*x + 0.15288232492093800000)*x + 0.48039958825756900000)*x + 0.69857578503189200000; + } + if (x < 8){ + if (x < 4) + return (((0.00135958539181047000*x - 0.02329807659316430000)*x + 0.15885799609532100000)*x + 0.48167498563270800000)*x + 0.69276185058669200000; + return (((0.00011992394456683500*x - 0.00338464503306568000)*x + 0.03622746366545470000)*x + 0.82481250248383700000)*x + 0.32507892994863100000; + } + if (x < 16) + return (((0.00000051726300753785*x - 0.00002720671238876090)*x + 0.00053403733818413500)*x + 0.99536021775747900000)*x + 0.01507065715532010000; + return x; + } + + ///////////////////////////////////////////////////////////////// + // LOOKUP_SLOW() + // + // Computes log (exp (x) + 1). + ///////////////////////////////////////////////////////////////// + + inline ScoreType LOOKUP_SLOW (ScoreType x){ + return log (exp (x) + 1); + } + + ///////////////////////////////////////////////////////////////// + // MAX() + // + // Compute max of three numbers + ///////////////////////////////////////////////////////////////// + + inline ScoreType MAX (ScoreType x, ScoreType y, ScoreType z){ + if (x >= y){ + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; + } + + ///////////////////////////////////////////////////////////////// + // LOG_PLUS_EQUALS() + // + // Add two log probabilities and store in the first argument + ///////////////////////////////////////////////////////////////// + + inline void LOG_PLUS_EQUALS (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; + } + + ///////////////////////////////////////////////////////////////// + // LOG_PLUS_EQUALS_SLOW() + // + // Add two log probabilities and store in the first argument + ///////////////////////////////////////////////////////////////// + + inline void LOG_PLUS_EQUALS_SLOW (ScoreType &x, ScoreType y){ + if (x < y) + x = (x <= LOG_ZERO) ? y : LOOKUP_SLOW(y-x) + x; + else + x = (y <= LOG_ZERO) ? x : LOOKUP_SLOW(x-y) + y; + } + + ///////////////////////////////////////////////////////////////// + // LOG_ADD() + // + // Add two log probabilities + ///////////////////////////////////////////////////////////////// + + inline ScoreType LOG_ADD (ScoreType x, ScoreType y){ + if (x < y) return (x <= LOG_ZERO) ? y : LOOKUP(y-x) + x; + return (y <= LOG_ZERO) ? x : LOOKUP(x-y) + y; + } + */ + +/* + ///////////////////////////////////////////////////////////////// + // LOG() + // + // Compute the logarithm of x. + ///////////////////////////////////////////////////////////////// + + inline float LOG (float x){ + return log (x); + } + + ///////////////////////////////////////////////////////////////// + // EXP() + // + // Computes exp(x), fr -4.6 <= x <= 0. + ///////////////////////////////////////////////////////////////// + + inline float EXP (float x){ + assert (x <= 0.00f); + if (x < EXP_UNDERFLOW_THRESHOLD) return 0.0f; + return (((0.006349841068584 * x + 0.080775412572352) * x + 0.397982026296272) * x + 0.95279335963787f) * x + 0.995176455837312f; + //return (((0.00681169825657f * x + 0.08386267698832f) * x + 0.40413983195844f) * x + 0.95656674979767f) * x + 0.99556744049130f; + } + */ + +const float EXP_UNDERFLOW_THRESHOLD = -4.6; +const float LOG_UNDERFLOW_THRESHOLD = 7.5; + +///////////////////////////////////////////////////////////////// +// LOOKUP() +// +// Computes log (exp (x) + 1), for 0 <= x <= 7.5. +///////////////////////////////////////////////////////////////// + +inline float LOOKUP(float x) { + assert(x >= 0.00f); + assert(x <= LOG_UNDERFLOW_THRESHOLD); + //return ((-0.00653779113685f * x + 0.09537236626558f) * x + 0.55317574459331f) * x + 0.68672959851568f; + if (x <= 1.00f) + return ((-0.009350833524763f * x + 0.130659527668286f) * x + + 0.498799810682272f) * x + 0.693203116424741f; + if (x <= 2.50f) + return ((-0.014532321752540f * x + 0.139942324101744f) * x + + 0.495635523139337f) * x + 0.692140569840976f; + if (x <= 4.50f) + return ((-0.004605031767994f * x + 0.063427417320019f) * x + + 0.695956496475118f) * x + 0.514272634594009f; + assert(x <= LOG_UNDERFLOW_THRESHOLD); + return ((-0.000458661602210f * x + 0.009695946122598f) * x + + 0.930734667215156f) * x + 0.168037164329057f; + + //return (((0.00089738532761f * x - 0.01859488697982f) * x + 0.14415772028626f) * x + 0.49515490689159f) * x + 0.69311928966454f; +} + +///////////////////////////////////////////////////////////////// +// LOOKUP_SLOW() +// +// Computes log (exp (x) + 1). +///////////////////////////////////////////////////////////////// + +inline float LOOKUP_SLOW(float x) { + return log(exp(x) + 1); +} + +///////////////////////////////////////////////////////////////// +// MAX() +// +// Compute max of three numbers +///////////////////////////////////////////////////////////////// + +inline float MAX(float x, float y, float z) { + if (x >= y) { + if (x >= z) + return x; + return z; + } + if (y >= z) + return y; + return z; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS(float &x, float y) { + if (x < y) + x = (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? + y : LOOKUP(y - x) + x; + else + x = (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? + x : LOOKUP(x - y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_PLUS_EQUALS_SLOW() +// +// Add two log probabilities and store in the first argument +///////////////////////////////////////////////////////////////// + +inline void LOG_PLUS_EQUALS_SLOW(float &x, float y) { + if (x < y) + x = (x == LOG_ZERO) ? y : LOOKUP_SLOW(y - x) + x; + else + x = (y == LOG_ZERO) ? x : LOOKUP_SLOW(x - y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add two log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x, float y) { + if (x < y) + return (x == LOG_ZERO || y - x >= LOG_UNDERFLOW_THRESHOLD) ? + y : LOOKUP(y - x) + x; + return (y == LOG_ZERO || x - y >= LOG_UNDERFLOW_THRESHOLD) ? + x : LOOKUP(x - y) + y; +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add three log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3) { + return LOG_ADD(x1, LOG_ADD(x2, x3)); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add four log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4) { + return LOG_ADD(x1, LOG_ADD(x2, LOG_ADD(x3, x4))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add five log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4, float x5) { + return LOG_ADD(x1, LOG_ADD(x2, LOG_ADD(x3, LOG_ADD(x4, x5)))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add siz log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4, float x5, + float x6) { + return LOG_ADD(x1, LOG_ADD(x2, LOG_ADD(x3, LOG_ADD(x4, LOG_ADD(x5, x6))))); +} + +///////////////////////////////////////////////////////////////// +// LOG_ADD() +// +// Add seven log probabilities +///////////////////////////////////////////////////////////////// + +inline float LOG_ADD(float x1, float x2, float x3, float x4, float x5, float x6, + float x7) { + return LOG_ADD(x1, + LOG_ADD(x2, LOG_ADD(x3, LOG_ADD(x4, LOG_ADD(x5, LOG_ADD(x6, x7)))))); +} + +///////////////////////////////////////////////////////////////// +// ChooseBestOfThree() +// +// Store the largest of three values x1, x2, and x3 in *x. Also +// if xi is the largest value, then store bi in *b. +///////////////////////////////////////////////////////////////// + +inline void ChooseBestOfThree(float x1, float x2, float x3, char b1, char b2, + char b3, float *x, char *b) { + if (x1 >= x2) { + if (x1 >= x3) { + *x = x1; + *b = b1; + return; + } + *x = x3; + *b = b3; + return; + } + if (x2 >= x3) { + *x = x2; + *b = b2; + return; + } + *x = x3; + *b = b3; +} + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/Sequence.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/Sequence.h new file mode 100644 index 0000000..5bd1ef9 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/Sequence.h @@ -0,0 +1,444 @@ +///////////////////////////////////////////////////////////////// +// Sequence.h +// +// Class for reading/manipulating single sequence character data. +///////////////////////////////////////////////////////////////// + +#ifndef SEQUENCE_H +#define SEQUENCE_H + +#include +#include +#include +#include +#include +#include "SafeVector.h" +#include "FileBuffer.h" + +///////////////////////////////////////////////////////////////// +// Sequence +// +// Class for storing sequence information. +///////////////////////////////////////////////////////////////// + +class Sequence { + + bool isValid; // a boolean indicating whether the sequence data is valid or not + string header; // string containing the comment line of the FASTA file + SafeVector *data; // pointer to character data + int length; // length of the sequence + int sequenceLabel; // integer sequence label, typically to indicate the ordering of sequences + // in a Multi-FASTA file + int inputLabel; // position of sequence in original input + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Default constructor. Does nothing. + ///////////////////////////////////////////////////////////////// + + Sequence() : + isValid(false), header(""), data(NULL), length(0), sequenceLabel(0), inputLabel( + 0) { + } + +public: + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Constructor. Reads the sequence from a FileBuffer. + ///////////////////////////////////////////////////////////////// + + Sequence(FileBuffer &infile, bool stripGaps = false) : + isValid(false), header("~"), data(NULL), length(0), sequenceLabel( + 0), inputLabel(0) { + + // read until the first non-blank line + while (!infile.eof()) { + infile.GetLine(header); + if (header.length() != 0) + break; + } + + // check to make sure that it is a correct header line + if (header[0] == '>') { + + // if so, remove the leading ">" + header = header.substr(1); + + // remove any leading or trailing white space in the header comment + while (header.length() > 0 && isspace(header[0])) + header = header.substr(1); + while (header.length() > 0 && isspace(header[header.length() - 1])) + header = header.substr(0, header.length() - 1); + + // get ready to read the data[] array; note that data[0] is always '@' + char ch; + data = new SafeVector; + assert(data); + data->push_back('@'); + + // get a character from the file + while (infile.Get(ch)) { + + // if we've reached a new comment line, put the character back and stop + if (ch == '>') { + infile.UnGet(); + break; + } + + // skip whitespace + if (isspace(ch)) + continue; + + // substitute gap character + if (ch == '.') + ch = '-'; + if (stripGaps && ch == '-') + continue; + + // check for known characters + if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))) { + cerr << "ERROR: Unknown character encountered: " << ch + << endl; + exit(1); + } + + // everything's ok so far, so just store this character. + if (ch >= 'a' && ch <= 'z') { + ch = ch - 'a' + 'A'; + } //change to upper case. fixed by Liu Yongchao, May 21, 2010 + + data->push_back(ch); + ++length; + } + + // sequence must contain data in order to be valid + isValid = length > 0; + if (!isValid) { + delete data; + data = NULL; + } + } + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Constructor. Builds a sequence from existing data. Note + // that the data must use one-based indexing where data[0] should + // be set to '@'. + ///////////////////////////////////////////////////////////////// + + Sequence(SafeVector *data, string header, int length, + int sequenceLabel, int inputLabel) : + isValid(data != NULL), header(header), data(data), length(length), sequenceLabel( + sequenceLabel), inputLabel(inputLabel) { + assert(data); + assert((*data)[0] == '@'); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Sequence() + // + // Destructor. Release allocated memory. + ///////////////////////////////////////////////////////////////// + + ~Sequence() { + if (data) { + assert(isValid); + delete data; + data = NULL; + isValid = false; + } + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetHeader() + // + // Return the string comment associated with this sequence. + ///////////////////////////////////////////////////////////////// + + string GetHeader() const { + return header; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetName() + // + // Return the first word of the string comment associated with this sequence. + ///////////////////////////////////////////////////////////////// + + string GetName() const { + char name[1024]; + sscanf(header.c_str(), "%s", name); + return string(name); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetDataPtr() + // + // Return the iterator to data associated with this sequence. + ///////////////////////////////////////////////////////////////// + + SafeVector::iterator GetDataPtr() { + assert(isValid); + assert(data); + return data->begin(); + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetPosition() + // + // Return the character at position i. Recall that the character + // data is stored with one-based indexing. + ///////////////////////////////////////////////////////////////// + + char GetPosition(int i) const { + assert(isValid); + assert(data); + assert(i >= 1 && i <= length); + return (*data)[i]; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::SetLabel() + // + // Sets the sequence label to i. + ///////////////////////////////////////////////////////////////// + + void SetLabel(int i) { + assert(isValid); + sequenceLabel = i; + inputLabel = i; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::SetSortLabel() + // + // Sets the sequence sorting label to i. + ///////////////////////////////////////////////////////////////// + + void SetSortLabel(int i) { + assert(isValid); + sequenceLabel = i; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetLabel() + // + // Retrieves the input label. + ///////////////////////////////////////////////////////////////// + + int GetLabel() const { + assert(isValid); + return inputLabel; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetSortLabel() + // + // Retrieves the sorting label. + ///////////////////////////////////////////////////////////////// + + int GetSortLabel() const { + assert(isValid); + return sequenceLabel; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Fail() + // + // Checks to see if the sequence successfully loaded. + ///////////////////////////////////////////////////////////////// + + bool Fail() const { + return !isValid; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Length() + // + // Returns the length of the sequence. + ///////////////////////////////////////////////////////////////// + + int GetLength() const { + assert(isValid); + assert(data); + return length; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::WriteMFA() + // + // Writes the sequence to outfile in MFA format. Uses numColumns + // columns per line. If useIndex is set to false, then the + // header is printed as normal, but if useIndex is true, then + // ">S###" is printed where ### represents the sequence label. + ///////////////////////////////////////////////////////////////// + + void WriteMFA(ostream &outfile, int numColumns, + bool useIndex = false) const { + assert(isValid); + assert(data); + assert(!outfile.fail()); + + // print out heading + if (useIndex) + outfile << ">S" << GetLabel() << endl; + else + outfile << ">" << header << endl; + + // print out character data + int ct = 1; + for (; ct <= length; ct++) { + outfile << (*data)[ct]; + if (ct % numColumns == 0) + outfile << endl; + } + if ((ct - 1) % numColumns != 0) + outfile << endl; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Clone() + // + // Returns a new deep copy of the seqeuence. + ///////////////////////////////////////////////////////////////// + + Sequence *Clone() const { + Sequence *ret = new Sequence(); + assert(ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; + assert(ret->data); + *(ret->data) = *data; + ret->length = length; + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetRange() + // + // Returns a new sequence object consisting of a range of + // characters from the current seuquence. + ///////////////////////////////////////////////////////////////// + + Sequence *GetRange(int start, int end) const { + Sequence *ret = new Sequence(); + assert(ret); + + assert(start >= 1 && start <= length); + assert(end >= 1 && end <= length); + assert(start <= end); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; + assert(ret->data); + ret->data->push_back('@'); + for (int i = start; i <= end; i++) + ret->data->push_back((*data)[i]); + ret->length = end - start + 1; + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::AddGaps() + // + // Given an SafeVector containing the skeleton for an + // alignment and the identity of the current character, this + // routine will create a new sequence with all necesssary gaps added. + // For instance, + // alignment = "XXXBBYYYBBYYXX" + // id = 'X' + // will perform the transformation + // "ATGCAGTCA" --> "ATGCC---GT--CA" + // (XXXBBYYYBBYYXX) + ///////////////////////////////////////////////////////////////// + + Sequence *AddGaps(SafeVector *alignment, char id) { + Sequence *ret = new Sequence(); + assert(ret); + + ret->isValid = isValid; + ret->header = header; + ret->data = new SafeVector; + assert(ret->data); + ret->length = (int) alignment->size(); + ret->sequenceLabel = sequenceLabel; + ret->inputLabel = inputLabel; + ret->data->push_back('@'); + + SafeVector::iterator dataIter = data->begin() + 1; + for (SafeVector::iterator iter = alignment->begin(); + iter != alignment->end(); ++iter) { + if (*iter == 'B' || *iter == id) { + ret->data->push_back(*dataIter); + ++dataIter; + } else + ret->data->push_back('-'); + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetString() + // + // Returns the sequence as a string with gaps removed. + ///////////////////////////////////////////////////////////////// + + string GetString() { + string s = ""; + for (int i = 1; i <= length; i++) { + if ((*data)[i] != '-') + s += (*data)[i]; + } + return s; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::GetMapping() + // + // Returns a SafeVector containing the indices of every + // character in the sequence. For instance, if the data is + // "ATGCC---GT--CA", the method returns {1,2,3,4,5,9,10,13,14}. + ///////////////////////////////////////////////////////////////// + + SafeVector *GetMapping() const { + SafeVector *ret = new SafeVector(1, 0); + for (int i = 1; i <= length; i++) { + if ((*data)[i] != '-') + ret->push_back(i); + } + return ret; + } + + ///////////////////////////////////////////////////////////////// + // Sequence::Highlight() + // + // Changes all positions with score >= cutoff to upper case and + // all positions with score < cutoff to lower case. + ///////////////////////////////////////////////////////////////// + + void Highlight(const SafeVector &scores, const float cutoff) { + for (int i = 1; i <= length; i++) { + if (scores[i - 1] >= cutoff) + (*data)[i] = toupper((*data)[i]); + else + (*data)[i] = tolower((*data)[i]); + } + } +}; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/SparseMatrix.h b/binaries/src/MSAProbs-0.9.7/MSAProbs/SparseMatrix.h new file mode 100644 index 0000000..51b273d --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/SparseMatrix.h @@ -0,0 +1,266 @@ +///////////////////////////////////////////////////////////////// +// SparseMatrix.h +// +// Sparse matrix computations +///////////////////////////////////////////////////////////////// + +#ifndef SPARSEMATRIX_H +#define SPARSEMATRIX_H + +#include + +using namespace std; + +const float POSTERIOR_CUTOFF = 0.01; // minimum posterior probability +// value that is maintained in the +// sparse matrix representation + +typedef pair PIF; // Sparse matrix entry type +// first --> column +// second --> value + +///////////////////////////////////////////////////////////////// +// SparseMatrix +// +// Class for sparse matrix computations +///////////////////////////////////////////////////////////////// + +class SparseMatrix { + + int seq1Length, seq2Length; // dimensions of matrix + VI rowSize; // rowSize[i] = # of cells in row i + SafeVector data; // data values + SafeVector::iterator> rowPtrs; // pointers to the beginning of each row + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::SparseMatrix() + // + // Private constructor. + ///////////////////////////////////////////////////////////////// + + SparseMatrix() { + } + +public: + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::SparseMatrix() + // + // Constructor. Builds a sparse matrix from a posterior matrix. + // Note that the expected format for the posterior matrix is as + // a (seq1Length+1) x (seq2Length+1) matrix where the 0th row + // and 0th column are ignored (they should contain all zeroes). + ///////////////////////////////////////////////////////////////// + + SparseMatrix(int seq1Length, int seq2Length, const VF &posterior) : + seq1Length(seq1Length), seq2Length(seq2Length) { + + int numCells = 0; + + assert(seq1Length > 0); + assert(seq2Length > 0); + + // calculate memory required; count the number of cells in the + // posterior matrix above the threshold + VF::const_iterator postPtr = posterior.begin(); + for (int i = 0; i <= seq1Length; i++) { + for (int j = 0; j <= seq2Length; j++) { + if (*(postPtr++) >= POSTERIOR_CUTOFF) { + assert(i != 0 && j != 0); + numCells++; + } + } + } + + // allocate memory + data.resize(numCells); + rowSize.resize(seq1Length + 1); + rowSize[0] = -1; + rowPtrs.resize(seq1Length + 1); + rowPtrs[0] = data.end(); + + // build sparse matrix + postPtr = posterior.begin() + seq2Length + 1; // note that we're skipping the first row here + SafeVector::iterator dataPtr = data.begin(); + for (int i = 1; i <= seq1Length; i++) { + postPtr++; // and skipping the first column of each row + rowPtrs[i] = dataPtr; + for (int j = 1; j <= seq2Length; j++) { + if (*postPtr >= POSTERIOR_CUTOFF) { + dataPtr->first = j; + dataPtr->second = *postPtr; + dataPtr++; + } + postPtr++; + } + rowSize[i] = dataPtr - rowPtrs[i]; + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowPtr() + // + // Returns the pointer to a particular row in the sparse matrix. + ///////////////////////////////////////////////////////////////// + + SafeVector::iterator GetRowPtr(int row) const { + assert(row >= 1 && row <= seq1Length); + return rowPtrs[row]; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetValue() + // + // Returns value at a particular row, column. + ///////////////////////////////////////////////////////////////// + + float GetValue(int row, int col) { + assert(row >= 1 && row <= seq1Length); + assert(col >= 1 && col <= seq2Length); + for (int i = 0; i < rowSize[row]; i++) { + if (rowPtrs[row][i].first == col) + return rowPtrs[row][i].second; + } + return 0; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowSize() + // + // Returns the number of entries in a particular row. + ///////////////////////////////////////////////////////////////// + + int GetRowSize(int row) const { + assert(row >= 1 && row <= seq1Length); + return rowSize[row]; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetSeq1Length() + // + // Returns the first dimension of the matrix. + ///////////////////////////////////////////////////////////////// + + int GetSeq1Length() const { + return seq1Length; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetSeq2Length() + // + // Returns the second dimension of the matrix. + ///////////////////////////////////////////////////////////////// + + int GetSeq2Length() const { + return seq2Length; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetRowPtr + // + // Returns the pointer to a particular row in the sparse matrix. + ///////////////////////////////////////////////////////////////// + + int GetNumCells() const { + return data.size(); + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::Print() + // + // Prints out a sparse matrix. + ///////////////////////////////////////////////////////////////// + + void Print(ostream &outfile) const { + outfile << "Sparse Matrix:" << endl; + for (int i = 1; i <= seq1Length; i++) { + outfile << " " << i << ":"; + for (int j = 0; j < rowSize[i]; j++) { + outfile << " (" << rowPtrs[i][j].first << "," + << rowPtrs[i][j].second << ")"; + } + outfile << endl; + } + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::ComputeTranspose() + // + // Returns a new sparse matrix containing the transpose of the + // current matrix. + ///////////////////////////////////////////////////////////////// + + SparseMatrix *ComputeTranspose() const { + + // create a new sparse matrix + SparseMatrix *ret = new SparseMatrix(); + int numCells = data.size(); + + ret->seq1Length = seq2Length; + ret->seq2Length = seq1Length; + + // allocate memory + ret->data.resize(numCells); + ret->rowSize.resize(seq2Length + 1); + ret->rowSize[0] = -1; + ret->rowPtrs.resize(seq2Length + 1); + ret->rowPtrs[0] = ret->data.end(); + + // compute row sizes + for (int i = 1; i <= seq2Length; i++) + ret->rowSize[i] = 0; + for (int i = 0; i < numCells; i++) + ret->rowSize[data[i].first]++; + + // compute row ptrs + for (int i = 1; i <= seq2Length; i++) { + ret->rowPtrs[i] = + (i == 1) ? + ret->data.begin() : + ret->rowPtrs[i - 1] + ret->rowSize[i - 1]; + } + + // now fill in data + SafeVector::iterator> currPtrs = ret->rowPtrs; + + for (int i = 1; i <= seq1Length; i++) { + SafeVector::iterator row = rowPtrs[i]; + for (int j = 0; j < rowSize[i]; j++) { + currPtrs[row[j].first]->first = i; + currPtrs[row[j].first]->second = row[j].second; + currPtrs[row[j].first]++; + } + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + // SparseMatrix::GetPosterior() + // + // Return the posterior representation of the sparse matrix. + ///////////////////////////////////////////////////////////////// + + VF *GetPosterior() const { + + // create a new posterior matrix + VF *posteriorPtr = new VF((seq1Length + 1) * (seq2Length + 1)); + assert(posteriorPtr); + VF &posterior = *posteriorPtr; + + // build the posterior matrix + for (int i = 0; i < (seq1Length + 1) * (seq2Length + 1); i++) + posterior[i] = 0; + for (int i = 1; i <= seq1Length; i++) { + VF::iterator postPtr = posterior.begin() + i * (seq2Length + 1); + for (int j = 0; j < rowSize[i]; j++) { + postPtr[rowPtrs[i][j].first] = rowPtrs[i][j].second; + } + } + + return posteriorPtr; + } + +}; + +#endif diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/main.cpp b/binaries/src/MSAProbs-0.9.7/MSAProbs/main.cpp new file mode 100644 index 0000000..6fd1934 --- /dev/null +++ b/binaries/src/MSAProbs-0.9.7/MSAProbs/main.cpp @@ -0,0 +1,16 @@ +/*********************************************** + * # Copyright 2009-2010. Liu Yongchao + * # Contact: Liu Yongchao, School of Computer Engineering, + * # Nanyang Technological University. + * # Emails: liuy0039@ntu.edu.sg; nkcslyc@hotmail.com + * # + * # GPL version 3.0 applies. + * # + * ************************************************/ +#include "MSA.h" + +int main(int argc, char* argv[]) { + MSA msa(argc, argv); + + return 0; +} diff --git a/binaries/src/MSAProbs-0.9.7/MSAProbs/msaprobs b/binaries/src/MSAProbs-0.9.7/MSAProbs/msaprobs new file mode 100755 index 0000000000000000000000000000000000000000..e7e06a481101752e83cb65b25856657086aca105 GIT binary patch literal 215232 zcmce933wD$)^;appuuP*8Z}}ZBDQ0qfC-Dz0-A;nREKVetO3ygO%ODYm~^EE2q@%#-&<9k3eYq2{onum&6BD+ z%RTqpbI-l^+@*>Y`M$A<2?;jymuS1uMrha2Jb}`$Hd~E5Nx;11*@oMC<9eAb!`2gU z4}l|vw7hQj4nwqgcL=J@Mrn5Z4Nue&!xQtwgL%);(a1snnHuuW{JMU5#-o0}_X1r{ z^KP?c3OdtK*QYMi=}%o25P0+ca(@BZY&RKqBOTRax?M)PT}C?do@wZB-p%r{Z2X&I z(5EEk0V15oo6RGxU3c>GSNLUc9-j;M>InVeh6uN!#X&_R`Dg9eLor+|mN<0ecc zyNzO~UpoG%a~l3w6QtLS|I>`cKW+`@?;pMD^WQdq(X{K6mq{zdAJg^1-^#zFmJUrg zH_d^!Y9h zzBNvJoEHawK^%V`6URPlfutj$h4=W1osR_|!Q1N8|9{8pl5G#?kYaaqM<14*&OY{PuTo_^*#+hcDyU`Sm#X zYvb6VGfqFSHV%Ge9QlvODc8n0c217dF4E%2?-9rUua9H5)HwJxapZ*K=y`jba$OO} zp2Ope%k6RW*%qf=9Ejsr6XNLk=Q#2w#L-8NBc}=FO11U1)#L@>0XAC-+5>;jLeI;A zU*p#CH3Dn1%{Ka(ya9OzM!#)>-;%#(w9a2-P)|TU@itF){6f(Cy$HM^$Head{x_7Lugf>_J>YLFSEhl7n~7gql0L4boTmRBC>P~t8u}L+ z{13vOl(WykoA!AUbdHaO1M>_{{q`96DW}HJv&NuaVbn|GwRr}{xM99g8Jrim<{Hj1 zuCo;v-@d49adBmEPDQY|*j8L{ck!f>+ZR>_ODe{c&Z(>{sk9Y)r}&HKl~fq$DgH5~ zWs6Iu%$ZwSqSMYwDGx5FD48>_I51~%prq7RJafY2%At^5o|{ulah1V}vU~C;jh{Tn z8_0(mf$BNM+cE({dUUszf)w`#sOFgci;8(1)> zqBvMFXJN1s67oH{`FE3h{N&)UK=7XO5+HMjAgd({=anojUbuK+P%t3r^~J?du53y1 zTC}(9!MeuC-xv77turx;XSCoiq5n8z5fQuF`o)aw5%Xt0mB|*%PQLB)7 zTHWgwv=omvr?rjZT@TIXdM6Jpo;<90N^UW{jY^KmW$jijGJI_K!m>(HkfC0u1Q!uP77k^PkY5 z+=X}NvP%oFyDnzWhju%^j9v~cx?1YO#es^FMJ0=aXzNydtObh%6=!wx|Em_ZQ1tXA z)##%GLGS#0bU+IyO%YuL+TGCk3m3x|#s}B{Mejcs1I%KK7s0>+mT(HR{7Thy!$)fV$J?O8>F{qVQ%(=ZpZ|||b?_UifdJ`0=k&rlg`mH;36o{$-yO8;`qn8tm;V7yjFRV_u2b zZ@@LWx)W=+(KVV1r7EwlC_xl*cS*kPRbAa`Y02W-gA0nGeOX1!cVfeU7GUP4ld?sZUl{p1q~a_D-{768{EI~Bq4dB7@80>FVe&1lIn6B z{^r{%@2UvSx0RONj?2Qix0fv{Cqu4n+(dt2aiC&ha3MzUV(4T8sTjda@#3mQ#pM-c zfl8gHw5+V0^y0;3OAy0akn`?A;0whUqwCbs<#Q?!rk3dPL=G{G2;5_N7%?}p5~xZe zTODm=98*qDD#Qt8%zSk`OBDzdSL($op1ODm`fJ4Rl~s#MSY#u|rM$s=j0TA@zZy1MRI(_rs2pOdQ2i7$zZ|i4a6WUe%}1UA!BT#YZN7+? zZIzXnj-c{_n9fw#<}X1#m5^mo+1&^timA0R6iTss0a2JF=4e(Ovxr^A3;k3XQJ&K{OSLa#hpBq zkSP8LnSV^B=gfN#Bj0m{lpZ!x6K&^-Ym%UuC31k<%*E7zava#>O0Z>PjltX>Dg5a@ zn3A^H0Z>&W)bdTbI17Y zw%ZMPg`hw7$P+NsdA0(BKW*VcJSE$v8nB*UPmv$x1utR#c3W{wUV?3yk$)!WI)9Qy zKRZgG>w=q2S&@wufIhZ64f#7>xD%D^u-#+8b2^>`y_YR)z`^XFV@V;=_Nb9xM?Zc2 zfwhZb#D3;F20f-ChPB1kTZk{U;LY_G;ul%)=DGy&ODuSEy@mKP3*KC>Af9Xgv7fOn zL40`(iFF+dzS4p>*D=U{uLW^IzkXWr&7&w^*&m_ONqr%vXt(1JJDj7Tf8;NfVo-)svWOJ=d(0t+5) z82go5@K!&mw&2f;al=n6c*%laWx><`&0n1bpK2m;f69Wl?(3|v;4iT7KWD*nPuu*h zwcsx_k+`q3;4iY^8!h;YE%+@KJonDcU#kUwiHXF0mj#d2zSwV{1%GJ_YqMzrhuO( z%-KdXMZmu$%uq3E6YwtyGenHGp912_pA%+i7~Ln}2MIGIjJ68+e!>g|qm2T-moP)X z=vo0+5N7BXT_fN-2s7l1)(LnnVTO9q8UfEF%n&bHF5pRo8QMi>3%GzVL%L|8fJYN% zC>PBW@C}3+!bNigJeV*;w`it-uO`fpEt(?W{)8E-MQsA^OPC>AwEZN@e?H+%!utf= zhcH93Xsdt|2{ROnHVXK}cYv=TyjH;95@zTXT_fPH2s7l0)(QAC!VIaRH3I&aFhi+m zxq!D5<Wpz;6-GCR`}sjfAfzoG0K7gc(9ba|HYnVTMl8OaVVnm?2X%MZmu$%up$6 z6YwtyGenBE|0wF8Fhis0J^?>Sm?2TLRlxTXW+)VG6!5)-83IMu3b=wWL!amx0pCHG zAy2eUz;g*R)QQ#zcqUvM$AlS5M9T%dov=)Jwt(Lv>?K?% z;EjX}2K33KR=+64Sd!W{CW?I%S26XsAK z-6!A&33G^#whH)u!W`P8jRL-xFo*Q$S^-xO=1?A8Bj7s-a|n;t33x7H4&Bij0na4N zAv;T%Y&;XxoNl3}E&B8b;e1zOEl_)25;1lh)UL2nxr=`olmroFru=C^v7o z5#!tXHSdkK)%RtZN8bdcKPc1IXYN26=2m|-DK1~*#_EZsxH(BlJ;Mqt>ft*4(pE4mdMwH=BIFi188B`Kn@kLS7O1?uzjd)cO42 zt7ov#(0&V8&O_mK)d)7M>Fc&>SCfVDMMEoD+T11!L7k;njAboZw!~Nn>MUP$&=5Z7 zIkZNy99im2spkS)i^rMVxqtT{?TQ-{Y-H#|2A$SWM`_QukpO-7rIiTvnWJK=RSwb-tn) zUveyMp^1}QdQ@C>g)JT1fZD-hD0b-0oLibj5oD!VdwxFxLuIe_EqcTGb&MMuR6YSzIIGumEtbD7S zl9dBm@jt2R0qyqQHd}5Zv>Dzk@_&r-HXb$gCD$*xezi!?1ynt=0Jg^WqIn;5UtbDm7@z&;bqU>ma z-`(0kQs+LYUk!2V2$}p%9ZBGqm5p-KS2xKCt+KLN-gc@A={M-tg;>+ZjA3Iv;pl-y_ZQ`Rnp8K_45RF6KGC znDr1@g%+|y&fX?B9Z#y=x*Rj0L|qy7NUC)~>0?)B&j zY*M%mH@EVwPuZdzb|2d=@7U)Keby^K+$hzKPqNuUn-k)A=tP1PW*fm%VsH_zNx^Bj+JiUY+9Q~SYtLY+a@eoD1v%awpLvgM_g&ul{|6xy zUIXn!cE~(3Awka{>Hzd9+wdSC+a_PWB{CuL3{27)82cHR9%o>Bo`LBV+U(GgdS2A4 zb^*LM<{wHgIn?6FJu16SNVS|Hd6Zq*?V<|yp*}Dj1sDf~I+Z-#@f7k&)~f822JDmwU7I`}X;_=Sdp_cpv+3O|d)s4(TQ>EXR~ z_g)SB>F#ZiD&v!i;*&ZF;7bJBw}992=@xL>bll&Ni-D^%#&flo zY|6Gr2SN5}<7GGcd1ulwo?a@igIxY@l3guJB)RE8Vsr;sk#BBevwN~Ojp=lKm08Yq zSt)gPAd<+E)p04%UJg}jw&1z4x*}b>hQ(0Fq{xw=Q<5XqnzsIHVrDthWwq3qiSaiJ z!RCEPw@KS`kYzrk{VXQmJ>9FkFDu8~)BMV2_f+>3ukw$nKIPrX$PNO0&LUa$I16RP z=XA)5-Ko8X-a%Gcv>ojT_b!6d)PIF(5iu`*)7j}&)10z;*((WG=oUO8r6kH~r6#2{ z$}K-z1?%=f5@}|mHiqdr%GY0l*&Wm0CDM;{`qUnGBR!H%wEI;VX}5~n@V2b%640b2 zo*^Iy0{l?Gr(QNJrhr>YndI=RcS6i|Z%b{LgpFDwOeb;|dQgRLU>~n)M-k3FV(ThG zQL?Pw3<104mixN|G;1p$pnDnqDgWJW|ToWS=@t%ZJMt)gIHpO~>hThKS)1ak|Z%!09%- zn*73MeGQvAK=Z5T`P2)~i>aJ1rS$egWn{b6+odydY|@^J)rskv%Z=<6I3DHfawXpye{0T@0A}#&|02 zVA`zRE|>|%)J3xU;kS}RSkoOc!$RE?V!ZPePoq+ZvZ zoo7OFe(q7QHECPH7BkqdU}E%^f4Jxh3|$+Bo3#!FwBL|VJ@-M7Jm`%WQm&qaDT5f- z@^im%AKjdguN=cH4KCtQXLRJ(?v_^F0*(f;4C97-BYlBLKc~YZy^@_@`$cuCPQ5~> z4ghtu^ol)KR;SwBuhZG&NOGRAkQ^EMmMDy@-YATJWUQ2u_5yT6IW}qu(9a#}Oh6v{ zFTBDgMSeu$=%o(u%%q|@+)rn3JVTZIFSzV^LIVu1POcL4oBKBjZ&-zuzk#SPWfImTpP1+Biiz0rJ z#v;0rb)%$oVvHAMjb4c$MbsC;%(h?GnH8TOS)QOh0}G-TeGX~8oI|S>8YZqD*D2}Y z42Y;by1XR!pdQEMt8*bcR(mB;k#aFo`p|~+rB{YteWu^})huc{@4szO^-Zl1sveFULdyNn=Bla=p%$~+@Zt34`( zRV48$KWfLJRPJ_8fl(t#>GrU7wQR+5&Pq(v2y&$&{O|9w^-w3BO_<=H2_lCB2 z))%&74dzi4q<$otX@iH|_q(6zCF)x5iC>;tD8lk&Q*&j%ULd11U&2Q7r9nOXb&0ln zM^w3}1(Zk^N}N9*W4UMp^U=*5ky7*F>}M80_?bt&6x~4Z-P}fs>j`m{JHC}t&b8wS zm@O55Z);v(&XWA4dr6W|60E1Wr`3%5@O-S`tvj?4Ox(w+Z{*TABPsV(k2>t$kNd;Z z2L^C+PjSD#7i?JT+vJrzU)PL!he;>f`%mcB0fk-CGeVIYL5=55!GBTN3|H+Wh@u^;J8;LwwK=CaGaW{xq{o;7G z2V~P`9~o*I5sBP0M)vj389E+@Vlu68Kzo7}MIF&G2sNqWHbFn6eFS?7 zFQjfG4aqNqNE6W?MBAZhY;Wm`KPgh~)t&*-9CIKs`Y_F#NqhELTe;2cLz zLJ_%kJ0|8*xDTQu^)~y6z8>{Pb+lcoJs*ht+D>Wp7I1|c5zO@Vsdo>TpYo}T9k~bP zrhSRB;=zEH&?Nd-Z(zz_F{}1`R>u&5PqNF|AIhOa4!P-2 z5-8i`h<#<~03M4{(EDSlVzfhcZI;4&Xkjdfl*kCff;Zxt7|f6Z!y%){j)Wh96Wk-$ zBV|9N>?a2xAZ0dbpUR;|2WXFgb`@w>>9hr;MFq{Z*&tsF^0mRB&QMN&;qRcEobq!y{J$4o2=}V!e8TA?Ws<( z*EYh7lBLyu2Z9bp_rl82YXEKQk&i93F@fuG-oVmxISHHq_vr19I8XRpaNAO_xo)*d z5B;}Dp6~Ffw+{CQlHpn-hhX_(LL~Wpx0*=DDzHm0Z1lO_m!I-RhK8iD6Dd$J@Gh(b zZb3aww|lcYydlluZPHBd`k6bl&*EO=99}wh6l(dgF;(itDs6BKu8F~ZzQ8!vw&`Ev zQYJ*~KSRbv>A0k(`vP3F>GCj>nn`M=PVMqBWMeX9ks&Kst+VJ}X3}y<%kc&By8O%} z4JTA zDUWi*7g^}Q>{6P(6&^dX?L0j$=4{9t+T`%KK9^QsEVzTt1lN(}`@Mlh9X>2{=J*4* z+T7~0A3a#z80l80+Ie7G0aZ;0=THk+ww4MyU5k6;@Ka!7*B_-L3erk&p4t8RWjs7~k5e!~-dlk4Q1_ycr z@{evcg;`;FOqMR4 ziP;-@Lro5Epzuc{qn#)+JLP1jCHZtDx280-HB@W53%aPY&$xs--(^HOp)R zrP`;_Ij-kKpuvl241$*<&r0E3v|jf*1beoIi8|J&G?9=FLc^qPC=U4Rx$@O8wMzg) ziH72Cd_B-&*7Fc=!`v>ucJh^3_<|R%KaV^WF`nA-NGQ6Y)xSZ3*)L(AB2x~uc_Y4q zs7RNrpv}C3wfu0S4{L`~`1jBfEig0G*+Y8Z1^~*amUnnKx(1>t!Hpf*hrfgKZMYJM zddEA)>`u%1z?`vNhaStXE=lo*mTOqE{38{W5N-M+Whr7l?o+;DNcS{S@ZJ;r4K}Fi zRly(w+AtKdVNg&J$!WD8!q=7J^wYC^W2c#AGdSQdMLuPp)f;$v=_fqvlLukisef?w z5R0eY5jemkg`Z$1>b0EXkSZu?)NXt10w&^%r(-Gp)-(k`GXkrmh$+DOg5 zKtZCe7RJ z*{Ex`S6`%DxaRBrw&)0vhb?z&^injtI-JYOWPZ8Z+xAf3h8$FEk^x#TgIjH ztx$1XTZ9@7FPr{VRjBKe-(4R+eaox5eDtlELLc3?Wa#5TT$|}$`2(jz(gS}XM!9V2 zTTpEcI)n8*3Er^I%pmy8dbZ4l_f16AHOz5yk4F=6BuHBQjc(Wmo}d%f4Q{e&MXj*q zWC(NXP3svkL&C&j>yc-xkair?Mh7!DxVNq015>yZegLq01CCeO8a~#sSWr9iEOy{u z6Ak)v6ZsJv^sD4MWs#27L)3l?7uqD}iw##}h}S!a+6bD%<{mF%i!34f7i$tM`18O(q_VHx|Q?ZC#JdWqlT!+79N7St}1Of!EkI6B-SSz`t)F~Q8XP< zB(FLPMal&ORz9iwen^TH=_3Gokq*5Jv{|H$!j%IQ8_;2OcMQAQ^%3)0unukhr#G%snF3=B^4kSY%8OjBNHnoX_ptD>*WBSDN`We%5ZDcW?&|?>J zp4vkj1-mhaK}HU*JL{lAEE93UbfL)PWkC^VPqkyerx2Z2m-GEQlrzP74U4muB6zG+ z+XF+(k(UKVKlJ<1yC^b}l7|XjtKi7xp>*vZ5D?xig?~Wzgbl#|KG`3Go1EfZd3^2F z7$P3{9&gNeq^!$kVd!*=r3~)Q+47|e((|Q@iyX=(cfv+FuwI&=$BRn8RzcZci zP@x6+D>GoX%;+dIJD)o0#UEJ5x1)}KTmym91GDhf6zaIg0t{ZL*j}jEahO>TTL4CH zWLk>6@fXXj03OL83%!JvBPrU`6{+=b=bZW@D+7}R=ZVNy$GG3jKNvNqiC0I zb$JH@ZAWdV5_D#m8(>eP!6D%vkh|njDuodZ@*sPL&y8u#z^%ef2!?7 zb23!zsNG$Cq0ZKzvuyzzi86CU`9@x({ekUQ9k>S+6s~qRRy(|KtQ78SU@CNEw3KRZ zkXCI**1D*mE^3*XBjst=qAaz$VV({%N59TCEtccJ`|v0%Nkw~V1CTN8$;|vHahkVw zcY*5JDY8snC#@P0%Q8Wi)u&sQU%!2NmLH3%8uodIS;&D7k>xC>gIWGWQ?{UIex;Q; zPDLM-JPE~BgP5VBkZJYOs?=DH59^|yf+%5DQOE)$$Hwj}*dQx)rkDktr?W2V%Jt`X z^f5N}Cme&3Z_-kc5Jhd|0i=}L-4n5`OC4^tO;D#GcQoUS`=wR)VJy&1oT`iLE998k z3l)yNb$X${gc;$u-yDk-`T|pFZ7aBq@|K)lUMI@Sv&njn&*)N~gA{JY3Evnba-7<7 zdXAMk@6xUue}hNe`=%pDmXyU?gi1}$tKF>^a*UKZV1u;kr?D(q|4@7w()tj{>QyAN zJpYVB+H~IDU0Du_W%=^vSRt!UFXT`Z@>j98vH>209GmglDF;GP$Q!jF(!15gY}*~R z2hILqwa)vb;2qeAn>k%VXGW~7BR5D7eTLi%qzM?1gua6g=bs*i5A_YliD6dKSgH|_?}vVnWPW;PqY17itwV5F1iFkh)LIT z+pN1@NA!DXRn>YY1NS^(I};1n@&?8H-3M(SD3~5GXEvC|HWF`O zcdf01^BoO4XQN&AkZM<8HetpTCZF6A77+#CN#Qf!WiX!`jc4s}GZn$wPJwpREf9iO5-K|C@u^txW?)ny0jr@bT!IP4rtTJ1Jn-mxQHx(dC<>iE6g@eXZ} zj&JFXPu4E#p8uW`Mux%VYUGra>Rp$gqZCZQ{)L(!@5?Ab`TB3 z7n!AV(2S<1`f#KoMZ0Yy$@83fJXw+AQ})Md+>X-vR2*}xV&*x>JiHVk3&Nznc>mC? z7HjA~R^Ja)e(pgJMjoySN0*^V=loU2y>I4Yo$G zk;t}vt@c~thXZ#5iP3@~K=LGg`YW5Gqx}_W)t_Ud<6XLxd(F%!N*e$Zi4dUO92pCA zw#i0jh%%~;6xV8lkSF>RWP|l;U&OwGvqLai_ssrD z`>Uh&x9cTCX6M8*d!$kHtF6clv#IeBI|hD?IeKnsf0tHiv7z?~UCc8OL*rZ}igq*7 zch9X%XRGeY?bmo5A4$7bs=q;2unc?|(lEM_Qf6@iHx$tg&j-n7P?hnjw8|aJwx2F9 z%gFXxk!_zd3fTdxp^yn(+5Xf>ah3K7JPei19OpT6PK&3UYo%3Oi`AXwMP1B>LwX_g z+)5ixFXV$d+oNEkJ}~JzBgIwPVm-HA$gPwnO}mA$luwV|2A~3m#c~^?i}7{KZ4lCT zH))2>c4b#?1+m;(>uJn(WX8pt$jG~COb=Gv;VnZ^G`42FXdj5yG-~fRM$xp#k<_i0 zbx5!5>KfhG>Rju=g;ITHFkdA`_jyP_J90dC(2U4+sWV3pO{LV4Pe~7bA)2>P#ppq9 z(giMnB$|pN{ybyEze*d8mceEijQ|yk-}Sb4^bMA5S9B>x_O9{vTJ1bD%@1NoH^%L2 zwawrcvZ_ox#_i$SUfsjn#g`YlP{zh7OU zL$E;<3qn}V4&!Rte;Vo)CxMF(BC3mwyvCzec8I{@ zM#%N4S55~Ww#~0S%K0RkJ|~CC4^?OAwU@4^zMQGmE3Y<$2m$ZDj+Zr-iKB8O?$hWD z5P;T90ckHUE78~W&^wFJ;|2ED>SepIPU}(c#Cg4gl5z_tpU_E&`y0F+S+szG5i(?9 zwU4swkF`CFZqJ#bYxJxT1TZ?@8rn>Jjq(u-X;WdySYN&hzQZ++M%Y8FaflU;Zw2$~ zMzDdE4}tx}!0IEBiQNorbi+|B7Oy-d=Ek9O@rDESJ9orum~}$K^9Ws-Ye3V)YQ$wf zHNe{(q+WTc0nSg3?rEp6PR`V&(31e*&sTPCfGo^AaNZzg;86o8vjZCTwE-=002=j~ z0j)@mmLhG#f_JdEvl8=@dcL~NMKLGKjQc~dsJ`qV)*;SF5F%x#RG`wg~m8)0-XwmmEA zfJxq?H6fxETv~!rCyfMNHYg1Bv_BdEjjsI?fcP{_!!DNU&zNMyN;QEZAomrNPMjTO zc276dk@0>jkMxMunvE=5eTvT>JXoji!A~me35&w@7?-F z3TW=v7-;*I4k^NOKkm?v3F0hM@LoJ723-YeTEChbAex^&kkyJ5nVQ}X0IPu%>{EMs zl{Pst)!|dz4#XhYQg{-`6I5qEcg;vAlJ)}V#}*dU+A4*w5zr+_?pM;mpXyb1$f1o6 z3X{SYgX%%Ykr!=-Ui0g?0Vkv134aGrR;zH*w+OxH5wDUXg}(wW-?hURai;nr1r90l z3J{17E_T-pN4^gO@~hRz7CUM$1MsTXM#>XCuA^RM0QM;UOm3VgLK&qA5od3dGkBX% zy;n~V(i4OllRU0=CI~JsQ0=`6B104WkvS>IA(-n^^T6B~oat3l+>tTll$DEuQ*mJ9 za&P43bieZX1a&0raFb1{%|*|7*0->WUIpQ7Z$#e&g64w*Ysb;#&4y{XRV(!4k1n=L ze-zLAjAv~dwu3mm%p*s;g`>mrY<|R)efw%2p_SEhWSl*YU@O+A-V8@P;cYqrM}*H7 zp#U*gdrXAVU*sOmJ$Mu~m*5sNHmP_gtB zPPoHKDbinLWDS6!^% zpa<3}m%=~6*#JMRg(Drqb6Q4_0%A+i>tA0CYctLEILlwTrW2hpA z${Ve!$k>Nq`PM=tUPGEWre@?71A~)%=$7?dUKY7{6Fx!#-JzCPKKY8vquPJM;-btR zW;CEHqbV%&MW<&(-IZA+9i5Ekc(q% zs5Ma_F8G!Em7koEk1%cRZ1`{VM_jm{Ya}RTfsDu70#l>f@dwS0V=OT;f~oyVH&dIHDMzaCGGSV|UZLaVBz9?7lt z6>h5+!_8s@uXTu0z*nX4UMyM|r9i#>+AEFp8ok*@3)s(` z-Zu=zNFU|P(Avj{$1LZAV3SrVsN78{@R29C#mkHf7e-{4or z(PW$FF?vRX*`y2WYrYY4&G->5WY9 zz#g|3p%eNM4DdKF5|x{xH+d7@^=>;kJ~H%cukugr)mst}a{SPC-Tb=ci@lNiI=b}r zxGwf8KddNNcB9vIvU09CcBkT`XFg74NIbBoOtPz3si)$1ih0TZ&_Kkw4eKXgEaUXuE8=->aPP;!7F) zT87`X)2*D7uZ*`#;rn1bwU@y#(< z5C?wn4*iZc&ExXhm;d!N>~@50%q4plV@1Rv((0a&E=R_7_#;Jd!Ud>|J)!-*5Dv-; zChy?`tYD5+{49Ztlaj&ZxF!Y{;F=VigsVL`64xHVpW@n+Uy+%vL0&uLVIzNfI|80| zZ>TN7r{v)UbPe5mxqxM*+<+Gt@B#xaG~hx3pOK#Db|DXPuqvJt^g`)&SuNDSxDQBp zECeZqz%6J6ehV@ttq~dS0}b@TR^YZknLG%hLKIZ>s>SxoIUbt6wiXS?@A|$fvu#{# z{Xkm%4>SVdSm_?6+U|FK6U=t2w_E00XUXL*2a zHNIkn*fxOJ_Pb^KXoxKZD=q3j4Jm>6f`aH>( z)K|sZ#%PI|cyYt8j=(``Oi{%#PLDHPd;Cw}6`{TlomZxD0yK6CwSqAigR#FsrZ;pv zA-DinaSGMv#DUHID6{pmIyhtSQ35m9D6>&A3L$x>=1>J!mpu1@dAVMM`(w1A5u|E z+BHb)hj>oN^~0ua27zFPX3PW&j7!1e4FsJ$ldGRIB~J>Z9RnYDaKyAo@GN!Wz^!q_ zlss^kZ&1oiu+q{vVw!U{U2(D$2A9GTbd64go%Q}HKeAYyEB&r05#@tB&K$$~;cFFUMJ8=lQ*+h9&uZ9H_M?2WWal!}T z2fo%3p<(rhg)I;ZA!<#;Jm`hdH=D0 z!Fhb0Mdnc~O64An_JcRXRbq=ZL9;M_9Ce?za^`@OW3>+-_wc*gtFod?5DysVWS9Gu zJ|1O~-LITv&&Z?O=nAFq4PbGrjuGehl#Tgnp)njy#&Co#zXR(pr0iMN=vU8S_v%yn z;OlQ~(R|lrj7Qy(|L`d-5HDx%l`;3B->v4%-;3eM7nvxABR@Xn75W_G(N=G4JQ8aa z9FM%AA21%_itz|nj7PX)Ji-;@5v~}Iyy_AS0^1?*lvi28p#tMeGy%haG2T=gaJ4bs z6baa;6d81mPvkepCyrl)F>G)=6XOwJ74no6jz`rP^or1&7U<)VTG%Qp)fg6vka_hM z&@dJ)z+ncCM}-)VsxclFiSY<&@M207Ei?VpPwN2N zqBhC^L^E9b9FrZ=7W|pP4<%@qf!_8ip4#5Q1@rK>ZP-ua9v)KLqC39E>Sg-7Sl#>m zI;L&WUPnvU*E8p$&|*EWVHHkZyQlH<0aN`rcZN^Qe23TDxC->OTr+CMhy9_DG7_JS z@Hrh-f#^AKqS$yXt2z2N&4jI=!$Ttcl z&oOb}twDS|0fcQ5MLWmHfwjS)vG{3mye*_joP@)K;11+hn3A9hOvjVXR%_3F$|Fc=j-X1{m@-7 zF~M!HbWMVWvWl^{T1D?qQ}3-J1ecf_zlZld-1iQSVKcv$x2I zm0c}Tw-Qi|RB-KEA;uXX68tSY`T9if~nJyBbdbw*x-Lt(veO_gv+Jl%fp*+u)r-!m$%{@?w5eYs z2Yh2fTD|Ke7g|%?T>PHsWupm>IqPEdOKS{4_drk!mp8?G#!n%=S52=OVMEbF_rbAi z>k)lv7rI>B*oV^BXR=z;GTXQ zK3Co+`q&Qdj!%J3oN##t-b_D&H@!i93tLr!y4}0ub5N6fm#3ZZD&OKwU3}XQgVa_~ zi=zdXkK9NV{Yopew0n=WPPp9umaBQiO0T-ip*?;8jW9B0kxg#;%#JVjsteM& zVbOs?`qaV{j)#RJ%)p0W&^!Gg27I^L#~u0=zbBTF%Bhv8;E3@33 z>tbOSb6qS07T8hp4Z?Cv^QoRDx!tWM{~Q$TQsL11e?)NYTwZLXqMX2Cx9a;j*43#) zGHT>_7Zz{Dp9PytEHbnk{N3|)?OgF2bwL(QaDw%$R%Z$)5gy`+fg-8&LEZu z4kdY!oJF4BqPI%g`_ZUWV?A^(Z)udp%9y3w(sC_BOTkoY33;@n|*q zVb)xz32%*o@R?3XGYCgW5V^q6%q3%^$Mx>=*-R$W1;3?J?AYfEG>uk$58LSh1-i_M-CDaFZ6*`?+QgR9iqX;4c#e&4 z40CIM&;rk6rx&w!E*z&@LmMC7=k?+B!lne*M~FBxmtn($FM|Y*V^NTPEW>hQFse;E zQT0MBZayCZnNSyss3|5iPsn1>#1J-f=?ik`b-k<6-^U^-`Vf5`4hslQIr6fu=CAHI z#-~jPE5x9r6W6i~D@-Cju7=zZ@7SFfOM`tmY+yijXnqEE3=T0D)7JbFUAuy*%3)dg z7-KKTgr%4%coihWb0(O1uLd7C#Zv^lS6e`sU6!`^zvx_D2MdK3m;6CT)KKSZ}mc*>gImz7!wql|e0^o~N zpFVBMX^+Wyl5)}^C$_$e_iN7>A2>LyqqZCz(D!m=SOplK)4d;N|62_LI58lgQ|6@{ z-9Neci#vemL%~yI!BDUUcPV@cnvrEFh>Sd{d>_eJJ|^O+Niv;Qe_8&Au9xNiZy#$9 zDi=<~`y4B7j8?;MOnV5=)hlz(AGsfl#v&Y*ZtKQ);C5*q6f$$!GW9|U>HqhdSR^PH zzP`1;E%aG}RLhx+p^VWYx1nC6cZz@|58?V!SY8UhP78K5m%jqk+eZ-YxMGFTIN<-> zgy`0C=9)yboac~?AtNSI!M;A_eZI@?&~lz+FZov~&^S{Ju-fm z4675RP7NQA;kHe?58G;3`1pEwX!(GI;9L>pYef*PR^bBx2h8XcZ#*}nTjgBf7PeDm zFFu{G&Bp9aR(A1KhZJ%Co(q}jeDNof8znf~jT3(ee}^|)^ii+F2W#<)yC1TO=@V)d zb~!eSekzK2ENwmxczq5U9LxS~CXhM<-cH7bjrPhRB;+KbIXIoO&uLgc;{9)r>ySo;(>JMA7a?=w37Gmd*XC3TM)0ljlPgoIyl;IeajN1=W$eyKTBYuaMPLhV0(# zZ4B8xuD6#}aXxdq=u$?0EY>-y1pq_KBXEk+qmIk)pl1&bK!6`R8^KX1OKddMZdLYF zJy*N?o&nmQMTc3#tbH8W@ZT`ddhP#(`a}nT%5=27ZRmk&(jt66_>oO0iP~dCq`xh9 zcWvYHYs9>S2cJ^h3S0~uX!~JvAyBJApO4)Q*Ja6IU-7Y+VCs}VKgBxdb{Se?mVUe> z(T_Ep@Lg!pIA@Ztd?2kZ!L#ryk1FBYFxZd9fhG^#LcPL^=-QXPpV2i;vU&GS@GNcyyKOl(j zDU&mnU+-53yn{0V5BnlTNp5`j!4@pV0#v>-HDmduW7Xtm7(h>i;%-jLZWj8C&sb5b z)%_f%551Wucg;qdG2a$;uKM(J%2_9Ye}xEb_^)xP#085)^c%;6bn!!49(o?jc|9D~ zgH5r6h?r|)iaIXK7tzl+_#$EFK9q;A!IbBA%7F@a;1p+(@r5m)a{*tevSA{&1vl;Z z6MU^)3U^)w|NE7|amO$cyd_C)+MmReIE+hpx?&&h9_+=jdXZcVCQo^khn(+_0iSE( z?5>f|=%k9+Q{yf%Z*?BPIq4L8$OjP| z=LseMj$Lb>SUStZ72kJ(A7|5#(O4JZfq?{0Hp$t0=&x?qQ7JMFXdW;T!2*=#9cvVC zQ$I|p*;!P}%InTGz)P#Lz%4!m)lW#{fkZUXJh|!1q?%C!H=<2Wz_+8=%@_I*d2r;D z!dJn5+MGJJw3h{n!xBeK99?o~3m(x4%zy+goe9E35H|Dyw*Fka-L9{XwxPz|k-HOg z=&uihBas~G`up!3oVL)fkP+o@&`_so+RMO+!>0TwS_FM3$Bt)+1QY&mC8Xwv8xhi% zU_begcJt}7`Js(cL$**J!wzK^QH)T+eA9od;4(^rP+BY?@wMnTAd@vLl3NMC2SJk_ z<&ws)jGBPoabGl#$M9t}mvLMjErco(_omO_K0E`ej@(?JX1w2!4yty|W5@wjhGPL! zFq6Pp?J@Ym{fFKbDrobzjCSyjg*XOV08+kr}V(VpF%72w~;$K-7PdHY7w*Eh}*9BV(9(w zpLB5lnZ@>FmKc5kOziKZFlR@2N(|nOYf|twT zQ1&$zrG<}h6YPy}evZ!l{}tv;Sw7dtcgsLK^ekHPgdWBcSxa8Bp^3v-DQn3~Bc>&f z6@ps^Z_qLma+a)v>7?+LD1w~5)2nEhQzqhzO||3^!%kn=$Q!Bdl%{XT_sJd+Q|Qov zUg)6RQg)itA3<~@g}$Iju1)?{$nJzC@7JFagLmRXbxFagxZ*#P!L>&)8`qw}3#940 znLM+e286U(kTm@ZG_?c(C8&l?fDan*A_G2Zz*Po}E?e*~6L7vXy^)A~DLdapY&8%# zI|7MNywU}>?Z7&~HWlxJXHQMxC6kvNUh;S;~&I@ zy{IqZ?ldYoQi$EdW_|w--7&tWqz}uh@POSp@#QM)-NB=vCE~>kgy0y_V6!VT`8NGFo?*(YmvYHk@T+ zCImRD8a!$eUUk4pI4ldeF;??zp{%-7&|(ojyB&-;oM@naoMqYuBI+f{tp3zkOk(=#kpZMQ%LLb9$Y@9S8+Gg-BHp|=C zD#x=?;`<3b>Vi(T$yBo~if#{|cC#BL#fsGb210T}5T&?IR2GCbqTSP7ZEnMgxQi|f zcVS1|^*+q7Bw%4m+=VS6DbsbL;uU=LIeY?b%dLFpR(^12|Cq0Q=0=A$Ix+y!xnA-^ z%qMbhC)^e9b7%ZQjQePO9@jRw<)z-p7&JXbV>G6MyZAsF7ddCM$xUF3yMYbvr)+QM zL(CUQlPMxP2nfLIrys;>j7Q2w5Zp-cs19OYBEU`^98M5T3y_q}z5~Ek0bom*z;*#( zg}X5Y%2f`6!uTGOl$|bR7p34Y6Ms4Q%fnwG{$}H^9J|Ri;I7!7@Ri&3wG?hc36u|g zf$fokgkv9~z>g#xLup;_xm(~;?1skJrPZ78gazFdEbBs+bvnzM&$13-SubZ{ z*il(ybYEwB8%A5A+yGjQ<8&B8 zC*#8y|8%2?;;>TUdivA&$jD24k-7GQNa_8KuKA%`9qMEoy93F5>g3^}ZxZnJ$Ua_t zBGebLx8pFI6uu5Lf8c7q9X}WAl^aoH)Y7R0et^LF0^XxwmN?d?|9@Y2N)iX$>_H!% zdjwJSINElhH*h{B++j*U_%`54Z(uNy6&B>sSBbgT?gu|I82O};BQ?Oc@<+#5@%ak- z3zP~hSCWNZc#kMGS%?L8k`mpM#b-$~bS>mSd8RK?$ZgpLJoGexsj~pd1IUp40#fJjEvCGouumTKus><& zJk#!T@jDr*881k+_hMG%4ZUgiCF~WS7=xqM-i^5{&$g{WMTzOh%%9Mt+}#O}2v#2gB!!0vwq<1Nheu{V&zY(E`Mt^+^PE%<3!?a*-c~pEZqT(NG#9-e zo9GKsu9kv`D4Ocd!>eR^G8|e*9TdGItv&>2$H_Y!y$bC^c%&gb+J*IPw`-GI8okMl zZc`f94*v=N;xc3plV^J(WBKCOjHsC4;iU{57vI;*b%gJLWlN!3;4Adga5D!?qG>TjT~)=^QQt|rQLL<&6& zbs=*w0w>(=h5Q+Zk$=i)fI^d$0)Bu73II7Ng^yeLI8%Jjb{ik(ikkX}k9TB{;Zt6i z%V7LLB#HxZxC&9JLQ1L-kSfxq-huDmVgNWI-G3Jx%Pr0rp>xYu+BgtoAMq&v#M=d) zNE(;+IN#U*S3i7?=J5DP@^2!`I`u91bsS{!rOiie=pnI4nJ;CXf-1S_%5$X<|8GBz z37p}fpVYschrY5dxRjk`fSqLlI?K9X4tvXsr7R5LVs^hS6G`0Cj20=|og!tWiMSl_ zhY0rAc>H7&-vAF5k4NWQ7aYvaw=cWYDNcLj&P2H8Hi~ipl?oI*_Y!mrMhm!vpREPzavjAM zaJhlX)=~6Lgxi8ES4SNND%U`{bkuR6@M;UV;Mobpp$KdTsi==890QTC-#cr-B9<1V@Hcqma!2?};<%&&E8x(O zJ9G-5A3f3x)F!@l`|yhwvy1JtNe|D$6HoP`IFzeiP@oR|4F4;OP#hPmL25r2A4$Wc zob&fOksppEZ4|<>LWyM+gy=ri{sUJNi@Z4d)cRYDS{N#LkOgbT>ayWHqa+ET+M}?9 zpa7p~!QW@W<28pEe;|fe4(SqZHZgB7-jzrEMHotd=L%n0MJLBij4X_OTnIry(G1#Y z9M^v1zm4NrCCd%{Apy2K$Yq`k<)DEQ2lX`cJ6<_Rv3ndd&Md1hJg zR`YmbcxA6{p1~#t!2}xBrgYOnQusnlD8PhqUHC9x&XS`~!8C|})N}a$RSf_XGZjaL zJ~vAE^Z&!#pTI|5UH|`hmI*`!-=U($HfYq)CI~SoC=t{QOk@UT00lHrKnjX}+&~x> zl}(Z$?~a4CZvEKJwzl=t)wb5UA`wWy6>vvUaD5Mp;DSW9{GP9S-;+#`e!lIeeLVjE zJRW(^UCzDt-0j?R&pr3tU#N!hl8NZVN#97_Z7O1`iD0*{88z-R-s|X#Am)glfv$k5 zRG#<1JgKGFp3d{`u|89QJZ}j;37i%x^lQkDr}K18zkV$^nZ8?rLv8K%9pzIKV$^|y zo!Y>!)q}Qv&K(bMgP7#=k5JOvuf!Kkd`sfKh2%0a(fg?3iMb!DH8jTm_;b~fTfm5w z(sfMt;-KT`Mrw#Wjq&Y${xe(0v)b#pVs2&~|6+Z99Us7_I{uhn$(_^nG&Sqos&|GM zl?M+>0LD!!Q)mTWWb(ws5@m=tYeT;R(VBH2OR#gtmlzIJ`lUljru514aDcxgk`smI zD8HAwmqVA(hwFY071(Sma0V4fB}t(Bh+)4GrNQu}cse?IK()IymOulf8B5yit9P=m zepg1dt1AywJA>gD4+N^6p|2aB;V(3-7Lh_-i$-hhO`pBfZNLxMKfbKxq|m9mUcIS% zps&*Wy4`F~&ULxjZoF~j#;@UP_`Cgi@qV~FVYZOWC;I%IGhqt@I-o3N2_BnVhWnbJ zwFi|HML7jC{Xnfgn9#C;T;&rtH$m$U%54f{wWv0sA!mYFfvVfWW9e|QW!++J;bYU` zT7kM@bd7wdqR;V>;dlVdnsue}pI}y}>rKE+U2Le4Y>-2^RM-NtLl zqarwMTCH5&Nb4gy&PHCVb(Po#E6C z6oUc7_XIf@$|~}q&GCHkdsnpcd#FIMxpPWyE-+F6!|pi~_B&-a!w;1Pa@glmq1Es} z0hn-h^G<0OKkx+tyQBlV`+=_#*gYLspK|K2#5KHBq1S~X45sxfJkpYbBGilLGK zMdWDkG%CA%af$>IP;hh*xszhdFh3eOr3pSR9c%{Kap~X_)4>|m-A+sge>)v)hB4RG zY$oODU^Ar4)4^=oY>{SopQT{xI)6Tsp%YPNs?28=Gb5dXiy8d|6EtzAFy;$pY2M7& zyt%>58%>5z>A7GMX)Y)cQ_AV4gcC#rl-SH1WngH9GU;{$^QEbn(ibe!0Te8dUBLO# zR#?QcD#DRx!`fkq?$5#C>~)qb5OV>M9YBI&3~NW+gTcCwppl`_<0oWXoy zLW(7U{6wN*>Wb;rXa0)&tDIprNh$1`Vg1G8Mg@4ma9)5NvtIF*&qU4K|%NCI?yV=^s z4>k|=MUvJuK7J$I<<}QU4lNRDh@>`FHU*^mxS2F!+3 zqJS?{o8(MR1lIBp$-U;pij7aGaw}r{BO=KNLP;Z}gXz_tTlXku=^EuE?R7?IuXB#M zLs`dGM?%RJq$xI{TZEE9c6rDapOH`!Rn10uH&|~s-}{#JYV)Jm53E-kA9;6JuQomM zerdhh@F1GpD$(Q$Mzm9gB$FL(S+JOYM3ccP{t-Mo8m)Aygxn7>FP~Iavf`@{8_nUU@ninxDMlbjW|; zj+omRtlI)1NkK^7#0j(YJj~Yf*|1ytJ5@UuJTEQr`azruS0^vzka1ixD|vCY(X%lUGq!8Z^;n{QtHRKCctec3ew*obDD19c?S z%Rwy6+5e_bS&&n(vT@dMKda_YogrP!4xDBv@N0$wzXd9rUqeCoH57zjLqW)mYr2iI z|3>pT_1z#K)n(6z+_ly27V$QNlSPKN5gq-CY+}joOPHFi)tsIg-Uj(~f#i;%%C(Sy zbDX+0KpDBC28!g4@o9W>j5;o-XShvUA#W@(^2Tlu2{N%q8<3%kIFsN6f;nC&E=EK` zo?`3KA%|0jpj$CI;&96R6Aqn*_=h1KPB=hp#@V3E2?(;NvMm0qU{K1cSX9cYD)gz+ zXOun@^=V@+)@E-ER=$ntan;0K7oGep#~Z;t>qaKWB(s9qEk@q@Qu>@JIhZ4kb?MqS zq-%eJsr_YqbK_xC`~G}6JLH=_?HH^XY{{|MqFeOAD4K_Gd#tV|;j>_Rm z1Dlx4lf~-F_n4ILX#r*j^tM^Ab;?nl9Kw{m?(QrK_NU}#rsTft=4$e$*u@|7HRH?@ zX~x+cS~Mpdj zOwERTmB_C@H5>e?+2Bvj27hWcWK7MKvmdUm+=w+HGc`Ac+_ysR>ue!I$u3VRH$%k^ z;NUoxVZIjm)_>cDU1zb(Nt8vCY{{Lv=K&JuWL9=gWoPSD_6qU2qr~S95}#YDL)q@+ zgUSG;HodfSahx!%-eg!9VfNwG>W!E4W#iTAjhDMc#;esEZ-u;O;g)Iu42y|uwUGnl z<#4vYVHB`tT*h&9*(mcVma9UaDt$)jGf^Lo^u2|g!#)?vezCd|V;?dN;Sajx1a$SA zV##q0S!JKLoju+XsN2%H(k@-j?XRmDp!^!7x+HNucO7lD7<iW)YuQDP^vuw{r*FyPKm7{~on& z<=;;_qj!f@G-h?A&K!7^i~b+S%SI%+Y=|TRYq6S98a{1W zv5^_C{V!z3nvKhIe3|jb*GWvo^N*3lK#556yy|O&Jx`%|192@p_kkaQTKq(lw^93A zzTfD}lF)>C58r@7sMW}0P*^3reE6g%DTj{Hq;u|=@&>u0rL_xRIBD%XdzYdjj{09i z5s_Y3wHhV>7|R*D)aL%*K=DEo)l{R{G@Z@^Kb?)>2|*#2C?sB{vAy5ljucAo*hjJW zXJN;{bWs&V$N}V&-SZJyAzv2o&ZPi912BSig#gDrBjxTV=$B9KSr+&i0smo}Zmxal z+%aUUQq^0*HOHh@X-~OE6J1uavupOVxRHG$VqNbT5Mztkr6lzvNd?Z%kZ#Y^PqXsR zNP;0Us*qd8&r+|AHhGBBZSr{}m+ak1-scGiBW3qx#N=uQ6B!MRCOUIw@KU;sRzxI@ z7A9^Yoz*cZWneI26v|SWMxLpzNoK4)BeU(kQ4MTUKaotQewE^7WcmA_wYIvSrJj@J zgSS#2?l3>w-?wr}ZyRSEhrK5_n461zH>9501P+`MHgx4}tFViT_?pxi8-3$=)>Q-U6VMRK)IKT(5R}fM%mn{f5QY$ z<7!`pQRc)T(qvxvjFzA>r<+AdX*Ih|V)xAoB{n?YdmM&P$nrR8wB&d}7W0ml)Z8o3 za#oCyx954EPN7zaN~-#9c>19qR$=gHE@OZ_L5)yEyYmV5VYu)sH1-0*1t0h67fdp@It`fN33FR)mR8@x@wH!u_$y8#(nT==VduHT~{$%6B=7^>QeZ%*{?| zQ!1NAXrFJlj3Aq1zd`EHopI}&@?-zX=E+&~6S^go43gOzWfoYX%mUw|ppO-QTZ9aq z(p{v@dyRlpq5QJ19ACTbkKrWOYm>gkj2~UWh&3%th*9%J?a^x>)V%Axd?0I>U4l+# zegQbq_+UW2&6Co4#BIvVtG#_!DnD!ekpmQ?aQrc0zA|%Dn=h=fB3K^-}UdY=& z_6fjy4{#O)H7M|=LI@b;cQg>9#q=dp(#PIlnj|%iK+}%i5U^w3dq=6IRCti5uWQ>H z>kEQI?nk!e{{CHH=&`Kj6D&u-S(Uc|2sNipneJ%=n3M)+^8RcA)EwSS0HO)*v^U2R zVQ*NbZK7!mNo$*E-G!!2Fi+%FL$swazJolxt7(nY*=(ki)9>&^xe^?O!--YyiI+v{ zc4o&a56&ny^{RFrIg$VGR4@5<^^%ihKfsTl{-IH1`e}LFTv&?JOrcO>INX{n#x5kt zpGMPg1{2fFOS?wtUe^OykVhFdLt^ay+mFu43RS)+2@a(8$0ZACAxt^E7{SoQ!gIg> z1117e?_OKNiIXt-h$wf^O8gVH^BK4M^Pwnp{axSqPq;I`?mOUxW&6#!ldY$Qeu~gq9 z(tBKE?bcNyAAx?YTq-y_dEFB#FxBjzhbyEyvNXphYXGQ zOVBA_<=mF+VF*OfDP851_x}svPNE!@GpDo#LUYh5KX;hI7WE@6dE6G_)xr>TzB@9*h=;XCZTV%*v5#()?vv{mY+ox4#yV``l$x?xs)Ibg zZ=B6l1vZE)zTWI#YNkg^YETkD2J6&Mg_uEoIcDa9H#&sxa>|Uo$%u0S*0FTOV$o>= z;4<4KT(Lm53t8YmAeO|cq&aAo=o1}(u2^)K>OK(ub4Sxx4O#eXtL*DManFIxHTtWgqJ`QgFl3$zj- zAiu!0BEMba2PHr*FfGb&cOS+ux%iD329&vP@$T%0Xh)|W(vcM@JAmC2DQQMC?_1>3 zV9{h1rzc0_gJld+eKwTz52<(6ZxKad#poK9+B;UaaRZt}oxbI7=Ic zab0PB(_>H5-gH}Fxw-~n2R;3NcY_88e|`qR=FoC~P=t($Z;A;mH^V{>e@ujy`-391 z+#eO8V8nQ_Va~`5S3wx{qsw;N?g6=2P@X04Fls`6kd*2uU2;z~-yvss?*E1XMrO+hi%SzJW%pE2Q8vnQUpxjrRFzdb|!#z<&Io+{jbZK+yeKd362g!O~I_nivSh`m@iyu9Lyji;Q zo+d`s$y;t6wW@AS-lH9Sf9c@+Jw8=ug{re6HP4h1GF3R4C};6-GFQ97Vq}4jbLl#& z@hoU}{Yn}6?%f&gPcz&*a8re~RG~3dOy=ITmx^UVaDpxK)X{|4d(3K^IVNF^|7+VL zZZk9OG%dq@oz2*`O|#*e7t-=s2nq*qftSGas$_|MTbg<2^!ATvK%(DJc&w+}|fYM!V=;Kx4ts11DvzGWo#%G^wB0iJi3JX;6~f+W zAZfG~Sr7`CMuow|HQ4HzKikw{SuAlPLPX(vy1{p}6k3%}BvA#vS7*nBFVBQdYian> zqN`Y;yJf6$ZilX3QbH~7vYVt^_gZxSS|YB^;#*zm%)0~3t_HD*VMG(AUBF*CdW$wl z)M__+h+ZQoyJGj*?4}xql8b~SrX{#X%F8b{BA*CUOr83V;LuDpHP&jh8PN^!XyRn2 ze&8u$1dR2$({Kja4RA`n9jfafSw7TR8uLpz{bvkImWjth0*=^>;qAa8?hTQ|K(c9O7g4S+eA>&DV%Aj2QMM z7wDHs5H`2ohndVxh0noBfuY2tLZ|)=6K)DU1t)R`EBbC>h;WR~CNks}W3T^fOq+j` zlkj314Lb={rT%Y)|7&PJ;Z?prtY2s8*)*e63XkL0bWGnbY2;|4Z<{?JwG4V6YS1bB z;o@@Px#wi(WKBQuv8>lI5m8M(%X>YI%wU@Y*iT_b&#WJ4K3UGsxqVnR?PKmO0Lwvk zwvKDz_O#oS)>Hx7X5~FjRi<1QjQ>VW9EABY(RAmO{bKZU72lPq9A6C3qC*W`y9nOXuT7AFRm-quef>M&<~71oiKFs-Goe>lZ%k zeLgIuqOY{c!6+;{Se*oZfrbK+;YX=U7J;qdQ|n9a#~n+?iX)Tv#F8@y#FA|KttpoQ z=rfE}9h@8uBbxGL zqEL|WwZ(CvTDJ;lTo|$Vp>+kMAAl+iXXB{SoC-U04*j3Lsf@p7!}kC%kyp)Ko{5=dUCVczo&rS9U2*F=$5r6~G_{7~{HHASDPitie72MEBTA%Iz3k{9L@ z-+yFA`e|+H=NFJZK>WFp?0Zvj!=hAWvFk|{ z?iSIiXH58foA5H6TDf)jd|PP;-zgn@MffuKw$)#V;KwBb!%kCLon2>w(;)XEwFJ&D z4)X-19{bY_gnQ@IB9b^hDx(P;nr$8F_FfZ9OfJTLNy*4W{8g+Y1hmmZ@YWewg1VC%2NJaJriW(4}yf@tVagO)X7-&kejt!`% z5G{m2Y=F46ir8dqQ)8_Jp*Org^te%T{Xygk>qE%(Au@Zti8eLXh?Jz*ssAonsE&x= zVBVOl5pF9aqmKogC57yFj8T43m&Q-H#u|WVaG>t)Y5X`4u3YWh`AiJE{&zMW@hr0Y z3J&YR;T_Ek3c%~zY))rJKM?Lxxf2xx@n>O%jw zSieSNnm~VbtoB#OYO^{*l@^@kERI7Pv{-d#63HfnRo`W~x{!ob%7tIEd|D|4zEOT? zjed;+HGvcTz^nb=Y5wmV{i>{4vT)QOA36Fu99m!G@v#qC%?*VVr{R3uLk&Lip@uf> z`^g?9YEw23C1}t2-_12d-z=`7O|Y;7^IgTzMU8^jfRyonu&CxxGM!s8->*S3-5kln zbVza9k#3G;x;c_<%@OZZFf5In940$COm=dZ?Bp=n$zigS!(=B%Ms~&2^==icX1zO& z-Q8*I?oMNOx5-X0Y3%M!V|RB(c2YO1QoG*vpcZ;}Uo89cfed}8ez@9s@}A@++0||f z$Dn^>ZQI=0C@h64_gWJs!KU1(bBESKqptK5utGU0JHCJ~av#3PefT2x;fvgdue6b^ zjS{1)6l@xj9c>QWsu~5G0=ZoGmKx!I)}QQ$65qiEw`Atq9J)1N3k~IhLFiV~mcgb_ zZjO9bSb{HCKGVF43&>~1CiwE?GcB&TPVyN6ihP|_6IQ7J3i>Vc8&KRV4?&g&h%sEc z*bzw_%0|+EfZ9!2+M#1&3>ey*+G>hw_f<4T%;-je-0q7ZYDjuYgncAg8wfUKjg7Di zbC%vnjl|dl12K-QQH`&`~kfvKsu&F9L z6sG&k0a=7a*{Mg0tJ4h#kVb>ycNS7AuAKP!%GO+ptf@730WOy4zaWDBl5$QMJ|-!y z_0FOLDuJ5>7lCP24$UH6QOk9Y`@WDY`aXzF+0W;??+2Xnx1GA_B$42G(R!tIx_z4# zEy!+9O387OvZw0zeHD6xDf)`EXjI*Y^ve-&YSj9hcK}2aU4h*r?Oy0~D+kzX+#^j2})I=qZDYtQ~ zVzf%#=OiGLZPUks@D2GCIlwdy28NruP`CKS8U>U@$}Ym%cFo-Hll)nyt_vJB$zOLC zEmFx&x8rQv+M!ecznvGvH%?zf+y%DqQ0gx#W|@ZfIU3$$Q$=97OnoDdg+VlmkLXZekk=YG41;|;@_Mu;{x3-HA6g2z0Cx21 z1KXkKR?H;H;;zOr?;(Htiv+qKOU{xr)CHzB9 zVY_zhC2lTw}RZvT$!GUh>%Hm)UBUaR{^g5^c4=Xk@E>Q3%nP`z9uuQYjE` zvN~degB`H-llPJ=lcWpFj~hR3}86k0&(q%|Fr^-m|u zH_3FQn!l~tFQ!(-v=?zi8uo2)Z0b~NV1Gnk_Y8lUopp1LE|{&R&Bm=_1GQyWHium@ zYJ#}*!&K-)jk-Q3S-|e7L?A+54cub}?#GgMmVT0Y{{w;bZy}KU0OR4GaZP~zz<`}j zc24Q;)U5`r&-ym7bZ*xguw(q(PBmaXeyhO53rr!WRHuLY*pv)5fG?Y{O{rf?@2b4d ztp-rE4V-m@%AP(RXJC&rWv5aD4Q$u32DTTlPU#zDs#DG#J5}dO6SgMxDt)iUIn6-+ z$>!=YRL5;6xX%g!*Uhp(eg0^Yp3bU8u?78qiI+jY+gbF!A9U_rHt2v;cjHl-=>^B$ zLkKhSRj2N#qfJQHAKH)?H~?Pl)HQWgXlQs)~qgCbjPT{@LWr>>8} z%Fmr3&!TtL0zz{%UW?|PKIUCRHV8ELzMb zombHFzvUBE-e?2*+-?H4Idu!v;Ea_!OaPWnnuIi!{ecNs>6EUdISf#(2~%q>C5|er zlzVZ8d%khkG^PfF7%Fd#yyf6D3>TKH3#pgh1^ae->@X$zL ze`UMsm#wh!9xLTp6w*L&3VJ>!pX#^Q2K4#837~$pwmSX)WCEz)@qYdOVgjfiK)>P` zT3wWA+L%}EB$w8ny7!-K1_XwH*o(Lt34mNVqjEPObP_mzYgyzBnzkL9jYY!K*N z?FSuul?{?9m3N)G6K!y9k1GhKUNt=~w~pF(jc;rR-*9};Y$!_2w$!7-w_zyXRINe% zgbt{`yj7^@S=67AXVDNJ^+)9s>RoOq2iK2KlI;oksnC z2sX$*U>!c{_jT|s!`FuTRD=5QLcNR+CHE{={Gy+;jHswS$Kr(=!|jgsaqQp827Tew zouVxPQ0I2GLHnJ$w^$$Pm1B<}1OojE;C#kSSNBb!CUxe2#5YPBQ=gzP}ED$@*Xe&5&CLwl#_>~RmI@^Z4fOZL7 z?l^@?`zTJZ8m;G4IXF@I(D<(G;JeHR`Y<&coOI%~Lc9_OA6-58{3G_*w)?;nqF4Ie z)aOmSw(U+x*`)cV{0AUgL|8$_*t3wNLq^Ex5z zwSG}8=G1l-oNB#Zzv)`9$@DyJAznyb3O)?Cm6GWdcz2zzqbgjfy|6-GZ;I=v*sgwR zie2fZ;EqldCj+{WPzAn344hnVwado+t364zT{x{9PZ(jQK;R=YdSmkCZ0w zfK78lX3UkDo^hF;(Mq%4;?`$`Vz8RUFza(chWoq>_gP9%VkSmG*B**Uw^R2_&rzA4 z9Hp6L5UcHT-~$y>)8{MmYZvKHGu$cMsf$}oE%KhU5r$KFIK%z>4EF;{P;D{lldutH z>95Oh-;&{;p#)#}2`=1Wt2j6!)_%2bp z)BT}8MNyEKN%~E9X>F!wl)!&&i>d8#mZHQR^tBFuiTzFoUk@eOq=utLJ$AlllK7Ax zcJRH`!M7e?>R0J>zw8kA-yM8+bnrDO-SvJ)EmRa1->6mIoDBE04ENPa@TbphFZGzD z7}aUKb@-T$?%<0k$*MGN-|7(8t%I*~2j77$q`N(x?j?K_<(II!gYStBzCSD77*nU( zycLR~K2Pd5JqZ7r>G`d|`*W`d!jU&GGbWztxi-@?NolfenywMWU}8^$A(-K=%y9Qr zf?CefM4bW|5&Ji{C;lSCy&ZR|R0%Y+KT-^px9ZJrckpfK;9H|~N59O`^g9Fo!DXoa zXA-eY3JT4v4$D7Xj?|96TYvlNMXyz)*m?#FNOE3*cR{7S zDDeB26ksn3h{rjhA1lkf1bTHsr}z!>&`F7v)%;GfnqQNLspO7#Gb{Oi2j80=d@tck zm2F5@V@+E%4p0|wtU=1Z(h&xAFBdGd3O3Ang$0r~t=)sE-@Zy1M{zaY>b|_g`Iefu z=MQW#H9eCZ%B$<(yGf=0Zat+NEst|my3z7@TUs8klbekg)E4oAB9<${G-7#MBYsPb z_$wlK=)J(pripah;$tyjej}oX;JreHQX2@2B31Ura-T()Bpo%Z?t%43vBB__?_mUfs48S*g4W%QD3$S_H})M3<(j+;&9B`oM>5<&+^HAgWi-*UG9p?wnK@wAtX&yy z4|nP(CP8i2Jtm^2>*xASliRJCo-G3J1Mj3cc7JBfy_ue+nVtrv`O3`8+CFzFhJ|*S z`L(P1k_`7k0bjb)6wv4VjEJ){+^1)_zoP_YCP8i9Stg<;?+goIsBEtc_bCD%`-yFy zEpMA9F+gu-xYuX6*WylFf_~B-rL}LA3bxmgw94ds%vV++6!>{_LF0kypy^5c7XGyXkuc1 z^t9qgn5pw*>y0izQQr+5x*xlNuISsEoX$JvuQ?5`AS~1Vp;-3>Dxx4iF`E3b zK}*wGlZ$Ja%T`r^fQssRM#t!kn}-=$Y| z7gHfmPXt+A>@4*>04ddCtah8In+#mQy!=+FC{m3m_mA~n;)MKQ>m>!ll7oI_s`{ti zY(x>y7ooCH-GE)1P3+Jm=PyR}0#(nd0v;~KxKVP@9|SMe`f%klRnDDF5p0e-cdiH> z(S&kBQ69<(jiLG%o%(NMR!>`x6Z!qznfi@Ta%`)ArNblVvV+*!a%x+K zIL8bsAL1N8w>%#mj{;7}rUnc|wR71TnHyudSToc)rc3!y=lEzlQ1>*@Mu6S~=na61 z1T?N4s3Z-9NP9vGAP=D40=ljp$Rb2>m@1yY%fYoR01XmQ8Yi%}#nFUnyV^Ivx=2|2 zWl1q^@jmLT3YtRmZSCcc_cFB#^(v+a)o)BM6zMNpBj**ps&HJTk2Hf>g_)=}LE8&_Uo znrMI;gQNsqS6*crB&@32lyl2Rnd;Zrs*Wq4XzF@3X(;Qu@@WQxIeLIXRlhB-6{9JP zNvx=N#IpB%?)2i)x~#1g5N@5T}+IO+tsd7OqaHp?j}a|?P}L4 zrh8jVk%^IsyV^GtQ`8nyVq$bgQ@dF)C2cXiO^giP)q0BQZDNvLI%B$mSE|-&5P?oV z1NJFOF4<9@lfr0xE-yy~P`1vCCMR|ZCu=%0XnGA=#31R_{d@Wr{XpN6`}FPoTYdZe zg0>iRANk3o9d;n;aQ-oPC(Cx~0m4CKmp(1D)H?o6P5KEd)DOWPJd?dUV}#B23U?m| z-9}&w2ix7c-=S~Oz515?OyAyr(zoAl)Z~MH=G+0_(waE-x#Cl#&$RS4NFBpr0LzL9 z69>(x2_<`97H)i>XQ6oh%iagkx>*`coF5Za%R%B2!5(hpw6pC6{@u~ZA8EC^sBN{% zVvKZHt@b@8!Wk_Yt<_4gBI%ncP^;AqJ?&~`!tMI^9kHlp9l^>-IC*=?{etCJX|$A# zA`kzDf0(Q76Y+*vO6DkQmXfRa)siBP8|w*CK&F`>o6<|1W>*zu<1M|5RmCmSDln#` zNc47TE8(2G>prS2`IZ(;speu>7o%Gr^A7asvXpyXyA|1+zYUYxW-0eN>+`M1PQa)8 zy%+NvPFRiGVTnPf=z_HB6MPC0RaT^O)38L~+q@bVb{(f)=$htUNSqY*@8@@9q6>O| zJRO~^%_lM*j3gHLrh32XDFhZ2+vR?n_4x>F!Y793RsH%1@U+<}vFvTaXEQlN>hlc- zLW{n2&qR5daC?rg`wjQw8<7YU$FjXxV!$D#-_oJ<>pPTwxnKGv{Du>@E6M0&GLj19 zX7c6jx06Arm#~Pr*bzuKQomE8*`Guc=N(d9mkz}pEHPF0E4vGyD(mqpu1a`gjO06H zq-v-*-jXi{11>$AN=MyJPQwYzi%8w7!iZjO2(U{Ki{SyRi{eTYtK@usk$S~V>GDae zY)hmrRfy5ITq$dsyNq;+BSp=8?;2sjaH6Z`mK4Txo9{fO)nfi2xp9vX(phg^Iq~bw z9mk8!9mn&{9Y;(Xv50rm%@i{wPEaMe2+|gie`vs-QxAdo=+J;y4-Hs#Xux0n0E2K+ z*rm(=Z^a}Q6vmQQ6mBZU=UDF`G_oCToTI4*Gd81fp?;|8em|&- zw1aBDN*b*bEx9&+3NN6`GDyCcO)2UY`nTCDF__sz(1^aVMA0{Os}pVLccUog<$D{r zBCgdb-)kwRWKHP0CJ2a4!@Q@AKsmcM72!Yc{8N)g72pNiMkQ;fN)*whu;YWbQvo+q zSr6X+phGEXs#t_gr+%lgV~n4~OYpKlnePo~!)$^n!op&+s3M%`@=aBmru8e`#T4OJ z`t-~qY^%PGKwPVZ8V_qz=kb_N8Kgvg`MRYy&-zN%G~2u0j+5HKS!m9p3Fynr7p{K< zxa~vgv>foZu1Ush3u-itOav+;iR((~q8;%<_5Ea}<2R9!L>&`J^rlKX;+&lA^v?5v zrWiCV1=hS_I2N5xerLAlcZ?4@Fava0B6K!A*c-ayXSkz>E%jJas%=QkH^xx+0gS>U z3)&ET#s}ScqUvNpM<${b6<~NmTZTXOp;iH9MlpjX%;3S=z8S?=Arwd@SOk3jr9Rnac;psX_Eq9<#Wx4d=74ae_SA=8w(~Dz&94ln4xpquSrr}*@ThavoA;v zIxGI2YWJ(~4}-~(*qP+@ka4TCsvr7eZ*aw}yA8fp_f1{ry)$lI+lg5{b>#eIKOv$i`q1jp-PTCb-4giX;>ZxqyxfsB8hjXQBB)s@#Jf4f& zJ%$Sj<|h8X;Ufz&GPz*zZ>esLV89|7*7<7lQ(Hf13PX{RR1l5D5#3|c9z~lLEG;3^(JWm zx_s(Zr(SYrwS;BIaIxQi)V2}oz>BRbFOJPmTBSn6;8R^VljAF{o=p18Qz03GmwDgbKBsWDw}BT%a~ z7+3pX+CeQqj>1qBVr$cY>+wx`L6EPek<(?O1*6(PEq0`78|FTOKxGVY<@%{cvK(Kr z8B;lvb_Xk;Q|1R0stcbB)Ihco<`g)KcQVb@JRgEjzM29g-s5+_YD|RM3Y_sq9;VvBEJZ;ZXcQQ(+EMxMsV>FuesZQH; zO<|AQlKKN|muP|6$6?#(I2fKb+EDrDG;KKlceq$4E;-R?j$MwF7zP5$*I`GE9Y;b9-P)ths#cBz1Q z%ZH)aD<;p2_t5$wQ6sC-)vARKmcXfOy)Kwx`E%(xo!}nSD8~iZiSDTG`z8CzVacLi z%O3>6$ElZZSZmEUmDia@$H5r1`nw5WMdj6&>C$PaF#Vt{_#^0zSe=IVaG}s(+Ed8D zG_{&^<0M;djcSK?nm6uvzh{mOWG%lsM17m<4Mx*Yppg3wu+txkyqo3ZcZ+@%=lOAR z@5*quWVo}Ax9Pn}G`M=GfRaoh{0=vX39vTat|J^!l_ zTa<aK{NhGFvj z$iQg@@vs=bqrxtC@~7ns4kdkfOWX}BX5QX+$F@7I9{2?+%pV}l*1`_9$9)?+5tnpH zjvCa3Pa?WZ4Q_4YKO}EkgCH-QxK^wV@0ptW=zpft>iHLrvcJ2JRRKc^KsT!?SJ0?* zXV^Wv&%nRyy#QRKZcqtL^jih_{pF1ng0dI$N0sG=(zXm zLHd2S-_LUh@E$C*ogT)MhFZqZ^ezV~n&|OR`6<+(>!0~yj6@PcJe>)sqY(H6%rAN8 z2wbzQkAoyw|ks5G+z6^J>X8 zryvc=)Vr&@ghKt#Jzc0U^3%&m#yXud7%o;XO3Zo)_R^h23v1v zV`VL`0)Q^XW}ElXaUyT6-Y1}!IG1CeEbkb<5f%a(d~Difle2=4F5~;yLwp`z$7lI2 zK3*cx=roLA ztoL2}xDIMH-hR&j(iR8l!Z~(}{5?^OH2-}r=NKAicT+2EyZhkRZv%eI?`^990;!D% z<`v;HyBiAXG=wNdR?!H}-~f5A%Ge&1DUVZVVI3B6pY$d#Yv!;>@+L2wjF+75g_Swm zdgKXMYK*Z1N*$orj2(eAvGCqU5M<2pwS}x#NEOi4i3>5-v0;uQ46D2dEo}-4F04E+ z&OsL@LKQR0`2&|U53we+UHUq)yXaz9aQba=N22LfLv2?OqVU{gP$ z5}a<%=Eu8CGuxk#I@9_QaK=t)R~PFT;Y9!M@nhb;x{&Sv?fx`*xck?p33+HG@_H!) z!>U)DuCCMaSJzzNeFH=!t9)Fzuh0@&49a2m9bvbc&RV{SKzY`vG59SOq)4aNM2&=l z%Ags&dmu#H?(^67S|Vet?OPrzc#(DQ9uh1+3EhjQKal3akBBwu6nhwV(gYa0PXTIp z(Kj{n5JH~bE{v8U_1RXRE`}1lE?}LK=)n}P?jEKj(+M$sESLd=YSzm?+D|9R z|1rO*Kl4$RqD=xng1X8t;^plpEqaJOdO?d4Jx=7ulukn$ZA4isRgFiuKkjm9i+d}` zDD{0?)V4oZ{@#1S$yA457PeBh{M4BR8sS-=uguVmKdFlL9#_H|e_csS7;}{i7Yra| zpSwGLQkC<_YnmiR7E|Cn5;~su8CMlzi*_LmoaK!szi=YA%3034+wW?t%VDMguc{DW z>t-{bELRkBSB(w3ua0(~qm-(!47xu;L2TF9)0T3a$>uYhyd*!kuqFG1FT<5v_q@gf z=4LS%S`cx!Mcnm~#w~-wlfR6Vtwb(*exz|*F8dn{OTHO%hCU}_TQTQ?=Mb;(&LQb| z#hW2?hP8#uNoa&^kF)qe5SMUcHWJY6_;>l{#Idi24LC_g1MzacdGQ{6JH@+%-3nt5 zLZ>6Ru`7l&?O${%jgqcF0={-uZ}Ko%v4FFP!+%YKZp!p7*1g?ntk2W*3PcsKvtNl- zKIhcG#ORN?n_^|yINlanzb)pz6U#nX>S+SPWT4CIq}Q*@~Q*hK)gR+UUlHhP8eo?!4c$9 z9DJNM&61Z*u%0w;Ecm~8l-5tzSO9u6*rPs^Z$k75noNV*%`6C3m~WN&jxyhg=8N6@ z)I!ouUlps|&8_}jPW}IY8-s-FuWDV5kh*R88XfN%t;gpk&9xd~@Oh z`R1z2vDtPq-@JHtzMbNo!|vH+Mem$#jHCS%Kb1Sie$so@V7>Ccyr^8FsfqkNSS;{Z8w4-Kwhes^L1(|ci0v*KqjeEKWnxG8blE*#jGx)@>0z}vpSs( zy_;@p5lquaI{H06-e_);+K7p55kFJJIc*UW+9K{$#K~OWr(0CjeQ^L(Imxc}TH*^ku z>XCW$x&x$+7phx^<40+fwQ6*Kyqo6w(YwP*s;XT`7!SQ#&VfVmjVQlP!ghj2a zeUK746P;wYJyGL*89K2z&uRD)Wb1ix{1vBuHO^3Cs(rCz`ErJljuARjReoV_yyx>Z z?wh>;Af%m@#JyF73B z$fxaNl!ppJ?$(g|sSf2iZ1VO&kZ5+^-@P<{=9aI`mp1%<$p!So@gs~s&c0Oez=kj9 zoET2PR)pDM8L>y@i}Sj`1RzNH%#OFLwj~R;z zyOSXPPW`VKT(LxMBym}O-?e==Z0kh%VfRzG-Dueg?az|aS}Q-BHmAN@>409gjjXbCRGNPe6hEPNk7v%?yGLD7* zDbQi;*;uVGTsiUCd~@Ry_y*$DeDmUPF+7`hOtm|>XhdSnGo0zHfXJSc6`%a|piy5B zI``{Ay}llF{MUkn`1g36VQtHo$P-9;% z?!U4{s5=dp;jv>hYXhBmd&kbq%hT`_J*GdoR9^WPUD`T^zLBEs>GEL&dy(cj0mq(V z0@gWoPtgVh^yp~<-k4E^r)O{D*~~4n8CRpO)29NzbZ!+cogTSMGTcSDg&J40(GM=@ z^Y)+H;aLaphcnz&8EFrz zSidqCDrq$C*U%jk zl^V}D`7a49bMCkZS2!^;KRmf9(eGBl4lp68&m_7u5A5dD7vhg5gZUVa=6SzeW*XiJ z(owh344#3bTAcdN31DVr$LI3pM4NAJ{9?X=`1yQ!(~2)@8yylYKQtHVk#>Oi@u2~U zjsfxc8Q}37W0h;-b7RR-9QHN_2VT??zdSflp7qSDg7`&vFbMo+Bw1A$uf_wL%j>bz zisJ+D!0&zXn?5%Yv)Upm74ZlWKA)WK&mjaIroRn)*{0fbB0%AUeNa8m zE3iJ!kXz%OxnqiVSw{w{s-1s&KkKmhcid0Iym?0g*u7mlqrxaSy;gi`(L8o5Oe(y4zJ&;G_Q^tbqp#97#-PF&)J2VU&OJADr8Mn5vIJ%>4uNa!v*BLcC>Wc`* z$UNBPo1ka{PU*-)f*@(%I3(zVsQb+hLA>=8c6p{7`AIsjaH1^i@-kdTP&9$&QyY{) zzX4n`u!*=EqR9wj`kDMVd{hLsd>FpHEpbeTUWjtyMe^;6!^71U#N11AS4=YVLbTyVMqpt zCkGvjWq%QM&y2d0>GWIjQ{52a`SaA>Y4jhyOpPS$=_@roez;FV&90yA^ri1xX3CfG zRMo5TZejQHu&ZN8wzJ+I#%4Gf>cPND3-B}r8TgQ(w7lFoG;aB)elcQcJ?PwDO#aK}?R zrEPl(V+gGL%mVMf>G;Ih!bGfyCP~aJM%}|5UgXXwrYZ6-8^7|gs`ZdiF&TC%K2u}l z;k`n{EF=-*-059NasK_Ih`XED9)e?{D3~@L$kPe3Dxx}+qHZivA_I|A8fWR50jNge z6b#ToIx+9dVb(Zq#n)}g4p(08v44PGp>z~U%sril0~DftioD!ik@r5|TWGyc;Eg8d zF*U$9}-|Of414DwE+jHGd zd?az6P5T?gqDdKZ_dpnZJWN;{maq6;KR*%6SaQC}54=FsraEB25V;tfj;GDhRP|Bn zYkf9{h8r{<-HkdMdz4AevSPLXk>mx1cD-3un%)ctFPBg+J)cdI20zIK%7qahb$4Yz zn|W*C#`|z*_;6&;kgy^NWxLErp}!BunK>)#1qgxD<&k+tf;4=d58uMrONB|)25+nM zA+trtw-c3L!f%g;T|lSh4i@gIj&Qc68eaPv+}#$g;YnhIU+M}|ChM}vM;fR3-ZTTG zqqTetx&zr^+%+sg(%|E7;j1#?-%-wOqq5-|fK5MSSUGe^DR*x2e8(M5#D36k#BAsnt_-!((!lxgLtiP=_QLp zc2@W8g)Chj>5 zOHtPhDyP1d;8@~9Laau#Q~wgZ5@2@6{50u3f++A?Dq<%xZ^s!50iK{`g*;{5ncEpb~*Dh1jlpZcO zbIii;&n`%vO-!2ZXy<*J6L!~x_pA$7?wWpFxbo9*^9pLv8g_ZgH4$=y8hq+!Gb6y+=`wisuycW*U+bs;&-_lZ`Q`po z`TglXoZsdD;ryJ#^6tNu#PFKX%=x`viB9D$*KAAi>;c}?O!r% z>RMnaSH?R96UV!w7=bCcE))Yo46C^s=5^JjlBOPxJv?MXv@BY=HU2A9;Sz(3D|xE> z$4%Sr%_K-!L2ghFh0p&Y&HogK6PKg;^j3UqC~@?*Z-f&l*qWmP?HZVhFNYFCimNNv zEclQp9st=u_)M?5o{7G3W*HH4hno@K6yi}?LuaM!!niHgxLrxT>^K`Z9%{OUMDY`~ zJ&x0q)rl@8Jp58jAYf!Q?{9#hxWz<%fFZ6dsW+s1+ppW!4}ZL;$Lqf|zDDl+`gk=R zq)uc9(Y{eNotd#$4I9RN;7BGmr!?p*>L6Jg#+zEgZlx+x%}hqC`@1dCY7J< zrn%zrUB0>T7~en~O$5&Ad-6pf#>JHFEyLXFQp%84YsGZ^_LdQDoB(*vk%_tT&9%Pa z@(oM-MkdB6ZcG|-oP6Wbki-p3$AMma=I}&ldrKsFJ=cfk@h;r>1Civ|{lnZ)ss$>( zy#?BsYN3Grg4stQU$s!c+buxvrI0sUsP!xO#(xD~Y_6$rX#Jr{+mo3jGZP{AsE|7( zpq(7@9U}s`LLz|cxCIaW9Ux&q6~irT$JygIu^TYAg1q%C%R152@G8UpK4Jy2aNm=z z#d5Vge3s&VG|3syJRCfSNz)Wb242(AOlRpLM%}D% zaM$H!b2>5)dB5UzYPEl)rR!O9a*%kbq1@GQs^ z;8~C-pooAx0YwDl2`D01c|tVtHL*Z6Q5kj5IYb6+tOB-iIU$P-$PJYh6Vb_sELYM%LR-J(daBQ+*UJdq@zZ+ zVHFW~IDImVJ{gUS=XqboquX|6Z$}!pt2aJ2g5*5!F)YKxvUf+_ne>R>$hp2C)hDfQ z7&PkMR((756GFWsI}qs%=2rq{6dbDO8VNaS%5d z>cO%ZOmr`aA~tmDH=14ii*+CIX6Glo+4)Z0N60bX2|Gi{XCH5NKC3M}OF?ozTK(Ok zsJ=&%!GO_*;7uMg>=uh{Mn2<~p7gXhQ)tZozxobITlwNF4qqDc-2!)1z#WzEj_M-OsXGdPcXw2wJF18hi^G*K z&VD0Y`MFiw3YUEjXUa$9q03|QSy0$65_hwX6#d!U*Xm*@Hmwk?{D_&( zc70l-QMbx<>i%wSZOz@U1vEty z|EO#Ii*BW}X&MVaYDPb4o-2TV^tAXC>r5mm@c(v^_`s?ExnkfZWbeFSFOGNUu9zqr330>s8(P=Ze*6%3KKr z*q%T0^=P7+JxVp=XOwCTV~41{p~CEZ--xE>@z?;B$nf3YsEYf1i2SZ;he z-vCbv${@yBe6fh3W1mdLd|m5PuF=G4DzL4zH~i8Lh5v~keklB;e*nMtAHeIuQur!TuLr6k18U}=aB@5}{%xmWlxQ9_)b2=EMr5V!{%uAw zc87#!M%75X(=4P_sj~<{AN`gBZ?1t^@OP_<1owY2@!KAhe8l82&d*~}W*%oKk76DY&!Ka3;SlJ{)RO?Kr*nA#g~LGV=R?l?j&cj+Y2+!|idwJ(Y$t z`90~w{U8meI{rX#3)66>o_G0hW7BZL?;61kA;e^LqYv^8F{jeZQdUC+lBKz%79HV( z=t+h)kP?C1VnP5p%?G(C4Wcbmwm_txZ*s{uAe_%1mxfVEn?3+0kk00Vl&$|;th;{w z(N7o1T0%@VjXsEGdK)tL3gpCeEeMJj zIQ6G%8tZO9mwO=_GGJke917ZKAhGd71Bs0v8c1yX&_H72$ELt!hUG1^Yd_JV55q+e zCqmkqbPPHw>YB1LppJ>U(2WiWzZJzqNXMX4qb@Wf0}7K}VI{PppbAOxI97cf67QXPl4yKlsJ3kB6g}HUIp0xSlclwej$;@QaZ)e(`-)f~fmqxbdSw zFpMy=8LXmNoh+*uX=4@hJF<#WZ8NN*RB33W?D$Q5bK+O<&5e)b8;G+tgf~J^0B?kp zGR-R%7+w*-&n(g}Qq=!9yoaQRW2CF3>`$qq_~F_yjH0+kevA1p<-dY|hVBX!!(W_@ z@Dk4PMNI_DIj-LxbKi?)Gbs+Jg4&j+nMSNRN!#BrjYio&gKW(HIkGJQ>+-G8C zTVuSeReuvBHpbhR9O`$F{y>N$i8CVH$4E|R;D+IAxvDW-(7J;1uStK_imIO#b=m81 zGNp;deu1EGN8OVT2|6+Ao^VLec~KXMVMaopj19Zp4hcFBL1u@bXyWLodqg_Opl=kb zY|+9d!n0V(DU1j!X+Y<}y%8Uhh9e?6B}7Od@2>a}F{E_Je{Qj|24ayBGfu3q0WSwH z5%(4=Z2%Yx9&O?VygXqUb7#IiQlP6?qe~R=zp983hTA@kQ3k z7ZS?X$Xe%q*1}7=yObm27FlcbvzC!=lmHgK;fc7S<7ppp!_#pi6ITfGiges{io4GG zkkKkm*^&$BN!B{%GvuiA;lgGiYn^g{)A{|w-7&imm`3-u#N22L@>B`{W?w{wAP0UA z->ki4yBXgYppsLNNq&+~jwEgQTGF;;Cdtf1BzqH<%A9(~v>eZ!kIr{@y+H7b*XC;`K ziXTA`c2aoWE{15muCdqvncfQm^d>~G)Bu$Nq>zm$##NXQET=HWz^-!);iS_r!4Qhx zUZj%s=6X~O?(YoB?kY(tk!?s?X*+I*VL)RpDxF3;%;`<#nzY28ZnHF7-6rOot}zmO zx(tauU53P-E<<8Zm!&24UlY$CM#y`Jl>HwHjQd8vrcL-YQGZ9VvOzyXI&83UUy}x) z$a=eU7~!Ll4qpfbznHj#Mq+;<5}%7<(+?sYjwNm^jJll7*Bvy{;qMkl-6=5Y2aR;N z7AicU6rYjU-&7HG=R>U{19%`BV!g&nhvD81aLj^e!$^TwBcv_EXbYqzEfPW;6sz={ z`a865l=SBg+8Mb{wvqJYXcL6gXBgjrk@uL3nn-<)4!YGc;N7hn(sC^mKJAkk!vBoV z;I)ShX?u3K%s8%w%2caRLuIO=GSz0BRzqc~4V9^e%2XRFQw^1=HdLnCP?>6|%xb8N zH}f~C|0efkkKe)hmC?9k{q#OT#YAUN5#2D>f?C#U)m)*vpTUcSAJ?+RAN!hh&TV_d z)+9?-(`qoxz)Ml0*Bj|`EM?#}jZ6lR7td@p=OJdhctp&FuiPqK{7BtahPU00qDpJG zqyOA_hzK7n$q87QR4&TR1aZ{F)u0YR99zZQ0Ud(EiEa^XKsqFZ!KmmE#8d&-LxOCH z7WeqwhcFpxJ8B9LCDwM7vo4O9zU$OaMc9buN2F{o5fGNG5SI7SCxIx{ou@nAk>m)}={Bb63f!or zE9p%?dbEbFXw#3|&=qa^aT~e<;}=ex5f(3qR`LJG-kX3&Rb+kRY0`lxiMLTu)Syv1 zP9lUw$w(wf8oH$$x&f6XL3GfdgNlmS2r4M1JIJ+d#6cZrUblH)XLV+DTu?wE0g~W` zED9(po6Eff1e9GN|KIP_?asXsXU3Utp8xke-^=rmzUNfcsZ*z_PF0;cRn;;Vgx3fr zYYx;IG8eR=f{8Xk9hL$cDx7E&{vPV&FsFx(SQpDA(n67arB~A2$Xt-V#A+^hIeIzw zpwzAtJdRUSLHZJ7$uJ1==B^XGhv84tvg>qNeuPU2YuD*cOat#O1SGpo^epBq@G_YM zQij$}AhuVz6Zm!*J`(Wf4kg14F!%at zL)amynY*F!r$gf(l091Z-}0<}?2u^uq0sn2X#7J`GefbI529vgWycs&`I^>u#D$DE&b~ap^cN9A8s%*0wI0VGw*tkl z6yVmd-ViKWX1uo->Q?p$d;GipCZo9?-Tcl!xgK4g1;tISkGme7$U9_UT9XB7dM)}Q z(x|m)W29(zq!jC!DbmbWM2fz1PHdoY`6{jXA1NWPd4C01XiJAA;a6Cf3Wk-Md;ladxs}; z&>13V$VbzQ&>f+JAIT!L7*!J1*TQEwwFnK0zfYueeMq1FulW05A$ibRNT$}HZ)4-LA?iH*zs5FI*Z^O6ku ze@w?{?uuTEzir@x&vkw|{<@<*@i!}a7XD(TinBKA$`2U?x#Z#t=@|Te#HXa;X&kK7 zO4r|k@mtadu^_^Kn4Jc~yKW$q>cB$$hXNf4Tj(;(1=sWP6WEICq&LH|v^S!^6QVhE zd&Gs)ZM-lcsJp#l4IPr~j>iG->F7-vL)WTZbev(rF7>S+VMBTp-uwKqo9G>oKD~)f zdlHH-o9I94o9Vy+(l|HKPY1G+o9LC?M6cu~dL=i}E4hhY$xZai$t|1cr5_GScEp4O z*BoNmhMO@sw}6A{hEQxbCRw{N$)ZgM76~pFSjV{L1a%z5U%BQ4b&P9HP{-%suUvD2 zI&K%zalI+jfK(~;11tIO{?NvN8Aux(ghIT5NJ)p8fiPU*@Dpkf|NDZ5*bFwN#}DVo zHc#vYXR~H)_5xU~P%@jP;FuHys`)W|U_t4M-h;nwq7(5qGkQ7xx}#V*V7Yl7{=&A; z6*#CkYyV z7{3v!_zSAy6_TDyK%GbQ2BRax|BzmX`e1bA!RW}1=*VAC6=PfKr!Yvs#1t<2nm2K+ zF~j9*|(zUU+U`1nQ0S_R*9GGYchB0h71)2THD@ z3W(!XK#|VpW?De*q6(DDx7g@Y{|hoR>KXhXMR zuw)^zfcPhWC8ztC6BE#F2^Jds$A}xih#M%xe~h>RjJWlRUygnA z!}gaQ-?zUsAJ6{sCu|fbKjQzjzx;>oFF*fZ`^*2@U;e2x_um_@{~xly6v4UepRm8= zL3zUb(hoOdKrdQ$mjQOW%jwtw#o-Eb474OH)aFNr;J!Vy&TjLV_wU(bzCs4A>@h#q z->Vz=`RDz6lC^g3QEs?`@TlW>(P-HMw z#T87Q4*@Z;3ipy_DolNrD;O-fu&&W;n?}JZ45OY66-=BT)M3kWpiYF3S}PQc&VQFY z*;iH>*$I$*^txd3Mi8nK+ap(Qv^E}w?GfH_fP92tmEp;Mcn^Tr!>~Q#@u`;^^{K4hD)M8WBUoF`FM*agt1 zKEsDrxH^)o!r6n4FUaM}TEkjA1M(SW>YH(4iAO7Z%cm8cti}Eyi9X|@EUdq;!C$#7 z7wc~|&JGL6JvhWYsB+u`Kdmc(9|C90l6sF&sr@Rl<5-xok2My+E@y%cX*Z1LF$_`jHRA61b zhZo$)l6bk437d!a;RBYlf9SHorj!Y4a^OG#;(f5({VxNUp`hV><%*UH3H})*)Rb4i zpd7)7JHVih@-6$SgYu9ND&VW^sj!4cpe!QF_mc&y$)aPi{vpi$rpxJ1#xn?5)VAlP zp*gtPJqIPvFs5>cnIlX3JUo;<&-+w}oceZWH(84#_F8-ezC${wA2c>U$6R*fL~2K4 z9lo^%{esEcvGrRYNM7eM@-ftC3%Hj=UFP;08W3{z2@kP$HlA5@tQiaKj^t zIvr*a)Hhb|N{;(WhEIF`<8T#@p&l^a$3Ppz+qZq;LEMqt;KXR(uWt;vKH@RT{DZ5* zRbPjy-uAmzhg_@BHeg?SNo_+y-kzL?_-ZYh51R2ZHyR0|YVpTGl-@n}(79&GRaHX(}5&Tv1=XfatEu9MXFYYsv3OBp;?I2 zR+2A8%yuLJ6K&Ophyy`ne>0dOk=SoDY)B5{cD$e8mwWh~_cXu9cI3BrDZj7njHf{% z5ae|^w9~SDvl1#D)w`1qVd7n*>zb33{=x@{2POM-ADqm27AKH%{7L_U6aC5Pf-FB8 zg-4t77u;$at{R6HBmQz#_2JAsFKV#kl6z1a+8Dlz-3B$~>2h?uD?`u2!^ECW2k^;j z88ArVrD)zaXaJM4N8%z^ZO%ZLW`b47F*uZAVP5A!%(FTZY@RcL4Pa2qP@%gO8U&6ff@`b+b?T5=3PIkAh| zoj;=J-Cq73-Z7FKcV-?WIIH1jbK1-1pBqZ)sB#xy?Z2TEXd<0`6 zNKBUId2bnL91X&R3Rjq~tOD`-s5W|a>ff%Fx%LL?`k z^=Qy$FQGU1EQ%K3ipPruKrb|r4;Le~}ug!iN69}+W{1c)0sFbpB4_Vqz zPG7&8vKfZ`6O;=Y%tmk`C1t1BT~VYHIVpa?q=}naQ@l|qPJ+G##d0|2D3Uog9%rO@ z%vTgIvM9!cqN_E<&O-5GCy&#FV1>x=<)>2=r;P)}Z?xF~MX^h7q4*O;@e7uEJ6JDh z!1*by`f*j8lXHBytZZ%=(}&?nyfBO=Hkof`dGaaIm(voRmIvDVwAmp=yWj&7NtORA z(#8|qJ&JD>+IgzA^&0A+IGzpIPSUSPHXv{ERV^edq!ARhkUULDma1x>oSo*X4=Gytx4V{Bww<) z^ibpF$Sb0;9ZqNky&)k7fTYQbaHXSnZI zt3KdSU9He;kObwpUN)=C@#4QM@vp~@J4kex=r;Y50P#z9A;_Z7hrh-(kUsAd)~fH& zRQ!q@^R;yRH&pyiKCSS(Z=l7X#70Z(Ao~QUkIyzsQ3#9wlH~W}pC|EOu;S;N3qbt( zRC%vb@tx(}H1jqCQSmiB~Fk2_4Z`Q=RM{#PLiEu)x+d$bD6TYLavXtioc5S zyG#71ta40to5ND^bFXU^|4qjK4%ZZ++-%2?Y%g=u;Z(UxN>qG%J*<-0^U`wViMW(p zOR~Nn|0#*T$ExM=9`h$ipkBt6)~$bo(NgLq*4^vE`%h@Qdr;Pd+gpmsq89%E@A}BQ zn%V;RZB6nP;@w$n*Z6qJ3%Z9-Ut?Yi>&f-=w3_QsP;;7;){jBH<}f~6%7b_(PI1J>F|I3rIKZ&tfhCi27|w|7%D6ng89I{@YIa>sr(Q#7Y12*7WamhTqpZ zyen$T#$Pw7I2(V`^kf|bilu>e0{;b=Y2r%j-2K2}MwGjkzdo(lFqZe#|}v4ks!M=ExLNTg6TmfWQxyNp~wu|MwLJ(ioPK#s@%2-Ns^y zq1+8B(tBVCY!;j>@+o0F@KCabzhDUGgDOf^+JU7Cs5oH$5|&fpXB<#k^{H0wmjePn z&02L+7ZAn#B5M#(D)(a5YH|ZA5=2&|_$e8zFbBa87=Kg*S=pcQz(Ri?f58t{{T2QD z+JT-5s5oX0wfHH1XC(QV&D@dsGC<&`UaP*+;-};#puo?5E%t#L7(D%7R;Z&|>?3MT zw7Uf=-Me525g!r8D@z!UGI@c&U}!&q-`jzw6i~6xyav=llArus07&uk zHZhP-Nmrm0Ke;J>yb1+=PPX_tPo=Z?c~&}PWeMYvg?#>|_&LoEoTLEoGZHO`{QMb5 zcD3s3Eq?wRkm9Fbil6yFDSmEF@$-m6fuCzFejZclEPh^=o>*DJc;sgue^dP2ZwKyC z0Qh-B@l%ioj8?t=OeKxt4git+PObV+7OJF;LhaLH@35glX8ki2>N_pAP$qYt+$>;F zkatjFh`1ah5_)_I2X-l-;u~|rK5C&^n1xXf6~_^vRbN6TP;Yku zQgS*a#nw$gDLEZY$!U^8K~6hlX6(tmMWwUkvPBUm zTjZ-`=Vj#UcV}3V*a{F_9Mh`rA_`4+9WY>Zl@_~B789P54;1Er7Q0DFtN#XtIRPEVlT0RbecCN-TaDkNo_NzbStHUhmpBmuiLj zP>apSv$N!{Af`}Twb&okV!~4#S11$w?bTupsw9;q_W@0gN@nl_{PCgUijpY~XrdKq zubGF|-ohV--=o9G-m6x|SziML*BE~j7AkkULSZy{-4b7?&lGBd7CWC!juQP`p*F+p z@}(BjE%6m>1DXsKe4;)ozZ7Vl1A5bn^o7|Kt)BDC9{sNaPOCmU#n)JXimz`hCUS== z6!_Yya`SWwD-`(JrsndVE)j*Y_`1;&Tfq>Zg_D5#u=widfO=bzzAzV~wW)PY?mH1O zHajJXI)JJ^$6BZ^FDex3)97f`=SvEO`n-WX00Jw1S)r`@OsJTZC4U2&jFtSEAL;u1 zZwK_af-3fyuYfT}eHJ4~tNzlGNY=RkmE0Cvs9e0CLloq8jipyRbyO(G?E$Mhbm^o} zmfYMbW@W+2K#SaR)rTdwOb2urRuD$|!rYXWTh=2$VvUvJLIA9)eyGxKr_$cC_mEu^hO6X-ilph}_8p7fM{n4nNrd%Dr8 zu##(lCLbl^_>pc;mph=K73qNa4!CM*Pv9@><00hlF%I|;f9@K9s@`t2P@R@36r^@{ zs@|3>6vXpKOF zoq7XQ@_Wldbvaj|Aiu1XvhS);kY7}H{IV+w`-`1@1~iz^iRci@fw>zL4tVmy&cY{4kkGX-=s+Xixz+t>Ir{wkv3)N+ZLP2hKrsUS7P>|bg zuqv}b6z^0hOKy28W@U*9w8-rsC%8 zqKuoG%iUxLuC)V|0L*hS_ody6>B_87nVMc`2hO(x=P=zBG8a_o+*YWpLB1Vq%lvCQ zU;;3Y$gri-y<-nuZU+|Gfxj``1uf~a9}A$GvW zbic8c&ufKB`OdThC) zdfEX!%CtT-Rn%YB3?<>vSu& z@O`TtxZVz2MLKI*^3N@|LWR4F>_87YP{4F|LW^2*>Yr_e3g68*)o|0$L&!bvIDd2z)U8-&(`k7+e63Lfnjza zz;p{`+JSmOyDRC(;Isnj?SOvbfVwd4v(jc${8pBD7zN{J4u4bnC({lb!HeYP&mo$5 zlHc0^Tk@-OK(9KWzcAqhSr)hC_Y9*TzbE*M{G=Vsw*wC_*?K5U$*I4 zzL?@0?REsGZgjtjulJv?Q%P?h)D(`t9dY~WIdze zXFXv>k^JV{fd?4>dZ-YIKiP^u$sVQ34vb~|28j>(6?bD8>PmJCMtCSD;g+>a8#38AgE}_6hz%PNItE+kpp|?0Ses`hW423`^JNWe#Yt z1M1I&--&Ka)kkGXFGfK*yYm4-&(7S-l&z$AU ztz{JK3%t%>hAnJD{tWFlKMB=uaaU1>;nhzo~XN z$PQf0WcyS36}M+tTAnTkbg;iYY!@JNf>S?LW^HC1Ov$r8vLdUFvf2SPFzMA_u(|m& z7~Rulz7;_&8+8YCuLGLO#0yYPnqVh02=zCKzbK!y(<(bKmeI$c8>;c58^hA_JjVf@ z=74gUa5>7yl`fNf!g6)_s0;)kAjRlv2h;$_Jd>;;dcpe)`c0fn^ zDK-?9J%G$JRl3T8V+>=d4yzBVRJ$F}=S*@CdWcyS{Es8-R}SbQ2UNp!OI5nc;`u79 zqIfPp(qf4_pu3pl6D0^wabHJR4+rFRKxZ)BZ!H0KDP$O{x2qLNRqyEzNMn*R%mSoT z?_MlPtnx2+Knoqv^MK4dt!7d3h6<}Fd5s?^m6Gyb9niB(vRNhZlw9iwt8hTW9FU*s zes5(}d^y8Vs^W+hNsW4g98f8fltH1gRK*8N6;mqaE(f&T0euL_bgOigC0{a(EpVF^ zNtJ4&16su-4_nQm&fNo*B%2czM!7!F;niWa$db0znVv>_EJRxRfLC8u{ z;8!13rCscRdNIkARDn*ll9Y7dN4lEYIiRC>O3$3!q-0mJ7*I>hzd4}aJD?|-uCGd0 zS@ImiD7)V|B0b@Ne!(Oq&|`?{DHx%WSmn6X0hKwR3z)8tRlNnB9bqRqAh!cLauL!^ zu<|R}0;r{E>mATL4rm$EB@IjPs~Lu(6}+uJEQaeG(5p=HFtS=$3&-9?Yq1x#WDMTs zUHUs*=wx(y;MnnBYyM781vE0nUc7U^v<}IP?FhitLh$Vyz7ww!YqQUMpDs}FV8dCQ zO=dA5mD4BboL*o~&mkS&QNt--z23M40Iz+%bS`oczSgBFD}s&vDX2YXnFsJKFvH61DEJ`?%{dQFZHtwZ}W_vXv|K+Gx`xB;fH(agkbVP@AJ$VbRXw$;&u5=`hSt- zgR`_aPs5$IK3KH}_sP&zT19}j^j>T@gcC1IK6s?uJ8>{wZG(vig#y+~nUKx|UviWS zlrrI^-pq%#z65s0@oE-TVOcy*=o}tO^OF{nG=PU=k z4imh1PiX=Qckq4s6l-&8VPp)#>3uR}n1SE%aBjgXf}4D=(Up$#WEkuw;10(*^)Lp) z-F&hOC7z7OuftU{yyNNWJ3UhMO{l6aRP}X0|5!Zmw5Q|V2avp`d02AND;We60E2Z~ z@k~y%CSzD~#vAY;^}mAZd(b-zLA`gGP4H}FezRVe$fzeB81zQZFgG5AorQUi=R9_@ zq1{oWDxB-^Jh7O9fvNQ!ZFUyCSK)DZV;@*N6LY{Twq;E?)$PPKw2R2<7p7M?D)LzK@l(+2;FgI=ovM+w- zLS`^lxdN{Rx?&yvbQqNr$B~j{C?AXQGh8iHCQhS0naP!Ybfoyu;^*RRF667C%;Y97OY*X` z5LkXc*JeLydHMPzgI^*8O#Hq>;&De&lK$&2U`c9`1<*TzuAp;ihnqd{{~qs)t;kBw zbPY;&JO^Is9sRDY{-TfkMW6bMJ}gC#(H?xk%}SRx5JlGrdnalOMi$|qOFhq`!;!NQ z{~O@cS=$kJ_UXItJrT9dmXZ;D8gH6BU8l`G3ctCQCcxJ(Spp9Wa|Qk9JB*^H^^B({ zb467l3bjp}eaNbwN#s636$tJ>W}!Ypp}M%FP-oKL6a=ng-w4vLd}tYJ7i~vZ$qR}l zIsKHe{|c#&+Xtbq=uL^7#4SC@Il{#7$JQzajnI13X|p>aEp~XmW~{^BFDjoV1Jhe-PGP#3D))N!*Q zD{aBoxM=?pHl2!*FR|hw6mzZR$BC4=6Oi(*wpzRcgsBy-U{UI@&2zXHn2deLlPx?x zFlVH91U#?DdCTX7y%k}gvO%%~&II^zFrbirhxv3u>}*V@(k|RWe@6DZk%$4knGY#! z^P`pv`A8uI>H#Tj0cfGty(4Jq_n32qEx-6(ba@91kT0L`RZqT_gRg6ZukJt!U%bhC z1UZ@DEf=nY9U{h&wKP}TW|Au-#T5fBu9|FILFk~v^AQ$DD}*CdTBrUNJ41m%k6MO$ zTLyO4_N172qeF|BBy*dbvnJc#StnB$h4rq(s3kJpY|&(corN` zPBRo^BB&MMtgmo(eTp-RBx;wD2uDc{%(3Q{%n+8+Lb9_2q@5*DQdQO#^jn5}w5LuT z$qyW-QMfJaRoj3pc&-OKMhTmzG;fyNtUx8E{A9B}K@2O|8gMmkHEBg9*<)5Ryo*#= zXKq7|Df8<@&|KocBG&YXz|bokxpZCXp($h=Xd#S|z`g=vEb34Yuzk zD!k7893_E2GaZu6r=?UPuX230v_CT_Aspt5`yi!O-PziyEGYtr0bsvYz0UF+=zoSn z!Fz0&;xIQ47^wMowb(LlXQB{iDa_|+EgxvHu@bMc6XSu?PM!G+8_Nd-G&|5%0TpY_ zQ>CioXcJWaB~NxETlbL%_|?rPL}#)~ET*z*fC2mP602rr=>EC06$%b!FSCUL)#-kP zT91D8sTNzQVpevE1C8*CF88XB%1;HF>VR&tB7I_ROZfq7W9asNSgSUzy8HHg5yY2T z^=}oX(=LU<7WBDFSjD>)W;guV$QCSCdlhCgx(|GQ#<2r(srePqhXJWGh z`anSypPSDMSF@D7if;y9tCr@1f)`v15UhT#Rp%(iN=7mQy-P1sRn~uuAW*A3H-&sX zS(PeLJ*0)IJ;-?AD|a-|zE-e_f%zh0wNZG2SLk<_Z=9O?C=i<_Cnf zU7$ZXpl1|RvCSL~p^5)WmonhA>iiTFy#a!+Carpt!4trlBH zzR>6jfI(My8*Hu9Vjo&;bz)jF(y0qSz}7l}PH{jdSdmtnw@O{I-T$_bZ0Y0y)c=bR zTqdh8Rfzs`1#wJ^tyejDvgQG!I>M)zHX#>J?!yYTN-IQPIGqtui;Rcvm;0dnR<7cA z-1a?#-p#yr}0sR(`S&5;H>2ecRn9@%7IiP6{=w_xHE!<`uvXhS? zX`OYE11fevU74cSSn%U{wQ64rr?b+5pIW7gD6;moO+L`B&_~pY6c^FwJW6 z2p#bvL!cD?YLD?-JMaXf|3(!F{$31Xdz{ISbZy=4fNo%tr_pa&h}_{;lH4Kc!zxy} z1NteGxLFW3-F@duE>_ds;efU{p!I;vr!0XNyw0#RQ!hH8KRBSLnC?5PR9*heFqEpx z@70Hu@skc{K9gK%W!332hNbIvumkGvfG%XZtE{3G6f+EBQT@2913KLSX-rqZ#)s$y zC#bNB0yjU9v1;x|&ap##0GU@R!FxI_V;IsZwf~v}`l|zamgx?pSiFN_=^Q3Gplcma z1=BTAB&g?~GYHzUN`6(xy3+Q21tV{>T1BT)hHyCQ!;iEe&v!uiOmZ%hpjUj8kBBLi zyu%J`wF4Ugm|T`H&2tQ~I{E+DzW>YiJ)a4Ns7$i%QUTJ*r`W!4w0&R81RJb1YSjU!ILb>1zDM0j+aDZvrxV zS`seUpu#E&)>@HNlUwP4mM}?es^(`n!lpQ&i4N#$rklfbsQH^2gqpvBzo{A;ZwJOO zdV^Jwr`khu?SR`3e0vts{6f-HW}V0oOcL5!F+_q#5hE?meT@F5v_<&(*+c$h2YzD* z9%q_IEiKULcMM{alsIXL|5Bl?Zj@w_w=uI@IFCCeD>124`yNNJ`C&9o##Ti+18!hI z%NEL721ts=bPCxiS(r|7M>@sp+}wBu0jZsXpuXJbMHnw~_MMu_;>L6W*$ufB5n7g} zvakO`_e1?j{W~#rKhzyTJPXG6B^O73%>7VZ5Zj(3?uWvQxv2+qwfN6rB*zV8d^R^R zKpwWm%eleiq?>u0s=7{p?5)T!w!E{vD2q)f?9$-nls}+kxIh)RhjCtkuQt(}@i#L% z8h_nU(83j~xI+t9tah;8*vv9Ci&PqM>=s2kjo8&1@o{U!+pQ6cS|k2wA%x-CLHkUMlPw1qBs!g@VQ_D4?L}3c5(3H)!Qii1Ua@ zK1m_T!?t%}TZ9XX<&O79(Hg)`KPJKZqhH^Qs`}phqvqR4+ERo6=svOUzdxCn0#^R% z_sVzO_PzG<7DMs0 zXbYU<`0@Jw#v7DQ{y(7a&$dXV74S)|5l1Jg%+fJ-wnl7fjd-gyVxfijzP^8&Ar5_? z6iiCr->V=?-`}PnOW#*1$kO+t6lCf9!2;Rz{ZEPbk@~(3(tKav|M>b^^z;8?^>wR7 zDqR~_w?;%-Bg$GMy0u1}(He1rh4_Ab?Y_QseSIRBRDHdtAgjLW6lB%cOA4~;>$eKB z>g$&R+3IUH5y!1B`lp2S19VXd>EDgQt$piw#VjUG@;nTxUE#8Rukm5tlh@i8^NQ#oLi6CcsMhx--w&k&It7071YP#k(oYTc>*<9v^Q9HxD6h} z(Q0}zTUQgq!8R_T$Ni?uJL8slE&e3(k$KyzGJ)F^y^|OAXNS7=@dg`V-XddzgfaXI zSGa8!RPpA?#iUw#OuN4yK7z^auSje#*c%MO2`KE^71q0jb-ufIlZTA;-o*!3v+=qu z9uoqQX07HGWQ&N1f!73D_^N>=7H%7U5GGdNXtTbmeL%iDbblRU;USWmRL-wLjr>5) zeA_iURJ1n)q2Nl+=qX5-WIBj6sP8b?UPI&<>|z!eNlx-&@(0G6wD<#v7D2z*k!k1{qN#5qASvQEbIjnCpoYvw5KqQ}#sO!k2B%OYhqvGteKLhE?_(0UHmq-|LOW zLjFnv(LXgNVcl&^s}hMBKa&`njf42L?t$QoRf*x9gWcLC?uGkLPF?V|T6VkU=6geW zZK&vQq-Z5xN}6(ZsB~{g8?-mXu zcg+v$`OJ>Q4ub(Q4uLFmkke}RN|2Eqt~oK3&Iz?8) zUDPyZEyT`k$w-L3l_It_+!fE6PzoNcrV&z@7jb=s=Sc>j)FCajK3I38EiQKb0R4JD zUVk0{C4X_q^_4I7#Q;1E7c4ThIlQletvMh1v@o1ROED&nfY(IgcC?Q{o``FIC^-}K zcHwCukUWa_HBtM!FNSJt8*v>CC*6m9vCjuYijLw2Y0sTGU`w zEo|Q+R=QS$%^0Z$)N*i1N~%j$7z{EQ!Gr6AUGe^n;lib$xMy3d$&(aP4Qbh>sC7zH zbBa!@(Ga3q59qM*)a10#`5sqUX*xEpPz72|Gk8=yrTF=d7}YG&{77ADHTxxq&7w6s zyAhIZ%$d@dFNSvFxP|xn;AA1=s^tI|30bU}e3 zPpj;4H$Y!<3V8ia-y2#d*|i4_tU9vm035P2HT+uoTmNcNBaBhBJFSLE70z)30==PX zcH*VVw$w(}9l##rzH6y>FT@MxbWE~Fp-hfKorWdLK7k~qA!D>UVssjB>1e-xAgK58 zhFutbAk+xP!jQiAHPkD94LnH?FW0S^!I}Wt;1+C&1sj*4xXrS)rf9qZtY2vOg^1k4 z+CrsKsC?N%WvWow5bioas0{EYhal^vLgg)R;!oZKxLM$1^y_bic#rh5(7G?7^ww<))j(Tz1r4iE$51x|lA}`;){>~AND93VpbVMO z^Nv$H5go4=Y?CfDz}$l0>*pbs>)oI}!`llZZ{J8VK-C%6jffVi$1|JIzy=1+Lv2H@ zdNkTbs?M-(28-&nIlsZau_$0PV4wbO7(~k9U==hr4nc!V-0krvuIL=ZQ6I{0?RD;X- z^@Cas{ZWGlH-x0Ig>*Eo%Ry`)1n$=*t3WaW#BYEI=K0Ve?mzy^z7lZ(c0!ciDK06eUXbUjT{p2p6@_P+w{ z9nF?$1A<@&sP(fC?`J)%`Mt^lCNtP-h(cAkwub+gL>J=}X=q&2B|@?_Ivw zAyAr}rgXrM){45+4??(TBkR5l)!>|fzD%pZZhVTPqaXv06a(a_mi6mP-Xe6-e0Q;) z_KQToPn{(at%fHsQoI~eyo^ZkvKEE%qdl;cEEL;AX0#issf8g_Q<|YT=l7BJrukX;mjFcPngqgYsH3mm|mUPYNBAxpE+7|w4GO%5#>7$ zV4s;g;J$>5@-aZNy0@EkfFtdDn%$vuQ~rNs3J-kS;GX6z8yswZk@>34zaWVCSKHul z`vK-A8!Y)9W`0{arfOhKSUN(Mwqf4Ksb0Jj(Bbx-%~SAejdShu&DY2;N5pR#dAs>o zivJ_hT+N$P;pqW7f?HE9VjdwjPx4oTthoX4@p4ExXB}o=5fWw~jew18bE+Il%?P19 z?Xkm~k_UA&P-kObP3d)2zgC>`jBtC+oG*cKv=4Ou_U+7fZ0W=8&o+BH!Y?wfwS|Wu zFM80X@}vB8TYS;cYt2C|`J?HtHSdxne&`L+xaKZw$~pMEQ6iK>3rYM1QYDCQ(JO7C zC+*eTBN56|^tQLq!x*vFytf4wdg@l+mi!O5ge!WZEqZ)YlQK6i$7BV1q4%4;511#& z_bkc_PlW75>;4)3YyQNT&WYiek8BDTz3t~K)9#I-qLty&hTBI3U3-Jc%do0?GpL2u zaGoAY_E{5xzNkBl`L%g**!5;?D^^u+PVX4R>+5)P9Ua7TCEjF~d{n)EmEE*WwXdMQ zH>`geE~>*Bm}OA2#&(0DR7?}08e*J1U-+#X6YJX|%%sWvOcQ}D3)HS`0U%#9|s(ttqC;LlR&&-x3E9B=- z40qpiuD^5*vbfNn7>g{fcF!!5w|6dL+96C^p5gB|#65H4H_H=4+@-_ZGvZB;TjfZc zYUMvn^1t_Y%-Y}Ya<}&2-RRfICw*5h>9p)W_TD6huA*ajl>&QqxU^r#)75}>8|_A8 zHkkBx!Tbv7)Iv}bR`nmDXa@NNkMFfbH_F@W#kAbbdP`(mw}9qh-q z5Z{kh@$I0|+Ja#791yz~hL|xRKg|^^+7Z-m&&K(tJa4ppuxLY2|H?>=I@UY~W|VZ! zJQ;;2xF_*J0WP_q6MKQ1z7PxK*Sopt1(s{kotPBMz#c*Ye)=;WOWGCghRwFxklq05 zFhop-N`)CI;@TZ$rX9V$Ij7O|secuQrHJ#AV1h4tk8n{4Tu(@7y;8^nFX!2}Zdl;a zss)3R#~cFz+r`WNV3j+19t(ZCw%{a|c?|jhUi{U^WP@vIkGSaEM^A#AKT(LSAj8KcU=l5c=l!r$tj0%+ya?;`fB;*T0^j`Pi zafji_k#pSIoNS=!`ksS&$f?`q#tR>v^{-&c_^-Mz+`-ay<=XtlP-%lUzwU(haO^7w z&kp>u)*o-w;xs>SC9w^^{$vE|{no6DGT^$n7-KS)512skM;RkI1M`(OrEQXpgK#oX zg7f*yi`5vnkN|#rS-*Yx3%7%N+u{}~OuYhpo2Mh_W7dF4%AXO6FFp#|IH;U)@f+l? zT7Li{!X-hCtJVM`OEAs^#mK;vIxeZxW!m1F`wlw0^}5F{fn&v z_!sA=Fc$az#TNVi#cBTCmq4F;6pdDd|81hB@IoF5nV|Q1f=O7ilEZr;C-?V?@NebR z=$>ztbH2y}#O9}DF+U}X`6*eBcN-u@tpfidrm1EtaAdOHqrZ zsKsp5@&@NKs3qs3lU=5;kg3L5<~Ts#^7*(QTpqT>DGW*R(jU zN5&f~4Okxr^d>wO74yZmx0Cg-uk@&oHm8h?2J|oOK{(;_+=v$cJy2N9p`~(+z!!Wg z@E5)n_zT|({Dp4?{=&Dy*XVPTguI>A5O9TkjqZnuXz+K+2vf`aM-WN(slL+s8FxE~ z`x^ZZ3p2=@jQAfGu>xu%5Zv>HuS|hN(g<@4gqsW{EK48}KEm1xlxKytV|lWZImr6m znKjTnopHwX5_qG`or9%cAbAz^F-8PGlw2O3Dib3G$G7|tIw4kzPm+$MZ=uS-yO)?y z@!8IzBtaNE}Z$b&smpxudYw)@Jc%;~+>>bIVTZ^B9KnxgoYl3|ZFQRGjS;!P$ZK4;G>J*+OyaO3| zZoo4Rp6j#a=mMW3mOGfwL@p#g5j^_ZNR49d;)Xw-C;SUJ#+dUMT%tTaCZ6$_8=lrH zaep_G!xbBsv^J4Bob+<}8vGqxj`R~$datCf{Ek#c3IUuth$5MC+J3+yaJrK~s1zpI zk5Cd5rv)=G`H16N(j3K|fj}|SQc2^N!H!I$xPD}+Rk$Amw;{5O9C;G5`gSA{f9%Vd zHpQ<$j0G!Vor9y#o=Meio>=Za8-G3HW+UBBE!JMr;gH4G$Q|jfaSv+nyHL>NU2Tx? zPLY&dtI%S}Nkngm`mMy68B{c!rWunaJoiktA4sWL^ckm&|9tYQvO8r0r8I`ppVOT*(`>D^-a{nI|9s=Q^e|0eOQ$ z`c0Z7F%Jc*gD^MB{39^w`qFy5HDx;jPp~+DP@VI|=R9Zw`_Yu~EJ^Wh~31a`c-wBA{i`1bJ?oat6cC zk=*@e!V%7pR6%Y-2(uV3S&TBbAa4{!HM&tIkFU<-yirXQgHQ_|m`PcyIWLnAW;DjQ zuys*@acx9iPs2;yjji@-QyaBV;Jy=@qBA+~(VqXr?`jHHt;2~vD5P13!&-bJS^>UB zp|7hif3(-aE$iTFScFcjTn+cpaq#EC^!`>z-x1P3G!KARsc#(3^$z#peVVY|jK2+j z@9=@ft5~S2%%{d+Au@hH6n8fyre#MGJtL)GO+CBmymWnH9veW%U2tAt&UG2SIk4&R z@H7_rrTbaW9!&Z$r<|DDXASFzd_Th+6te*2+mdI6F$j5@C$_X>E1ay6sY>HqMljJd zsEA>Bg&uxrIu>#v{bO?;(8lu+DE3XTzWWZVK_!SiP$o(cpHUE34|Z9S+{8zF*qM7In1f@`qq0EtZGdx4WlVGB~F zu23*Oxl$G?*s;ao3fj#giLuz~Jp(UIW(G<>)RH)s3YH#}e1|3b>|&l_*IwDZ`v!&Q zRCmrAe1sAwhZ1*T6Mh4BnlOnztR*R&u(sx>zQ}#P7gj$ zl9HbsNZi(WNl%CxHAjvhJ$O&UOxVY3ym2X4mLt741d}fdmJ*qTG8x+$VjWp$p`yB!c`MECz#|djMclb zHpR}q-&+m_D0MG>U{&Q}5^L8At|-x~E(s;>HA0EkFWG}o8N7K}@)E3hGK_A0Sii8t zX-oDPPqFP_C3z{@F&#BLSY)Di^mK(2CpTqtJx4adRzUwsi?0EJP+|zYE>7ely}r^_ zT5=_DVbtdq&_?E7xGVexpBaNn`~2~qWm2tqm?;IYWSVmXHzG$87l+U!!bRT(>%Ikv zPqpNBpob^CyG5{=2wAcolFXCVA-)*K$bb^`jUs5oqM+v?BjYZHB-DK-Qm|lRv|;Q6 zHVpAI3T!r=L-#dj1gfyfGYi~U?HkT6wJ-rA`(UD1FfrZo_yAYOv}6QmI2$w#wZ=h; zjP-bv%#9$VoAQl^BokDhFSf!JNo0$yych{XiQb_Ep6)H$qgq*mmOP4MyTL@qvwGJ` z`O+;3%SdAyngLtUtx`B{$f9u1uy9XG19?IK9`A?4$K6Jt+Z9H-Jj+2hP`XWfXe@Lc zr;de`_1u9_RAHP9+yW{*=Ju0CJx}7lld204c3%OcvEZzp^4N83nCy;#r~MOAdAk z8O7k^@Yu=27>0drusA0SGKU6{Ii;CenCq!MxED;AblGVcuTwG#B(HY``t>Q)lG&1% z(om7AeJxpqAd7+8f<=O8D^&PYmD7RO)!Qt*P`708I#^;7KSoZH1Osw#UHBLAPhwkWoLqyj;9Gl|D2KF<&A;In*IIYIHJ`k`;pko+6NPN z8jxteJ)kQ3WIonHN}p`%Y11de*cYKs4uDLmdC<&~Pb-(l-!JccXlE_?dl*xxW-`nt z@dcCgQW#J&e2e%uQnW3ie-NtMg_nu*M3r!#D^86YO5Ti#-|pI>$(-N$UI&6s{*lt1 z@YQwUZEFwSOcDOz-v10g#J&GM_0=YN6X49~DEv*i_ZNwK|0y8(CX(m-xMsmh;NFl2 zsI{;(y8vLiQA>D}1;Y$0@MjjBZ^76ik@$rcj9o*4v9Ol-%@*93FqppGcYOe50XF-3 zzjkj1|CD>=Z@&EPC4bB1?+E!jUj9yod4CoNOj#N(+8inU2&SuFYw_JIW^!7yZz1JE zhdfBn58t?s{v3bXP!7j3ql56*9mR`l$Fibl<8Rw&ZX@^UP#Ju^ zGGkz)`vF2B7}@@vZ?F*^ks>g#(f@$t!4Fws^FtQb{D6LD#{LInNzD&gP4hz*(%>Z< z^rpVRX3iE9PW;)+P8%uu9IIjuhI!iDgCOG5mXvw1H`n|IW#Wr%$@J@Puc2c-pe;C* z$npAO?jee>pvyLj&m8IP>vJg@EIw%Tu_A==jbpY#Zv?(^!H#^71>7cV#*+cdr9!0RqzBWIOua75j@X)GionIDf6*$ zh#?_&sTA~b3V>_ZTfjz79+;ezn~^!mTjnd>rPb(|Px;>Hfkrcr%d636cu}Lq zZ;NcBM&|)))Tm{<#^j`s^Ro)SYXYuo!=L=1E9@?7C(b~p4Ql|Shx!;5K{~G z6=tGfUY6C?gy4mJWcj7lT#4L+_pRWfEVX>Z+7UbWn8!ZY7j!WZ?@WKi(@+KsTJV3f z=6pAc3>y62oAZ-5HDk~*9_@#6&+vA3sc}e)Z-+>Du8g9Qapyg-gHvT_ukwNURZKqI z(QA0LYyeM|bva%RMk#1>LV4W4yuTONjEeigl-vGZVEx|<{KMZ1Ojv>bQfzB!@lC9S zAY$6;S*`0UduR;9IHu?^m3$?S}&1{Goss5C9(AsiM^sKs|AO zji%w{e5Rc9Y>yZ|$}tFW$&7_G8vy^o&m9oQCH~_#H4XpuJ`hQq-gIKhzQ*;{CZBFZ zCqxogV6A)#d~2~*UOf|*12rk^m-nZc8+gq}EmC6*VT4^rf~7ADK`s6#kmcx(>!}u; zEQ?A1oKu5|m(`eA$`nb=S8yS{L(cQyD*_v2nXqM_{i_*{p4uG#>6z2isWK;b&< zdJ7{>U)O5vjbNt}C@vi_I`L9G{29qV7{bEduw=RtG0-D=xiFRV28H%3K>6OtXPJ4i zm+y^>`T0A1E_`McEQtf4TbG=%6t}oeu7~leOP^!S#>ePqq2#@A7V79VCZl85)cO-} zmwJd7^K%Tk6^1=yUqyf+$ zx3}E*bTc`<8;3*kpb{^_?Ut?(ULVh%dP!4M$s^F$i1tI=;$UJXn))<2QB3nhZ==GR z(9pIx4F4D|F2ee7>@Z*=fmuX$v@cXyrf=4vfm3T8$%ZglJFHnxrHYFU&c?(8$}N>{ z>Pnb~VN^9z!~62|JukP{KmrZ@1w@KeWPl8Dvhr- zy(!D(^qV+CJ~tcZLT)Mlg>drLY^j1J7r-tk^#Ip}iiUO>IHrSzv=&T`^qy^OW;3wP zBUxMjje|r>G!Du~4P-Q(5wD$kewYp$Um6`SzyvV_1Y>s@8B;s^a1ZEVOw6#}SP=If z!q?Qb3{FfrRC8c@4v$#vMwcLJ*2R}ZArHs1QfWUS5YytvGT9JkU@p~IhheN)CN#*` zC?g59P}mPaj~#)rRQVG)V-%Z-V6}*A?Wj6@~ z^e0r5hPd|#qPTpsj$PuP16H*7)676y@)b(*C`wXOJ9QpHduZ_uU?1~GEhBm&5XD-2 zDn#JdzxE~XcsjOib8H8eFQ;qw*CQGhD5p<5!58}~Ux>1Cr&=x6Kga-0P>Y{Rw&wga zh}MgJF$}N6vtxrW8BA4~R&y?MNZiyJE7Ef9>BjPSbNQTpS`9pQVC$)ZrT4R_hn4=I z7YO{m+yfG|nu>`QhuxG}kO)RhRzQ3oSYyrfYF&Rbq{^U!S${pz-o&5CVex#FY14HX zhkk8NL=M%wsoKzUB!EzD$xQ5LfB?ky06b<49Nn3E#yqpV@FD~(tQJ3rVJb26Pz2*? zO|v31!6Gvdi`o8|KL{Z${w`t$6A>7`F<H?lJ|IwDzvkj+Iy=R_iQdr`uBu>oDA8f<}XsMY-hz<&C|&2jbaFG>BP6t zhqq!`f&5^O`ZFk53gWYbpZ zxrk=0B)C>YPH-W?<%&`S-z~;Z>P7m?rH^!Te+Q>U;YwEn&+ZSPRFZi-yaM$}N4lW? zk+GPvJgzU@EJmb%*Z&>oPcQE!LgTi^|DESg|Aw~w1E)a$!{<*g`r(}a(fQNYyMyWf z?D^AQNpJnv&YyMxd;fo)KYg+r8Xa5Q51c=piSU2*{AmaDU23sX{>l;?=TCROhMnqz zh0@fG%_uz&QcXjQ)cDb=f4BKw|F+IUr~3D%^FiZ>`!|)vM(#DjMHUYnOj7=`doUZN z?-E^Q3xlP{q7%c39>K&N+1!c730S(*7VQcat;QilZbi2Vmex<3A;V`8oS$+2yY$^V zM&b#CBqvY?4+(Q#BWJvMLKS|mu`j<1WtMr3ZW4A1Zhrq0oo#XEn*O}Vh%?X$JXwG( zQVu8im=G0;&fM6WY_K^(-4m2Gp%9>pveZ^F7 z`Z@vaC&!v`cYdF+-W7R!Ogbc6^e~^~;D+k?brICJ zJ!f5(5!4S;S<2zv{h^|xm{Hap%?xYL8<tT15ZS7yGguW)#8Xjj+H>W&-Yre*$$J5{In?>I=pw9`Xh*GddlA-O(%YH!FGx z{G9Ej zI6nGe2imA6XyvQUx~q(h8yJwBio@o2cQ(c;02`Kf_cDenAP6963{=2)0OO4k1xyDp z-6#~`6}4Df%paqZLj3{X!Q^83xv##K(0$AKW9);e1QNjc(L2xxh9;voqn7#{K%2wq z-aV-W2<(gY(U$9fq%k;uLQHr@!yo$pPM7K4+RQP?V+;(j`onHP(R!rK7&o= zUuqBkP@ndNKGov)qtS&ESaCq7E=(&Bn|8$=XwI8G&gGQ81@_Q=xkf_{0EM^#0uAFbMR4&Zp@3!}=;?(?Y_hAm1HLf4hDjbX@eN(BjnfL6Oo=rlCg4 zc7bC|I-}lfTv@Gnf)d0bx`Oy-C#8RO?}ID#4YC>YaX7Qa5Iv28hEI+?6inW7NOU~3x~1O6dTE7L z3LZu~Tz9|?GSTp|W)=VvqkCNolmm1%3;&GCA)+&8Gk=$1Qm;4Fzs2&$V0DL%P92R9C`<+DGB=UV)COhKa@2WI7*@S^%cwaMT^2Zbr(pfD1Dv!Xv02L&9U+!SpO$68j* zB#SCEU$z}T@(1u`KY;iC06ymj@cYhErD>h-$2Po_vX(`%F}xTNFo8hhS^I4OJVbX1#5kAQ%zs;UsDccVY|o&Ccs9cQMAIRR6S)s#eDnzE@XVUajW1r8|}_* znQud%uMVoIvCNaV9QQm~g`6Af2g|AczEbYJ--MkPTjYnLCn)-fp%6-4Hka|R6ru8m zW*fIKW1i{4T0A)#v+b`u#;;{)qAd+$=mH9%YGQJ}E03sg+*O?fGZFN4U+U{} z>gyn_MI+GgD^lmU7NyUfu`Y&Tn-=HKaPAB{LAdz?7bVnc@j0yG)YKUl*EDGNbK7r7 zvP^6R#zruKh3)XrQkD0rahqnhkB(n^FJj7OS ztQJ?renwEH-6Qv7Q0d0AYC-)9j|t8=pN7L?(_&&m0KV^_7*KI1;g_bidGybjhdB(4d$FM&U?sj2__9h%Fyeqf}r1=l`f3BW(dpKEEPvNmv66~OQ{m^81 zKlI9*(RRF{E2#IDHX;WdOR@1|9du;JFp30b3u5JD8I`BAesR$8X!@Yz#mGw8vvGq3 zo6s}HOAsUNVb1f8bQji9Ryptp>NxPI(&4=0u2$zA@8g%eZBZQKubkP@eR=as+O*?62aDoXM1Sl2U+%hIWgd^FF6v({iA zV-N-zwZB%d9G1g3I=7m?DEr(obw3<;kgO*R6L%ESt-F}^%5wIn$>L_rS}+Qs^SBh3 z7(Ezc1h+9|$ZGU^M@Xbo`ohW&ZBi&R6W%!%qCZ6lu^~79DaCD>9oiA!BN5E!lx{Kx z1T1J_y3YrmY76VuIp5MxBXJd`yMgRb(MH^sk?Ajmh1ajwYspU$7*5`j9j-#UrnBaS ztAgmu-5tJ!Q-z6B(D#G-sm2*- z9>IQ?SWSHiEJ4*`eu?{Os2Q|eT*XuC)9Y~+i8ePVe1U5@>4}2N25{3!q8Bit;2g{+ zGcMHM>s^c4nil6dpxEJzdp-{*+P;QwY<84&#@@r9@X6SCL#ZQ^%zU@^rrx`1-n_S$ zxgOChdqP9oa%qY1dPh07TdX8YmSlza|R)n3ev&^;+n=O5UP3F+>$gNc-j zblF*Gdbs}$7Ht^L$0HxLD~EeEKoo6tYIX10rW)1GWp;T#Smt@J$(&bKa$1Q?R^07@^nTp(Y+y@EO%M?J_i(h_<)3`LFKK7 zcLMej%a}=xN(j_+x0P@TP~n98SU4Gk!x}57=4Xrb%wyhnP zN0U1!=Z9G~2trn9;7_B1>Vb|f=efxqr( zIsVGI%_D82*zvtH`^7f1%6dXNyp1oE$XUZiiu`oS=IbSet z3sVS8XJFtFE*KR1e4w&`@ zQOInIfr&twSA#>28|a+$rAuN}(YzGeFT+@K8b&URlAVM7XrRQMRXDnV0Pbt9KqZ9| zZRu{$DhgL!m5+fioHz&9eQ=i(YHH3mQjyu=#E9%j(ObB64_-m*wB*M?``%yXYaKyXJ6M|Ywfk>86XDPd=U4wl>el#zpAnitc)ZJ$EJtUenxS@x`4Cg z81c=%5KYb@C)QV81=M{H>`C&GCnZ3Py4G=SLYzb}YsA~`eVe(wh0_;=j2uH%`r7{N z6+!3L;|=1*L*98jUE%uv_Vs=3u_1OB@=BzOi|HRs zF}8HlMxs~On%hEW6De(`&@F~(0c>fbr?lOcP?ikgW_w5b!eRXEn4R1CJ;0GKdF&By zpXYNtd0KAK80${ZZ2zN1F)I#ZHUAO#gcQlH z!V_zI9WA%}on6PeP2h4FIU>&D9EO%#*r%VO<@Qt+>wDYNa?7#}C4D!N+CSE46?x$I zsy8R-&#vP3E6P$e8-S;$ire$39WBab{Ai84_(fA#arne*^p6#u3s2Bq$=G)$_+IEi7`Ad%_OdpoK zam+(n1NnEH+V^ST523%DO-L{s|v`A-J&D!!lvtnCeGSV#juBV%-f^+P< z=$%cHiHmo^i^}vUyGkQo_3LaiGg7_$h~gQ8YPQpe?>vWGwF?9~e+5wXe4~7I9osv% zm{NE0?zEXX$N5)JRxP%u?auAD6Z7jr(@f4X1M!mc6{dEUZ^nA+i0`+LIVC=zSbnUW zpw#M&(b|{v44S9(jy>aS`7hOrbN^p;?jK{8&5?-JuqzstoleZ+--!SRy#*@oOU~bp z)3UMGxr-`vV<(#LDBbI#r=s#UVXv7GwLjuq{`N{RS~lWc({z$KQRkHYT7xQBY>m*B z^HYvYiaV+6loK*(oG;VvYJv)P;r_}|Y7tn7vGmd0InH1G0JC7?Zp^=;B8eN?x|n|i z&oR<^Z~;!A3uXVeABq7k=55lem~$lXRO`kmR4HcE&x~T&BP;jFa?vQNh&HyEoYQEC+xh|+GOgHXT7v| z(n;8S#+Qo|%yS;lL{Rfk*D5yL!3svQaD^G9UbwVL@oklU$2P%n7aVGVPv8{+=Nc0p zal`wwD+4~d(7D9q?tzCA={^Fl3_6u2{3MlGte}y8=c^{jE6|@v&*{7cqbf zp|aadRSq7lj`i{$6iVV-irC4JN{? z4TQ`2N0kyf!Brvt91$1O^NQcvGfVm=~Qn{l&yH?dHaOzBWof|$G zCF4pl%I}Ofd5m|%r$y6a6dn#Zb0^|GKlCg-^s$=v`+aXs>Z5%jLu!@2t|I$WWkX zdvPtcnB2lfBZxo8`IU)d2~DIe>5V0Bbim}<$N7%QlT|s9J}aIcWbzzYXd(x*>N{7N zv}|i68pU2zguFrFiBb{bAL1m4OsKF*t54+2`LVRWuVNyle&=gMajf&A8o;PeQKpe0 z0p|phifWLm`OHSXmZQ^&Cid%v&U>tG301_zicAS{=j0rd?>B;#TK%0yV%=PCQM#seAxZnOIJxJ%Xp_I# zFVoV2B4I_*#cLH8U0h!5!d#&3jrBa_%=;m}rfw||u-PB1Fw*7Z>#Ap%COq-ce7a0K zfT+pGyu%AS$|Xnk+)-S8WS<9rJmsI@k9nU5e?;B$e&?F?@8OT+`w94?>8*pkOmF>5{E;j+8~pKE_md3%xR}xSZ{v^T-0D)o{w4lsn#IFi z^EDF=!yiBD(QL2zKR^Dsn5Gt$^f!8D@yGaW;Ez}4nr3p&HxMs5Z}9v#@W&;Z?w=EX zT!RWD&GtHq?ukD}%idZrD4H3?uzoCTLsj`8Bs&ak&bcvPYwW25r~qt_lm#13SX2-x ztMNA=$?pfl?$UD@Pa{Q9xIdPuCkL!_bdnCuo9kjvy%#InwD8%4y?*DPy92Oh?i|&Fp~5;5!HAzkqP_G&lGV;dD$QH9f+YvU4^Cxgv$mr^jUO7 z8r4~4)BFtual18cKNnAP*4uub?SHai)w`>Fa}fOBkt?GM)FtlQ7=4PnVQ-}@WOXn7 zW+wz}_x#SW{u^lZ=#NxJ|L5JfH(5`YhbO>cGKM2Sp{2XA>7ZpT{fW*@Tq$n*FfW#w zRD3Y{)CVzp8_KGoYk!M4c7&HWEeNAWy|HrwrNqpw$0{W>*B)It1Q^=LA#md!IRqHm z$RTj;5s|?7HYU1B4<}PuJY&u-{}BAhCkOxPlY^Iia`6054!(lmPVGd7kCT}V!GQzH zUMlxaj)Nu&dSUj#o?)eK7={kI;ounx?!%s8tX>M^c+?H|cTQY{z27rTGT?;0=Y=7G z;g-E#;c6li!BKUubDx4ZX10ts9a_OLXHCF8kAF=n*;Ub zkdZFr0$5YZbnmWo9=0tKKDv2Vo-X#4p#(qknCafHBeYNPFly=NIb2zEzOEWT3XGNQ zv2Of2K+xZ;=A|^B?)jxI!p%*6C4E#`f=pf~KAz6=G7&L^6%b5#kIsH%5=kEwF@Sd% zz>_`>_{|(=Z5QB|B4ty^alEP4u>v&NMePZypL4qhXsRV5ar*0Jb8@Vk|Au$bG3l}X zvILrApX1Fv|3=ay8!lL$J~m8n5bd_yiy~dBxM;zNEKV|J1n+1E+TvZ!PA@q=sus&gxfD%y6Ka)= z3B~X?!DZ(I@Eb0j-l&V%T_9Wq`$1ni~ob- zzuO%@2QQlEQRF+pKXti3z$^wRB{+mYz?qisF|(C7M3(K&<3oA~O{xG%WMWutf8I9<9mPjAg#LPvg_M+X&fd zfjXXqV(c$6gKvx(e5Xb+Q4~!hfAfOT#Jg8HMD4GW++hIEA~Cngx*=#V0|2L3Yf!+^ zwMyxVWvL^ZSjlcRDeP}#&Je33F9Dry>hKYD_#UGrPTO}CX}|>-&&+n>_EF9u$hq-VD`D02;fqb2LbSqq3x4NdMuxzy4vH& z{Vi$}G5|jUAf{z|*^G~kF_&%!y#`WE9dsJF&LY*=?>NshKp@31Rty*4(2PWU={%3V z>)yOHUL?PUboc&f$pI}bhH-2Nt%2wWu?4NAvZ#XG6W2wo<~P(NnJb|ry&W%kTPT?b zWhi=5pS0~bH|l#jmYH}!+ev09%m1rR-7g`V+3)Q<+naX_XT&ns9_X$^8RO->MPnD7 z8!dZj?iHGeQI20WnmjN#0WZ|P+#gOK-3`zD)=pKne!+c;-?_JIK2Ky0U*uo#Cxl`G zJMYZWFT?4%{<7Kr1-5~1<0eo{OP&_KM9F?foJv$J=}Q-uK!{8oMRX?@c-Z}+sY0h@ zL*3!rsF7pdjJ#v_;vBy0V*^9o5gvZu=03_|8Usd8zu=7h;3GDPPtsl8 z=mLJC{%Xi>hwHCKgkdi{c63!(EeCoM!bkn+d{t-42&9tB}emNv9MCY=%9*hK?- z!W$?a-|M_+-i`RrkUUA-#~)#x_r!k220N$H^xeHpduHV|j#u{n^zmfg)Jj&Pg|ca% z?9xa5l(J^q?6LY9`D^=mU8>C<0T=JO&9wh`RNNt(0Oh4mq?p^5=v;GNGI(vfv!7ZE z<1Mwbd3`j!5q+T zy5dNB9xQzt>eq}exH}23CbpV7pj~XUWHM@%X@t^iG3j%Jj`q2U^o4;$$tssc_`H=_ zL~xZvDc->&5>4&c^q}>P3&^bb1A-#yZ-z`Y6UnzDjK*Oj)8p^UvBwveJN>EVqa3@T z;i?=Shu`dkSLM9>K7$epAQB<-Y3qWhy%0&Z{azA#VZaDH&${^W**7bcuZMdm6;yp=NKflvcO4{ZXp>N5(a+{7 z7lf@jjbOw2Y{Mh5xW4D5hrS<1UkA-BDbPv279$j2%JwHGK`0A76A`?edt@WCkCnv}zpgG)rLyODD#ix&@r=sWOT zsKS>)eX=swNF;#4QlXxO&Q}IW>8$h9{of0xk3})z(m}c@sZNKXJ4|MMGKIHlq*Q?% zNXRjSD1mkwsC(x?;NxNnl>EYC7w;OGj$8hb>4u~I=cglyfOYp{jL)SvYX46f226|| z5J|AckBJOC7jKVeCViBXE?OQ3c`Rwyvd!tHZ7&)qH>1ZmUbYR{Yt-=8oXGSzktG{@ zHD)V{}m8I*7Ud0nl@SJU5=K6!AV-DMI|k>pos^l~v<1 z1ER^R455Eak)WP%i}lKc@}DqTZ$U_s*Y#Cq7xt%eA%Q;Ul}a761p|KqKz&ZIS|+ik zV#&)|Du#X9Wrt-hIixH=dX;`VT0ruA8xa8U#gnV_jbSrL1u{i-oAj#k0#RSOMBb5mbT&-aHPfH#>#GbLX_W7$uXa-b6KRKkJ!;22ZfYwi9ki3$!^{0BIF zhF7MG+<4R%t%@dhxNR5gMSo0MO#}8?c~nb4+D=d?PmOTGd&>lN8?}l}TM?(*F>)gI`gM^bUVz z(M<^9_~XM1G4FGN&Pb4t%_X#uHY6~ic4x~zR!jD_O?pD#?Ca~C0tRO0w-mNioS!LQ zq-DA~*7inTB5xQ<^2Vl%j!d7;YVaV_A)1~wOtv&&3O=G47e@^#id;0=LYjHexQ&T3 zO-)^y2x{LOnXWs*FH&}}G93^4F?^7YPY75`|J%&CJ~5_fW;$fpm>HW-fUI#~ z+0CT;A;!_LOljSX8CLB1wK*IRUuFcv%62pTyoq-t-+v_NkJT)h5D})Dbpneu9q^?t z!_7^do=Aqxte#*Bc#dwoi9CH9%_u6;OgV;3j)`S1VD^z8YRjq5#oINjMx_TWW3Ad5 z_WdQ1#9CJ2jYQS-!|Bs6Zl>V34DjnNu>Wp=S2MMuWjhkd_2*>B5^x^H|uoA(8AnFXR7%61a0bo*bhQGE01~i{Jg^sti%iL*km0Oz$E=9vqeK zsz;AXEHIT=K=GAkW>$91%ym5~VJhy{qif1rEip4YG4(Y?T_@eHLyNg!!qfSO1X%oKe}Gid@-RO)3UXwXc9K($GYgJ6^TN+dnn?`r+? z+R>~OMSoB^Cu$~c)l5B6O(C(f?w&DAUe`kKilC-2#fl7=sZ>?jWAWq;)480x2D5`;&)DZ3a3xdS|%Ci7^;Ed!%;xf za=)kxOrnrxQnYg*uUR@KSX?7@*SwzpcTT|FJ8%UHdEN_iq936)y?t_b@@* z17Ygi4CE&&+qsAAA6y}=I6JADD-C3{;`}gM12_@RK)pak_}ZI#a)I^@=L9e46oMXX z+)M_({4As8dNEoq0suTUkv=hjeqf`50z+g&cGJ#~GZH0Rv1*iO*1HJGiZWm0{uTpp z$wf5w*tCCj<1nV@w|I#n%`4Vh%e&!pU53E@5@>OeHDv9DuIz;Qcu8?F09rqpqa*qMe}<`ouB$M4G-lOFmOF}c>=e*vjxl^EEDQ^WYM znx`7T^FrY?H^9fF3k8@*zmbaopJ2|{thbua{e=8jG_v_=fvb7SYVP|9x#f4~wq0N^ zVEa^)n{Vq`yMpfAUJ=-dtMCz;;>9KlgIu)BtIwmD4oeOl~?s=o{V? z9Ll$@2QJ3g%*HEDYg)~Id}{x)c5B)FbgIxHMBY19KBq)2G|L=L5zNOQa_!n%hdg^q zsDpYYEB}Ta6PX}}m<`KOmES0y z4Kp=iA)xn7MtqGvY>6?+c4R7LY^2uW=B47e{?sts{8TY662;g=CMzzRR|SmjS(~E_ zhYTI&*>3)~Z-=EVdxCoo+^Vws+BJT=CScbT%6gt%6SQlJ>>5JZnOj5AvM1(kiIx4` zYF^FgPS}5qmAr)!N$?=F5*N1cMeet~hllgCKZYh8jw|;;WS%j;7^Sj=a|r-TZ?Vi+ zvUx@$>nW&P~%6l=-=#1Oybo?_%Y4aY#<7oC-PBa%$z&qp+uuG_xL$muyUw zZG@7u#5F;MO!XnU1qwjI-U51v3IgQdL=^=UOw}1Q@DhUtLZ3a5mpU8QpBjjppE?n@ zAa$gD3YpO5^8@xN#!zNcyZ^KMP#)`7s?-B;_T@$P<$dkT>B{yH z0D(CiImZ8zy&96!UT|#KWfviTv1G;xek3_6Q};ikV@v69tLEOVv$ zFuMN*S>VBLxz114XmH{W3S!o%r=g>vBvv$*%(o7OnG9jm^U$i91Xv-zQ8Jw(Q(t4q z)RPREnxX$;UaB0|pBjXlpX!fWkSetMhD}Fn$jd;uG@E^PpWrn~TK(~|x8^dZ*7Y3Z zhYxUI=DjErIL*4u5-WL{F8n8>yB-Bzb+d+2hEM%2GrX_P zv6_&SGen6+S_M)dGU%GV2sbYk!S$!UhMS)X;TEKhW_*>9Lnv&lKbbek7R*l#$r8}8 z&+Heh(kLy}nhm3Il?HeTzv;?tx(4|4QaKvn)2roZfKN9AoHVl@Pn138j_zOUBcS{< zv}sa9d+>vKsa&uT3(;fnD&K8mFdtjK$A6ka`I&)nV6bF;- z&hWiR`<#A`sEr_ZiFbr+5@lG6kY*2QL3<#QMg!jyhcEe2Yt(ZZn$}HU)2%D}ukp-< z*m2>E*iZ~-E9Q4~U+D^qJKUcz!<{*CE1noLAay-%ZfYuSo>;)#B4OZji{vY~1*u~q zZe|C`Ea2L%BLqs1`kkrGjh27o^|18J-MJV^7terf!+w5v!>s>%_2eQ!xQJh0ek>eq zH17-ZHpR-gp8KrX172m8#L+gx9uUtId3ylg`T^e>fe?tjt@7`3*$6?~8F6Nb*$-)& zSQ+{r=P?HB+srKKm7OG;Q%n-th)F^lF-d46CJAlCB%zI%B(#wx3ARD!h1|25d6UYy zrga+D*vI+oe!(h@(o!o;k~U3}0)C^E+bB(vQKfP;Nk&!6(IgqgB-ztQ8tnqlC(524 zlPUbJ)%>vLL1r|n^dJUa0GYO3iVC26VBFaZg+r;?XddvT*z}nq=i}xXZ8QGV8Tif0 z#}qj#V&{?#`@jYC1RN1p)9dHP)C^tmBKb_Xca-~^=Y7_{!gW*z6cSli#& zRrW$QVV)#P-heZgD>loq(YC*GQ9#@rr}34K5WE`|Ncdhh#U4!9qnL<$6TV%}FCJkt zDg%!^UFe?Kh}f*&(3E8T5hBL=12QJf?I2_*C17^KUOQA^o+4~NqH|DYuGxs(t7ELu zEVS%HI?f=~l&XhM=#$nTR^_p{d8y&J{?zHX`Kgm|=?%NDS&rS!2igi_P213C^9jn` zhN5N9%`FybrU$Nd_%;O0ychWvt9htclAxnVE3o6TCfz}mT_nrT^b?Ym$c)oAWRR>> zaTed?`dryoEJHAU>kpay#b#=))x`MRFG}mBTMNdub@rKrXs#{Dkz?}IWLr=wN0V(qwH!^h1x&Wx zpj=yLJr*x}(%q4cgTaVO5NNZA?`M8X8tU3=(m+LFwCqi?k( z;j$&+vL)e~EvYX#v9W+*e3v4C4TCxJBXteiQVrWu4ck(U!r7KuQGUE; z&X&%};#$j`k#qzzkmL4-&IkAiv0z%-pjem<$mv`G?IdnHo!9Pnp9eU*b)P2T@4+68 z!{dWFRfsY%M4*hG8)*<*H}4o!1!M~UTk1D8BVqWlZ6j>}Sqzb^Xvr#P+glXrMv2-5 ziv(7mEAI4YHLsF+3OQdv5=TOq?G+)x@EqVhOT8xyAT4#*hqBj!c)Dz-OmZ0hVIEwC z_l)Y92Axb_Js^Ji)ge0%F#yTm*yH@M!)x z!rFa!QM2i1#z&K|ncr}pJXxX`30UA`(cv%>OFtXpwr}BpIEs7Ry;!6xLuU!M>&(C< zPATVKh498V{R?(-3)NbBBGUVuu zsxga21A53ewQ7vfqHz{$#`4scv}OdOFj!m)KUqAI<2x@|*s25U$fig}Z$;TRvOh1` zKl^q^j&DqIsCgsZeR^{t-HMD!mS^M0v#M;}!dhjV&2)Tg0I$h$Qfm;e$u8B}H=Eb^ z)=)O1hE@!Yx;2ZpmUidB5j2|%`7c@#p-(WNRF#=Q6a1b}N3BB$8zKi?^h8wfDh&F9 zJ3Jstywz;uR%yrk6YUxn>3a-ru5|lLkwtk}T@Xzc6~r@z&&TaJR-rWKAk$jSzafeG zE}r&>6Um{u=$1oPBZZ|zrRf4on;siya*HPmSsja>6a*sdZf?}bY7z6xAbxK+SN3P% zBrs=UEv+$W%i#`88HQCc#$zBe-RGk4;uFBfJlT&JI_!Z-0ls5lxy!GMC5O01hl=(` z>|ZwzOc^WsZGnCKv7qID~W}YwB_lQgCwvLwWI8z~(Z1DNVr2QAb{x|^r^gKItK_HQ- z^rvdo#$5Xjk4cU{o6sb*D0rIy+m+`N_!f+S^qOvM3Zoe4(1Hc>|;t zQ(nt-Gxf%WjDA^kVTE=+h5Fyn&fk$sXy=WT73#bUXnHKv*&wnT()XRmld5~c%G$Sv z9`oS@`<-$2(^|kFXTqQfvxZ@v_^>Nd?W4^)LU@SpW$hX5tv#c?wP&=qwv4Xu;?3G( zEq#dbC#Ky#o-zB$XxhgWvJGahehH#?g^ayggYz$C-J8|#!JOxz+E$Un%7IdbzEf1& z6{zWB92#7~y7@FliUvzBzHt>{WO0(hl6(@jUg z1E_;F_>2WzASZet$8>?z`y&`%wFaMABcLKPN&il_DI*Rh%A;}PQfZo#2L znJS;O9`BFdhDG$K?MHv5HfmS2W@xeE_J-T@$n}u(CS+^fL4^H>I<*J_soXS?{8aL3 zOkv%pEeL+*@9A#IlqBqd62T88Q0PO!@#Sy?Tc<8ZWEEm!&^Oj@s039##JbK+u>1)( z&;;Tg_ZbZraZ#YX7rmWha2d+oA&Adui*n-CZcHBmR^$y#XKqejz zav~rn|GFp0<%ffu3dm{AJwdKK9AqFMXI#+}Wai-@UjyXKb9#czI~?R}Kt`O@6J$|O z5H(t!Peyx#xis-xjoI&llQh}@5;Mln_tQAf5Q{9h-~DnR+{OW-nqfK}kmLSnGN`h@ zDpr)+Fhth`BAIK*|K#s^(Pt^zZ4{zw3o{om%}+~trJtZ!w>^lR7R+4ZrztM-Voh4N zDTu8vqU3y<;jEq|yUjrK{JxZ2Koj)sS#q`sdU4e4PZPMxJnZ)pzOB)c_t52&L8GZt4+Tsb5s;r=I!2qEG2T7B){LFQ8-VZ_InQKBXfz zsh9qhKBeR{;!%J;x$TnrvKpn|zpYQn<9FEH{1wZCepso6QF@GOSa+fbUx%U@*Y=}~ z?lcmqKlzuqUgKZh!@r`3|IQx%dwTd=d-&J)@Ne?`&X-W0!1p#jVr({8_qWKdL23Z@ z9g58|J7n|9JJyIa_l9$T28=cxKu&4kQCYckH1Q0UI-aj`K9t-S;D3D41@EU>k$FVc z4?1u+h^T>`^idY->1lREyiL(;|E8& z1_e-zQjAh0Cjn$)_^f^Nj;KnH0mIs`@YuNhu4+2?2~jLusF6$hpUC~g;^>IJ#*pez z>Yn}D7H#OV$EW6tpZ<&D6+Cr&#E3OsEryY}=&_~+RKI00DP7$~f8f)iu+9Z8TbD|1 z`0bw}eHbg@n#+4&aM*|zc3T4NT{=`+NtYg?-Ro%b4jUc+XjMA2^HL-I7`HL{%QysA zm0)PLM5Qz(8XeT!3qZ-!^8w{}ugMV$w2zQ6ihXB-YabewE?+6B%I4o9l?iE8`gIzK zMlb67RhgMI6hhXJM(dq+*rqC^l~|+KB$6I_qSMCuM0;d)n$&wbO@0h8!LBZo*-)sy z-Jf3wZ6+#)#z%t{%1rw6W|WyoE*AL-yJs?SZUEft!n1vGLjfGkc?6zCXWmYA!?3jWxe`3Za(T5janl2@ll5Tr!UPs zuCa+PJLe#EIm687Bjh{Ac{dUWJ%<~^nWKIi-L*afl`tJGp~#F6kcIg#UfWkHTwlIXe$9yv%dxT#YG?RWq%;-N0E zEWS6|V^xUe*zS})393-G+O>ohry&%tCcd*9P6$LF;Nq@DX3+7>(6vM}wuiRp zDZ#nE+OIOwV(e`o&K}mkj|~`Xez4M6_oHgbTKR!9m{EzDl#P+hxSzT7la?p5arC4Y&-u(!CK31!?WZIJ&nv{ zSEjh{-KGLx=lQCOYbPd>xs)P4=r{LQjUNn5{Y=H)?wUb)0lOpms#fE0q_Hy%1hiqX2pf=CCWnJfFCXe~v?1E#;>TID~J%f(Gnq_4L#c1*Pue;Enr6aNP zUCmZiT;0(~$fs-yQJ62a&i5f83c5njtw3j|fV1^U?M*iqHxif~>Ly=rycA`#bk9b@2+0>9erzM3oM_vtxl!&1FlLmm88@crmw9pSHw#TEGUlv+ z!?XhajfS8Ns2>)J4m$79{0y88Rhdx?oCA!E{~=x0>`;Y<&J>v{O8vSjbD8N_>!#zG z9m~5vBqEXaa%4lZzw{Q8#Goo{9yE|fjOVv9!WY*B%@R+6ba+X$6_%080zA14+rdh3X%5Q1Xa~SADHg}#%%j%X8qupy% zr}5WB{{Z>|3ulw)?`ls-m^ zE4_->W@o)~Ej0YjlL&s0#Z!p!3J;IIXD!uY7FkT>!LlTZLGd;46CMn>a8o_FB`#cQ ziy@Ehb?*EV>eBcY9ek{_@6fkzK6u^6$dDq;au-juJf1XbpDAFU;_l5Im{~XpJk;8 zaB6`%S7MlBY5UGE5aP~PSIwJf@;$V=0@h9qkBjV8t6vH{sa2(Tmzl*-_Jc`-& zV59WKsVc4_x$g)vqCR*>{s=c! zmioAVg*w8`bKb&?P0Zerg2TRc*v{SQiG4+&T`K%EJuk#YUcm^mCjJfL%E`yh7TNaA zXnHz#@*Xpa->w4C8t}N;F98`j;B9N*xKcEvzinN{VsSNkgpsJNSwH8mZ(A30lVMO> z*!HDI!|p&yY*QPoj5ZiOt&4s~lP~Q{W-(0M*=@*YV8L|<7F=Jz%Q0tD#2U4!=|G^$ z8og1+sOD3Ft;$>hZ|MszHwfk85aIvUtEy~$#NKK(-NE-)A;$z^n7iJWrZ_Z7pXPef|Qj$(&YrP_xK~et$9bf^;_lttUkf#9jWA$KfBl@3*?RQ=Z(QF%o`KT z8&i}wrf=RDDAcP$z|4A)t6>mzSv{r8Zk}EU)Rrwr=rWF!j1rr%6 z>K|P342iB(m7&UV0vy?yS@|XI!lV}Iu1jhfE}|K@h-Tm-nt_XG2CiWm9~?;9F42sG z1H&%0liWU^U+I*F4+>JD*+U5csXjQ6-&M-(D!9c5uPT)TxA@>y)pFn#AH0gQ;EqPp z%zB(pcqi=JGS!;BU1|65{t+)P`FYtp)mm6r{2``WKMa?>Xf?OeCW+*hDtlE`Ch9|2 z{wLx6o3Sse7RgKG(4Ksl-&!ghRP8a7FZQJ_!Oazei}pAh7jZsZ#QAU$=gT{i%n;?6 z5Ky0qyzX}TXYmQ%?R3gsXga;^(>ooQMK7ZMB|N0Vv%u}mUk%~ut7X*BUe)&gDf{0O zB6{8$_EK&sa`q{^yzin8ZDOlg%O3$Li`o02n|EpK4!4{8is|$FG6+S)ENfe|6Xnc5 z+_`bc2Ce`9#S*@}8~*LpQ}x%Ceq0pQs@$};xoX?qE4Zx^v|?VsKA(HnqeGd7BYgJt zL!(KCV9`gkEQ`t;1&FmfzkHZ=sihT7cmp`OL%c~t2}q9|N{tYDmTkYAH04TMV zewl9z3ti3Bz-Pym1JO}}tG6xDQRxA&fI?*pE< zy{Q$So8_7=-})}!<6XW@`1IG_^bD?B;1(02uopcawz*!$tFCB~)(Xx-ORonwv+$4+ z#$%)llHo1n5B|k4q}9saw3;shNEDpk5e)m&W$MEMg&yGQJikODG!Z0dmZ#2;1kDNU zmBpqOmD#N74MJ&;DQf`;ie$pMkxVQv0uwKixi~*_ zaY5$VUX;rA;ia%EC$(2j))zlU#fbXb{+iy^-x&hylv{m~J+A7_EAD5ee zh!TLte(EAVhVVQU6W$7%UNpcxr_A`XsD%rv^)@A(PSilF200(Hy92w|eP*;B4;j5P$eHj0= zeos8qUB3&%={Yqm@BZ`p-C+`R)o&@UpIEP$<*Z!0q9sSrl@YNrOulZQKeL={+Ncs%Jh$L5s(&1t;7^4Hi>FVOBeGRzl z(J{L|Xpia}N0`yRsQ+R6q3)=1?rM$~*VQIEjMILjy^j0AYn4 z($&eM6Ge*Q7PePO+klL=yqoHug$Nl*w3m$WdC^5=V?I5uX85>C*0M2F1qw<$eSLK_ zsX>+8XpgJmL=cO%y^gZ3{bAS%T;>Z^*%J|pThv#zsj|-^c!2ZNy;Lf>Xh6&!9W=FU zRX}&%=8%_-`(oHg0S@4B)3c7E|<|QT^HR$VR#R(+S@CXe^%vxfqI6742jYfJ5d2qzK z(<8a`k1_}`U?A>J=2|hnYEi~(bfvGB;WrH#yGAODGJ(sAhqOlQ6We{XQO?e_(RA<9 zCqg-o-otc%C`OPW;W~Fwx27i#ImLWCAiV{$L?B=30Xl$pX3Km8aGL2tOwc9A<(r~5X4xi25fB3sR+r)#jhqgu?$HyxTQ>^*Fqz)H&*vCu#W4(@-AzdYFi2dqvbMq}nah zjI{QO$?n@UFS6c!o$tOjHtNY=d*c$$hn1-|G1y07a7#zlB#r7jf5dNUJk*`Qv{?k z^D(^Qwg1*q-nDN($7^=qE_3mUMFy`3cH4@cSbgdwNM{D8lslr@qEXG zA-l)@nOqrjyVxdspG(%x#y_ez=9D5eY%P78v}U}Z^nCyd24Kn0mwtg@#ek}GO~|?g z+~W`z{*q6_NO~4vZO2dmHb#A`qGiuVtg4P!x;{{quJ3P^af@4{6A(GD|-sK55nmvs2U25XxGd-8Ut2mzc^O|AKEx-E+!#r1)TFWGGNn3nfIb%ri z)0_EcOv2?5MXI;c=0y;_HUDTy22HPM-h2lVY10!v=eO>h4!HBf-~(%cgLsVotyR$(VnM_FFg$Z3{PZgc|!jZ_OAf}7P%A#ut6#EoPqk1^rEQPh#@0u zf5>2K$C&Vm&|l%Di;afDAmN_x|5j@bN~LK?)Hqnp6AE(p4AuhJq%rx0(N*B7f|Sgl zj=(02T1y`wL}q3Na9}|?U+r0yo*9+kvn2GZ%C;?Xq!@zXk5Fj@yg5ou`?gnNKn0pf zWsx3H?leVR(SA;Xj5!4QZ&gwD9%O$dV*?Kn0shxfkRVnon4qNjqxOKPT^;Z+5Xj-} z6-63+=2#rHH$^iOqbTzv0nlJKza$PH*v(?s=TBY1dwvROcEtU^=;dcJGFuDz>4V&? zYX6vPM}u~>NQYpzWJ7`9M3wvg{}t2Os`_NEqyKVsNVdmt32aOeR~VyV`i*NV*k9Ap zIc|R|khz%4YbZ0|Hgav|n*4ZX)_hLZy@&!M{Oxjbie#=Rh-Plkb{@4aL`r8&1-}T# z?6`g5F#D1k`;tjf`?_e{zNFfoRd3Hq5nhWqm}wFF|141k_Wu!4h4}eV`?rlIbf{qpYI-1nR!UZbVLFhNa+pAM zEQXwf0UN<0dr!jt5S~Q-?U$;Ks8icH!mM-F;8k;vvIeY*+dGxCZ-NU3I;9*DOI8KL zW$lZ;k>FaL(Ww0brRp4k$ns3VRHYXNQ?Gb%3%8ghY|w>L;l_R@J>NlV;sz9-#nXOc zVWOzf8oY7t(uYQn&&qqCteU-@qbX9=`Ao`q`naPX2^nquMyxHCPS=N%Oh-5zb$m(V zwZn2!U$yQJkF-|q>yh?Hce%(xm^`eBoB2wAai>U=W__}sG$n}FA9NP}T6-r4!Ij!` zSho&U%QS<(c;{VF6vT$OqGdIo4BN~t)Aos}KA8fNBa0;XMb9?K zsw-N1M+Oqf@x?_W(}hhV^9sLjqdt>6hFtYgr*Kh!4z-rddKZC~hS8T?CF8ts$Xx5v z#vE2WIh%dqQc8#yOHE%emb|bik*o}k&G_dc$Qe!#{ZUoA=)0mE$L!89B7^BcZCb)A z#$aFV?U*%idzJlk*!Pyaugcl6JeIrw{ctg=vw?;i`a|uF4Y$&17yq5#2e7yH!|i&9 zHXpit&gKZs$SD*N8A#i?8j2NF_Ekl~carQ{uIxLqbD92gC139UAKX6vKcRzT>)WI8 z70h`aO*&BsK8UiQLW?u4yu)CVO=f`!7B^WH7^(!@A%?X7u$gc_>7OUCd_jJ9m6DQ?;}-E?|5gXWd^l za_3?7SS{(RRpiJmpd5GTvM(G$awj_zoLeYa7;-sfd~DxZ78OIDu^5u7GTLZe-!S_K zpK*w%*_0pv1!C>gK&x15=aukbo$)`{Od&yM4X@qwC$nE)3C|YA$L!^Ys#(q0(eoM7 zWdif}m;F zg`9W!b|WJaMW~}Mx$@AV$2o%ziXiKtFvi+2#cMf z#{#`l&A}g9YTvPL+DZ`Th2Ogk@`kgXHjUYEa33~#$9!uHOBOp+E>|{+E?ekGV$R0x zE4eQEY}^|4tZaW-+wab z6Y@i^$lPke1711d_ECPd9#6Ba@hsFkRRUyG(2FxT4DWrt_x>)-I_{uuoOciHh(=;s zC0+vM5%o8^xbJTfjA^G1JSeR~9v3yUh2M7%8>0QJvr2TIJ!l#Jg%I|65OjR0D{ymD z)wuAzas5W!Lq1piMD8iHN??6n;3{j8-ze}{75qG2r7`fUf>dMnAl?JKTP2lbQyJn{ z%CCZ7HNRSZ_2T{lJL{Q5$=Y}sMz@FFh-xE!V`c(F2HcQl%Zy^_=W^UD=xE^@)@DU( zTNGk~_8l&F;^yk|FuHlr)`D)HZ{X&qPQ``M?M`lTL{r14fcqBnwDbIXZ=kpgupL}E zbMyH)X{WuybbA-&%yhU%%7dM$ZzF>c83g7$8c*M4=GUVd9tnF2m>GDAGv=qveFbT5 z-^0@x)-&V*g?yP1NyFahfrS_~Rq14~%6>gem&B3>4fXNRPqe(aB4?7QQ*MUb>a*YK zIwAO-Er3Zl+~h{3R76!e3RxDhb$g?^Bxw#4e&_cF^sZtR7$aKpiAokp*HHM2;ifed z{-G)S22;2zu`ZE1Q~0$IlOekw)L8Q>d5M9$%PajBQ+gy_Md_7Ld65QbBTFvoKu!HB zpxR7K9j$z@B0h;cdUAex0!9Er|za$L89p%O0jzRp+33m+c7}hc1fgt(B%hq?C z-7zrSu^=bhfiy<*Tvj|YV((P@Xqjui!u4@T`I777kn$R7iG>9FYuA@=uKO3Hz8>zF z9}IU)3qBAcBHRJy7VfB%vyk76V8?=B$JN1(>w+Cu@xFlH)%?nV9K^5O&y!zy0ndVt zhWwn4I)3H39fNYoD<2Tv8G!#U4Q)W@S^X~?NiI-CZ-d~zBJvNTA+C5^2}9CzGCDw@Q zISmE!71RS(4;0T_p1F$2S4=)TiG$V&XtKj0ak07yCt{OWA_`-KcOguPB$r!XiorsX zBpdV_NRUe$=9azPH34aa%ppG@7lP)B6RevbBNBGoe5nvfO7F;pQXl{s!JjG>Md1_? z6ub?_=pBjsHo03t6O6ad?bB7yL0S;t_hBsxU;J zIV1`r$LnDnWqSW)l&*q;niiSma4Y16sJ%6w83{S*6)vYY^kz#gDwLIQ#&JJtQD?gfL=ICu;xE){JvY`WbJx8+qSWCV@+sBem5jj7Cv>-;lqx(A`9io=% zRqm9xf<9wg>MfU_HFh77><7}(>amq8cWutTu7ZoM6b0IE0 zf=id+8ufD@&?#Fskn_vrOxo-AnJmhsohSIe^iq%1crUGaG~~LuHsrqSy>IfKt={t< z@43QzE@!m`-B~~9fo)s1ZP|IGas6^VBp%&S){-al*_XlnMH(3vPd=I5jNd};a`;&G z8O{!kv_#y#xp)ar@cH&INJuQX5xzEbqFahJrlUmf(^GV;+uUAE`A{BpAWmtD3EP{1 z-Gz@0R7ql){{N$7t@wpd=!wEP|Nbp822LDt^#dm67W0hWmhinA^TDirIXCX>)X<3T z-<Dji-^KIB(Zh1iOunYMy=b)xKIYs6Z46bex8XuTu}g|#zGv&NEJ(duDB#%B7*5}CpuK~fp} z7Iq$sx2>p3sx2oMSELFU=6omZrtbBvX6ZGTuW5o*@%*i;0814Q>wKR@sr$Tb6>;t4 zlJ==wWnXRGFp|kE`HizX%kXLa-nJzQhPs{%HKsS2r`rv@YG5O$uwRRQSOV1%^AW4|ZG|B;25Ei#${=+=a+p7nHxU zW6%*AX^kYQ>?l8q-w_I{?5OLV!_sP1YMu4o1|2z4Zv^8RbR>wYNv|(fdSSiGc@iJ^ zy!m9?z}2dt8hqYdsN)eq>KC9+4M*Vcs(LF7y8%=@`&xIT!c2sGyb3s^v>~O%;ZD@% zN6qG!)u2sxnOTkG#a(9c@QHb$jWf(%WetGOV;J)@9GG4ueV^G<20Ce z_b7(R3a8Gz-(rR+q@RFusR?Lyk2mT00cVT}a8G5}g9%E*_q-c8Bg!`Ye>&r^x`_>{9E}eWLbyk1e)%%`kH8Cc+{b5OJ5SMsmnb z;?DWVe#14z^p}Fn>_AvRziQO8=#trF!$f^hRTQs zW(|_!cqYN0#V~}^NUnyGf!LcfJNqKspx&9xE2n(eeC}e!ra(rx%8on0~TyIIYv#6q$9i9^n{?vk786= zlUWe_+vSw{olP02-*XTjh!@w3K!KJ>k4AAnF%gnyZ!;Q_2)aN$s>lyb^cKXzJ z7UHu+nCpnt>};gnP}+tt9k|2-5R-=D`A%;}MLazxgcxAhZr5$25BQFj*08N6m~2|4 zPE}>g3|dQ0hmBKZzp{0YL>XK%g(u%;%qMN9h*;*DeOTyQoAZ#_?~oH?1&Ehz)K2DU zz~p#SFFlK?OL0-Gh>K!HTofzfqF50Z#ft8J1@%4$B0`^zL4Dwd20y=#!c(K&WE~BC zf*p1I8v2BIhIp3pEak}|lwU)iYM#|RIVAFH=)<9}54GLFQE%g%2SKNO;j&gMQ^*Rf zb-9tsnP%s@Pa=I}B0bz%(#+ZvOJ5K5=w(Bu33rr*J5bNd1qqof%|!P_+dBOa7vp8E z?Cjx=uXYUYIGrv2t5$PVsDnt2Iz>hyHM&OP@Ub{PLSguz;C$cp`BPW(o}Yq8583gH zVOlKA7VlAS7V$DOsEz;I!47u(nY@?#IOy;zho&^BS4VkX$Dll3@bhW^*T>UfR`Y4J z%s=}OPUt?qq)tvlFZp`W;dyjCKLYeFn2=y_8hXjsi@}h`px{S<-UU-C7@US)^7Ue% zy9^f zM6v))F2=U#grH6tTuJhE4CWv`T<+G^Fhj;#T1aC9S4Vv2LU6JFW+Iz3{p6Ix68p+2yKp%bB zAv!UjWdkR?I&0|(oT0b2JwkKkoL*NvpDhvz>{`8coYAWsiQl8lzPk1Ct&eTpKwD#o zqng-lTg7Fq6MwZp1duG+3)ALSE1E_XVits z6U+c$z~>?4l8-s@`FH?St!#RA0P-4iW=OoO$G%MbxSZ{6tRh-JB4tl)Z?l#yqi)-_ zaCFNZZLKW+!d7m{IpJ{Au5c{5KA!YvbeM}JACD#rjThcu3u!le#vj#ru6(U` zoyr#uU-+a|0_VLlJsLeH78KoxM!EZ`;~2IAT9< z$Ze((8KaT1%}j@_k7qm1+FAWDHK1%h9m z0(=B`>oAmLK~w<2xYsXF0X_n}RT!GFAgY0=27+In0(=B`Yj9mbtsrWFs0D&wo&tOX zjhB{M7>^sP=JpBcm376t9DuHu=^Dm+a$aUqERe;wzJ;6xFon3W*D76nE-BObKfE0 z{DwCn(~YEdZZ|Kwu>C#xvR0Lx!|{7om}fhG-d#TD#z#}zkuDuhGFQRL&+zFynf>?Z z9~6I5SN!6S#XtI8#eQ@{Hg%HNt$RARa4B7%*QuL~tXF6t`-?;sT-w)(x@uxKlg7vg zK_IIEJFj)tk&W>5>h_%3Q?4mp$2A4+bA!I_buR6OhL8o!eCIX~dYXYABIv2sM2z$V zPwRJw5pX)rd*&ayj7VvMzqdx@5gsKnBnn>&y}=1fA6ow|}wIxcDO$m>^6r z-Z>or)$V*-fs&mmHi5$cK&tUAY?-w>=bHptg1u1dVx(!DVQxM~=>ZEFw50*-$!iNh zE^$yN50-98Ocf%tsqDvdhRFa7jMCXuuNxTKC<9(_eA_uhEncIRy!4yddnVdYPhWg! z1%aut?fDm97s?qqVchts?fK*Jo}XBke?HHgF8S~1Lo?Uu!VB&u%8y8Kds zMD62F;knwAYkuI$nKNcgNnJh!xZZ?+qjX(9=C)d z9u2%ysh5+JgOQHUAM#%zkvj>w>;*#eW4!b1J%VR@{@x#la#B;wXYIf{ea5={*LVWa zC;un|v71+2d?uv#NBGy}@4>C+^|C9t5xgRk!ScyfvhJJ+I=ttOw7ySr3(2uZ#3+-WR^s^F|m<)6z zGwV=${*FI{%zaf?JlrfRA_$2wedBR7gdqdn!AFSdUz3 z%x=&Bsh3^&QMTxu%67l05(^8)pW1!@$@g$(9`);@ln_Rc@g(zmQpDuYeZ113laz|zQ z-^y3hW~gS6IP}yiYi?^ea~%rhie37+!9GE3s>+@vauLLc43fK6(|VE#qiNe^0bIkJfdjfN7T&bUDpMKp!{!Ml-8tE22^b}y}CAF zLgZAKOe;dhUuxV6<5nBD*0|($hXIP1Y^^0{boX96q8$qy6BciaNHrb>?r z^hn*a3O(i(!Cm9iS~ivMvR3-4kN`9EU0G8wnEe6xeO`-Ed5$(eH?7W)d&ac2?ug&z z`XFO`$Mxl(9gZiTt?UuX!J~h_aMMosN3RlYn$LwU@7J^!=)HuRc2g+OLxJ7{^g+T+JGs#Q zeyT)rpWWZIfda#2Tdbw)Om&L-k#bT$Bw)uWkGg)j*2+k~ylCcn#OAI?{TU~oo&0v| z@Pi3nDnnS0C@rEjLhRn7zRK-pB- zonj8+xlxtDOttbj`Q7iiUvm4y%7etD>mc1~r_oE-Z0e=%S7KJx#cPy7+|A&$`;-Bd z_(hKl{ze9CoOAzq21vjcSvOl$xo7*XRjtmb^=frjvuYK|%%NMZSJift^IGS%xw@$= zTjaqr&-6g=y;q>BqFZ4S<+>Fn*}EiL=lsDWdqT-Z9Q>~P-4EYvl8q$UN2WJ2bMj0k zE_ajR+_ctD4u{C0-KisoL~`9*UEmt)F1XsBMv@Br{GTcFO6%fgQ+=zbm782nDQUYC zx{2!9Vrb6_@G#RHnGZNXaa=0$#TKtMtvtLArGYJA{fC4{RV!mYI_}m!IO5Ub91Xkh>E07bkVaW7d?AA^2IIo>cy`bet}e3989mmqmVBTnz+yT zB5;#V8Fb@d%2vUbnM^MW8Gos9D~wxh+*;#83f+U^EEfl>l2R-e2ip%07EL}8-v2xe znnhKrd`Jkr;i6!P>~Q)mAI^YbDZkP6WMFX z8p_oZ*>Mp!aHN00!9b|^E+>+ipW6db0tW;0^0SpkGBx>`X~MzGR;|$v!X_LnmV6RC zC6Rn4mh6ZpcY|1%{JR>b2MR`NvvVtTj~Wo%h1lWmLf*1CSg&v<>fV5cjr7SV*iUG6 zF_NCtXcHglPU8XpT4FqTsc%be{Q~iihKhXz?ls!CQuFs8aj&AYKse&bzgF5qJ#>o0 zinX%nEX2S-oL(UO4t2c|$Y0t2EHEEXP0PhC)9e_=X37AaE3EvCO@}xb~ zw2+&J|15(xZL)`&_EBKCY@fAM@`)rWJ`3dQEH=fMtCup5i0#wjz0^NcP<{7MUFt@&H~$->bDC`sX#TH#XZK$@&(=tYjM1c z>ZOmSLILwRC<)vf9%Z{nFnXIfzJ)+2Il^+-T{qco!KsJK4@0xSEreQ(qa1DNha*`SnGc@!J*BoTo_upT>yTCS zHz7x-dI>%SyNV{)l5#|io3f$VO?gN-h;y}D)Tg9$(W*my2lPe{U(F9HAMn-4E#*Cs zDRkX|m)u5vaLa{7^mdlGaPf!B4T54&zmH*38%WdUOePI@kkTA?uhM`3j&CmSMsG;- ziD=YjlCN@3Gsz7icJdrA`J|hBB>zXWstYactosaTlz1VZfJUMB$DmP1s7$&w-~HU+ zhqdD{3^LJxI}We!X+0vL10}w)g`lg2gpZc@z9s-sCy6 zAMu@22p;lo=S*(HIe(w|5q|WUKF?it`Z=qQz|)_E%A{!KjCq#}0X(gOho?%ZuGsmw z9g=v-YhfvHeK(4+xtRUzkPavOZHUj@{yfplJK4K@H^QCxLq$duC|b62&JM{a!jR); zgnO?PUr2g?2I#(Ssjl^B>9OcLTyE~{H?0Y*W=Q%_6E=PJMOV~KpPV!KiqsW3EotcGiS<- zq=3iOUomU;l*AROS<~n9I&0><&^aSQLqcEva!7u1f^J? zn?5@=J(-v}c}g8gQuAhBICI`?k=RY9Iisf6O{ttSb?TH^#3rwpF=57)Q&Ks}IkRR} z&zv1PCsf+yFAvS0e%+LuFV38kno6R-O7go^ z`kGgz5P#EWOix9q)2!*=y7Zf&5uxitISXA6<7bWUr8Wg2_My2uTcrNbcriL&D~R080o6f|4b>OM)RAvl|FlH8vO# zBgCo*$fMEvB3jypS4!~8m9%|Oqrlgeh<7ig)X#s;rTV$^&}BVmwro1qsm9?u~wZ1e@z0+0iPXrGy8Z5EZ4&UPI z==-`Q{ChD=srDh`8ds&yQ!mT)F0ZS8jf>Tzmo?h*Im@eSLG~?oG&BZN(a$v^i7aLc zeO<*?I4W;k>!^3yef7-ksn>!kx2zQ&Pfd<2gJ*DQU%jK!MFmykWo}0eT8!Sam(82G zK=O;9k)D};4U<-r;n&r;$ey{KO8$nU+u5y>#IHW)R#+HD!X1<<4u>?^^jv_ zy{DmWUaf0^>n5)nDPQa15#AT2F1L^IP+9fLDjy8Wi%#QaqKPm_^gopw#Kf!lFfCjhNBSuKG);7GOt8F;EI5FhZ+`-1Xo zmn>qn9tk}Uw_CdslM${Aa!1wF3Dr`TlnhIs`au9vE+olf-6YDfKzo;A{Hni%<*CR?kfSwnI+)K>BU8C5k656)@`YFB4eUp2;^ zRP08%b?BSbH153;`k8XnxK?{pB{(nCio{xoPK? zW?E}~4e2gtL%Me*aj3nq(p$5x(pu&5t;RS{2lq*$A^#yYr{K_xU+Nqrt@b)dY_GI* zp1r(y-rVcc)6=D;)wN{66xQaLJeqm}h5`?%c0-yi55t4Z9Og@m1z!Q)I#*@2dtI1E ztA!Cs$qUL0<}ECjR*=Q>$q|hmygc0a3fP^;t(m-pY1Wy_yUzocS--X#I#vf^S-PFJSRRH&|sv2NL{&rxhpqV?; zT)`Iy1NcSCMRn3OP%rhaI#0ciEN&%ygI8KxMe_uA$mAlz7aO9uI*9ok1#d&v4y*Ie zx4b-=GmUru5+qXnby!0A2AV^lFkhTVm>bb2=qpDpbV_rXN)M7Pyj?0^%zgev0o3gG z2$UaYw)ncVoI;lmvyqrxFactgL&|kav=p%p#u8Oret&jjt!Hhmgi(k^3HdRs;XDnP z@9SMoxO2_#E#Qj_$<+u0CQnRy($)u@qa+ws*JAaFsYY8exIHyBp0(5o1F~y;i^a-f zP{x97@wa5F@zr{3P>DnMx@$ZzfZCO5bsp+Tw4uR;Muy9tDn-m1x-!b(!*Gg!jcz}XmIBMgqD7lg2az{?=+Zt+ zlNWZ z280!Pg2Ap$%l?fniywov?^s8brfJ7kM;SWI-t=zpn$smhD+q_RQo@W;aXb7 z&9UVrbGfj>fmyDGQh1;6P8H>}CWP~c{bK8{Wed^DtpnnadO#dXT#zTrPEQ_<-Q{9^~Ww67;17L(PX#8zkthSar0?q;nV`nvufuYU$iTX{p@Bsp(p~H5@3TDnBH| z-pgBF?{X#6*IXWbH5(W*-Z%Fex2qBVm;W5hB&Uz_G?Pk4`w?90xUg!Go9A zgd`{A3kU$&&Z|3OvB;Jph3j0FXEs#VIPKaFnMQbo9{x9boSU70Bn2rYC>ZQNc$l^^ zbW9~C=A1Bx5-}Gx-~(Jtkoj>pgL6UhGNdtWWUE4eA_bp3YPlEC!9#fVAj#EWK$;-y z*QN!ofSic>S2y=A?kH$UN_7c0<#*sAqK4H?1kE&p#|P}Y&{5}&G*OXc18gRueZs_N zt`kNcvDN@lEl*yLA8sV`CZ`TiDGV!E!-&GWX+ngQpYmN91j-k9im}S&Cst+t11m8x z2K7yFFvv>2$w`H}KXpzC_y56%+I*&7g_VMkg4>GMAZQf7ur=@(=0KpYEJlu`e%yc;%_HFgety)zu!Zjrvhyz=4*z*oky>g zv8LSYX=9$>`MN2mV}+9Qa>JBd?7XdCC)7Sabk6Xc-a~yjHzit|_03PVK9_ak_UvgX zSLH5$!jOAMWA8IB{_*mxM+<6mzZj94gGZzCNuNW1H$LmMavRDp`gG#+BI?11y#z$O z3Anxh_2hvz;A+~C&S}7xOsr}1!%w#7j%1BLfA!s0a%0(<-dj!|&o%TsT)0E|A~*V} zQFZ;m|50w6-Z1_C+`pmD`Fmf=Rg@vacf9mLuCcrQ)Ax>iky~i}dF!&XUw|IHbyR*c zWLo=L#w7=GW7^;T_!H?5xkmfPe;zvg^V~as+<9s3`Y&>0n%2a8^|~Xs@5Q?gJodXs zbI)G$k5PN)b>$kc~}pSg@lecSw0br}DiY z=l)}%JSI;6tK3f>%RJCl_)c!0?*4iAFMBj6YP93C>+U+2b42#NFzWWa+~2qFC|RTT z=34JvQ+vbl&7>=Sm4;kKP=i0J?nr;yhx8cuXb!?Ft#+;U)UU&~k*~b@;RnvxTu!wf zI&=5$D8*5Q|0r;+r~XE-w8G&W$_C>ij$m-6-+-GjYg{nC7ulNV zRzI}OtmNUB@o(bKclC&LdzzJJ)39f?TCSs7D}RIs=Fx$gTQh2e$bjjN685>==5V+N zD!+Y6$8efxs=dvsucrg8O1jlcHp7n(17%@5#4fn7rdaJ9$tU4_9={^;c)iu)4nY-` z?GkCxfg9H1NU4TSC;1s5ol2l(Q>H;%`E*m&RUb)T@dc{BdhuU<>C*JVBj@>w$FGR! zioZ=otHAg>)p$UE%qrSY)v%I_DY>{d=!kDU{sEA&`Q>lstg!q2 z7an2YSO0Bly7ud<8W+=kU^P7hNxVm7oJP`_q=U4Fa~p9m=ZD<_!PU zA7N{@lQ{rP7yBydE zl!0x)g}@`gI^fA<)L!1F^iD?K02zJ*6~7R1pcPn$pK4VAHv%^T&q9`_MSY4L{M&(5 zz)oNjum_k7zS6aL00U?RRsbu2yMZ0R9$@eF-~)`m0rCxD%nr-|)&YxvZNNrgC-6ud z_$`M#z=|r!KMeQ0s{51!z+PYvumevbNoM4`3GxE%-ae%h*a_?fHm!l2mm_`)^d=$y zy{KnA==kr+XMvq~^Fh%B$iKHwX$SV=#Y|^`_Wj^H5%uEbQSFK7fR8~3T0cQMlNjqB z+pjbMJFeb^{Lpt-1Y50tQ?!a0W0wuU}~dRsgpFn}8j_P9Xgj z&6?k@B*!8hXazO_7Xy2M+kmV9`GIy|H&B|@uQ2GR*VeB{KzmWYVh7d%tAK65CZM$h ze4wuiU>&d>c#QN!^x=?eHu3>8fZGU5kq)#2dx1^Bn0S-}O2AIw44^a*?FLo=ngK+z_UPUG2X2_67>QrfOWt|U?;E*7{3JN zffc|`U;bj` z?GHe1q63csn_li$GA>5`KcZeBdk^&jo8Ct{umgA&*a?hJfV>|dKd|XT^eeCzxDi`q9_%>4qy|oE*13v+tU>#0pqkO13$l_@e1q&_5yo=(iBBuh_!S_RC`uKu1K0$#&sLNUpfm^hh&~T;ejn|c z55B-UU>mTr3~~VD7eEg9jrelp1KNS@6t4t7_={e=DE%bRTBj&6@E7eq=mjXPSCnJ$ z7j?k1KKz#^a>SOKg6HUjH_ZNLuTZeY)YkOOGn2|kn2FF-r6;$gG{*!c+LP6Zt(0egWn zfbs2+2bckD1a>|FeE@ra32BHw4}AgKj-cOwy}t&ZbkzSE_yBwHgXeZ&({Z!|NEZz= zx^(Nyn65EicWGR7Oq(t`p6D*IPKo{vP z3+dfRhs*R|L@x*ZSOj_v=nsd~L-{v={#Xc|>fZ@E)ld4R`W+$lKacb~wDwRQT*U7v z=tofQD(W|J5&abCy;zg*c7op`a}4ieqn@#|pl4EE(3|xYsHq^-hp&_akW~1fxmuK)?zBA`t=VF9au*( z)j|DPgYs?D`;|O|$-bNQrDmz#9G@rj+=}#0qzCJn$~_MH5zwboImopjNUm~_UP1av zq_6YK70?Tpi|eJpY}LOVu9l+M(r{uyEcN?XBlJCEpgcsM26{pWo%B-*x&-=SghTr$ zAcua|K=n{&)oxo+-WtM}w;%K(&`T*J+Fu>i{#1}&L3$(7-=uVOcB?+moX}!GKQ|lo zKOJgLfUaQxeCQIt)5xEY*{{4#`T{@0Pj!Bd#Ba0-`j-0@daX01>l=|=5L<`uqSzXI zm-27{^(*P40Qt{iZ5rHfL|+Cv%Nj_Z0Fn>%7|@^6>UUB7g|UVB*8B^}NtbTDy_9?M zXhY|fR%THBx$2*ZS1w%=s8Q88mj*2Jvws?PJuJjJ?T}A&5XfTl7Wdgw2Lo zX6YW|OmlK8jhmLJ0`rXK=mN9d@J!55^9+#CWf)ri@iQlO4(NGdbX8(%Zz=puPe^;I z9Zt|sf_@dks@+o$+G5G>sSO*De&o772L=rRI!Qz23{ULPWK_dyubgX`k`} z5rXnLIX5Cg-S`|uzL;fw%3dQP+)rFjx~f%k!);qH0H^QKE(-t zqv{Jv*i3##=nG0{iOSRT^-uKPpn4&GPVn2kqEAWtcKqHyA3xIbK9bMbr??Q-E~0mV z-Wg(ty#GNzg8X~GP5n(eL%m*Y5C$sRjA>tWpmSqkBKcwcuS!7uxDWg*P`?dfqm|nu z_vJL3XpWZT^ueib43U%itrhe(&=rJ9@Atq}B(%~vZZX0bn_;I`{Z7@pVuY(wi2=jg zkMi~q`y=|tpf3h}GVxtzj-M<1?K#lvBIF;9ancwg}m3ov5wd*4C0~mIGKTu&<71<6;Vy}(p9||~qR+xR{$6|a&7#}lZ4PQjAp%5*k ze%m<|^9lCkp?-BA=*b~;(rXv!8K4&<%oeKa2(PMkM&pov*Ij{h{@+(%JzHq~5H_xb zAFMMxri&yt@y12+WkJqvoE1Q={)_14pdSH!3Q?;A>)0C5dqK}5`nmvp1L(;(YY3(9 z1ic~xeIMxCLg-{SU7&Y^{$t`_LbiE>*{YgnbF|(K+nE_V4N0ewZ*d{^xReiiXr=j} zg>0r7>nN*!$xyR|@f9>{s_jjUgMUZ4U^&SS3qVi6naEa}?@DM?++enA0|RPA#WqyQ zFK++Hzj02#Qb`oC-qYtJ7doEgyC3Ptke-cojVd43Swg--bB19QR(GKSlK<#JxgMO6 z(E3F6AL!p!YM1aIg=VYa9f(6qzz_#Qa>Wfp`SO0{`v^0>K3mL%qIrtaQ<2__^hk22 zBE1yp)`idmja#nQfZT?SI!&WURM&&}U*W7{QDlCkhn+}g*TSC;qKB~&^g#A^6y*|d zh7;URPS8(*ZU_A{;u~WB@b#^xf%BTh7;)T|#2QM5L`CsgZyUsJ~Bm=0)A!3(1om*Kqm(c zMbh6s-JB9QPq?4P{F6tj6&PsQK9;v^lA$qP4CUf~9hoor ziyt7p0_oqjeS46<MN>1O2Xneuvi)@H=AOg-vc2>(7u4NM5Yr za@v}NZ$XM;@#`$KAN6#;*RR}%u}9{4(Vi7a#vP z(>@7$r1cxkv(u0s^FhBdg6vYvcUEn_<0lt3u8(DOHh#QcJ-_jp^G)!vn)2 zYEs*NvI6kk0KVOQ{mQLqr|}DwuQ+o---$C9^hR@3DJIq!m`3RFN`5T0w+nn?lz!!q z5qxyR!~Bws<{q4#h&>hgCH?IY#Vd-X{@I6iZZzPZ+#wukotFjwcmV0#uB`*=`_6Vv z^-aJ%iL+6W>mz$8KzeetqGYS~5Y=j2g2tHcfg$T#G53*DNe?y1XN^&mFNHtbqMzsA zhx2|9=z#X&zr^}8d>alvbdmi&4}QHv6b0&~c_6-6*w<0ePlEoRsE5W?D+cm5yn=)N ziJ7qi`YdVYZM2FucA$-#V<&x;<6ca{Fh$*OL9S-K+dm(2`$u{*(qHiF0sB009ucsA z|Ni>k^XY-?G!=etn^{pNVP9t4sP^|}TGQS`XB@$HYWPH~{`{vJn!!^$ec;m+uPA?{ zc0LY1vznvJ)Ggk8a|Pe!wV|o-HtISj3-^*T@cMcy;;O%)HFj|dU(vKoN269a%xkB_$_IeuW2}l?A z%Gc`w|8)b}P@1i71RiHN$ov)MOXR*j5_c}8cr#2K2iX}ae zUp|8TZ(>noyfi*|{6`*-SUhpe=Q!sm;1fI+~T*Tr8Iwq zPaq|+q!;qb72_1ehp^EHekIMu76Z;`aTZkqtx)CEo}I{d0QqbJ9WOuQza} zR%(V1KN)$k>TeJ6Jq^AR?&W_5G;Y=SM%ttD_P|dLF&H8*#r=F~yp@i|es7}C)46cI z-&IdL!LJeb9(|;zgb@+-ge+_sZsgEC%HVSYI#r64JR1*2J6XTuIzFz#5~) zgiR&R1Mdm-4Rq2%Ex=Rki`w;u=5OH# z&VlcYd-{|p@@qTJ$5+S-e|h_0Yi2Z+F7j`uF2j0ZOP^9kcBY*VHAjmB%7U} zOEDKJ3T>lmT4YyyurDr}t0=c&V`+Rr>#q>M&D)euYkC_P#zbyYUM$(wIq*C1qdsM8 z3ix#m!Vez6zh3Uq8Vl?|3#And+@L`Q(=eQdc&^@@IkG8-ZR9 z`bp4(&zUHH4d^`)@^1kB80dU`AS$4K*$FzybEO^#f4xP2gSoCbT0Lnn?8b6M-HT8W z>hCVfzgkghNKmeSI+9GsEJl6JA4A~l=F`Ymbd#dojBJDI4L5lPsNEL1AISd|pz=oW z+vs1vl#}fi(fv}sp9}aZ++Hx`VEtkXyG=y0;39tagWrLAMOp6WhxL~5IVJx4)!dgB zV*E*>x*eEcP07E@O2mGnF<#B!0*ToMOi}jf%f^&-?7gs z2|0kL_I`}~2_fwz`Z>^h9>TgFVeKM$M<+pEJj2&OnYg_CoF?*FTK8mwDY6du+(ay# z;CCbu&psmz`?Jz{J<)#vdN=40!*7=`Np?Tg-+}WhqVsi{n{GCXb=qQXQ&j$W zbNxq2?9OP@ret<1`r#-<-Wy{&lFW8p@{|dY!&m%Sk62R@MV?Cnr{5<{K@e=rmmoIL z^jAIJuz{9=BBz3K-TJR$*n2wDLqpgd`Yi@TcA8ABLs++o5`Gh9dTI!JD*7!QB6ki! z{)0nI2!6BNhKahdcj_KNL-y%SU+HzH^(egAV7kx19yTB-TBsPt=tgAz#BjS&cfZlJ z-N+s{`V$pHrY@rZi^-ct{$0=B&{-IJNN;-EpnFnp`nf^(yxz3Qpu2;ZJ!LSxWMEwe z98hX}72P#|)z4{BT7B(J0gJqu9q$psGTFaU3zuGdY-t@}g6+fD27~?w3i!kP~f7tU|0=XL|S|wuL(X7kblO7qOSAe@_@qyDnpgMxP-|f>!>l zdp`!h5coP4X%yd~e?tGdiJdg5@!?~Duj^Lznb_T=PGpJQWW4&Nq3pw8+(SOC|E$V%jsAl>EeG z_7++=ncb`ZrLJuX2k#papl!q=dA-wk@ z6X=I7B3@5kJQtL^6Xqjz)0n9U|MHSy2tR%)BzpQQu3!f{KL3$e;Ll6jx+spIQwhdOyt>1zU?{lL}YwpIAw1eVFDR~j2L~l6cyPt6*B}@2<#BpB=Yk@_!8T{FuYov-)iX#LgJIeVU?C{3yH53 zaRKbeBvmeY^op*d2WN8RXIKbryR4GO`B@P{89c@q-728#h)Ab%CAzfptiSgw9*S?% zTM3x9VBT$3<58T7{022nk2=xyh!8|Hi{Vxizi=yHz-7>4k}4n8=KP}Hd(%bdA9O{l zz%CZpHqOdJ8olmvHLl4m3B_s8Y-{!7R|mX3*2~oViim6N=oRszv1&T6nAwg}uRaF@XS0uKv( zSKtYOX9Py2iTVX53Y;#`CUB8Jx4<<5TLf+uxJ%%EfrkaYEAWKCGXkU1Mg0O31x^=e z6SzpATi_ajEdsX++$C_oz{3LH6?j768G%t(iuwg63Y;#`CUB8Jx4<<5TLf+uxJ%%E zfrkaYEAWKCGXkSBMEwF21x^=e6SzpATi_ajEdsX++$C_oz{3LBH(c#Jz1^y18}Ls{ z1X1(V6xIBomS6L0T09g#bHAJwO8a->k7h}hQ>*U%kMXQJJj602HO68ymHkI}mfk+n za`8vMl_&rAO3S>qo&Pq^=bk+%|76*xnM?M6ka^Q*otcKX#D9zDH4hHA>`Y3u99{92 z{K5V|%lFOQoq6}Ef8faXU%Ng(u*4ESEyHr8Xq4rl*B-O{OgWr+Jbi`b^2K-kOLCU| z^^oOQwIVMq%eG{tUSiqwq%2!Io|W%>E6%cbRU&_+`MXHk^rr{p?`vJ^-Ta;8+5cmEbpC~D0lDrI`iQvuVls#waHU&FO)|wN|*1x>HW;? z_eWZ+H#}$=`qjkm|8mNe8QbJrM{XQc&Z6-bTiT27md!Uc%YRz*xIEsrKeKU0jePLO zhvk^Ry)Jh=!Q|EYjq>`8H|1;p=Qa6vU!2bD95+t>RDLibvDENw}nEYU5qEdM+u zTT(h2<*!=5mjC>a)$(B3ddtCW+vLt$Ka%SjCs;1~sMPYFrdc;b{>wx4@<$1)Wb;cuk@r6Eg#1k3aLbP-Y>=(*43o$2 zzR6Ot&u;Bmls$6m)!948mu1&Dp3b`Y_{i*blRNvNm5*fijD9EUwWW7tSN0#y ze)yTXY}0eU%39PtJ$psv71?j^^kg5uV}ACkD`#cpeXV5eb8gN4Fz)pn`aC<X@dTpvjjpbP6nDFKb?(@{1o7vsQ>S{7Mzj;i+tcZGA4b{;lr80akgs#< z)TuAJ-BG~5;bX{C^D;Jd>Znfee1Sfc=Z&sZ#7Fzn8IuIRyTFs=>Op!9KF?bb7qV^V zJRnmp$+=_u7{saW3dq%AeWNQ5NNvajcH`4Va^$+*?@~U*t>Co;_3ZcaL^^o4gJwhC zr;&FT!cpLzX;pEF6?y#mDWBV&Xl3}{@NV~3;tM@>=0blIhFsf`?nYhRkf-Yf z>H+^3cWi$KX;$QoLmhVkyHI}x%CrdDm^{*tTCN3o#^geGkf9lQNUq4f@@>=S(PNd;{Q(iwfwh9|AC4<1(A`W5nYQC?1` zzM=eYbnT%$K(eC_;3;4ems{;?N+(_XAP@Qe;}_XGF-7~(MzV)i==f=>8P?A-#%9(zTJo*%|kD2XX&o0|88&5b1roMS1%aN z&|7(Eh9Ha;bPa;<6%!3Vt>@3UXywcGR#5OeT0xL_EbwIv1bOHReABZqT6v$|iWq+D zB?uFEEbtXtej1X_;Mo_gy!O1$HbJNnMYZRDVgjsq2pa}QI?&2%&jZC6)Qs)oL7*r^ zsqI>M?YSHqXp~heuRUM1+YBNu?Rg?K7I>~oi_b-Xp5@WXYtQc#3B{ik88!K}d>SrA zIz1bt#kJ>yte2?;Gen1x{PfY}S5p~Vg#hVPE3Z9|RCl?WLlWh+`nB>}`+Xthwdb4K z#;N7C=b@;496q7tZv~C2Alc~Bo(H4+lIK-#f`lWY#On_h^hc z6~7k`!3~H9m+uzORdkC7&5WBh&8P*n@`4T96jEM$e(mT%wcHRbqrg!6Z4>3ST6)Cu zZ#|-Xoiva^NR(|0DQ`bMlNYcbS2@zVWP-2I`gb9b+OO50aY8MhaYCgSlY>hK`cI>F zgp{X$^Gw$?vpRrmn&EJ2c>lc&It>*u-2Bh`ZM#gRh;9(2!|Q(&DZ_)xYtI875#=>| z(-?%t|9}K)zgB;@c%H5MTb4hLvZP|Iy!JfYF;QL;iq*P7t6#IDlOgq=9ajkoe$PEl z<*4Q7M0{y+4L<`dSbip+M`V&(zDW~IFwn|rcqXKL(|EQ1rtxaQu8;{p5_~i`hXC=? ys;RK5

HwSI| z0P2L^x0N@5(Ouu~*WfqPmwy-cEN3IR{EjxOSOdfF;<_P8>o7)j)eT8W<+WR>E`eKU z7yc60uJ3|`=kAX}t>9MdMy%WZCH}6Rq6Uohx=) z*M>?&4H)ND8+w`E_j=Rkj)>&j)qK0?9DXdr@6uvP7Hjpt|85T}*{qchQGlAiCJ zxQ=`hoI@Q^-I7(o@;ICn<_qPGU3eN+!CKL+u=b0T7ZQcvVg7MW+~QjV^3AFGb93-O zTo1Pe55&E0(+EpnBF<`n;jIS4T@8&b9}~|{Xaw899q4XpRX(KUz+8BL&vH|CTlTwk zU=+yU{s#VbqlGyX>t3u?--oasw%uNj^}cum>G%>}>sJRK#@|b}O&`YZ)Cz5Rhqy!v zpndEx+Lm~_pB2yiy5ce9CcLm@@r(MB2ur=^{dx2^`ZC9S`5YE*XG`-Y+P9S-@WfsW z&j#`@r+j~em%bmEbp>WOx-;M|D#2geO}>-)^=$8D?{)T9oaSE=-rdNK=yh|nP|oIe z8-@A1+ng*8^N+Qme*Q6%Q|>;Fj+L@w*g|8;yi#izC>D+U7LT@}g8uWASpm{sfmP2YYW-WxSHw9dtoRmTL-dK! zbRI|NSBspeR%<3yD=zmzeys_%6{#+$hc8KW%uTH4NJ}#qI|CKhE!o4T^fEJ|l5tI} zf&T6*dLxzeTftXNY^@sSH)59ZRX6*z`@@&R-tp6h`H8(k&+vYVzULDbhj> z$*Ic3mhe{k-9sEdP!>Oii8fp2EO<`h)G=CGtE08On`Uix99@1w&nb%#*ShyH%1+#{ z^t-AfO_>ee8tZBkwMBJhL?pk1Dun@lVn2;LqQ{&TtUW-f7G84rVzfDWC)yGH6lGpy z@2Tu%@*LFx^-r0tExIenq}>SZ9Ci&e>HC!akTA2W4c#419c@E-{redC)A=1W#e)b;5PGl4}D8(7kDC&yt9vFN`y;Pmd1MjQ%8xf6aXzO8XJW*Z7{x82% zTXok?hPfmA=Ye?dA8YZLAwZ`8A4&)dhj5<`nWTulol@+L1tSC;qq@ zpGfGhK{LK7RoyG$m-MszLgBpd_3+%N*;t#(jrfqf_5Wh;J>a#dxpwbl?oIE#!={7u zCLoBLDqV_z3P_bIMVeSCB7%ixp$P&CDkv62uvhH87wp*ev7y*K|0|icCR^7>VMS(s}I&W#r4F}bLgDLIh|8Hr_PJqIxNklx`Z?7nXd_E&?j<> z=!ELTzZ|tt&G;VefM#83u7hT^{&_BadLI1|Zr+NhpEQRmXHoEQR=xBWT3fd`dw!rK zct4w7dW=L@Ep7D{W*})+y_fi2a&zlj&+{#^ZLp>%YVGS`I}<_GR6BFQ^?VMmAYH_0 zERy>Acb+Ye9-}?qR%J#cVuMjr`M{; z{hWDG@s<0~=+KC{ztxRqE&IY1*uh(f#`?o zk+L6VwO zDwUf#*LP;z&AjV}pz=?;8T!vL1N&9zefM*H+_#y>%@*4qZbGRln(9Bo`)*BXj|ySq zGWtUsl|E_aR%Wyv@9{rUvPQ2Q=!p&`7c_q({{IRcOVco~M@sa)ljQ?ur~EpG^o;_zUx-(?1RpP zGXPM3{<@Kc9GjhdzlU6C@itEUXRIZUeuQg_OppN%1g%3PH-BB5cdL4kX zmwyE-H|~$?^GlIzajNuwF&mkSd24%LddHYsJ9xaW(MZMGxCUpWilo+38x&79)@zQY z2UIO6pXvqOQO)XTPm5lIl6nnrGHWzFtFKo~Ti%O$#Z*gk$F%c>;#n9Cq{pj-H!0mj z>o1*uRu1bL#kEalZKGB#VzfL0P{HK@h{c2k$dN2xx);bsPER6sR5=|k0vst?^C*K*B>J>cfVYTh6VTVxiV zwIb?Q)w7D$mUHVy%CmB$0&7RKdZZF7Ybs|{;mqVzJMg_reZ~qqy1Am7E!v$^GKbfP ztEU-=1}%fS!`mInP9Mz#+kE?={p+Cq zcUsw6)H{xjZs_1!ZXctsxgn+z7o=pRT5(;7wqs|^8SjjC#=VP1Z~jQFC*zcNBeDE8 z%gizB>Dd%(BeOn^=lqm*hZ4o`J<8bXKE#cwv2nhBZ4J9FWU_O|)bjq`C3b2j&nefl z^=$)NDRph?`BdAC6NytPI)^%V;z%EMSL(z#$Cp6A3dA%b53_;`%=Pb$7*E-0OY${J z=`bYd>GXFcp<_zv2hKXO(wAba<3amd7tgn(rCUj);vuEO5x3!c|Lu;>32@FvQ4RPTZ~1@-R=F8S!Q=k=klfIk+ZtrfZZtO zQ5y2!6pcvDi~HKl)Vw%%&a-n<+HX-`>(@4BWz3uFV=Q7PP(#G;9XbZ`@1$AnXkU}( zI-pOO%4kB8KV8ThzkW}Wzho?F2qkA}-BU46&GaqlBrdIxklx`^Hx4zSgHPjnv%zdK z+cGA^HEX|{`z_mv`o@K<9GpN|sf4~W>!`WfB}qBFD4Jf``>r?B$9Y-y->)mvUP^lU zf~aQPv%D46?I#q@mdW`-d&%fk& zN?Cc(dcjYy^Po}L&(Vu`9#R_7hHgwzmJc)sS=J9U{^3VJME??*L9|VjELm@R6}-N< zeVtdkQ@RPy_ixE46Zf-vPnqHVD=tmFTg3Z*O1&GWIfMN(a!0ant1lQtd!6NWSyB$4 z!CI~tpn1xH)1ntz`FwA~`tcXyygEKZ7AST92y<7QD|NBV+Jkuz(%}6g|NkTZ|0DnZ zS^h7ko+&fS?QfZj)`KM;c4uZJB*0;VIYiZw*yt%urn8Tp8`got?-weYT8X{9YqzHD zLdq|@kfrI|HG(hAk#D84E1m6QuL1wH=1l+V(3)E?BBgOWr6QA^sD(9P zO{s8~N{2Tv?n~S=E!;lIdP{ku^|+!Z6`5Sv$VfjgyqJ;HsPtE4C$MUa0oLShW7E{M zF~K_e(3Gp13GF{E{Zgk+fBraJ~0G^8Y{bzn^z=xDnNVC;!({Ma?vw*f&8- zZ8?fMnfF_n{K(8|4{m9?9LHt!p(1CTmBtG?yjMnV@R9-UBa(c~*kpiNie!Q-3FW}qj9`*h}^VG@2FC$wXE8i(x!AI^!H_GM{2 z6K^ilo)fMmz^ghu%VcrAcqu<|{M8)Z0P2RWU=yQ?zjI%J*LS$ze`jleH+Fa{+sb02Ex?;Pyrpdk zz7RY~zxs__riE<*J|hUv#A$GEe|~s?w{*DQ-=}wgAMJ3zzfa2m7mu3@?Mh?fuNL4P z9p1<`0?!-ZT^!!fHU$6a3jW0T+|}U?kmeYD15eW5&EfTt^BDIHa5^d8djuAiup$w} z)6?N~ZC&u40gf0%c)zdEbwNC+zrbtSnuNb12;a}))opd~1pz+5;ni$4@TmcQg2SuY zs^CKde6YhaZ66*l1q zVTbE!Ywj5wnXV=M`-bvuB}Yc=eyk9gv#!C?E!%TE zNdCw=d+~QIE#9Z2-nZ#;dy=h_zC0W2S&NK0yDI2GjJa zvwEI2$G42k0&R;K9CgWyI@J41-lI$hvZsKyXNiwh&m}&8eLT0n*PgsBLH&^x`=97G zrgbS5gvta+dEANA(JY49Q7l9#04onX2arcQ;&O>F&=bqBo{ zb@I5*=-iGB@4`FN)sz-F<9IarUfN{tN0?&;xm!ESn&nHWtCY*8)#F*^ zKRCWuE2P65eCObQ#Wz|r;RgQ=E2#Iyw6!6}-cph2^(o4|6B+R)OgHj5r{n55k$G&2 ze`Y)MDOE2Wt~+VI=RDk|$lOZ$uDITsH^|3ZJNYn=QWp+1jm(M*+0$WykK+by-Nw;k zeq<_SS<{`as2k7e_`FJF?y3`+S; zCwBYm9rgUR|I0p3{To}DJuzk>f%Qg@yqEWlL#In#@8jDJJvLN|Ol#g-f1|%w5xP`= zi!qPXj7)XD;Xs`J@VVubdw6u*9hs(dokO7Sd$08Axa^F`e0GjC4WDGL1@!LMJFIz* zZf_2KMfn=mthm~mMj!G`mBG3ilU3H5;)$v36P!T%5a*Ol+rv5k5>p6}K1+AfPVY>$uMU`=V>KOA;*`X*+U zd~8jT=Y2T+rZ!n~=_JM%Yp2Wb)w=%KYrtjAdiL4=fBLDz`vwlOW*hmX)65n{*?Qzv#r_rI`TMm;*O8d0ACrI`|H6?P(FWkJVjr1aw;+> zLhrlK=Bm>E%d92cgn`NT|nI_^w-~;#GhQZ(azo};r~6{ zEazus`M2DM@DayHX2yf?5E-;F=yR^fn%4Ba1>vpECLeV?50B9>_78v#mHx`(J0`Q| z4YVRTrd^FLVqrS%1-dhX@JoOHw^d0fWA1;(np5fjb$qp%@@8w-ZS;$uukg=aN!{2C zzI_^PmF+6~1Z^jYC98;kerfQ1bEr4BEus&GRjo`vIA~HjEuBhO^WnG2(~KKIQ_j?u zi5x55_HnKKF?~Pr6~5B@&iazIbv!faR3BF8=u6V^FIeI6J=2pX|9s6uy?f=JG%hRn z9rMv=r|7%#TJz-})>NLz{J9#`Bj|IZitr+rvj-0@r(@bi@-Mga@aZ%q;T{a=>($>| zvuQwNZoxf-3y(TyS+jnZ#}+q<%xNoqT(1?S9rR&T=nDGGw>-81OvfL0Tl2~De|~4d zUjF{8mss;WZSFDnyJ7UZ)97z>OowOJv9JBXX>cGvxz9#2eHC7m{^ZNJ|5?HJ=_t6` zUl09V+1#4*M)-JZzUS`_%{(}5^$Pm;4f)2J4z%GJa}SNh|F78Jm{;PyawBzDNBd3w zs^14`1I-`vac{Vh{hi<$KZlPTeoXp%n!*c}iFt_LH>cB4k$(E$9iNi_$+4&xSCHc<+d+Ke zygA4OBiPq!3Uzx8eB2M#TvUwxp5A7aGgs{v(S!E>#5w7RFQX3(k6sHHv!#v>f+yLu zoj#H4^VE^LwIlQOJ7^dwkHPe5IUQTeSkvS>`0r!UVQwSDXlwShqE5pfT{4h;tmp@l zqunV!jM^-q{pw{WKF?C%CI{3I+2GzlkXPVazlM~ZlVtL7#f-FxSWo~q|&>3}zQpegg8SDoiHE!ND0raj1Zg7@?P8|v5P z9g)*`@9Xd*wR!#*zNI*IZRknFqx_^z9y6SM%@!eFuZc`=_#z#*oNmqL9>}b7(c3?3 zO@4TV8Zk{jF77{Ez#M)$Q13ccj7%x18909GpL72Cy9fUscoB^s->PFEc{BI~($^Ci z7nx{b8*~HkI(Jb&hu;D}4IikZJ=ptCIInqnmo@Lsq(7kl|AD&xEbarId-I%w(_r5v z{MtCL@y-uu;F)WzIUm_c$2;q+**(Ym-(LXCp&y~_C;sm5wLcFYd!98{?z3ie9QU@3NeupaiD(4J#oHru&Fwy2RpDzl zw2sVg6X7>^q7xb8!{~P%^;+`=isNeIo}*n%qQ2p+)uetu+tFFKl+mY_Izs|3i|fv`R4F=h5oKSn$j)sx;pZ;@z*CW3q$?cKa2Lv z&akH8GJkLMW@P?L503lLr%t79yn#CakC@XjSQ=Z7`-pqeblTbsYhF7M*(BzZZu)@w zIgQ<3kj4I>-#EFk&zrM*`sb?F_t)^Z+qXVVqi*omythVX5B=j)*P?;DFCFqn-m!LO z`hP3(ZZ*7Nc-&4sI1^rVF7;5yW3fKwPWUbz)v03*HbL87v1ZK~@X+umkM^VA%Rx3@ z0Ug@Af%4l(yA0n3 zWXh1<4EVR)xpE3|F!tN9^fwpjoKDZ)-_cb~h5wlVPxCPGjUWxxXbU^3^YFIA>#=J8 zGh}SOp~(@}v?rerJ%)Z~&7$@`{@U=hI-c&0?EOA{0qc)t7ibROODzBR*WlbN)!UC{6C>(Cj{ z-d|e^4?+TE4!x8E5H_o)?O?XKiV`}-Zm(Y*t=v>vB zYwmL1?4N3}4o$!#W#PxKvE~AV zwEt&u+VwA2Iq3foYx2@IJJM!;y33l8+BJ=sSbpB^21W(I?*1R3l ztMAD_OMjmn6Y_Y!<+`75tbQ4Ej&@pfw>AA{!wbYTUE$m2O+UA=aAc-sMy6^B`n{KZ zezbxfb**Pj*^|%>tVF+&553M3YrdwOOORK2FQOk^g&cbgdzLP?rVw=SsgHe1TEF1q z(7z$@AstDJcCyp1SW~F`-wQzhlgTl16(ifo1Cj8D(^ij}>x5<~} zSOpE74V}{NM6Wf7Oo^K0J#DJk6{G=w6KKaA`1YKRqu@73!i!u0z0UKdrQ=n|+sH2+waZ54woLz?&mL!d=QrP zOjgj}_^0>|WS*Ks;dL{7_%Eg*x5RqJ0-r-KYo*^;W0o};(3|zaxBUzcI5a=J5;XAg z1JFZwla8B_tI9>@bZA1=pJ`{O!SkF6FOMvJ8$9B*@G_56N6)7Z7{3Jmn)oVhrF`L| z|M=LN7wh@d<;w%_0uOdzHL}%ipN?g(6W6)uA~q&pkiOnS{m@b1d>?idZ7@0NTx85i zl=X$zr?KzJlM={((XZCr4h{KZP-He-<)65?E_?XGhgG7k?Rnqt*!2zdHt$OI`=zh! zfPVz-gbvK(1x+i(m=k?Y z-u3Xw{V4Y~BlV>O8Gddl22ioP~j(Z>AdusTw9Ur%*IsJc=d!ZG@=s#$u zd#FoaoQ6*Qn{<4iRd;^VIM*neHP4uqNq(R6P zI*MKg4W@q!kMFnnf14XIRy7;hka8q+Q3@rv9qg zTFKFjvepqb$Ho@*Uq|5^BXeT|_?dNF`>u4);%nHps(So7`Ck*P@gDo2}pjlOC`Oh*?EqOXEyD@7bS zE}O^x*U`b{w&Ie5^LF@y{(e8&nRcK%|84Sl2j6-ny8e9DyaIjrn6w?q`@f)`>ew99 zR`=(SpW^6$ayshn@_3aKWhBMd(!p$~iesi}Uc7e2NnGR<Y5Jin%$T_Z1uv(Tuu9YojiD|GXMKB&K0y>g*{^o z&vizgpiWFbH=WmC+!2`%;URRK`=PtIpBv)*`h)&K$KJjdlWmm+iADQG3Hy?r#<}r z>f&^Mg?Pc0=(ny%&iocW5?XfFX!;fEVz>1^&lI-N0rGu6WB!zpj^Uf!#oT;~kMo1o zjFmI?p<^<#myXBIMb70rZeEE)KcQVB>(!xdkr%(iGcV7_KKJys9Vz41yzl!%cu^M# zKl74r1!T_w;Yw$H*g;UEw!r zgK@ojYXjr<E@6IgY~g+>W?32q5)DQ+2VIc^2+Qru;@%W+rWR^miBBuyWSTg(3| zaqDpFaaZ9s;5Onm;jYGAgWHVTg1Z)X9qxMER@^q+4Y(U|+i^GHZpPh$yA`(scN=ae z?snWR+-}?*xI1xo;qJ!WgS!`ZAMSqK1Gooqc?-aW;qv1O;0odj;R@r5;ELjk;fmu* z;7a03;Y#Dm;L764;mYGG;40!O;VR>*;4*Plan*3uaW!x?akX%@admKYaYx|l;p*cW z;2Po@;Tq$b;F{u^;hN)G;Eu$##I?c|rLq*qmB2~C1G8Z0JWUxKjI$|+E03#ygFqOB zMN<`54Obmk0|zr;#0-n6q%oMfxFc}&aP@H_VhwSPaE)JQM87Bc_I8L3{NZcsgXxu5dF*q?+<8b3~ z6L4Y>PQ^{aO~y^ZO~svtn}(AxF#|UfHw$+ZO7e&yBT*2?pE9m+- zxZ82NaJftsEIm*MkcdpCpVxmf-dtFKs0@BYfS=;VBn=~Y48mJj&KZK z%9a9O9^euna$yS*CdAAQ@J$XcVM~Bd3-Ie4UYy;@sEYx<-QmU9w~RU;;1F-(FKUZ| z9~0m(px{N=>x?!S;0T`Jg>7N*Istya!wX_b3pxbx#nV(_%Glk16=ho7yHfp1YRh>GaddTyW4R;z-u}D2X?-rTrTA&E|>Za z{~qhVaC`yY#NpquR*+c(0S>dqd%xwRy#)AC4*#0nw3v+=;1XVQu{Y6I;I9REdxw8% zz65_hz&kno3-bl|69L}C;h$oal0G-U`#Jm*^9lIw0Ea2%y&rKxYXbaahks~31m6sX<20ge)Zc;4rPE(Z9i4u99Y3%)qOr#k!{EM`NG1AMx}-!gB3PYdu_4&RH_ zNBWEaKi%Q4vu`wgRDi<_lb)A3;gp;46PM%J4u9TAfq!feUcy5z^E4;<1{aoupX2Z~ zW)09S0Y2B^tFb2zEf4T{4qs(ffv*bi`3_%cV1CVo0e+stuP`FD=LYx!hhNU#;Pia~ zzR=+pVLh6@HNY1+{6bbw(}xH6Vuvp>qPvX)90fezyO0weEWlxG!RK)r^Wk!S;(U{^ zkju>Fgq{cZB@Um%T5S5P0GH5|%bdYU{}|v)9X{L420u5zmpS}&_H2ef2=L_&pT+u7 z_>}-(;qaN*5`k9=@Jk&&11lr6UnEBprym72=^4t&&PV}{pawp~Sxej(;8!?&u(JXA zT!14S5xy5EJZ^xma(GXyOj9lajvz$%qd6&;0AJ(qwr)q-76HE2;cZyE2Co?4C_9Mf zC{Fn007p;)Z_SCcv6P?qd)GU>C2QR%#{j>|;YYgt!(IsR4GwR?N<8@V0N?2F=B7FL zZ2`W?;Z0fP2Hz6kS3A53E9>ZY0{j|>H)a(cyi_i_ zhPb@Ae7O8(VpsU)yO5UZd(FD8(!3lF*X+zY1|1x}FX0b|4||w?Fm_uSLIZJg`M(DD z4o)MRdR8-5<$BVgYgI!P(xLxHr|BkQ1j>UDy^};21AN+E9Ub9IXa-AAq71tT@ zz1{(y+`lBguekL5-Q)ecWn90coha-YoZ=R)bp1R37Q)E6cW`|X*Deoo z0@vhOrB9=92%pmk+u`oj`-^++|KgrTgmZe=*u&tbgD2&4X!@4? z#XZgVNS+J7NizU)!XE`!y27w8=77DE1NJ$X>W7~FA&2`ZgaF-FJ zO!)tB{{Jt3N3|zBjVeRARH3{?ujEgz2l}HI>W~(nSZIdRX#LT+Fs>xN4&cY(hTt^ge-=)0Y9?bc%Q1XTX;67&(Qk>b z%rIz&;U-^W2Ue{o%*Fq@_8fNST#{OuIu^E(fM_V5%ZDxuU-49hRE<=9tc|wAE@q#U zcn*c=WuAitM7T$0o*2pA;w1d1Vr?Xg(ZKQ$zEN^0U%db5YJ5r>HPyO- zR+bA2<2xp!16HhhWc127E@NoMFzo6~#;&h+@jW|Z2Fj%rVf1AuMA91QU&;<*M{cbR zRyj7e|6+GlgMGK5&CqCqylg9BeW^N@|LS7fsuA}8T12hfx9Pj|P5K^vi@rnOFgiLV z8WW9;#<{Q17bx|zBb)4ua%RRk8Jb6{H!h*xZ=yDT5)CDND)Bt_q)0ruzU*ixHOY6O zTUV=^lZhqDh3rN#bd|43zCAr*--_#7iHt3M{nIm}TF6RzdY+St75fLKKvaubt2!sW znRIH}-%56iicsei`Z}`|Ut@glAPK+EGan*xe}a_$6`Fu=(H?w{#^Fb_6jU^4J11|H zFDeif#3FT(s2KLDN=Bue_2p{hoUA6+A@}N$e+|jOCgfpraM1`(&x;~Xs1=2Vur4`=_)6y2oc&`)VQusqEB+Y{Ee~M1~#WFsQcF~LFJZdP% z7t8xnztmoYl|X5H6#F0OhOdk6CU(8GmCZ%L6vTHI=hMjEFPj(HiQ{$7x7;cFi$sJL zb_x6DuIJf1qX(kLv7Y&6v=3WDKSwr|58LkLQ`NC3*9@C+om0J2ds0tg0V-Eq%Ek_e z&d0Aeo)}4|qm=)E#$0ld(3a*vOiRnzNs(5aD@0@aWa|D|-e15DizI~zFOKXXNk~sN zH(Bsf^39NeLg$<7^p5)45_W7>YOBX zN%7LDDGrs=&PXfO_3rw1dun`KlDB5>E_Q~~i0J-a^Q)D1Q%@GRW1@U1*)D-4Cznf^ z&+JiAS8UEL&KOLYDtrXxdULM#m$#FnH{-9F<8(L*@xI9$Nk6F=l?&rjYk9x!+zWNw z7ngl$Ba4bcQ&2+5%gU3%rbb-Pw>ll0?*GW>#3gZ#Y)cKKV(F_(q$;wj)Top+0(x?` zTO+UV)v=lOO5FY)w=dhT?T>a~{QTTV`*6A3kEEMX8rNVkVyn||>FG~Q$w*pSy`zX7 z#ePXYN3wpPd#!Dmj6aB3_3v|RYyDS)qEh5H3R)? zXm3y5o6=5QO0{ySZ)bn!mFOLM;AHo$BeQqkD$Cwh(g`a37p7t){kUQ(X~#w7Q+@g7 z{QR4aeaUm|d3F(f<4UaYT@AAHC3COh3JrU3adxp1Zj>rueD2-iy|BoatjKXop7~`TnLnANG+H zuawEz{iHP4Nk1v=c~Tx>?>8VC5Dnx^dcdUj8;V8O;hYmv6H*#OlI~@I9pr39kAtt6 zg_X^lsc&~;fA4YI5ev9;qBP~XnRXabpRaPHKZ8=kvCel6){3{Y57q6C7Cj3!`T*Oh zg|I?b20M{eGODwebFy2L+Ucp3Pzh3_@dk}WXq-Z07_ICnu8&hMr+#i6`+d!fZXmSE zwv-(o?WB7tfIpqiFpb~0^6jIxZ4tN6-qGn9(krRev~iXz6jNGWCwT%(bLPF?2ImTj|8* z|C$j{jVGzziYj+bT^pzAAzPbTD*TuzD{3EI%RfEwDBR-5_!Vc#49zrAx;>xbITZ0G z+IvZ%#Q|z}CHX~h8xQw>(QNIUq*kCX;t-`5RIEdsrc}O#&L)S#RHe>bOdXdE7RA-Z zR>_cE7x|B|wKK}m^N9Pn0)AWl*Vd>UIj7X0VwParTVrGTr#9O*wK`7!j?^X^LVfW6 zr?{eOaqsvWqqfqk>Z@kCktL-juN_PeD?2Otjz)G*Y9uKug?}-!!)hdkZO96{;QfDv z?=J|)Ul~rnA^d$7JbgcS`O&FOak+?>mu6CLXzgt6i2AH!$NT13i&4Ay8oKZ!dje>j zO`(cfSuoL?tJrb&GM-gVcQx9>Yn|07g6_S`>RFBG$o~`L+|uSN+;i{|d*L3A&hA}D zq<)L@wQp?vEXj7S~IyZ%bw`iF&u{Wm;p zMS9*U@Q(kEm)#wg#Yd)Cq%jAT)*LsQthy_CxLIl*ZBYO2WDl49b{=`Ix-loUkT$nE zB`czt{J#L1_)c=-0dhiIGQWSaIg&%*R=fvj}H#&QhFZIdhVAj)-gF@64jm*rw9|D>EyW zL>i&jKlQ`IQ?k>fy4cDV%h&;js_%a!wS!!tLS;)3iR5soq;RNYpwVH)o!btLzKS$< zEqYbhjzqqiP9L|I_MrQl$igV2B5%?At~Wzs-^*^iRk`~MGeItZLrnH5n(amy6#7Uv zW+dNSH%h0_uQ4{a&wgk>q@>iEp0XFAl~{`|;zqO&kDzmS4L!pbXcvBua-&x$gFc}S zdW6>K4tk(37>cgorBq>X*bXDPPjP#*G!jSIi`Omr~W6L%l+% z3D8^$m4bMPSyA{u+GKVr{{PQ#AzR&3CInQEV* zU6dqghFYwCoqW2A!3hOB*CjP+m$`8lb=G11j6hxEH94 zEwhI71`D|_tM$KrAaeiln!zE6H>B^rdn0gzGA<$-`MZ%Pqs~TG`w8LDA^^c zH2YRIA>Wj$W6fx@(cG1ieLdCbEYlG^pm>96>=rT`Swm9H^;YBX%JJ3a8_GvdO5$xB zwTr%?Ty&>K#+pw4%kD$7C;NE%%A;(BjPh}aHc|Bk9vze#o*G4s)N{?Eo29NOSfSe;;Ht+3=IUfxR{LAP>^Ga*$wewY#kE;~z;qm3j{Q=!qm-Hsis#0U_TR zrXG1F-!{`cj!FHlM$m;eb#vd8kJ1O!OKGHBcw;wLOL#8!et0|@LmgG_d7W8J+P~KY zKT8mWst8xoAVc$B5Xj6+=+$0FvnH+DhxUXSK81H8dA$~w;FqRKB&&x?xv0Em80fu6 znT>>~fiKiehI+}v=_3!PhrEy)u9O#NoS+8d11%U8IF^xs{N#q(cG4zp4_bxFQFBq0 zqIqtX4D1^-W2E=?x?#!t!=mB;fmS%N->X)xc?XKSk=eu7DizYeO6!_vR}(F2=eU-O zLt7v1iT_ED{9?2nsZn1hTdA_6s$K4;V`+YSTsI!0VE)m@oR~cp@qeE-=D$k^Gj0mi zGBdRQTgu7uzfC?A?`%*lnikDy4Vj`HQ4#*qlTJ40ay=G2tEi}iZJywY;)p}S=SA~- zD)^S!#)Z#_!wW|!H}hNalj-ImH^m1pa5STIf5r>Z^Unnz6u&paL`6m23Yl@72jk)e z3t=v8EZ4~jUtH;qimF8xGUGYX+GM9c(lP?@vp5gN#iJH7XL3TL<9HC~it^duXLF+S z0Z;Nrcri3rCvr``w=mzE;N8HVkKbFEcuKhN1KpltAzs?y0}LIL*%!Z8;mbOFkQu~v z+;o0?z7-K(2`lNXx&9c3FF|-zu;BHb?x=8cYq}OSRygVbaBp|GW`Jipydk@p!p(Xd zO=MKGy2JhatKI=#%i(^$*2w{0$Kif{*EDcgCdE^%uEU#|W?at?@FN`V=Z~!sUebjx zO2-xX;hL!mH40>id2mo-AHimGmortIz|g4=mCmjUVOknr^hXTYvu0zL<^Hrj5go zaeH!vxb!7eK#$>iZu-5sk9N49&t~bnS%;4+h%01RW5hK*w~ckW{I7|lX1kM`#-6MZ zAIExlTyb1UTq#^>Tp3(hTsd5MTm@W3TqRs(Toqh3Ty-}`;d&8@4)2iRluX%b2-gg9Y9rtCWM}GHy zo-4vCGQB$qSC0RQU*T%=cjc&H);p%q37HX^X%+^3Iog*=eXyCW%?&eo9SY>cIW3rb}kg9td^Z7s!&D($FMZ?k!@H(Y&&5w*uXL!0apM z<5`4G@fNdhs+X%SHp@xf7W35U{wuqY{yu!$F!ThAN%?wGenb3*8fJg&Yi53pea%hH z>@*K0r+7(_Q!UUJ^)$zk%LAa3gUFW=NPuIZ`Qyo*8OT9rLbuO0lW64n#-r&c&Ud|* zsQP3VCJCi*w~&j8G+x#$jGt;x-*TsUhA&dyu3}b*+NJy&;e7_ba?F>XQj{Ait2}9G z#AVA@!7Mt>`x-miEY9%=C~xwNo;uQ%`!VK6a*8U)SM}j*M)DOi9bMAvI%;H-Y9n#QCF6;lbwG))Ah#12szm0Tat6iyUEn7nUteS?pEqm ziTIf+=7T2w={9CZTtYQXdM437Iv9<}{aFuR*=GKugZW1X^FLk(^QMT^LHvI%N86^s z&wxYoqP&EFrWJA;?nC)=@gt%rZ?*LN4^&di;&`rz>%E@!@o0ac+@fdLvfyOBOn_%N z{8DxsWF#TLMH8{XrO7j9et_q3_;M&4^DF~g3B@Lgqx-rdi@3S|vIhSGuF*zD2IH$% z`>UVtz%v>TR@%hlErUsuzbd`q{cF5`Dt$^fdIsU+kzU3Z_kF?nnv28xh3kDu&!1s5 zLaSUT?c|w!&Q}I*D-$lQ4!uA>_<%&`w1EC;8r-|W7cuYO;oozt>25}{&`)vqGA9_7 zhw`IPb{tJyo+$51(-#gWHvDYaRCf!Z{6U?aWH!LkDsq#wAa1Lrj*HrUQWKY=KGja(zEB27b;Po2l{$_cW25@IqXa1A&1bhD+#sG%?4$mX|H*}7t}gu}|NkTZ|DTorJGG*X<%2;iXs0i&p(>uDjxR&@b9j4u8w7 zGv4TM(Y>e%!~=Ti@yCMqR(ANy>>-Thm;kTo@TbiSTwjWDG$|If0`c5up5VGPh+q1y z{4svgQT)kt?=2#{7F6{vt{)OU3!KuB0UB_>F7w9#Z|rctj`f zrUBgRftrAKDC*)bO2-D?!SN~~-p1kWO?$50g7EDe-VqASXmfz;e=T}#x)yV`-rG1! z=`VV$!}~y~55~JYyo>40b!ia3r^8Qz*0YW|!239S81gvwCBVDJ@%MB17Mm z7p`)u4}Yn4(+*tu0AB12hkJc+Yfpcid~l}2L;hVl&TtKHqW>fosFBw6N*9WKaonN0 zPBhH_vA#2tXR6}7-ZQOJtp!#aR|j_lt{$#Ft^uwgu8~{o+hRJ_=5PaXvM?>{p`T2_ z5*`__75{FWteWqM@8vzs-y8J~GoHX?>Hj0HKjX^J@cK+y4VM1%Wd6%ybr^SZ3?k^B zvyx7{VcfEGse2z0=S4gh#(h-~_gDD;z!jZ|{uU?QXfv*Qw(khIxB%1t@xlKK@vp-j z8eVeMjo`Q8Iu4>u@_!HhQ0J@X!Z6xFLAu<%;JV7HuCB6{r>iV}>Z%ZnNj%Wt$+i=>Db_;zLNM#@r4>esb{*7+LK7_ z7&9@DHJ1~1Gix?(Y~jCPpOXg_M-el$wa0dv2Jt(VBhd`Z?aSkHt&S?=rNI1*o3u1P z94Tt(OQ9oqB6(3U{bFj7-hBAfgHJRMQZBEWcPW(vW>)+qTbU_ai_|Mr7qs}&Xb*6? zJA(Wj80Yt5w5=CI#h1n@+u^9NaFoP zmx*gCZK_fWR1dWCaUyxN8hT`zfh; zjr{w2qDvoXzTs`kk$OhlmSXkwqI*?eR|?RJX$0hMW*UkwDozMVyB%l=;wq9dT+C=h zn2VBSmGhb>vX8lNl3(?mW5}!B^kR29sa4W$DZX@}xd6HLLdxQwBp=;T7U_(=!fxrWt}yDYybTcQx;nqRh%uJ4bo6YIS`noUL&@x8H znA2n54wFgQ>Au=lCUr*su1NnI;xs&OvIr}59C?&zpo){{bt&g!;GzaeIfpc1Up7@p zbX7|E^>Msk1)8dUl&#)SkaBHGnJQP5hMjI_Yu(Am48b-$sXO9jr<%d>cTYq!Ae!jt zBi9Bmcp7<22HJzMSQW+f!_5o)U#{~OMAgrH2woH;K-z&*|9emyWffL&DlS{yX)BnkT2!_)$OA^#2<*hnN3J{?Blf@e*z} zLAcio^q}vE=TTTu3a!%=|KBRWMd78rox!jA>?FK;NUSt+!si8eVTVtJ;-HHSaPc5m zxZ;El2yk%}qLt(L%@yF1W02h3{GXq)((i=@;y8tVh+P%~yqd#DJ2_VUL6Xk84%d8l z_|yPz>~M|Hvs-L{!*Fm6adPq#0S=kv@bjG>2yoFER&jDN7b3trJA9CvN2IgbR6$#cH&+nxHu5i*W_v81H03Yn|zK*wD5a9YwKPt`ouK*wIaBt5_ePEIv z<)h{}^x#)KV1lbWpsJjFb%0Bb)u=V(+V%1#)6K)lD?Ea$=)!d{<(NeVGdrc2Va6eyb|1sI=%ze7U{rs-a16=JkFPx_4TfH0LXE@x? zAA2>x&vJM@_(tZl1-M8>UL=0Cn>_(8JxyL@={j8R4e)avUK=hK{ZW9=ak%(j^o9XG z*WrGi)l~sL&*6Sv))fIh-{Bf{K_(9H^Bi8y=`|Jv_yUJlHC4IJ4e;|FUfHdDI6J@> zI=qt8r_2uU3mje%S&sSM0lvuL6{y?T-U{%=4lj>vggx5;ztG|3+>DrU0e+FgHNr-_ z3-F5_uF*HzQGj3K@Y3+w$iV@=#NmGa=S6{DW~svyy-YGkO!LDsaaD2Bm-zW-vmqM4 z*GEc%$Cuti{Mt8@{ah`JE<`+-b|Vum-Y&Tc*Z)tqd)I|9+Wqy=|Jt!6arab3-$IyK zxbJQ`_&L4%c5v<5oP>WBzw|NU_Yy3*>RzHxQJVDLi_x!WSE}n`J&T^x`(Di9zuxyH z_^&wWCgc>SbUb=4!IG=)Nk?=0GJmfVncVaQ>|lavR}qB^u@`d)r+DkqNEKG^PtvPh zTy;c7W@zxD-0A{5b8rT^3gbR}0q&x0i6@vqfjM2HSE?YgSG$ zBV6kcTHeT-QG{{e9c#A9P!D#9bqq?m-($k0z z$X^Y8o@k5wHPPpNj$iRKa1>U)#zs7je6!63&Cqu10(azDOO8V8L5pKON1 zo1Efiy*0}6lG%~yE;>1GNbeZu#;qk|AICGp;kl+8Q6$}~Xm;}q0xkM}c zs?YC%Ze^(BTXe6V7D{dsF{#jZKXTMWzR`G+uR+$r;?+bx?9eOM$1>p z?d2=qG1*#zlg-O~fv{7}%r?Gm_2FGL<5X5Ronv1u*N3To)FH(!vV6X`gkOO3;Gg1X zm#se-?l@3kW6j&eeR=y*Ovb+Rnz!S$Rxl0YchqqGp`NPkvPGWwJE{gN$aZ>RXF4YV&Pe zUnijHIK$jZ48Hc9NGe8V>j?@lCquoA-c#CX3@9GQeRX%Wb~Jpp=4pxpRG4nmSD*7~ zd9a|V5o<9^xt>hn${6*@@>O+QrF`9u_*D6ha}tAmQyot$UtcF($ak942db@|=;l@4 z9#fa;*>gS%(o6VMOZ7Ug(We+w@$yegu}f(=jNpdSrz$tB`EB$wSC;B@R9(>SpQ8sM;G9A2++eSk}z6TO$i~@Kfp0*wZ4wJ34$KV;sCaz>jtK1S7e7 zT!43XxL+SNB*1$+-0NBT2Y6qHdp%3n03YD+F;35t72vSD9H($HUoF6gINa-B8U(oX zE1C~Bir;DhuKx!5K9b+^0Y1jz;&9Lt1-QP`nBkm^{piX)fM4e#y^p19mj{#dGn-xV+?#9RFcDQVD#qB5#f1Sf+`3G(_2*1tYvewDiN`P;7coA$l#PvUp2T_(o zRzBl;9^+qzg|%iMH2oIhxbR4VXgwaR)Rn3aIcpXFPh+w zIo#_d#VaTH;|}kGoWOjp0Dr>az1@5zNi9kECmrtfm6Age{3(Zf`}>j`68ve0dp+js zK|Va=@ZxUVQ?l}TRJ88h{CL#g^|u?$ya5UU||k4r9*d zM`nl>x0T}mbVkH~GvW~~|IReB4HDrSZ^v6{fW)z>-&LPHjDB2l=qRTX@iOLkc$tat zKa=2@5^aGrMl<07Pe*@q261Zj-#PHK*eG&V{>!j&xs5ny)3TH;|T`-`D|G zP357zZqyHSnCnYwli3EnQ(5G(^AcnSlis@k{b=GsCQ;YA`H8^W>*5a(qS%tnTvKZ{ygm3yiU1I>uI952RVQ#<=!{BM=1N8O$`*XPmo@Qjjkl#^5V z;se<$T~r?3>3Nm^nXLcl$h;Hv+%@^%%jKPND#<17Xq8y5lf|hb@yg3uE@$fV{rck8 zSl;z5t7qJj#G9zB;7II*IE9yB&8&z0EdI9|dwG4WcuR#l9gCY6#~Bk|B#o2-XT8vW(Do#=sVvY;LZc*E zt1M@m{&6dmr7_7ZdZSv%*&Y4cpM!2($=emWrPH*kW%i&JsK#smutL<`CeXONvb-wd^q;Zz1AY)k5|?ks|Gw53Jw zitF=bSmf(q2hH_mb&VNLe7Oi$jTmb|*9X|F_{qiCGVey4zdwHRa&sg-P$p06{p(Fb zdZ*!WJe!TAcj2edHoq|4;y$5(%}2i>{9b0GJ>vAqq8xo4P1EeW(%7Lpik_~&txH@g z|EoxYWH9-snv%{2pi)?m@$ojy9;{}yCQ^t>TWx2%`8Lj@^^Aor$Qt!`9~ z6f$i(tDXN>`$ySPlzb%ml$?^UBzs9NlguW0PO@HTlR2>=+0FH@>eJP$t6x{ouD)Hp zyZU$a@ap6H+c)E{>TTYf@2%R#8<{1A#A0iuEKf_BT_Ho-f z?n?ZXY_A_fKP4_pe3m#Z^$6m&#BYh?63-=`;_sEw0Gn>5oetrV7Epf5<7SNDT@(9{ zf;LNnR!IzIrtc(s<6NKn+l@3@!bia$d}e-tgVMkIX*Z9VSv;?QwOD1)(8dtG8`@vT3^|JIoLe4%t0ie<7XL7zSgY5~(|4z1IP#mAmzPW<#z z(~P?MNBnOsR`C1TI@A@#<+(9wFZ8Wr=zFCp)SdBgdtaNx(tIy-C;g?`?NN+K`gSXw zK~0c>jz0=}bd`D7qZf>O^y+bs-Z<{j+r~Y5x41`_mQU{a&orYt`dsc| zBf1-|8m?OxyVfNIy8fjvV03pR+inkPBDV|dNWP`)V zB^UFYa%QU;m2IQ)S(CDtpP1$c2E=c^2%EOu?d9>m<=F4;WnYfdv68()`oK}nBtCH~ z*V5;RXBEFHUe$ALN4fU+XDLXUVWna;<+q+MR*M)$$!le^)+T$I?hH4Y%5Ahl;;<8* zQ4~WhM|7gNv(r)6ee;oyQ|#bq!f}ooOXH~boMFn@+O%=y?Bk|3-yn28v+Jiaz#z1m zm34UeDmXp5?oTkqtaPHv_jBo^MRBL{zZU-wZF&DmPm=8Elh_ZJK1%N^h89XXUZrBB z-4y5h3R4G)w`s0V^9^RSm7ZMTN5Y$FOhn;l8EFI6e$>kquouNoFEh2FnFV-S_pUSz zpp-rMr)REqnl|NqZ?_&q^tc#xs0HuqZA%h^LJcq_39qNuVL7$G{f$;Ayq}x>&=B8$ zO>TW04pb@5SsKhuDwO~I;R?jJJTl+sL#C}}rRS8SD!KOW@XA_I^DCT79wk51>-As8 zD~i&S-%wxpio^e`FMQSEX?>yQMtwXGz8js=X*lVglK;{@CAz4?>G}?b|L^Mg6yM>- z|DI$VJ{kW|d5TM$%I{qPp2y*SylP8;=X1CpuUZ}81s(3kpDqmWq7L`tPqPBNxWoPU zlU6q+=_%=OKmIf#z(wOE)r{r0SAbV=xF3Jg>W#QO^9nBxmG8y%b;4_&DJu$#iHa15 z3vI*oUja_X2JYvLrrM>$S9Z8x=UXDct2o@R^F1QKGac^N`L+-6st(UGSzJ#F@M;ck zZ`yO69^lm--ho*&SgQ~48V>L1*8g4^;Oc{m$Ma`z32@P<;+n<6^|1i2?eH#c9`2g~ zUdQ3bvgU~Oqyb*n;ayoj!n|1KG9>wVgv0$j-wFYaQik{XdBIHrTt!qIxv~e>P66J) z;lBNy)t34Yw@cBL;`9fjxYkv<$9N-$`*FeC0ZuU!egr4u96>xy96sC(=lW29YrM8N zea8CB>~>t;eK3jFtaz3^t5oeAD_^?u>?QT;oh!cuK;i9aBl}uvyhVT zs830cpBJpzAqn2v;eKAQW)vm(Q4aU>f;F!x!BxMDGuKV|r1>TZ-qzuMUa)3sCHT<} z_w$1D1b91#dpZ}|DEzOi%hj46(Y1-o&`dx#XYasPBl_r$gZzKZY5Y53#!_h%R&zST zI7DloB0kYT-TOQ4B|3n=a?)?VLY$hk zMqJg$OWQ4OT6*mXXwPPu*XQ|OZ5kRIQCEf3nn`Jf6MrHp4>$d&my{rFNfv>0e=KoG zUKUj^gw}J8lbLyqd&5MhFP~*pZxy;V{k__n{6lDA$tu%vt|w5;Q;hlw`KD&i=qj9T z5s2B4YvyN}hp9?>VnFu%$ri393LBn12W*5mo=oOyyl32(3VlD_<3BRihG- zuX?uK*0d$zlG!@&az@gw!c}y6rg+LzLW$kh64{o2OS;}(Aq%=vm9JWMPhH3;2laGW zlj%y!$N7&=(U-#i-*t*AZ3@0q+Rm4^|2blV!|B1JA_`K(JngE;gs_^qgk+JDhF{Co*9zTGwzUXof^km~k?;vqbd<`G>eX#F$usi!PKjui96^Hw3uoLP>U2e+~S_02f^-X|$s-9O~9| z`~@8ThJ6FPrSQgCN@r1JL`n03{p1i_dWw?lEBGGx425s%!%I(5l6{800KXMnc99eh zY!CRq*xiVE%0c|nPn9%3+FxQk2`{=>(tKxs057_YA99{}oSvd2JCpwbbm0a9Wok7@ zR7CW(idkXr1229R=_xAv`L?;ouVCj@=5Ge&#bZ3`!*?bAEC8%0<*DlM)pj-E=LdK- zhp(|~z;^_=`i)GpmVI5Z?I4`*)qVleBV@9FCq;V@F1uo`jcto@sWl(>?aH6dCzOJjGOTGufl~ zUZC4HxIcy!j75akGlT2`@UPbsKlzqPzIlAG9SmME$T!L1_2clrDLt7AALWr8UO%2E z+w#UVE;+nD^F@Xc&$s}W9A4iHx5L5L2{Wf_HHENIM4nb%m$CDSRh~ zPeJ!gpS9iRoA53UpYG-(cLz`6NA%^r=h(S~7p{C$_#O_Q&0H9?;o!znh~ zQ47m38~Br{eQ}~9!n@G3bpyXu@sn>2$TyGs^`r%ZeCtE_W8?6zC_M3CNh?oZhx`7! z;7w_~pTm8B-#Wk%qlw4!2V;eke&Q*LiU7Qt)4hlINe-{5WSjL0PrfPq5Qo=s^QvA+ z$DdDlPeQ036~38|%hYa#QU0M0_xo1V3hD z84JV)Q-Gi4@K4z{3=N0yR{p(n9bSNOEat5T_)LS{O37bbEO!U+QCnAAOAv!Yn+w&+75T|6uZFT8b7981o$F{YfPDWxk=w>x}DyI~La!M`@s;il|``B^9A_^0xI_a&3icjXMh02G`xK6_#DR zeYpHDpdWafIYh5On;*7j$vXB9!99%Y0ihKyUmg50==pfA`Y*rqe)3BoUmzJ6)t?A-m?xoiT@e=r5;JgFMk++NB$@A&%&?xcg5JJT>oAC^}Scr4}8rzzUJnG_?fY?x2M@Y-!i}F2X|_QkItW%Eo|8P+S-U+t}EG0TlJus zunpm-rjvi?!H;ey-|n>!!U!p6sxj-NCf}XK_jWep$d#+f*$>Fg`FHwSF`Xy=Wk(k9 zwPHFt!3U}9%HNgd$+)iUVP5d(F*?BXpe$84ltY?jy_4AjRhdB{JN8w;EArMl(5l|( zwpX$@_??tg0cKmYqGZM~%Tarho)g!f?RJOVZTFI*&q&30?1XzX(ozPo^so!<12&58 zq4plhf7uT#2dCqAj2Yl;2gwpVE5ezpzLL7F`RP|OU(e4vy@q+oH!@@4c4k?g0N*+c z-f|T6>{59DHSp)_sbkL|x4n$4^cwQd8`QH8NyFFncl#SPT5aSZYVTWJ{EUVwuA$zh$P^@666^!@QPbm}{U}%Btb2jjnF1PCr0Rewy0*Ej9EpT1!ls&CC(U$kGn@9TckQq{-TS_y z{py{v)vp}v&5W4E_9FW*J00hW@?Yr|Ha;WfN4=| zZM)s|HaW};paeySoKX-E6AnlaP(&0EP$X?ckzhbYQAr{Kq8mjJQ4s|Rq9Pzs1w<6V z1ZFWH2Fy9@_P?K1-AvDH{J#DD|2gN{=bSx#t?BOPU0q#WVO7`d&hNZayTV? z3b|MnY@NxQZO9u*oLwekc4O!KP9U4053w`+9BZ}jP0IYPC?i#5Q&Kz}#dk_-=sQ)n z`r9fH)vdXFuk5(5<9iR3cSVR#4o{XxqE`uenPq*y@K(mns%tNxr+71t`Aj5@v>lfq zWh)@XP7YU5+k{jKPUgAW;r)R&L@Bv0SVei1PC)Y7OJ<*2(^t?1lA@BKlADr~ z^|9z`hm=wcxQE|=4F1MlG46Vi^OGsPKL=H@k4b!5s%B3o^;BLy=a^1TDs?YlUdGSe zTpWCPGM*a2d|R{CYU!s|Gf#-?;6kf?)8o89F;st7A*z4+8lhL<`gm&A>C8k8v{fo< zbMK_($g)=Vknpgu1{P^Y(u?j%9Z?Dt4`-1l3gv84U;9DmdNfvTV+mbxRL#|jp3&Hl zzsFN5ry2)o?cpqwztRSs54X}$EudPxYbf>CQ>T4vrB-SSrR8-}Q7zE-yu2(kLr2ih zzkw%}j#^FBB9sSC<-ba!%ADH&h@IO%iR-jRTI(obvSF3BDe=9j6s|`e9Llq5i4}{p z%=-2`>fTM(dMYly#gqhmlhW$jLrFguHV9`B6O|LS^gjK&ai>&@%vVRc)#z5u|57&4 zuIc*nLus3|zuST2sqZg%Nh&$|F7o4}@Y^^wHA?h#O65$tvg6{kKf-d+=UM*lGG*OW zah@$hUeXX-9P>SV6gMx!s;OwgiCY!qQYq~6+Oygwznz+qYNwu~oqD-I3pFSuccgbz zNq8}CN0lERP;XRH`cZ?m51dk|bnr#oQ)@~I%nQ>y$Mm3+R2m*XBdB%8Rp@6N#&I}p zd$sV@xIDfb{>YnE9$vEcvPE3W+R_JV7@ixaOEdb7E$KHNOG!Q#4#nhMD&`_;fy(DL zq|$DaMPFlKCfPHD6jS~wzG`#!#c#RI+UX{78B`nGGEC-)iwD`RN-O_u!)>=1gAjiHGyD~ce;#SzLb{va)y%(Q`n#Hg zSBUW{yq9!C*1E8z;fL5br9tYujs-u6Sx9|%J>yr8(G?e7kr^J1Q>&-=^_`Vs{22SL zJnV?PzPgf)Rj|R0zZX0w&-lF`!b(0Io5yW!c;Z)3l2W=XW{~#l!?eGx^kC!)IpX+Q zuj|s@wbGT9fYQ1#>C3d=ZL-&GvcK)Y!FAiipf?j4(i5bw?*f-DL-@m7|4Dunz8>*V z7~BHA#P8oii9V&{F8ns^V6TR?tc`~B`$^mv{$2Ot(|Ho-rO+zq9q3Oe2|s!+4C+AX z=aaDY+l7UGTh4u#chI~1>~&evQ6YVy0%5@$jP0R5Fv)pJHj|EdrZh=KWA=DuiB(an~+W$=+`Sa7N!~S@+vUo{0D_*@! zdh4op@aHI>BIWshg{D!vN`P`YDHW>2im&SH>^Yua(q1iu`Y!r*rIga=Kl;CaZ~fn2 zwf{$J($u&AkxE7o+ry{Zf8jZ_bSH3blHym{$e~;x%eg@cSAQXglBD_3+9_P+C5Lf_ z+NWwMTyje7ury$Yrf`+V9N7eNu9(6##?4_ag6Ybjd$VV8~$Il&;Q+gmD*vo*~z~1`Fk{#dLI2%OqDs; zNl`PdTc_xBuGM}?=bxO_X7>kAXk^TzyzJRT`5`GTdn>hEUYgdT1ZaoO7L+u}-Q$9u z^k$VB3Flw&<&U~r+ddqm5&5b#)K!+15?$3uwSn@Wsghlm7Nr_(Lw=i>7qq$Ck0Yxi zC0kk^>FI1MwW>Y!h^cChu8$zD`Qz&ogU&pwlIza*Uh?>SH# zb%K>FahOIZ4vSVcj&pt9Cz&ITCghCjm)=p`YOJnmS=~~cE1KRwl0w`K$xlfiT^~uV zYQEt=`oI6^|Nf)@`&aaTk5Y4j1C0MCFppXg_xpS-9ZoeX!0-3}?Ea(p^Fl^%kp8lZ z983fL;)BMo5nU6t&*+g2Pxm8)Yj^R=@DGc_p=Alx-j)f97by$=MJgP%pJikGx|pAl zV5s(x--;B4zr;h_0F2?tIe)wG2*zotF58&^W`d*qd zT2YVRUS8>}dzYp0KX#4L+wdp2zE}OCgJS%9!q0=BmbjSuQ3nOPquub={mF;JNIFaS z82aw7fVTk8qe(m{2%CA_uW$R}d(W@%)qlG>=IanX4#s~GexI0AOySZSUCsQ%XwDtMlXU28xc7g1 zUJ5_OaPKd7YzjZsaPMDtW(x0OxaRAyQ%vEf89p``%XwQ0?`pW__Ru(|@Y4++Z~LJB zn8Gz)zuIO2DNn!T$Nvn&C$d8-S(3ufH2gaDT@QlRDZIPkli0Zp9d-)uVYud6@ZlEY zSPf+fzZE}gEYAs+38%baxzx<#+9f^+-U1JDtvob2i~E@||F3a4*c}$@W%x|9KWq7` zkH7HVhTn$&1J>fFaE9FG4{a9b$5Qy&hR?>+8}jM5{BSfjn#oM??VL|Y;e8FC!z>&g zXoMe`NBmv(0K*qEpHmPYWcXZs-mo7`DxAL=?)P^s`+NR-Rqki9!`)iWeZggir|^du zuH6^0GZTM|4>f$N?PDDLVf>-^hZ+7HzIxDOrf`+-naoMN&-q$#!ZH4f4gZN*iGsMw z{Y-rM{J{B%6#wOh=P=h$5LbPe$-Gq-_@AlwjxoGaSRMStf8@tg<$ETcE9!t>>v8+u zafa7pJ~Ie@0@nbM@5&i(_;J_-(Bu2lr<>%@1jFV31>IMScc#1vUlep;Zk&7(PI>D{ zdGomZz+lG=9_0G+rt-Zw=HC&AgN0f#mG8yO{+$Y|w3K=93s?DG%#3~)aI<)e@yUkE z=a2RQ&F8Zrg6Qpr`Qc16Tt0-blNL^SAU@eQ8!n5F zg7^%>yED_qynZU2TMQo-4g>!PT;)yS%ryK`X6qSKxcu-{PZkGPhSz|P0f#>nzv{!{ zV4T@cuS(%_4WER)LlAuB!!drRb~gD#9#c+82&KU76tjAHGC;HP}pt6-+LkaFBtv_RvDDTRQz88e<1L9 z!ap4TR}J4Aeq4zEb?{}Zmk^#ESw31jyW8*|ur;DQr|@?S51d}v+T)?(zsK+*t|WLL zaFtKtdkrt=4vKN5zwi$YFM}NkYm!s^9~*wC)7}lj6aG&Oujs0PPe}29X87^$#28Qb zzcBo0cP#krDgLhvZ|^$Bc*6gU;jLX;@MWp@N}etYy1Jf)@ShFu?7DzInF{|`!+W{2 z!Cy<^lGn?EzOFy`S1J4-h7WXu!J{Ji=@yXg%Yq?pD0sCL?hL=!jf(Lk{!#!g3x>Io z;4M=8MGYV0u8r}8zqsL-yDPyv!Jpuz3?Jtvf)7gJWelI>ZUDbJg=0#_d#AeT;J2l4 z%%i|>cDH~(n8MW#EejU8rQlm)d+A2K;132K-xKpsgTI>L_qc`d z{|TP(*8qPg@OZ*M9sat8-{I~q#9tr$;lSeu7xn3IGyF#w{*2oJ|54yU9G@oO%Y%G8 zNw*e;Kk2r{{0V-n;mh1|@Q!i#w-SDy;rpa$3C>G}-v<1Vz~c%3ZSbFL_$%%s!b$UY z0$&k$JmH@WzuK)8!SilcA%3+_D^qw9&mM-aaGT)2CXT1-X>Y@;Wa<#lG=7fZE>j8o zmK6WFhS$p+556dc4=}t{rYrb{6h6f8k(p}>;cDkr27NNa3*i?T-YwG$d}k`0OAQ~J znGC)!#_uKmmm5AMa|?K}VtibjkE6j?1s=}@S2`?!e~jVxW*&zB_!Pg|(MN-PJW02) zhR@901An(ToJE8)(eUk=z2L)A;Y@C{fQ zoE0!X0IvS$TKbEAjNW-@kB4DxTZm-xl*9qHu`kR_qvr??78!k8ljHgk1kKh;cs;(-MB! zXKZ79A=TFo*1^<<|Lhdb^gg)XpK@#pX9^$O?`OFn|GmYYGhDOCv`4~82jY|cqTvl0 z%dj5OaEoWoONMJ6oA%Csm)S||G`tMDFxsC-xykkOGwLtyK*&?A87(BX6Nz1fY$0SD zkp(5T6SAA2M5+`hg_+rPSTyF_STNfZ$bLfeHRS?kT{tH;6jiup7goN;F{9;}7k5~U zI3nYi-|*{?YH+Rz)q-k6b)dRXJt)17s1f&#A+!O^MEkWreL0^C^@Hejt0#?zKZh2` zVdv?vfOS}VI&3i=IvR&$hZU%^QQ26|=5s2g+!bSBgt>H+nH&VqVDy`etP+0Z#qN2otE5E=>%gKmJPLN`J; zLAO9Np;^#;=sxIvXbEvy$9V(v81y)V1PwNF-V8knZGoPGkYvmNIn`wBlpXfYj@2ek zH4iIaM~!h^V{foLH9zhLf=E> ze++{*P(NrUr1!r>$NDL**CDf~Rrk+{w-`ED{eA@JbJ#;-Qhcv@-52t^f&fjreINthBecxZj z`v~-Tw?hg~abC;yyO8_cV|re{oy2_-=ZW!e2g07_w}s8we+1Gyf8gHz!MZxAB_!<1 z5(R%7T?oH{`;{@alk?h-C_|ioD})VY0Iu-Fvn0M2-|qN2`KBZepD?h?LLZjILEqbw z`*zTz6T+Ztq2I3HUhhucqwr>fCGlI$wXj#>bK(0hV!S*xR(yr;_5P#yP0~lLM{=)k zkrdH0$ysGV_mZ$WOA6@x*;E-e8sJy`{&uqYm(U@;<%)F@E0- z{R$=VIUc2s;*z9eU+%ArF~v{!$#XLffR{wCk$j7I2gLV!Z<0rIz!pIIHtAW!zn=5f z7<)d((s9@g_Hq1s5ytv@CLK5ZULIUwCch`oC+EWPSAHDAGmYc$lKfFUkj&W){wt)o zS7JPw$fI=nD9q$J<*R7v}8)J|*UVj{awd=H8y<4OUl`3OgL*txukcu3r%lGx?%EEi6{f zTP4hPbKQLR;+3)%A*b9!?qRpWt#KRNlkO?E&24utxSj4*_qN;PK5;*}-<-=70_j26V=_-`1&h!ecgUQaX_M_OFwaIR^$!NngFP=e zC44=4BO1>Tf=+ud&TXbm)jJx|+b^G~kU1uEY-U6>IvO9{9NiH)VsH?@UWoVVELXwR zboJaumy^lKl*=^9G|jZk^ssNeB)WnxxGB0lYC!rcRu8a_=_@=Y92O3}BA}l}31gqV z!&t>qGpx<(s;1$#@Y(Qr4y`&Y&e1B9muZ_(yp^s>*)utM*wK?TJ~uNca{(!F5vhDx z<_eC{q{<_im6_EXN}Z=OJ2KB_UgA(X?a7=NwTn8Cx~E2`M`uR;qdn2y=#%KP==12? z==D;%g>HQ=&`blG53o>bkm1QJ5*!)`F z$DQO(b|c)SZi1Wa7Pvzx<6TJqD>4%@(=)ec7G)kKrC%g{zvB2hQ#3k=<6y#WL5aM8 zbp1T~oix2E{;EmtET$k-BDLCcc5r(5I=`qEPRUHoRHIHPzK>?sWY%Xkkb_SW_Rh>J znODibw=;W6`qhG(&z-@D=DFZvH^$vVnJ&pw&rrVJupJpn;D=jlq{i%D1uN^h`a!2= zK9!yc#)MPi_g+p2B}pd)RPagW)6B1#EYdeO>I9~E&5ssEyBOvxoz_IRtn*i&N98FQ z`i?ik_gIzoX;_}Rs{66Q_@EnWq<2xDR37Rw+Pi{PRa2r}l#s(fT46Iigz@5qj14b~ z%RxP6412Q@dT_YGJ?11$j-)pAiiSlakObF8W2t>lqSYx+tf}N0RfZ+Q$J`TE_sUWC zj*9D@WK8d<569V**~!t3(VR#<;j%pSspV2qma;9cl5%u>Q(2H`UFM5;I|*4keMHzR zEbUgiFIdXjF_WRmp zexRk>1&oumJK9*r#uF(C*9Q-?-tq15J!G&{HD*BQdg+`%z7b0^2$nZ=nU97{6~a6Fi441X>>-%=BGd~Y@S zSF6*1W~i9_scu)IcIv2N^*h&UcrEIx4%PJ4ly$}YP~_#&ytf3`^BK1@p-RiGqCXh7`RBiMfN4pB|kIf_YbjhUyAxi4jQS&e<2I{RkkUF7a3 zOfM?dTbY?{daMuOsp#TZ`h4n|A`@Ej`$FbD%eX98(N#wF)N~D9W4DZB1$nTImiJX_ zb=Bs&Ocgs$u`lS88A3~Y5yyDs(v2pW<{+CEn{;~IMKd`lUeb^FiXRYr$)YoCu<*WEr&-ZXQyW>b-)rmY>rBkA|Tq$+) zEn`at6Orb{!Mse|8q34?GFxJK^M>2)-sNbE1Xrj>yW`z`e3#x|#;j3mQm3Q|ZADuz zPa1=Gza-PTa3d@HRoW-UF&gGBb~lp4iqR{qw=NncYgDs?VZHtS7Msy%$Q!~ob`icD zPXc4`C7@LzIXt7*bf2}RpHu(7r}q8M;b>1w(w>&1J^kWgpLS}eZd~ra_TbGNg@CWC1Hze7hl=omoNGaM&sz(pq+~X|&pNy%Cj(drWFw zW?1_o>##!z;T&qiDdAG{UZPsQjk)f(NwPOgYDi{CVn|*{T1Zw%QZyoE^kuR!`N{l! z6HT%m3cn_!i~Rvq;GnlzmCj zshOKH_aP;A(8}$il`BQPuNF0oF5_#}A{|PusYSV+Hl;`0*LWh5238@J;rDk5wK~_D zyMHzIHL;f#>4WeSTBXmzneH}@JLuQWb@$M>o$sEZE^TwqQ=eXNuejGZ_PI|vzH?6? z7kwY5iM3K)gL5fWO8=>@Zk!Waqea9`*o^(_vq}bs7HL8mpu>;vL#@O{8gs~Z$Zc*m z$9(z@>OF7gZM!+%=6zqfuXyK=96!7?7u95d*H%t7YfZMA(Vl2&!Q2Yqd|fBop;T|_xiY}W+KsjIrWD)UX;Mhyur zB7c?6zl3Mdzu)ODKrXyVHLMA?3SS(LQAeJnmT2Ai5A=)XT8ps6MgtlNjH1V>*yTlM z(4QPkk4G)U0**x-%cB+1s_0irr*dlzlJZyHr`jxu`ygzg$M+geLR|)F;q*p%&mv@jd7p85P_d-4Z>(dllcu-5I3R z4{`b0kQqgbESXxKkglNrqA|prNd76*%4*%2dIqhnM{ovh|8jC@3nlIy^H`yj9)ktJ zL42t~QGa#;ZHQWse$lEp{r9-{8N2=NG~QYgEscHv*OT{B8}A~46|Y|IGi2E{ly=Fc z3+QWHN1yYIa2)=8hPlh#KjOME#I@q-+VG^?*}}44W2MUOFdHv5c1O9Qq@Ko0P3gHE zMY?t1(0ASu&80`RE4n}Kb3PWG7uWlh(Z_KtXA(TZ0ef4DM=c8U4qXY%^FK?9fYLwsURJVJS9~Fy%V{- z1ev^<{?|5>H@mH8uf4<^{(?$!ltQCY4ZkeMQE#s1C~Bouqcj~y5o5IlO`^GRPCgfY zfvNdh?gw{qbX{~`w3`@6CbVYOTk>0a9E~Hr9R9GG_kT2n*~XdF`L)zr?O3Q?B!`7s zJ6w}z<;N=BcK%4)*_F~a4n4wD>Ri%}O2f925wEmsYEQ?~#`|2GLcT4GK8*9?E4LsX zLu?E#4X1-rJQ?w9rYHIgJ7?{*vA_0c)Q*fU%!G*!;4t(`IxeH9Iwo9$+&zhrYM1T4 zeo>2~F4Qljco#-b{b}PSgg4?HNj`nl7pg#OHrg~_xs+$sXSD-ogxhFS8*!)pj(R(v z#eJQmr=xz3`ZzzvJ)2sLQO@7rr%8G>$#_L$6W?>`X`^@bTx91UdDAk;qaK_QY>VUR zb&P!&@f1bR(hUyfXB2d!fat15FoXIp3Db%(Njch`Luq&Fpr>m>yR(%qRuA;wU#B=k z#^AaC?EhoXTD~$j57|gQ!-5Wm@egY&4VTPK*7JD0@OqwRq|JNqPl&@QLO5zkngtqR zQX5m@C>5K>_&qUyG59qmXdXQ6o-4#(0lY=))f-oYCMUmiTj215OB5&~w1vSa`1VI4(tGu4 z7<(gyPkgZ2Xy);o+)d!sQ}HH<-{9kuOMHZP4*I)Gz?1YjjQDtbkQ)SE zBo&|b@ShU%w97nUhm z!n+66Tr>DZV*dK# zCqB)1?^wgV-T7JIijVLKhI>2m@!*ONc+Nz_tGcR$zgT##elE&CnZj*V_@vLV z#K+^m((^;#o{G<8`1{5DUy7gjVBM2F)$l*8v90)okB{)140q@tgP=9I;sc&@v*DWi z!4JLgT-ASZhq>$_ka(M@r1u4 z{P!8Y8f`*B{zc&D1s+fMJHx-!@MYo3Li`Vb4+%V8D~=BqP~jtn--gG-g5jh5Kojrr zgda<(kj@MEG*d_(#V4w~L?r!ip<Va;D?lXesIO-EaKzw-i$Y~S5C!eC;X#g{uSaUK4HeiDf}zL zPYCnC2ZJkp;LrKmaPNoy$`t;M;eP$w--VNI7m{v27%tC_L2z2?dw&KW7kK<$<5&4} zS;Dc940GXM0j_i#M!I=C!oMo=E)~wN@K25Ti*51gfHh#T-wZE~FIL*o6#l#68g
2MmX6a_fy&Ln4v^43S8+XJTklzvu*|PVuqKub&NCMSGvKUqj*fk zhwx#X7pCwMh98c1NOXk4Nw?8_Piez{W7lB%m8tJ73qFm}xbSC;U)nR5CH!W5(kh*H zgDc&xB;7o&z0uJ}q{3mqf#s>^Z}pV_-Yfa8@`itg?^0%?!1cYtD;h3uw?Qx-T;Bzr zQ_1k3(6tA_JmJKD9PwAW{2ec-?}HzndT&+m88N=p_%%LrS;B8))#+RCKMt<=k0<^f z-+_%4dYn`^O0QWl{}19Pzs3{K>W06-_!9pv7I&$aSbT=?zSe?AR92wd@*Onf}PDcA)5^J>qp@k?DU=fwQu;n#by_RVf!xMpBT zAMk+ir(;Jhd@i=Q8^9k1SNPKi-{X&Bor{fHD*Q(9-x>4oio>5q_)QF7gC#cp^yBbn z5Weuc&0--x{F@2i<4ds=X55hq|0ww9#r#?%sQBMZ_(vNq|KH>zc#x}na>a$u$0m6p zcoP3x3E$)M2#b++D*R*Mzc=PTA`bsn!au=q&4|)pj>Dfr_`(-p!+S?6{Mm%>alcOc znN;{E!oM))KQ|74HsPOS_$=}Uc^rp-7vT$EM2_B^3V$x)dwdEqi2g<@{C4m!j`?qh z!=Fp|9Sxs`#WCp@hd-b2g)e1>`npv3^9bMLejWb$RQR3Ye<0>x7KcBN@J};b^X9CF ziNnX@ySVTNu~WY?75;sM@9|5`zrcg3@K1;Tp_u=TIQ;tvzq{ey@4(M-_)7?1_;PwW zBU0fnB7Bc~KL`s_;rE39k(j^eGrs&_m7d+laP8@dJ`6m_HM_~;!dIdt90cA7T;=}( z!uPoM6LD86{Bz)674vtB!+(JA`x)L(GvC3$IQ&P5zwp(JBzl35jKhDJ@I8J8+8N4m zD*OTPuZj6*#Nj_o_=64aPTzp|#o=Q)UtIV)MyOp<;jbiokIVNU^*j~+5ct=}{A=Uz zR}%h(hD&eCcp(md9pMXq4Btg3rNUoB_#XHBgHK3>KOFwYWB$Ey_-hFNV#80QPtM;q zZgR!viVNR}%|BvrfBI}7e2@G6g04=5e<}Q%V*XNuBl)m_@UJi&e@lc@BMyHv;R}C~ zk*f3uN&0Uje2@EeFIS|(zY_i}F@K{t{EdWvjp6mstp-8cID9Pgiwl1mO+j_=6I0=g z2Y)8U&xb!RSK+dr-|)lDFX_E0e4^pG0c^oLDf~Las|D4-v!CS#hG%)N@MoD}t_WT- z_1?+g+he>D{CV)RYM|H+hWmZ1dZq9whWm9#e=v6tkn;b<791C19NPw%4? zZ4>%1zpkbV=UfPlfUS>VJHd_lrFT~cj(3-1-wskACT(sVPoeEOg)}+kmtTiY|4YP=*_SxDJO0li2*vy$6 zQ|h7fOs^A?uHLUH%I2H{p#ft)!TV)Bm~%y_99U(}>GeWrf^5A|HSp?C4G3+Ctrx1z zxh_;6Y6#yEoSQ&RAz65%H9!;SD6#qLS{S)gcM9$`#OOI_4R#XL7HS9OLG7WFp-#{# zP#35xyk~Ik4)uVvcBLCwFV5+8D~vFh6%K>`oCiXKpua(bq4S_2(D~2>P(NrWyu&$< zgf4qC8D+T>ycrZvL$W&_sCznr@|Alj*YluF2l(xMu;MRcDBRQ*{CD+$*|2lNitNwTKKfv`n&>^q!JTwy0^?T4kuZO`@=w@goB!1PC zzY2dFJT>2dAJRL;|0~z^-((+VXd1L3zHamu=?E$OH#z?SiT~i;`EgI;orI;|w7y4S zD&DoZ*Yo2z-wrK>#Jj%GIr&Y`ZsWJ_phMpFyh5q7r#uC!x?xVTFhG>C(Jj) zQDPeImVvNW289%2@)`g~T#YFDZ?jAy>VDnWK0mDus4Wq1tUrcUR}uVN)jV$Ri%+(kR_NL)c;nBSNWV29^zpK+pla+*8lTbfqzvMsg^;6E3 zcXgQ`KgJ#BT9ZB^zR5d^I=g+fHBy%AtPr!T-Bl(tdz12d|R0-vwpaS5WDv9nEBo zbq+f}4PaNZOWDOvIX8)z-Av5p5VQM+6)#3*B(b)meD7QO;^itnce) z+8bTn9UM$*=^I|;oo`}g{2e*k9!#Y>i_)UqVUFSbvIWzewNmyz(tanYeIWn6@3}|& zN!z6v;DfPcY&)joy-VLPBb-GFYbUI^9QWDYhWe(( z;X_ynCv|fzmMlr#+?uMJvbRm@<{svsK4vfNZ`lX?S4xy){;D){cIB`)tLmyTn^>3f zew34axXM^7%8AOEY@$@wy13J=yq!gfQ<>|}{O@`0LS|_%V`lnlQgpJL#+>;KH;b9= zdzj5%WLEL3DUB+RkGoA)CZ9$Es9egDMrBjB;VPdR(N-XRs#2GlGGBi(ql@$D^< zY$iSJrHrsX4lW|@wRqnGcN+Z4jl)5|rc4}8iD*n+lIB%;_^#>RbyX|Ws9RUH1L@Cn zb*pJIb+s{A!xNRb+J|+_x74(VlqruLWL0Y05v0fv%FD&nu8Dl%EtHu%sbR81)ZC)V z$SYa8W z^tGqP{_n|)zoTm$|K4%@uh<{!d-un6V;skq;<&vP$4#1*GQ_PsqvcJsF%fNs%5!hh zG>de&$!YFbaz-BER6{#e^JS(4mT-IBhwdmsPzzp#I&onvRhFfs#Ojok*piYGyHZkO zAYrJi=F*aVV{vFnt8{uOy_-t&@unfx)eSb+ulSTDe@{k2$QD8OHIXEz(=y3cMfGDe zIk$<{NVR+y%1P9ow4g6iL-){Her~N~8I$RCX$RE;cMCP&rLZ!znzd*tW$&T4_StVu z{vrOhq>U9i#OzSSKMqOnw?2o*txw1B zd~n76EZRZska{U`@5a5}kZ*5SDv;(~*fqg_^nc9$n}3!6bN$~7UQhZ@`+vPZnxrmZ z7wG+epY;iOkef&U%7x0cAb8vS#vNz4a?CX;1scZqe0s`+WBY{(FBME?B@FYPaX3W@ zM|OUtf}QRy@IzDKsE1uT#-EM(i^G42;m;x+*_9;4e>ixVz~jHg{3YS9Y4~Q=HAJ*S=paOL(oIqS@iy6vrQJ zZ<7JwwPRc(B+|k1UHD1l%p}6^K{$E2+QY#W8)*0;?hx>cg&&zm&yx8Y!`r%cF-|z* zZ!!d&y-@e#;s?(jYIq&`B>CY8A8xo>?SlA4hF5jD;8Xm2!)owfVz_!tL9j9YUcGk| zc)P&kU&j13;J@7P=Cow2K>l3m>Eo%Y(?0NcZ*bxnDn4Tj_x?W9__c<2GJl_!#{6~Q zA8+^xt_|UfKM8*#c!$8_w|Ra`he?Ke|DX?nYraSCoosktcRt~4OW{)tA4=~q2tM$* zg`-}6hhU`HP5zV$f4bqL=o3&szVP{_@c(Z380^lOPXecFr*Lv+7(S7HC!;pux!R$_ z6&KzSyE^%8ot-K_w}N+y@y>Dh%mif5GF-hd?4S(yexPR?UIE){?2O~^nI*^)eok;> zSQNY>IvveZ9>qMC$8Ta}f?Z%*%sQe(bwe8U9YV2Yho1 zUv0SdQ>PV3g|pW1eXQj}CkNgp4rjgL>RBU4zTzK(neQzwd_eF=m?6KKgXbNo`sQ+E zXE7l7lU?sA|0(=2!vn_=j7#CNpBoT_EYU!>p2D9n-0_F*7hL6&_vUOgJYqycFC~R< zGF)r7X~({XKUem)-rnxQpg%kR=9jBeC|BaY5D(mgz>i9mt1aNeV*cuclSeqrJ{5b) z@bg#&!I(XTZ#CT8v0anGWzRA!(4Ob4#t=?=5>EEBh7V-~PW|;bZH3F;VfaY)nx{Sa z#`q0?!EosqShbMCcN#v9v3o)MWy95%9(!}HKs6y*O6d}QG9 zgrA-f>r;f+F@Nys@QZ_A6ysID<%an8hrf*BhlMpc7f;1Mhx?1M0~6jp<{t=uCBrM2 z-BddKs^FId9v>d_Gh=AaUxMCJ;idWOa(`)z%Ws?F!^|R@HR0a|if@|#DDFqa`0|*a z8Avp6!arqo4&^zOp2vY-7UMf({-N-PUy&RXykzv|VM zG2SQUzXbjZ4WG{}WI_Is;8!u;7oLRA%&YmazY43Od4>3|hJQ?qUmb^kIsCFe7=x9N z+MjW$_*@Tub&M~J`A5Tlli}Bymh9{l|E=KHFqf-#bw|v975sAzAH~cr9y(I|^T4kq zCxs{cSHr)^@P3r7g8UDFk3}~k{L47}YvEsRcu(3w>R&2+28+QsG|R%XzUPMg8VCP+ z!@FQxTrm76z{ev2g*S}(C&0heaCRgs#J>%E0va9RZDW3Bvcne*Z-B<9VEDVhC!+Zl zes0XqjJLI06KN#sDx6gOUx)v?7#|b!-vB>TMc~NT1D1Fg`0`vfGS*?%Cp%q{^5WA+G00<>e^zJOY2 zHVD)f%9FP{prr1%IiQp%=l9zhkm_b*a0usINOl^vp~MzLK0%vt-vT-sY6%?!9Sa=? z$!_HYs1@Ye*w8Cba(Sh^H5W8|IV&g20??NA&~4cE`)|dvdNG=#-)(#Fs^`PZ!reC1{w>EhbBUkpvmTI?d{L7Bl`#$ zN}F(H{VZC4{=zJ zfhmrP+rJB6MaI)gyCiOf<5l?gWPVk1k-9#D=TD8pSRQ$72=|j>Y#!(J@%1jwvH{R@ z@{^}?@=W@E4}3`&x=zB-^?}}}XIBs(otOQ^S$UVde@-0tWX}CZ!u?_#@nL>B`96g+ z>?ePp`INbFNWXRAto^8yZy3mZ;`30~39qgdADt6FqiIaPT@&*p=bPiWC;kM5C#2tI zbH57GyH$=9f901b$q$wHm*IH_(mQlc;#ZWhauS#1cRgFUT>nq&R71i&>J!G4oRhev z>!IRV_#KnrZS@`Nta$FGzj&_jGm6*d_?ch-#b-9fbuTR&3Wqy{F}31<8Rx?BpSIV> zeM?zv89wqdCyDpEm|x$Qd~e~fllWF)Tv|Bng!eP@OtS2n6pv(>e%E_P@ZI`d@4Y+b z(K{0!<#`f@-uHH)aFoaYJ2FXrD0hF&7>cxMz_sF^$O*}?-rxB0S2*l4-}-zVb%19M z6qoTa|MLgn|EqWWD>7B_Ps-+Dj3*1nKdC?I_@~Qd{{uX8p!g?wyyaiuFDy?l{{Wo= zW5pIwYv>e6>D`;N;(HC{Pi1fh_l0?rayYLLZ{av5@%tg>OY%_V>vYC*iA+{{oX!1Z zP$J`mDIOE(!(C4~%5eUJ8Omc(Ebr<9g_TB9m{bXV~5M}+AxtZ?1RiiYc5*bFcl%Bvso*#gH=xF zgd=%lF%a1YJcOr(E%+!4oqWRR-OGcu5Bn!hr_ZzzKbxn88bv9_JMm=orH$Fja`yvk zkt#CdUITv-ZJB30Jv=*nn)%~5+y`zn?@(y_LTOARt|~Jhyc};4n^y+*y@ME6yieRp z@!Jusb#3aJyB1C}kS8$5Ep6!hl0J;8rXAM%?+&Ih%PU>9#nkLe%7Nd5J;ADQHS=-V z_Z@%%&kgUslXTX;m{oTc8)JOrjrKpQZ|oc3CBu~ z$2s0^?{nn!P&ymsXRlCRcc_H)#V2ClTb_~stzqJGXOel@QBB#1XOJDiDpGABDm*>; zaiH;)YN^Ij(m@FQJh+LHqS=|{#6o@vd_E`_?um0jd9aGuC=Z^tL!Q%AN8aT4fZ5>> zUE+IZL7-U&l)6DlR|zYJ>gGdLHKP?rJC05q@+~R`laqjQLi_|98et!Ya_t=Ycs^-72Wbm1jZ&-!5DZHSK zzp5NeiRJ0H;j<{3^^RH8$|uPC4_!%Az(Qo>a11GWtScYOk0IfbI7T&)U-E4*%E^C^ zq~vCNl~rYxe|=<;d@+qd`iyn*C9AMnU=QVx{!fOx_&V7e$g|B}(pGc%-%|!k$7LXw zGN9cjwbE8;-VvMzI;XZ7hoRfY?WvLMoQnoRDkVjXT z44g@wQmtO%G2$rpb>-TWLW@B`moCd{_>s2VL&L$rqN@GT^p zz23A-qez+c%=JGRK1D5jj$C++I`}>{u*h9L!~u-1FGo+OGWmDxY!q*;1zc*e--=y- zeL_7cPBYnv$q&&&EL|RUkGOSsTaiD+_XxAd4sXwS2eslc-nj|Op)J@Kd?=;6TM(D8 zZ02|BQA(x3QrYPhyhf?ecV-js+{!-nI?`s0aoNs;8d^di@>_#_!QJf>|VXLI5mNu}OdFFmQ z(c;0UPTo@W`>|*;9%V&t(eU_CGvIpXb4Vlvj)jzO6ImkofM;ZvBRN@z{zD6sk&=&n zt;UaX6RCkJt-fa0q@Ji=A49LH2>l{y-V}Z16rVK&_3Npc~`xZ%sVv5CG5lp=P%)(D}4QL zLwWlU8@YC&^vDYHnP5m9>l~i>Je0m(c(w3kt`y(%!$bC4sFeslck-P%8r+ux^*4M; zP{~R6H++duZ^M@gm8x`aBfoS!NPCtpA+J(K-k`4S-d|GG?yA+N+eq&-UGHj8_tYP3 zW|p(Z(#mwOo?$QQ;5l{-rH}fKm9(ViqSBW1Tapr|TB<`e)gQ0MZRVc1)%?)?otk?j zU*3RkZ-m}gJ(_;jqZ!3FUJ>_ZZbHfz?9HV6GE=N4GQ)ZzbF3$FpY=o@w4TTsO8Eb6hA-oi(@{L^&N{&&%TRPTsQsiNA_=MBeMR6YG|Yb`t4+ z7bR#B^6C-f)du8MBHK0FqBdtPeOQ&~?ScA+njGdpMTF{fne`@lJCuhb4LY zl8#CRS+2K^Q?V~8qnh1>Ud?&*+7|__c#ryl@{7>}$*{`(eSQ``!u9gu|l zke-D45=pP)dwgmqUORsZ{g^e;-D%vI=-WaA^vU3~$P~j*-Rl`TUY8bp!9; z>zou$^#*Td{>E0Oa7i}&oznBcA5RL`Xr(TG%Z>)G_CkL6Y7gqN&g2;Ie&Di$A)eXl z!PO14vVfkP_+z}R;dxll2f=$Oyu9J3(2pyKtBtH1bYKjIt@Dfd;a4>LOxq8-O$w)r z3%|GPy3pfDK9_x{;eFAw1i>9CToSf!pw$hm_DSK@4L{!v1OGXNYn)Iw7{S<&e0#~; zjVb)PhF{8P5PPW<-oWtDjH{TpP2r6UzlN0*=!#SL5r$86*Msi?C*3Um43c>7&E|J7 zjjLeQ4Q`;1O&@<}KEH}m-QX^FZz22`!)M{|l=dgZf4t%Mn?2=laM{D@yG}IxL0Umt zycB;M!&kB!2Ug4}{&t2xf&bKkI86%iS&L^?`T;5a&W1mQ4L`p#xm~=aFF&Umu9YL` zK~wl?hQGv^61xIThPSkOk<-=iSIuAMq7;6*;qocZ+)E1AIHGRwx_ce`58=7$^SLbH zrv?MUn&5}LOnOp(>rsC_KFI8fzTfWoRe!s~-zDbP`q4bXVTQU`55tGyfi?)brtqGI z4>voc1u6V2!$)A#O}$Iuy$m0T{vrrkW1N|5)&D z=Fb`(O3cs9z4|;eeVcoFOLHI3(?+6jWK|^rK8R54X z{syC|g7|F1Ut)zBe%(_1cNo5pUS~lZ^&Ihe&+Hw?r}*a?{!RE3{L51Dxz}*5t_p(J zQv3@I{}Zha{b!6;lK3w+yre5z2!FtEt?DBFDgK8H&o(>Sp5T%*`rhS+S2DZmF)5q@ z4e|GO&-Z~#&cL6;FdbZ4RODLLfo*U+Z zzZuJu-pCUMLyR^(zh*fI$NB@phcUu92mTtny&UL?oIxQ5uJJMDF@>);yk=Mvd_oG} zV7S(#vc@xoKW2Dc^tjBy2uD5;e)cBA8<>4vgSUM-5x&LnCg}Uno~Q7whHHe5y=)5K zX1L~a3gX)h?--r}z5#wmz9{_X3_lY+BARk=r9Zg&QyhlYy%*3yDx@*~g7JI5iEV`E z=7m_agu4vS4l4uIQX$A?{*H8hoy*~jGlicQ^JD!I?l!y#t9Mb4rTF)Nk3h#Ge46nq z-CdUOvGNN7{wTQG3%r^%^Y{|h2I5C4mA@ZxKQ89~S>e@N+MF0~;3wc)E- zGfjH}zv`X%zcqX_^ELEmQuz0VOZSI9(T8vRKN-F+_@WU0i{Y=a;)(Xohhy>i-SDrN z0U~MkkUo?Lz4sr6|A3a5asaM!B0PX)9P6+3`()#{bjzXh0?x0T*Qaph(>T+P;D1hd zZXP-l*5?>5?JVQoRDP8JA8%S)`ql4?U-vFc_>JgB=D?rS>#^j!$1gGa!nvt%O2I!p z=C4UOd4w~Td@pUdR%Ql4*A!mH@XOI2V_%xWRsN=pO0DZGl|nky`bA8PoG=1;CW{Hk|^pHtQF*?7&t{xgLi zX87%_zh{>Z;iU6)(z%-97f|;|zf}6v0KW;HzwoujFaL@zOZe@9Y<%<6`6klY<86XA z;1{OCkzAV-^S?zndASPL6{~G{JDW2q^Fcmd$8gPfp(#$`l7n;5tEu05g>cfDaAJRl z-k;fWkB7n=8~1DzNvIL4*U-E(kH+_!T6E`si}$=fkh`B>bE%hBs%9 zBM2(^?^Qcn^fbf0ohwp?qX<+KDhA2cwFFcWDg~8>WY1a_%7R$2MheQOm$z+|4Xo^2 zWd~akl6`7rs0t*z(L1IZTkT&N$^9~uA+ga$!>g9byi{OV2Z zw^60#mDD!-Q>2Rd^rAMXgvWNhA-Y~~$2x+uY*{aYWX~%5UfHzD##eT&mqW5`9SvOx zT?LJSu7+q~kf>oWj`IX)B6J-z3A!Gd4BY@tfu=&!AfzHK10H-h&wy@$ZiQw-w?VU@ z+0gCK9Ox$K4*2ilJP*1Dnh)Iz-3Kjz7DD$!i=aDAH@lKP(bJG@1{0D^OAP zl^szY*VjSP>CWIhA9?_KJjTSQXLMfJ*z14g&*x))uT3A~|Kz$4&nw)&#phw16FbMd z4uCxyV>GjDDLsbq{1|8P zkl6aZz;8LU=~porug5vDoz=DCeJ1DRTM{hE|M%ZTU&QZ9*cfa=puC+~fQcXnj3 zAY0LYg(rC~iSJ-KpmPZ?iT7SQs!6$H4m$ff%hp-v%Cw(Jyt{ENOmVo8 z>+MkT4avC(?U-zePvqPWx){0^Qk-t%d}W-Tx?TdUf|9t1|7GYGs4g>1ouN^XuJvA> zlei?R{$mpB>E@ur7MT7EZh4(cNK; zx}6@7;{61(@jnEgai_R8V#d8WBkja?@!U|mi|dy^@TgM7J@0P4$UmpAKi&Otr=J5| zgMZ7dSi8Ly?BSc_AL}RiZ4cGYQo5=CawgX$xULdZqqoqRp2T2sU;-_pw5!SiSqTlp zT1y_1ZsE9_G|)a1>-ci*(3b^I9kcyt$ZGb+%!o8)HF`7iX>ARl6!`b&?c{i!5Pnku5tosz_6+xY_XfwZC zoVfNH-&pnzyB!ZfPw(Gl@0@TjX-z>3WF0ide7EGeh3kANsf86o?@$(gmEah}?hM+) zatK;wd4?KEu2gY{o84Ih?6LG!{+n8m*1MecL{~2PcPI9Gr(n<33;p)%PPTbU(?#Uy zvY@zqt-PHb9BPmAa{O{0?-`Co8rC9V^XT(y6L(PI36M>60HuKf6A@bdRO(N?#*O#2RI^rGd;u8C} zr?7@OI+U%1-r;N5;g;`X;&3)luWHTqacE?oX{_~pfhNtFe$KN3MhSL7M z?Kk^7B`0JRcrnUOd5#K{oy8nWC_%Ebd6ZJLfl?$pn`id#k#~7`ob7+A{FxBQmW^Z! zMu*psN|JPvb9W%+<|E%8HgAJ3hp$k_K8W921}W#?Rs&1!Hh3U9-St4`^+(!WNXgMo zi_@rybK^3 zWWU~C-QIl~Z|-L;!BF12iQ^e$jdo>KnbXKu+5~BCWOX_c|B2buW6iW)L%Mvq)|ZK| zuygMlONHf>u^`kAfK>>gGXGTyJ0TU7i%H8g06W%UNW+4XusXH>G^dfjzVX zshOC&keLgRnhzj1S0Fj%IqnIhr{t6)|Q`|Ecwl(Nm1lU6WXFdv_d0je@5dYWfs~xo(@Z! zr$g2BF_hXo%Aocb*S)Nac)MsII&q-!im2GeJf54mBC zpf96TUuDu{Tr5v!lS8tkl3Y2F@Rb4;2;;I~Uo4Mnh55ek-Zi_of9{D$v@^bU2saUR3ikZ2fhd_(-AeXt43a*K2H$Gks zA5Z@e+~)O!7e|lS2>#p4^AG+anqL4f5mXHs=IzH7P8sl$G2V;!=D{DKkCn_XiA8TU z@mqZKJo_er*TOHo^!h8rPa{gj1^r;Y=WzdC z;S~(`^GdZ-xTI`tY%5oB?v%n0Hr((3b5RPfX!vUSTa^D4u6}ZD^FGOX%M@PO@U`Z* z;*%7v7PL0ARx}Dhh1~pj9%A@QK@`*_1�oe+p2ANwe0%VGA-uKWS_wgYkH4!H{Ot@cWAn2w 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 z zdo||Gj(9cy^3UVl>}Xdb-C&#>jB>}Jvng*){=a>8*&S04jT{=0j!*Y}w2cY2_OJXaUyl!;=QMhj#;6n)GL~)_Df>=(0F@i{3A4gy`!q8u&qU?* zyI-1m>gGVXT4WwzS?Z@?^VUQwaTfZn-~6VL^6#Z&P$|w~PqNyP;J?&QDshjqzprAN zo=fisLeU|z=>AIx(k{(Q2G3m(E z2TFe?ZQ4?vm-<5K-K2$+PEHy+>Fdh32k&6}%lel#QMyI-m(n{*3n`tXG?eN;rM;9c zQ<_cbIi>Y99jMchcuC%(+@k-;XKDZv*;QF?cv3AdE z0*loQ9;-!}zFE5H4rr#`KDro__ZDS(=hgQ|Eg-Z1_I358t6C&ZeXl)NiJ-o7+T! z|I+{JH^o5L39n&1R*Q5-x`y%eTlHzj=2GWtMasUDRz-b-)|F6{)=tO29!CDV@V|7C z!Yb0Lb&dr8&&P+P-_*6l!|OWNJJ+|5i`>knMiGNZEJN&Z^I^ zY#xsTBiUDJiFD5o!BeLwEwG;7N-WcQ^iSXTr77uAb>H&n^;$)O|I(7{{zySC{gl#D zO-ZY+v=r*2!uxqj;HMWFu6cn8+|>L9`>tun1&(7lDgLx82|8j259SdD>$LTBj-$3GJI}YPgU1XH z)@keF;A(5M8bM3`9~$7CbEH6c3^utLufxEL8Ac{OziogA>!NAzl<+)TsqKx2`KKs< z%VP3J3U!@vJUyCE=;E5E7-#-FL#Hx$1;eX)m=UQbTH*pihF%Eu1OVbxvI zuj#k`v)A58g>@`FgYrQoO`o-)+?9_VIERLOR*P${%`esGIvare@4ml=qKh+?^VXT~ zWq0)7O~2GGusT)V%7=6J)!uC7pGeu~^RK^C+26m+(W==KX>Iqbo%5Xk&){k!^n}{d zW|WVrANnjo*)JdW;puTBD8JcjRoSd%&#~eEF;p#)&Zrf0#mh&vUTU4Rwqy_*hsfSu zHmIdk9<`4_sBm>)*Qte7_=o>@xrKlD|EwqA|0e&hITchTXaDbD4TCLzvI_!x{~!MU zAO8Oz{{R0U{=dGA^)mH8*xyQaBDmSBfjwW*>_<0$fd4svV9y8nJFj6kEck@%t88d# zsg$QOeWjv)OYbXUKPk$$r(??+YQbkpYgH0yW3#x{j!|0nT<*Q4cvhc~wWRI~`99@S z7|q~7-_zM?wVUiQCU!49#)#8O)1CQ!+37kjh3sqZ@SLlGDgML%OR4;i*XVzm*Jzd& zt0+_dgMIr}PNdM6!GnGK_L@MAsipa=2#LtTEUV;iR1l3+z|~%~7G4!y?C;=p!~E=u zr)601F%~3tfgfGhxAA$D@p*t3C5qr7v-vrGE42w@!u(A+PH`=@8M>rWL?!a~ zb#R&o@I4ZHfRA->-h%I$s6yg=2Uoow<5f*m1;5_Ga}D1su^0Gy2iIs|j8`pD4g6yV z7hf>OtDdM19-mlxp5nX5cr_9=!0S7BzTq_!HNpEjxH#7_Uadqe@CgpCHgk+uCs7Cd z0tbiQ0I!><3x21A7a3kJQ4f5BgNvsa<26n+2LIZ@#S4t_nk1Tl7a&E<-e-->$9PQ> zO~KncxcG}PUb93q@Z*KUn^c825ic^v>zgJYUafGiqc<+amA@MK`53%sqF1^6 zb-+(>aOLMXg$)cpAkp3VUE#Pr$lo#1xg6fy@V1G4%i-dUPVibJT7#b*o_}qQ!$2JT zn8Z-<72w(PSJ569;@SLl$*-~WIPZwWpmO=UfS(xRFNDX}c@`T!JTa2|UpY8k5BWzY zP5@6#j(7)!*W1(Z6B84`>pS>?hM$s{9^%>i!*nl>b5dd&csD2i!G>R)xIDzO`42IC zPGSN05GTLpGoR=!OI#b`+5CqazBsW2e7ckW2*YnltO)UJ{(**HpSTJ9GV*6}Ts9nk zWnvZhD(5&_-|0l}-o$<2FFN?KhCh&a1pI3UA8Pnxi6_AmCzal};f6n*SP$L=Jo~#N z4Syx^W{79+^BBXQOS}Z$BgpUTd5trCW8$L_C%@qn41YWE9{6bIcPAPCdE%=O&;Bm5 zL9XlL#HZlrI{Bv>zAf=%h-dSkZ1~rSZ^5s2&L6Xc!fy<|i3&vuS~75F5t6wlrt>Aog;HIsG1{8{`4 z!>c6s2ERT$ejkp%-0)7xzToSeZDK0SFB z_`cxX!gk|1!{;Y23GwXxdC~B5lJmg(li%wQw5zWeetGgL@F@=drr}GI*MVQ^;O`oK zLsD~8?g5X4$JuE3)5-PV+noF#8NMmG6+Ar+dpgYjvEkn)zXxyV;GY=&WAbP49^g20 z)&3WKYWR-i4)75U{+Z!BlRLrB5?;&mhay4!%J6t1O})7JHQv-RyQS6FBvI-betD4J z8-aZy`~vTmc$EBifXja{4ErR&m&cc5U~JIfBs|VHYFKimw8{*TJ_N zeoy=!@HZU%C&TZJ-wXbWaLNzoU%1oowehFQ;lCQbCVoHo-ltf5>ns27hCdU37Q8Ds z$1&XVb$?!ozgZ5C82)_xCGgQs{+Qt(#5b42WoXXx-j2TyexZ{;W%#G@FTwA2&PV$- z&hxg!zXgB8$zN#rw)l_WJDvO$4gWR%M>%{?!+(nJ1mFAA((A2ixR=PGoMg+}bjsV_ zhF=}Ok^F9X)4Es}dI8>z<9M~C4UQBDU*WwPTT1?6;3{u3C~pD&dhB%!-L+16t4;pf z!u)3{KgXFtd8=diTd}vuf1`tAVw3;v*xTT*Ie0z8-;KQso^x91arQC%z1Vx;%^bYG z;qS-Z2S3um8yLPZwh{b12XAQj2eA*pZ+GxUhJP6Q5d2NylsC@5u$keX#l9_vw=jHD zY%_RbdT{@hzm?(JVn2en0#|tx-q!G6wXt;>yuIN+#deZ^h?Bpg;mLSD`CYt|;gNV8 ze2$a9i{SF8=d?;3~v>e12QqA^!yJreE;}?88kd{%rR_^l3pyy2I|mw>+@oN~LA`ZC7wXJaq% zTn61qBLc2*-wEI=y#Rkd%zq8_Mfe(Tc5EH_v-M>e^(Da1kDU*Gt5aW2B>#P3{_Pw` z&2Vr(n;-@q;M?NRba_={HM*d*}e z4aA@JWI6fc<5gl+z%P&F&t&|+6!>o=|Ae!g_GF5|Ys6~c|3=~D8+e{u4BjEuH48q& z;H_fqvf#3Z_>xsSRuBAP6OIW#?`;Mj5E}r#ErQQ7_`uje@PpuzXY}1W41Q^BD0q$u z8My4Hy<`oGjRZd{g3mGdsMwX@?Z74HE1Y=-9~-*{d~5_?VDRy=8^JFje{%YK=-qAb z3b6{{Ju>nwvB==5u~hKSe&nG{8vBbJRskzM#bTwwqx`%Kd`p0L_x;-&@h^LtTdaJs zBKY4O;r~a#w+8sg!2c%vKW^}xu{`)c9Pz&z{AJ6>ZwmZBhks0ifIG1y{&TFd44y=2SJ*4K){Nk?hn7mIsoYve@b?V9(q74RXatu%v{ZW)j&?PI%N|-P z_90ZxcSmr|-KE-VaO~5I;IfC7YCnOa-;dz3hn8xu#c>u#1mA0L-%gr4F(bX77~Hq3 zRxX0?Gq`Vutw99;)Zo6|wr&x8zrlSwZ(}3)X9oA}!rd9cWe+XY-h`tch~S?ae6uZn z+!4WL4=vSx2}iw%;9nYii@k+w!AYcxc3>avz&8fh>UtlyD0j-Y*0(%YFstq}{O`yA z5rg~ojTKJl{|E4jX3c(vf5OT0lfe(LqCYeKyTSLePcAcV5oASH#j4!Gcq$y%;BVUE zuP7cj_)c5(Ac`jq{<5(@TrEiNA;QUR@EAMzEvr)`{wX|HV&9|i(Em61FJSOL*mIrP ze<7YLv))(uh#-8$vzWp28GGO}B6tadmuANSa;cBo@?YBEsm7lCa}odYSJ`gsT*mc1 zaJAd=pK9>o?7GITX$03?RAqadgUDrYm9P9)Huz{(o6_!0&IqT9!6!OX0zCA8w!yD+ z)MS*3_^)p8CC>c;9{R6o@I}tOT+fO4uWj&0oyP+_^k3KD4?4@aw!?pj*Eje&=b0>c zBZIGUp5Qtt5`GhdKkGclb$kSGYVa4FEnMeB@MZ>o+1bwZu?U`S@Ey);TwetbZj^c$ohe7<{+$HrKtre^ZX_41U=8HNYk3DE~Vee6RC0*WV)F?QC${^;{nhzuVQ| zzdI+m=A&@J?{+u%8Sa_*7ascWY4Et41H5tszu4e;+%n+l5xlp-Yr5xxUlPIl8N9vQ z34CmT=dztVENzCb8oK8N{;i;W7z}<^fX@m1pNW5U9cS4s-M08&2Oj!oih#Y?J|6nd zgMX=@s@Q36i!A=duT=wlR}g+a{ENS<+I`#s`2QvnzC`1*BY2oUG=bn3xxEAbAwJdM zUEH4F9uL9`5&jH=U**0Do+?j4dS`N5&Gzxoe-Zr8Hu!LNbQb?}z^mIn9{Mka|GN!7 z$h|C!|Ha@nY#(nD#7F$I#Ngk!ar)~he!s!@y9WuUTg3l^22Xlt;D2}oSADBt=k`j0 zPg1&&pB4TJgO~Lxf-jEXs|;S*I|uxU2)@?f^}R;mJ0tj$25;iE0skz(Q%SGta}B$l z*BRWoiH9IRpXIh@fEN=^d@ADq1%r3>F2sL>i2s+sYuP^DIqn z{-n17d@8sTr1y1$Z}c{UFN)xA82owfCGaOA_*(|w>TLu6+JtZV$Gm$C{(<)acBB(re
)_rff=`kT(|4ebp6Uc`UG;QfqU`Y5h`r89e3`rzN0ZsKpk&t>o-w)6^T zgNN}C=+YP?;aalMaoZ-HIje{!S z|JuO+5ITu8!s!OzRy24C&Vj>ja0IVpaIJr3JQBex8@!ZRDgAi_Kg-}{6g{i>tr_80 zF}POSu-_npS2cJ!s~q@*2!6J~%bS(bk4Ern22Zt8@&8@~uWoRy0B8Ns&W!KYFt~5m zx<9!1ob=|YWpJIpOMfB%0bbYOwOQTEcyMM$IQ0zP*sQf~B|Pxoz~JpH&7(%~Mg~96 zY6d%ky!S6Qq7?wo*cQN=9&R0gi5%J&M z;E$op%Zy)WaGhPvc>xjsy$rq{n>n=avogNh$KbMK!d}1#-rwNc82ht_GJ+2>_%3$n zWBW3K4>7nbJurTZ;KK|qTZicXZ_oJdNP~aI$)4mZxb##iuTcg+%8oe3I}u!R(zW)_ zmgY}(MewT(&g_Ye4N&kj7>sc8jxo4wa)J*x_0g=u8)tCezWUqM&1 z44B2N7S=X6tsX+-N(njA6r$yHI4ziy+95Pi7TP7OU^o_9AT(GG+9#};LTFFaW7Eqz z>iH~M9a<6_1re+Ipd^$7$_ZuN!;%7)2g(cOgYrWKpn^~#s4!F%Dh`!^NOitxUJp74Iv1)BHGmpI zjiAO*6X-lB4QdWCgUva#j@1fk4Yh%o73LgJ2U~hrWQ96IU7)T|H>f+*1L_G~2wenS z4E2I~Lzh6zVA8@m>=JRTGEh0FDbx%~ht7vCfZ9Usp+2xhf35?eLC~epU}y+56uJx= z1`UTsKqH~cp;6Ek&}isN=qhLoG!_~MT@Cevt|9#ExZVIwfNq2)LX)7$&=hDYbQ5$l zbPF^Mnhwo?ZiQw-w?VU@+o3z4JE7UoUCC$ zgYJhOfF6V%f*yv@^3y6f%nCT{z;>{j<6yza!PPeRL~r=e${ zXQ9o|^U#aX7HAvvGU2|;btkk7dJTFV+6}z{y$QVq?SbBg-htkQ-ho*d%)&-$$I*5zFo z?=al(s{GS;l&885!0#=P;;<%iuRQ)Jz*B~1+{;h+J6*Fr>-);b_Sf1bf8v&*xs>4)Z9y_5;5aS|7YW%(WnLlKh702=h_t2r;Ei zW9 zAI`g3&~E5g=pRi_pDXC)A^G3U^()9_jiH{E4!zS=;fLv|&ihkgde;?Fdi0y{K8oML z`!GFGKl)baUwI$;`FHNK$>i>Ch-Uqh8?yw zVV)IdEuDUMR&Wi!G4dyWUw2l%$@)G0Ui=n@pY45&AB zEA%|H4`RB>stt94rb8Q{&!Fu3(Y&m=Y69t7f3F{%h`+}Jzq`0@_<}Jx*PpXsBUm@3 z@Z{(5;9mYd4em`nqRgUg?mybUs;mn!*`RNS-%)t=!NT~3e)R2&!1aDiaGi6C=am8e zPH@fotT2D(U3a9z661Y7)pPV4;kUxN(H(#K_DHVNAo*P$x!=zH;Q%khL`irrKjH6m z&HAjkDE(hCxvG2l3DX?ri=M;${ZIA7X~Z!Mvp@GC&*)ov7naK$?v>BN6rZ2DhJM1| zs~@g%{hz}K->Ve?g-2H^{B6I+%FcCQo%IZJ-ZP+HLuh;oglFiSC&W9RIVubpP&x4A?x7;6n z+7D|LVSWa^gg=F?d`;qCSN%@cp5QiP+P*et8F5-Hebp6H85M5KNc-j7KeB;QcMz`4 z`>g420H$>7x4J&aHBA4zr@{2@jGO%Q>o?(j6mQS_8IaN+^`mcw{>8hYpMU2* z`)2x=0k$q<38nXa$j(_xjWt6?%VFW?t8co za38sQ-Tm$X_jC6v_hPTF*AF+=yT+U4-QnHo&GF`Y_j*gc$Gnx^YFv?Iv1IXN>15et zg=D2<)nxT#?PR@V<7As;hh(Q@*JO9xMYu)Ddy~tO4c3Ny<*G4B8oMBFG8Il~D z9GSd4d0p~)+zq%p@=BwK{EG$fqE1<-iPwo#Gihk;cHVWiCw3>A7uL!wW|y6$HzujQ zhABL~#LAvRUSY3@SBO1)XR{xzt@-*8!k?C${De`gqT_3x$3|PJJ;V>O*6T6WY3=hq z^_n-cO__xxx89JSV z=rUx>OqM*q#ER!ZTeh&OVMDVP&OZl3wlifbvxSq}OY!o1eq2jv58jX7 z@7@VqES8Anj-|v3#tO$u#7f2L#~R=o#Tv(2#aiRq#M;Js#Cqaxi_MD7j?IZ}kL`@@ ziZzKhi?@ikjCY84iFc3ph+h=%74H)t5Wh4&I6fpkEIuMWDn2?sCO$5HeSAWENqkxS zxA^gRj>H*>Ny(eYqv^?+$=j26B%3o*U^2+M-Mzz|<1TO)y35^1+(+Hf-j&`sZ@hP% zH^aNto9T@qCp+S=2Ab70w4%sO%|i>fj@;WyuAwut%VPs? zqb-iy1ph@j@2Gp!{RuzLoC&R74`sp6ibO$jn|5w6K@QWAA|F(M3TL^#S)+9 zw3!Xi9^q7D+i|zEm*dCIaNlLez~0z*u?yHCQ#!Fd@owUa#CM6M@LXAZ%g(IMznTJ< z$x`85>ggKl=!?|Nx2&t-jb~yTarxu<3?a`pA--ibiZ!Rsbtc68gfS=n>fOu~;xjwW92mPkwk1{~UJAY}6Hhhe zuJrf74Z+g;A6XT@!Yf|@C9r}1e{@HrV`M`PJ8y4G{cq?%CpZNmKdogB-jt#aHfFY>on|0d>$%QuLphQ%YpeS*ZkxN^eaL$l zx6)hXt*5LT*H+DC?Gf`0m!Lm?4n6l*=yz*!Dnx(h3g=VjJEwqK&b`KczS>jbAT5C7z$rr%LBQ@(XzK z>*QAQybsTJ1TD(l%oZ%Mmcfb3;lvH_;u&z_W$>a-sMqQB*O^noW@4#Xb?18O;RJXx zZ@hrvhZ1p>Q7SxI9WJc{pEiI;+rp*G;L$JO(!=oS5jgc{IMsny&wvMaP_K3;-lT55 zOYQoI`sLTFbE#QvOx@~XYS(D`yRc4eO1?lk-^Sf^kKdE$WtV)6ZHwA*TgX^fE6SW# zNy@Ms^IWOu=@WL+&SC2`J)NLejI|jhPTHQH!y1=`*aUx^6~n8jZ%?p-_bF_mZeWG% zX8Q$BVA#uA)*a44?+`u95$`BH%dg&V^et|Tt|fLxEEl~?{#XI}m*Vs7!h}I;(Y3#N#DT#&Yw$8=QaAy^* z>$A=aj(X|6&S59rZ68P^L)}U46eN$bUS+SBcPX;OlitACcxsAv5f!2&O0#=ybzFP+ z8}RiWxWS3xiN_La6Hh1n9$EeVyX1I|Wd1y>Or#}RB|0Q}CWavNB zznqY4G9C8>?W4F+?rZiJUQZ2E``?uIAwAZC7NSe+^Vk=$XW|>;A)|-!VT+b$yC=@AzQqG1ksFMdjLJN);fvv=TgeckxsNngJX`YvtqT81nS3{ zA_cVKYdvti*ySP_;4Qv-C{`))dU7|l>4W6+)E1gExavw~*RE$4Z#pw{YP%Pk*85@F z?`M%_b|J;=MS?lVyi0r5%IJ)be)a&1ocv z$0pWpkLJ{~>zo_t4W~JGIJ2EDZWm40$BdRyN zg}$&zvIw$i1?1A&$fO-`{fv`DcpWn7vgG@%^x-qX3;UGHA+E$|wVT9tDd=Goqlt&DGkOU~q3E7!N!i=2C$2ayA0Z=qUZ zeqv!_DLwmjNDFH1&*6-Q;Z8nk)urBWxb>0bb@U{XiOah+-Cq-30`8M^d4zktX=Ca~ z3+_}3wxzR-beF?Qt?$b`RoLsdDxQZ{pm-vcx-R*pj+5qG;#6_#A_p#E)bOGEh5LtF z-)o5+IGNGFmZ0Q&P;V|wv^(6 zXC`MM!QQsU4@teDq_TN--o#-rrDp&$tp}W=PDS@RcY^!A`-9uxdn$HgyhXBGa&U5a z@^Shr6u&+826g!zTE&k{OQKqREcRRMc+80> z<2mCg$T3yp)r?$KKi&jM{~{#(VaWAkXgTJ_?}^__54I%!5WABfqeWd4S6lR4{MGo* z`0n_d@pt3z$3KpL67+E27)k6WGYW_&67+F765$C>IcVADkrzsxIA5*GIC4YnXeoMx zs;n^3n!(b6+}qm79JM$jptGZK!&dj0`zw4>-)oQShSTWbAzJ&^_Z)&1%UF==se+bgxRMr`M z<^1Gqq*p1%7+`Mv6Vkw--O_%I@6B$GpUv3`C)nwrGZPxRjc{pbTz3tA3G&26S88`KG799xm%(avT|>XRnm1QbVNE5%| z;+)*n$Zdja#dt(IhW;nD4AL`j2>vW(fJ&stbV1e zGHZO62HKvhW1&>EE2*966_i)8eQ?;pEUnb3+bF+%T5ejUowP<@nAWE}(!>XZs8*l| z^42d&S(Z|%{GJTYC8Bf9k&6;iAGzCklhN_J&ijmz_d5HXube|joZnOPe{sGcaTfDjSy^4j-li6wSf)772XTQ`%N)=zUM@p?nPa}@k z`oAZG`;~TyL_yLdZP*!3X=qybR=@wHOOSQIh%2Z$ZzQt??pCPihC4o&QZ4z zx~(c+Ew8p$$7_nD&ux8zelyKO4Jh3vdijl($jMm;nGE%Kri`+he-m4hjNM$YF zde$?Q;LMQo86!T$8K3XMJ-<6~cW-QMd@JLle5$$?s#dufHOdop1}I z|Exm3w>0^E4Y{qB<_`3>(%ddGx?5=hmZMwy&?^WhOX4c*C>~ei=SgpFfQ>gYiF(nw z@h8EQ-X*bXlMkbzP);1TwtAyt57UR~%{F(XHzd%i9iz?-p{|AY!}BrjdYDnf%kZ*4 zYCJ$s{4;0ZeriUj8lP%(s>iIMdk~^CcI6K*d zI7vP#M0-@96R^(b+?C#FKBRwM!RYH1T8y_itL77Q(MLEj>IVEP$J#SCf62MUz16Ko zUo_Iw$a-aRfATnaQjPZq?QV>?CNkQZ%h+QX^=^ZcbaT6<(Lb(W#z5LfU-NhiBcFwd zd#Puu6NeK=XjzV6#fdS(igh=m&Cl&-rcdre z+ICS&3u%Q?(684*(rD#%@_JHg*U{pv_eL=S(C-g;t7r+twMDEdu~kS|#krRRE?$pn z0tO~#ByLU2PTZAvGSMU1J9$}h0(>;h^s$?gU!hsJnKDyt7>jmkX8h@(&pl-4;;gOi z&V2Vt_gZhBS3gKq#(c!n5gD&OsZoEj#a=?LKZ@qJ8Y8EB;fUpl`s{xfzcoe{xG>Q> zISj4s1hg6)AZp6&de-XR%9`87Xu}>x6V{#c%?5Cq*(kJNxNnB2gcX|Ad}vI;ow>nD(y3oP{a!u!7p{tObw@A$X$+;tR~)>;SDS8 zw<#os9%-<%k6Lqp@;{h7gbY2bIs2{&|8#m|X^y2kmiBl~{1E)7Qk4$32~xB)?Jm-8 zl^{L-OoiX`ZD7X2@6lE#hQfivk{mGVk2$H6>yWh9jkbTO8DnuQ-Ldkki$f?XGpl zcz1av4*E5Fy?1FZ|GcIQ>03I3!tl>}I7q!zX~t>3?A;}p?abh&_1^s0Li7N;Vv?aH zDRqNm9;2N)MjI8%&_#k7OUco*nCKR@BmQ228cZ!u>mcP+E8N8G+>#WlmH zxxKdN5wB)`Yn_?H$WI?U!8mcx-1z&+S9o!*FaE&Od8Zs4?NXlOsaOE7A=7c_gTDU^og4 z$AB6EYV_xi{Vomqm%sG(|22C1Pwt>!EEBc=pTm^D`pwL^e=bnfJG1)t&jlLxB)`ZM zPA($>eD-iw+_x8=yHeJ0&NL$+_l&G~im8jeS<9O_{5(dxSL~jwxGaTRR=+>t`OK`; zN38WF9POu46-TZrZfyaYct8KBH#seb8X(-?$G8wYt!A3=Jd)iCuzyIkAc{+0Sb&+e zT3K+_qXOon8R}Cc97(GMsJY#^?up=vPyt4$y4LAxSZb{n|% zNh*INQx>oqGlul>FyCq#ygI!R>+K@`)p{1NE^yj`zY+%^acMcf@`LrfHl-% zsjT%!1g~%K@eWI~tYQylS*q+h|9*&oRgUUHHB<&)uQR@uS~<%{9E&nk&Uo;bnIn%q>eO7F zn@eWn9CP-(PRGrIE=*1*;8y2++nSt;+!$TQc}|*hk#QHJ?dZ+PoN^Sj4wuB_e)foE5AJN#Zu3`&V9~m%=8{W;$+eu>kvg*S5V5XfvbrP2A!te6xW`U zLpyN_wN8Jo?KCkpqYb+69@Gxyq-sZRY%=+^L-k{nnWvrL{J;FQA+$l_!6Wt@C!`_p zrTX;itcmPqjsBMoO1^uOHzB>>+BT!aYnX+<6CL3)cBt;46+HFR6@;%o`gVLTV4v(# zese#2U01Tk=^w?efNK=Tg=iKwJJJ99iJ;z`K`ZHTQf$WmaCPM!#O)62q9B#ySj!%eJruG5eSI#gEnn5hzBhW^ zE7>LgI?`CoKHZaaX_B|vP+|)xE0tC!`z~jb^N%2Nf*fs!ZIY05N*|r9N%xpfRkjScB}+;C3?3Taaw&illr`Xz0^8g`b_L<{PS<5$5O3P``gsk>6GI2 zmDpj}jNOHIw8xy)V1?`kw9CN%N`t z=1UpvkuS2lyLgCNFG=~msW)S(A5-bSmQrJK{)1SR`}{Upx`huK_;sZpW!%qR6ZFeR z?FCLqYlyL0?OygJ_$Z2`U)m|-obKrjej(ZFThjylNPk$+Io195kN9(8(pwB~X~ z$okVat$nPX{naXCpYG`{W&+fvOh9KJQi-R0$sluoc)F)U^a+|zsbW`U-FZ!V!OYh~ zXgm7xeho6lTC?_E>+he$J;ltY@1CZ0c@+s{Cu;zG_Zs#tUS|!k@7|!@`Jev%c-m&Q zR`(creHklESDQ8bfA9HFP)5>S?W8|fj<Rthz2(gqo!2nbWfV6Z%deqvBk2LzG*Kba)&UZkuVX0#<@6!O zNHKCLr=8!dzW#g9H}N~=bOU#6Rm z<5ygBCH7iE>Oc*VJaTK0+v42?C-Yn!{I9$@moF*QF=oB+Vx-N7aGQ`h{XIN~{-rnP zKJ2%g((GOqNIZQhslL`k%0>An8;6DLeSBS|^f$CPIcUAJUdsgXTX$wyyE|GlEZ=RY z!GE)7B4=m5YE`dtO)_{$(}V9xr!&Dh$dhW`MmXX{>Q%=796|f@vnd;CkEAzBb^hLS zBcw!Wb#FCaOv!Rx#27&_Qa>2dM&ckWl=^jT0VW-44W!t<*nS#9J(hH-7UMR!`)7Fc zO#9z?yM-@EhWBf{#$~P(LyK}IvvXw_q5ZRX4|+HChrR?nHIU>__cZScKQH=|nvkjm z-1s8=xW()#`x+}nHSLl{EApTAr_)GP3T@GysF#(d zM7j}aMtYzJxz4#Aeaye}b{?f5?$@a4Ij0b*7eD{PoZ4|akCXMkOp>U`rnst>&*|8yyry!-xs{O93AL$P{#kJ)XzHnW-KAe zEi_sQf2^x<+lxWJaOgkct#!Z^XWM-^+K1R{T;|^hrx_Ru3-FeJ!6h(_AEvj z^BG+%WmK_(k;K!C9JVn^c$bmEf5$KWZ`S{R$lMO|B9ZgIJ+szeZhc;4!u|QY=sBPK z5}7!U*{gCvS3ewD{6-2gH}fQ#hl}FUvSf#=E@X!zdVu@$cF}OOUMM?U?P+#+!r=aS z#L;k)r@&P|ax=f9dAF$loCf#jjiR_({@iG*3uN)HTAdx9+u#LF%UKSYjeIuqPg((* zo0dWOp%y}`KCnar#i0b0gjlVu*|u!vr`F%%ST8_3ptqqt6F;s4OtyfOor3H8SEVUXugywoMmCJPiUVKq1Xn8!@RKNEHd)$^)WJ=VbzP6Ssy zuWFs+o&&x-f~%fawazv6{C7ui)$^)WeYZaTe~sX(=T)r+uI%rYW!^LVuIhPJtD)Nv zymbUuJ+I1&MA_vXCA?;u;+aSFwyM?F9he1|CZVd;-PqfY`iJSk+p;D*b2udo-kepI znQ>`Dt77RP4SZ4LyX6c%-@Q8vE{VM=d-msM!K)fvyPYzJqj~tM)>YVs$c(EX+1n{i=Z*zm+@7@odT*5;c?Lcx;gg3QTJ7vN1-RJXR3HZ>**E(wn zVoZb&&&PjS;D3s~OE}EPCt4a@^MCMj1aD>V^{hO@&VK}#Ha^XInpNp&zlD=t!pS3v zB+dHB*_Q?HWN@us&+Nau!M8cDXTi0aJPm2^pAtnFOBfS6#RD&{HM$#AIfM2pOcts@cOKkWcOnPzscYY z*saAm1rhvagKMQfBOl@9C*hcLa=Tl7oB>(zS;l`iG!U8n-(~PNtY*%PFEDsBr*#(m zZi6>=nu4#0d{;^AZp}pxkQu+<;I}a*&5S>6@M|4RJY@=Jg~3NVm=nu{uQs@U{!a9} zPa1q6VpK1+1`1lB&ZEW>aX5nA` z)C=5B2>dV7cfni34=);g6qb}}_agX92EW4CUEd$Uw-|gh7MIaHQV3x}>)yn_r=VxBta1x8;{T?>r=qn$4$i=H2%ltDq0@hXTV=>s%gOnc z!EZxX!TA&sd`|?wH-f(%!PkL{Pm~Yu8vJ&waah&|;9>rJXz-V@Dx4YLXYdW^1~TIZ z489f}cxL>d!5>1~of$uD@TKS*GUG=KJ_k$H>{y7z=LduD#0oTW#ogpXLqGmM8T@0k zTb9*2g8yppB6c0{Dul&Q0qS!BL>$e=B2X`Vryv{d5&D_^Yz9PW`2P^Xfd3NmfZTYiP|DXW+#RUdky2R4an(Jd#OPX=ZgS z>*5Gr(%@y#Tyefe1TSUqvRIO0uT2EU92?=3Gv|@*5MCxt?Euz^gb%>NI{UpMcqM~h zV)e^{S2g&BSa;9tpY2eD)79(%e>(_gJmIUnCo$vD8UOSA@t$da>VZ!V@B@+WGGqa7 zX?8J3am@08H#4J~!-4+^gwOU@@J7f+tR0DjpAJ4Hz<-N`-^$?Cu!v7P5W(9Tyeu*t z?IW6X<^j{e^_OIcd(r2BJfBpg`b<)N@xk|}|_VsOMOZ{^X%5W_Um4nJdsZa%|B2)>g z44nm4fvQ4hL)D<_Pz|UiR0~2XHs>GIY7V7C zEuizEmQX7Q$?D|!1nqck4|RY#LY<(_P#35xghe7_&9etrdWKBrAoSt6FVqj}4-J3@ zLW7`7p~27)Xee|UGz=OJjetf%mqVkVE1=QPmC#kt7>L#-)A=%WrlUIm zO+fFl_%Yk6y_a*i-?6M&_h8Ew+5$-*@(}NH_4L={uH$|ivgIDGzd(Awk6GXl`(dr` z@2VjgSjp+Wzi^$b-gPC6LDT&8vswLWO|8BoKj-q>@Hza3zAH@Mm7k9g5X0xtPZ$q< zvoB%j8rn*gUp-F=;uYq@gFL?mDKD~1cfptcobC_{zo)c>STx-VPv878o490`AJH(v z^k>bF(9h}eBlM&Ah3PIi!!M68-OYJEUAp_f^5=AiSTx-s7EQOlnO*v#eovLY(9h}8 z7y1d~p*$W=da^6;*;&%9G#5uWSr5J^c&Fc~tbXLsshl_Xe2@o0T>PJ1{V3Rmu@(dC zBT&d+rFh5i5fo=dHo>zTnxN<-ae%RsNd<&mDv3?>_Ore;LmzFY&Vc zO%43jqixXhITLO3ox6hHbs#?a?t@u=_jK^PZGpc}g6FS;=RME(;hf+({GQS>v6^KS zxZStGDn1ofgZ3!IRF1+r_s_soZfElwk;2lr@s$?R^+>OC%VOW+&L>t0yCkw$BX+QT zXSZVYtjqgfI7{Ox5(ar58Yj9{Sw?AvtK0CVqix(HAU`sPDs(- zxNfWq8erUItYgz&*)jIj%)tL>+;MDvc+TW!e0}y5=L_d1_eJUgk_eWXn%a_8h&JL) zK6K>^v81)x+5o2aw_2~-RjCt-Yfbu}LDtv&QcoXSO2@i%KfZ5UKX9jCq_R#)S}JK7 zpFjuo46|*rb?_0k4l1~n+;z;57UW$krxWY1hhiUcHoLR8a$4(q&M|C5=5zzrABj#?v0#`D?1N!SrZwJ)fb%P`knJLmMP)0VwV9Vs`hQ}EZ%4{`>vhja+#IGi;ySK_X6#!{x&GLJk9ce`^Z z5q zgYI-Y2BovvUJ%sgHTD8ZK&9CbE$cb1Mlms-8Y7XmWOYu8-JjoRK24SpOS1m0KI?88 zax!EqQ=X67ZOZyJDhKmom9QmNmDykIDPGHt{8tzGyRXl3sxou`2$sMqV{79v_f@{B z8aV=4GUv0t9fH?b4Y!AtaPM3B86GJ{ey!I!z5+ab%&PXUSS@sdHAQ(?EmQ=nBIWH= zEHgCXJjza-8F{^FzphXB{g%{8NeQj986xvy#B(hT{&C2ds)WcBXI%NJt}RC}=o(SF=u=JywKO59_?dgK>q z;XbfGHa2PY*`L{coPM-bdmY(>`gXKm({Hi9r43fAbo;|^a ztlaQtI^5U;?i&M_RiI`n_jh7#@OeqXSLAh(nf2JsvpC1kGFnH_KJN0e5hC`wJKHh5zDc=bFjXj zOH1tO&Heb?0$&^q!j?8~vRN0gh<5)Wtb}Nu>nvJO<>#l?erxt}|Nd31hghUkF+NE7 zRbbU*e^zjR&YqxSw(MY)bh_|P?Wt$YE~5YF;hhJZ^6o=!7wVl#?hMWWd(WN?#}OG? zQ0-n(3;I~lf^Ie~Xmi@hwzQDlSv5F_R?%-0#|Ew8ou(bk$~%5*=LGFs9@E05W09;K z=XUpSFNT{g3)-=(gBI*A({>#RYQ6NAs!L07n$z1J^xU`68--RI6V?-M@w5FjZncY( z1f})?`@`UFoqZkhuF`oP62%GoH^SD_Xrzxa&UJ99aBdE{4Xs?vhjVRTP zL3>xmej@nx4d_VU=cBqrws+}?m*;xHkrM+s|H zUPl@wed|s1NT1kEk>M1Fn${;ln|8C+6iH0AVktcQvNaqoolD;vhXY5#Y4cs_^7Ku$ zqZiVK4xsM*2&Oo{WzDjeA!j8U_~Gugr;$q7i8jHn8xI9_V*}Epq>E*CQqIk$Wf%(gDrdCI>Tjf=n*CLfmup!Y8J6@mBsu+JtNn@{+6_!v zPr03gd~0n@3v#0x+A#Gl>Q8cT$e`n>{OQ`Pv57 zmc2+Xc)~8{$WEQgx+-$Uli2N&tvWp~GW|1_e0kRQ(ygFZ!&K^s?m*r0O zpDUX+pLLCNv5%7Y+^k6co8=-cNWv&(mo@RKNa@s|r)b2Q#HQ@y_xCt-59->P^ms|< z7$bRoVY2;XQ0t1@xvKeGd9m5WGu+lnarG%zGd{T6S?mO_KA* zAmwdd;P*cT+0)k*E8%ZA$DMBOm98|k;)p%i2e_B;bU&Kjyyh*w|6`nrI3N2!kJG;& zv&%T&5ijM=6eB&~VSmYQs_;CIGFVPs*hoE)94!f2va_US$;y(DB^65^mLx10Sdy>g z-4^hAdw9Jkygme89}Az~36F<+FZ&~_-(zR(b*?1TS%eyuM)u!jqjhCo27T=|y z;G;gsQ+?gG@U-&q4tQ+`GJrU`ESw=}Eh?w&K;D)=jX~N5BckezXCAZnkMK)jAETrF zUAd}J83VT zW*Y|wQaTOqZ{FLdVEJCudBC~%&yV;ckpSQZ2G=6+4Oxi zgTAjmGMjA5X6*sHQ9o)DYqei3jU~~ZKw-tSBCwkY5>0kT9=T{@~&NNmS?{{x5>9;5s+c%S=s`;zkc+fM> zr}n)JFGc4^1+BH1+wdclv)n0geFx7uKT%oFEbf~Rk3lch!ZmUh{5 z>hnF7+wYe2D93Hhz^K&Kn@$RPgF%*dI4Ulq>_hNtW$wbUwWLCgskd1gO=}e09GS2? z@}S1Y8WqoH9K4;e!}n&KtI=(tlOqR>S2apq=uYChiicmnI@&MrthP(G(WGnGfLz-w zXrn$Mb!&rss$m@^MvB`M`zo{sy4!01|Em92>a9%c|9tyDf41}E+yD8qogd%+&!6oG z`Rj#ybj=#RZ~y1d_I!N%KYzB{(r!<2TG)Gte8VN+%qu6DS5{hzv+|H` z*=iTT#ht~`3l`&gNdyf4oYfyUaeV_^>m(Gu`k3PI z`|VsmkKjswaV!+j2v|Qw!YOWW)j!6kOEbbLW$@KTFIx^gjDJ~!Z=x=tNsHjA2H%eC zKt4ypsc7&$>@a2yDuS!_7pIlp&vje`SMOh(R{I;SH$`v;V&FfpLxf!*5uC;e+~tG} z^!gFJj=`lBVx2?;r#Zxb9kfK)&jAn9)yUvI*v-sHID$7Z_*kqcqQ{7Y)70QMGfqOz zT$T|I0zKi+r43{Km6ps_>%MuC%gxmJOlMHjw5(vbzuG zQNpX{C-mF!S-+F*p&8IZXcZ)zL-M1m#!}KuRKC@JPI8|LoehQYYR$d;E3AvT9}nFI zDIF>Y*%DH{T+J9xJ7YI->do`4Aleb^y-#BVEO!lVnsL*S=;j$WA5Gf=cCO!T%NhuU zj3o6gcWO^u_U9K~;-fd)+TEu23(d|p-EFe=;gd)(qR4~GONUs%-VdPKS%NxV3;8S! z=}ztvX2P#z7W*pV_>+|fNu`3ZJl%}_D_0Y%dA4@FslB?NbH)eS;hOln?FM{B`vyvz z5dAQoM}Jw#u7tJYbYm|`yWbS2?Ur`FRpPFct#hu*F{be4qKf!F%dU$SN+XLVxbqlY zG-E}QEGG9vQ*g1dI?^f4BgE@gBug1!E-23ob1FLx}ohF{^wavZri-j+2GwV6H9 zmF6<(S1YdA77k)N0i8)HTphk$mvtjOaaRVhU2T;M@^`LX6--)uS)8dAw}Z^4wX$UmsJnFHop`E3@aq{Py zeW1C567z_I@_m5OC~EhbLXF$9(xH?TXN|;_luCK>tOs@oR64SOa0?Ro$CvpMN)K{P zy57UI5&CsI>u?aeI(F_Ljbm+T+V!P}_|`yMyWo;MwPX*y%Az0Nzl_`-1zy8^S2=M$ zPCf=Q*7nQ(Ds-b`S!W{oSi9z)faia-Vx-0|>(rB_n?`JV6RuKrnc@HGC;44_;M7~3 zZ$g`BcHsGY!#A^s{B3I=dcq$q4~r~uIH|nRUMg>!z$v}$FM@PlU}>kDN@Ncl@FVxC z4|U+|bAxi2hOR|v)}FGv%`Ou?saABfv{OyFHQ&QRFlvWBGz zzwn)3oBaQNe#|1|TyT0h__{GX+{+%;+}C#~{{~UxCR@@xsN{>0hqv*)yDizaklg`& zb%C)tpt~Q;{(s$FXlXt`cXh41&bLh(d$2D}JNt$9w6r5%9NWV1R!3IGbb%{-L|jkG zO?%bl-?g$5Xf5k)?j%nXH96ZK?afuzL`GN-uu3v4^RFp&k9MQ1 z89`l4o1p#G`u%OzPXYHfp(L7FS#`L7>Hjqo`@d2DuhO$J$^ZYFolkKR;hdDuQb2Cv9!JZ$xVOAeQR^#du? zn@U`ti{LDW1g~sHzpqEa$!GAhSjmU{8Nnszr&zU(-12<{SG`O@i{G8AON|TTsqst- z)`tgjeUyC8>F2+vaZ3tgczwSx{)6&usBudQy_Vv8Peysgl`kpuHtKKGWBse^CLd#c z$A(~Sh-5s;dm%|4+sV7>w6&p(8OnpG}iDE;6gmr=Qs0vC;$i zRs6A;{#bmWQj=2;ru66>k506`;Z=Q;{MAO{5*4{mX;!;e)Ov+?%CqA9zP{1ebuu>e zvOd3#KjmRb{8grXZbT2%HOtfU_z~X~W6fo=;J?~n@lXj9enWoOCDXn3$|)`?p->y% z2R&dPOZIS7Q_rv@f%xgHL@1TadO-cA0ZwJAcN|G%NOe+iD1y(5!GE>$ihC*Z>&oz8 zJ#r}X)5rKx9Vm^T=Hy(r$em;ueXl)E(w@TaWA&rI@c*k{)O&IL85{ic7A2etd`VV6 zqxXaE^?S~S;No9}mB-|j|6hHm@~bvED0>L%m7@2u+@@T~WvQ>!SNq_k+g3;w`Qll@ ze+zl&Fa19wBqY6I%xnCm|Nl$>@6Wzpi@oHae^9r?pRfP>vwdz~F4*xW|Gxh3(6FrG z`1-$R9}=D>xd7{5`b)FBP-&M(aOu6YR_oj>xY~8iu2su|movC##4?9d+2Dn-5}6s- z8W?6DnM=!zOP@pwVte3sMdDM>;6E7qcT*yG1A~8Q^i?-R@be7*4&xJMz#@1vgG=s1 z?ug(m4DRn&>H;42+vgixry8TzjNmN|z8W0{>pLUi&`t7J-t6P39l_ffyr_|zszkzR zZ*bo(L)i%4!Qg?sV8StST%x1FeR*M|U+!j~MJI#%`YrX#BiIW!7McLv0^JVHhwg)x zL#v^;?#S%#5ZF=ZcPPeQv@@a8`Du2V_ajg7Zgw{K>HvF%>+4XBe!h(HZt%R1tI`yG zR=h(0M|d9%qtiOu#9Qxm|0`EfoPA<>AYsw_@V&y698{6Ke2qL;kCnz+k&t9;Ui+kq z(jS(m_pC@?uin~sRoVIByK2lW%E>BFt-#f$mz0xc!*?6Z8pcg%rQ|jT?m2W}a?hjT zm6K&S*`9ol)o))ipLX!1^UtmLnh~(Z{l5Dd{p`=w9_OTUZMigbMy*&w)XDxU?*B9S zUKoCo?%_-$)s}~UvbzhdbE#c_V}hhaMhmPqkX}%BkLq!1)8Bg@I?(6b%5Y9dYT4DI z*miELRh?5WL zEDej_A=L_EsXo71aIgM+U^*+N`F-{|;Om9|)ptj)@MrVY(tO1HeMU=@wUx=*!uair zYyVIDQvIm(5$ZkjTIy}}q)}s0(^uMh0FUvkic#OevSxl%}|;?JaLT#goRdVXK<; zN;i+j`F}?L|DisfN&n~D|7t%VdwD);&xc>KHYty3Nu&0#6lA)oCzG@gjYM|!^OaOsD#!^P?8+1T^a_$51Be2^WkGEb*1P-_s4 zkJdqEhf6P$9j;oR&d#GkS;EP43Ow&AaMk^EwEWU1M&qOW$__7Z3S8+)M_!P`5DiE1 z%MRD~(y2MpS4REo_u1i^Ax#hTzES`BeRjCUiP_=OgQf?1;%GS1gJy?I51Jh={cw7q zSB{2L<`j6@Q{Wo6rU!cHXgK9hfv27VmtHzO&|62tsdx%pdg<)^YrLFJ~OWO+2K_UUe>H;jfQjfDR4<%>854O{N3sXPh~x9X1vBJ@R|mfZZWfejqB5m&M`Ay z`xLm=kEAogQvOBb&-6sLc)e5L=NR0d2Z)A)T93V{S^=$tHbO5#uR?D^??azL2chqwUmyqDO*x^wP*JE1R2ixTHGrB!ZJ{nu zFK8e%3>pnx3r&KiLA_?Ps+sG2=w9eS=y7Nr^bGU@^a}JE^bYhf^f`1GItu*;u_)9^ zLT5q+p%PFzNIDehyZT(}ST@%(){sH|T_LMea96~-Be*NTjEg^KaHe$;Qk{NL!J2;Z z?JvPyaqFU!;T;M5on@5^-sZKAob*>N@K?&r+9^ES>J_{#Xo;I8^@w}J{VrK8XLdUo zkEy|36{|%MLVn8&!Y^TU3+_r=gMzyn zw&tDuT91=on-|;_w7v-Lidh{4f2mgA;I5*zD!8j;H4Xd~u}%bcC9IU-YbC8w!ChHP zngV^dqBSkJt726Sev!|rANVU}jXoLjoxxpItJcZ4FAVWRNm^}!x2e|n;O;Ez(crFv z)i4OTu+`?|UCtns64tPjv6>Ow6|`1d6ul6b8S@ZxuZGi`P!RtscD1XLShPmbR`Au)@~Fz~5O`zW^&_?F;UZ ziz?L@o1w(nVJ_Aq%h2}t1WXApZs-vv$0FSIMO10*B zSO{1Nj-Vc{|4#|z_(2gIA85{e`FnB%SGyIi&sh?|2^QR!o1X_7%?luE2@@U39rR1$}9al1fOY5(7UmDl{@<@jNP6qe&AkpYCbkhDfObNAA@xzeaV>x?!irEss3SB88V-Jl>n~6en|N8D zRbSs{KJP229PjHwt+MzF@#(^uLkzMfqsVKtXL@sr9$UHzd~X7Kkx(6 ztOL{9H(?iW)w;HU&^6GVko<(-3FG}0c=)?txIc$AU>zW(DJ#AjTWU3!uCni> zt86@l>#J5!9_O)^ITzPI+yY)DuZ1_16Xc`!=TUFTUTdm5)x8pJ2hUF{?+NZp4u_@(UJmwld9?5SVxZg4lbuVG*6)bHxj7c1P(UJtLgH^>XG z+M}U9Om;7}vu{BsOitxYxmDOu*o}Jwx7Yc^`HcOx9oS)eB~~4-ci+eTfy?Qom>9O8 zwY$U{U}F5A3rTxJ)PE~B>o_g#DXhG2!oGvz(H*-cJ+ZAN3pc;_}4WNx3g*A2k*X&px($U36rWaBV)Pf%8 z)Nj7vx2g}yM^Q(fRfcELJKeyZo5j{Lle@~<>~c$7Esp+Y{ind+nv2Ql74d3%b-gC= z;|Oo6H_f|~7X8ndWVO}!FN!QIsrM|>RG(gzlhUaF*I3uHmvkET&Sqe}PFA}fG1i`T zaiZm0)`wHMbpDs?nLOZ$wUI zeb0U$-uc?Dg2k<~ooe*Fb?Ir_IyWL0Om}CqbA1k{R^02p2#|>)q(hqV4!IHe;o~d+AIsuUCNgl_<@wUN^6w*WbGoiE1=5 z)l~2FZ?%?0^7U2BMQc8L6Bhk+Qf^_ltb3!o!#x#Vmbhv@ppYk57_KSm)iACmv8ZEQ zU2m9i!{M%x-W21e5~Ev;n`VCbum1Mv-CB=C-{ijG?xC#JrtNn#Kh^osKO1fn)-b+w z{r_46uD1ONEHHG%{y})vdJG4=C2iIW_+9nm3Qp0y5t}ZrVh!RccKl!OE^@QOX3)N< zEqM+bS6^cD;i%ovv@uzqXV5RHzISoEa)wJ+_b&Pq{jP4%ax}3Xwi zwSgzxva}ZG!;#ax=>1iszYOm;aWeaFSl`Ld>3{X;%_aFt?v=zVS@-X~UrXPww7h{d zE2=|&sf=?VnN~#>O~bWzGe31*?`v>#TP1>AN~gc>M!((P%ed1Cs7k>$>_8lMkGtu- zi{5K>igI{~qwmz`D;akhNh(&d8YOB>EGzRolXEa+ZzC`EE9Hv0sm4`st7A8)5iQeA zj9ET+|51O>2C2Q-UFNQESG&)+o8jxsPY;p~}NcX^m0?`T`2Xw-l_1dq*L5j)GOhgO-&x@UExin&Srf+pW30B`O1u+u4Sj?msUof zexI8?`XIl#oZn2LpP0*z$OWcvTh2-we|6}GMv{NYiv?0fZgyv{@cgzd=a{pXawTBaTD>+WtOv+(-uDWu#EgeU)xA?3B??5FVhE#XLNf6avB|KHci z?>PWvg`6WrY2>ExEiU zEm+3=PsB&{=Ofx@(Yb+i-3{rwKhkx0J-ESNGg>6*=_Hwq2>L(CCa1#pkq@f7pKu=0 z5vMle)r`9`L7x7Km9-*R)d{Z_aZsGp5{R@LUae**k2g1`$E&7DmX{PCGqU^t;qC2W zBukbwp>uCv(ELa|u+m7N1=WZV%=FZq?W*qSZ6$SUiHwY_itYTn8Ihe`GZ!62Mn-1F zt;mSD5s{TygSK}b1`QHopMaMUAR&+#?e1tFKSq{KPp~)l0W3!`;l>+}+&#&)nS4*U74VI~Bhh%RK%TR+s$ur|7%vH@}O1^JhQc z?w z9shgGGyM0bChx!b$sb~e^*>_;p}+KRr0&oLL(7Z%{i8oqz5L~91#^P&`}Z+^hZW3r z?4LlcI*W4M%{BL*$=8{`kac*7|EthbdOZ9qC4N3e%tT_K1`^aCxSF(Qx zHU2Ad3;YGVrT-58|GW7A&+xxnkN%r@$LSxzX7PWC)#5Kfv;HPD?Ef)s|EDmYtG<8z zqyPVM+WWb#wXWnf%q42{-{2Lhe*}yBb9hPf{kH!c7J?OCk$b=h(vIqnAbGAm7nocB z2JDjmUG~4h&hWqf;NO7dtqS%VwhsTxn6>{hM$UiXM^EJcU;oi>$^V~XAMq43Isg9! z{@=*|cR%_Y^8a_(Tl}G<{Lr-Y(WQUmR~hbUh*f4Edh!2$()-b0peEFlU&cMGe}LCb z`1dbtj^ulkzxbj4{R^AN{!dt$IC{I^KgU?Yd4+G&{%!1Y|2}5+ILsFw`<=ls&ju&G?qGP@KYG>wy&lHCJfGjqX8c)fEOa}1e=)J}YBIW9%xCYF zAc_f56n{6GO)r(o1%<>#NIJThO@@nX^01lAH=v!&CbxNnSWo|80`SHA%_Iir`Tc6T zvBZ`tfk=V`ayeN|uE1)!BE#ik&Fl~vFXorXf4MTK#KH1mJXvlwHzO(4!z7A<&vLXH z-6FwsKA)^|B-yMMvm8}ey4lm}(INW;)L!Wc~+8MWxwHR=3kRBtmTf zjdBvSPvK&7CJHnzs%&$KF7DVS_!}~2#OE9^IofHH%_j5f&5b27MuLc$>rTdEk8$St9YWTf!8>@kbD>@nQvBl#&GSHC2;6lh6P zV4-3~5hR85v@$t`KB`e=kN&7p2rmv7se^1QsB|EVIN1PDhDTyb_(Wn#;OyzXd{!pu z?E&b-lu$|^4>Vp(36Z6YXhnRU##*WnS6&5RL6}LaQim$ZQ}HBes4vxNDlk^NAS-26 z5{!b2)pb%W!OP;Yj8wl>x<(X(s4B&HMarO2b<|Pk3r%SmR^lv|sI!&QRpMM13)D`e zrJ^~ZmJo%`#@ZQ^3XB(R!baOC7G0tfWkiMWlN2Q(DYj08N!pU2lC(A0RFDb3DpaK~ zHB~`q39Cw6wMZee(nto768jEDDl}Lz9uG81QN=6haVfniKr#SWUezOHl8amOm{uCj z>d6L3@)HS_Ayp+-VOGc>k#ecjak6yiVx5w-)unTFuEB=!tHiGgWrC!#kV3Ekxh>KwAK^3fqOHi9_sY*SV^@)c`tZciGM8-6WgN$FsXjRCc{U4&7`vy;zN4p}Bz>YO>0% zrnAX9yPv{RFoH!0wy$h>GbIG$`2Aw_HXAQiFc)oL`8t_RM(atoo@}zkDjOq)zl%94 zKr4|68q#$9&T}9rTZnvizHFAU`?VJ?MA8?!6fvf87J_Fz+1heffoC*^%EtH%Ch4 zb<*j64I5v!q={&Gx4y~7J3m{l7S}LkJ(1c!`OSx~zWlA9-A>1=#d>kIdGc<$z8lS+ ztT%U;)5Vjoe)ewsGn3-a-a%+r>)%2B&;t24oxR@vAj{90D{7mge)kNY^^b-p!_$0- z7Txb3_4Yv1KLX|sR#VN(up*5%5cj)L zK7*jMytB7=+8Ydx_wm;LY65=XR|m(t9llgbM5ClC&|&{u77lgZ>*j-A7y86bms2@k9Ye?|NXX7RM@0myZKOxX zP*T{u=njS%ZIRQI$6#}~L=OnH$OP}CUc_?2J?e`&- z-Lw7u-f4c)8B)2jhkdjKk;l7(_zt#xB*-{v%@(6ejNUgBbS;?I$>#_&1$7}3d<;%YaB@88 ze+yMXNsdOGlGszDag5^vM=y-a34G-crI9a;co-4)`uqD4Hw=ZB)2k~oJnz2lqyuJm z_~sc`xSyOma5p<)1&_g_zLIL5brB5zEDNlWnHAQce`7_v*BBfEN5V2Pu@H zcY4}A-s?dgIyB=vVZ6YB0)FQU@+G&=pGU>abFu@-kY9dLLIPyS7{y6iX7Dqpf;5Ig zy2q#JPEZQ;p@ZYj9=>^XB;zi7E*nP&VHtb1$AK_^b=pG@e{qAQ% ze{_rlodKqABpGSDW0HXGbcZ|!f!>T!JhIj?r*rxW0zp+z&yKWPn>aW|`eL~OU>`*J zXF2lHBbuQc$n4+E$EqWH>y3gCkV7q;;y{hjxi{1x9%fDFSOH8>7CYim;cv_B8A?a4 z{KZ6wpB6>LAS{Xai$wTok?3Rz>@`N!}_!QSq^pKS_Ny0(C9ct99`dzvis3$&gJmsbj_1VEFo6c2eMLW z6v$`!^T4{1dVtA$h;j8bRBDC8yS>%)-9(ft-0DR#pC7=pRMgqU1-RgKsZ|Cwv6c#(wOWwoyJu+t`ym;Uh}g*q0sC zHl5kgHuh#u*t(=G`m-`^*P)fRMUVD`txFp9(I%aBV(`=JBQnum)Ha9Kea;oBU8hT_ zwe+x7VXd2=9K%HOCLh4EljU49Y^IBO7tS^)a!RttWkmt@&2gVQ*xupE@C~|W_kg}y znDu3=6Rkk784?ioD`e7cM()1qaTmbF!6|HD*bl6*GEm-rA*<17wS$FkQw~lXpXHXt z_5wL_Kj60I?-M*iUp~vV)>xb2cI*vZ&EO?9n!$c_1)s3h9kvGwzP%Vnu%)LZFte!9 zpun@SY>mXynFWqCk&-1KlFlbkl6+(M+{L+wes$2z`+Fv|y=*hO7C?4?Fq&WAjjkuz zeV4viFkT{XIXNLnNe)i*7h5Cjk@gObVPfg^kM@tT;kZ)2EtHhIyd@J!c*fmHK3+0* z1KTH-t_Z<(Ps^0uyWfNb(uji_SqjtzKzJ9y<^_;Cx;+a}+2}sYmg)ev9M5iHp<9mc_=Egqi;KKhp+QC1`N=*^H?NP+4)*fy z>t6S3>s@HB$lR?*7d52$d50Y;CclSE;9-C70G5pbx{sLpHs+y6D~8z1XlRxF>)8=D z=X=?^1?1^fC{eea9WRhN0?ODm*;X3glv}8*iMLQ}DQceI&F9!VT;`vB_Ssk1#?`SY z67KAn7PU{{^sar1MnRTKb>EnV!gtDER}|j~>IkCFQAbkMX|~fQooPF1(#f`x*0!j2 z!q6$}xL9YcLt7`VM@#3fM@y%#L#Km*jhj0=Vc>LQDPV30O+Yr7s;+Vnu>oAvR|b^| zlpoa9tgiN8IlsUu!pYw8VW)p&7FLWGu!xJ@o96Av_>E%`*wwnUP{Yu5b};PQ7>*N` zV;Hb{ox}Y2B*%#UHAWq^*D{9j9V5;0;Yt617O?{$@hAW38Eob%CR#WKm?FEqlOfKK zK)^W9ng%!%LTX0)hlgjw&h9}ErY^1u2vf5em}CAph2fX9mhss@MmR|cOI&9NE54k! zy&@cE9QX8JrUCD~b9yAS92(1{G|!(tKgXX8Qz4cgE(Vum)aYES^$ckM)(FjAHqiVcM%;IV$h(nl-vnwpBvrE`p*RX||YkE|Y?(qo@O{~$ZSaOo8D_fk>;g-UPtMUpe zuE9F!iy2mNX$6O;9oW!=6ykaoa23@ximkOanzZtiywwHgL0wes5=L$Lv!->~{QPex zx8vn|+S}3uA}}CtaY9nSo*TdW%Cy8vVxldz5@rU-ETR08;-ik2aiEiraKgg_W}a?z zaP&hPxmM`t_~f($yFCZX0T1%gbi)Jm0E|=Jp7$8wY5A7}9(zIxJparwg!S}TQI9ME zDMUel;deWE#0E#1g~Qb6dT`Aw(bYQ0+>b%n%HjMe-|b zNDK#vMhQI65lKRzqmmOwCbO{^XPlln<`K^jcYDBACKeQh<0Ckv@ozDF9p%_q5(B;# zJN4%!yNd-jtOv(O82-7k<=S43_dVzijdeYzE6D+2JY~ur{_0iwAKEg)rnoDNMqNmY z$5Xv;aqiehK8)btDnthTR~k83%&%woN0vUg4<8N)YPz_%1Gjw~;l*cAj34jsXII!X zNXkAAmIr9=3p#UPmc_ALmg6Lj;V#`t#=P&s8P`v=5;?@N^)aL+5lmQ^nk`~(D=apV zfZ_%Y4&mgNn*;~R$8=@Lzn;=rK#B580rhT|oA)l69%SQm4mrMoiwfLic=1X!$Z{Co zE{A9*9;Rf&#efH+5X#}*dUJ})RHzwwX&#c>DK?Hc!^^sh+a<)c8o&c+ij(xr5U(e* z;*@WyTq~RJuGSh57VY_yyQ18 za9lt+=?3)VC%#DeAzO)QryH=+KmdGKf*8PxRY+*HchERL2b1*Dn?J^bYBs%{Zsg>jITfs-x+XP6^j(Z$Nsd!obL z`~XMg9FzyIv4jw25+E-HDKBv2fJ*}TCEf*)mHwCM5DywZ)}Q&1r#d^x!e~FmbYU?h z+cpi{ku>jrC1sd?r9l(}zGQ%DDenaS>`SG2_9ciIQ7Q{bIqs%{#LkK}ntqN6rq75{ zTF969P6^<`Kg%zqv?onV1cZECIoDjKk?aG#Zh$9iPdpK&!aL%@XgFS!Xs6=7W(w#lPAjwJc_#C@s zM%dMl_jmUt0(X!8@qtFZkjRl?IMy5=zM*O}6+87YWsb-*A%vF{BhMv*0%2K-EYAu1 zN?@?@P&N-BL40_Q+Vx*y!pAE1_=s-F4=5K}OBbcmYFD$h#JbqtT&*$3VDrhvt2A7G zNGGg(aI?>L7VlzK)CJI3SL4}&OIH2mVbaxQVDegR__@KZ=)QUd4p?wrUBP|wCcCENSyfPos^qDQf>rL zR4jV4E1u+FHHG&B;AO22FIIk>Wl0rC0VX-(f=3dUuZFVxcy`HV$gbA#pu1v@5?~`K zAjdYy!rTza$q|TDeE6MUseOD!0Df1~YpCnhX2R1xLCVx70EVvkK*1!F#^4`uRz?6v zC^A|Qvu24=d^Dg$vm8LY-hc+kPoSD&chhkJDxisalTkVqReQoPbWQipZb2gn#dM^Wg2U8Q}u<%WYFb1y1Tv2>}NHB z?;@D4ZZQI7PRJ(XNW>bP(Zl{7I|_dJljGM5hZ-snUbjJsbG?)x0xE*mb6?&3T^!k? z^5MDS%z)Zcc^B z-nqWu0-$(j#j;;Qq8j-y^E1j&Wmi=s2{>0zpCHHB;Q27(df*aDrF{`0Cn^Me=@47)N!!DS2=B3CI8xu6iah;ni< zvT|YN%oUWC5ysZG0afrGe}h5Qx$N-}w|i#BSu#A<;Sn z-$mivho!4HB1G167eS6T)41BOQ$<)GVf#A-l+lr(r$oU}Qud$-;fo?YD@M5bTAzzh zE{G;~LD4)HQO$5MDuxTIBD9~DwxCs9Km6H*^jrao%Q z?TV&sJyzLziJ$~t9daY}NX^Ezi0e;|F$?dTOOa6=Sk9Q(jk$9(9De14^Ap@&81jmg z529Py+0-5iW86cC8tYXKt71pNE*ubyoy^S6_EFmtE5Pr-KOGBPm?2z25jn^+EFIu5 za+xh)AaF$y4`;cH6&17tHFN|z+(d%AkC%qHOD8WRVLI@&4`HOex_2|Gg{WWA-0LD( zCpfSRu?!KVi=b*~I>*(AV<^k)X>jw;5o-YbC1Pt~q_}qr@OxRqvhg&;U%$@uVO5gz z!U7I`(Ux%cwq}EOf~>Rhd%r+%LC8WzRGcHC{ju!i;`n~-qc*JiIJFY4Pp}H;1ruBi zlZ##0LZURN^9Bp{lts#47lH#hBSyjZyQkRW&;SgjhKYE>1wV@viXh8%Uw{OKi~=1o zm3k#Stg5d)-{G2n2RiG|iS#aL}ZBpN~OberVa>n12fWnbW>7{%C%vTP5uT+4?T z*ZWw=2LRCtKvwu3ud6yAMPI_|C(9SQQOI?Pi%q=Wsr&7;>o?Jk&!m=xU6jd<`-FR$ zUo%~2JC(`TFJyLonT}u{7>#NU<~w#s>pOSg#tbn%heU2M<{%s~i!i6rj>av4JR5Yw zVj5%=<)a5ZF!{=vjhy-*B8N6EqDMO}riK$A<4(`>pvFl9I5Z++P;qfC)pdhIuLqo5 ze1p9`PLgq@sw++#`P~|4FMLmJ_EDB1+MeW0lg1}rSfr_gfR7sAg+*k4Vv*%sVsO^& z;u@_+_Ho0S_il4oF67X{FaGkyoCh0Rd|Bug;Q-w0e-j_JT~6Nt{fj$X&chgnJ28yr zGySz6-CG{x7BlalVGKIh8=Rf+QfW5BCh=fTP?+Fwf%pKEq>Mlc!(NcFecTyC*Qf2- zh-a72VE8%M+daT993#|nDkqT{tl+R_saYz|gG-j$pJE86*kxV-#0h3T3HG3)4Cl`| zUbutN1eRC5n8VQCsa&X)VE>thJH*93Y|$|W<8XYJK+r%au*MjbIxajw8Z1EX=o=32yorhtOnm@X7`VCnDnZqP z1T^|v1-h6Z$H-syZ%Ojlf@U6D(6uP$Y6XQAjoJXQh-Z(PNimngWTk(lq84O^7R)bU zArZ1DM41FQseO#|oElm3_4_rs=vDM2A}G8IN%4Y6L!wXc-@$a`g6}Mddt=uYp3L7( zSM)?7&3zJEUgKaGECu5u#?d$^C!fp*0w-xuKYhjhTxn3o$bAet&1R8sU&#tcQy$Iarrz^Z3dzaK^zU}sXMy^&vA4C)VJA8e({F~WjJHzuzZ_G_uqLlAYj1M?j2-GY>bC+9dlcI9I2w_ z{EPK3ex?$cY6R0WYzNxi~-B6*H{bCw5sVOic>I z__tZ$IS3>eUBbvMQT+Y#3j^cT1{ck8o^Tr6f+}ro&IK2cpvG8(b|9=bzdT{rcMy-& zqf!Ag2smd}XfO^O=y^1=T=)y01DNnL%wqT<2l^na45T3sod+<3fZtwh7BuR>qQNr@ zTsuv~fH=WQCFE<;i}CtoBRbK=`U(w=E-CN8A_YVTPWmt{3&R9jEKTZ)Be7WqpGGVS zsDLu94+NkhpX1>NNSH2q>{BvC=Q4J!HPv9kcV8$_u+U#{mw=Nr)ms2}4sz!;9?Nj} zXZX&7Q61}Xw4;-+1b82Rfkg$aR1BaKUr;FL{Nr$}lZ6qY3}cyy4FJ0CHZu)~*9^eqdA(yflCaA40m0E$^y$`YlAy96{=a<%NL#y)sY z{ot?k1&N`}5Mzr;R03!*ND8Wo<6p*P0MW{Q`Ma)~98_4ffV7~blaYknbaatw zD2#QFp*pH)Jq_OdW~hhNJ?x0_lGJj<2bK2`I+2k6os8dc*w#5)CJYX;acZU^1Zz-(^H;{n%L_;VzKLi$otOl`xyt~EQ%Ib% zLJ&v-XRE~qKZBd;6;d;Xf%SIu7S3)PnZ;NY$K1iAEl)Jdx^0ldiur`o2L|kS19QZ~ zo?NGvTr=ihj_H~)|1zeNs1YJHTBGO+%^7hP