From 927b7905dd7a4374efa7a222c6f00eecec76a6f6 Mon Sep 17 00:00:00 2001 From: Alexandr Chernov Date: Fri, 7 Feb 2025 16:36:33 +0100 Subject: [PATCH 1/3] Refactoring for Qt 5.15 switch --- .github/workflows/linux_machine_gcc.yml | 4 +- .github/workflows/windows_machine.yml | 2 +- Makefile | 4 +- src/BamCleanHaloplex/main.cpp | 9 +- src/BamClipOverlap/main.cpp | 66 +- src/BamDownsample/main.cpp | 14 +- src/BamExtract/main.cpp | 6 +- src/BamFilter/main.cpp | 4 +- src/BamRemoveVariants/main.cpp | 4 +- src/BamToFastq/main.cpp | 26 +- src/BedInfo/main.cpp | 26 +- src/BedLiftOver/main.cpp | 20 +- src/BedpeAnnotateCounts/main.cpp | 10 +- src/BedpeGeneAnnotation/main.cpp | 8 +- src/CalculatePRS/main.cpp | 2 +- src/CnvGeneAnnotation/main.cpp | 12 +- src/CnvReferenceCohort/main.cpp | 30 +- src/FastaFromBam/main.cpp | 6 +- src/FastaInfo/main.cpp | 12 +- src/FastqCheckUMI/main.cpp | 4 +- src/FastqDownsample/main.cpp | 6 +- src/FastqMidParser/main.cpp | 6 +- src/GSvar/AnalysisInformationWidget.cpp | 38 +- src/GSvar/AnalysisStatusWidget.cpp | 6 +- src/GSvar/Background/BackgroundJobDialog.cpp | 8 +- src/GSvar/Background/BackgroundWorkerBase.cpp | 4 +- src/GSvar/BurdenTestWidget.cpp | 42 +- src/GSvar/CfDNAPanelBatchImport.cpp | 24 +- src/GSvar/CnvSearchWidget.cpp | 4 +- src/GSvar/CnvWidget.cpp | 6 +- src/GSvar/CohortAnalysisWidget.cpp | 2 +- src/GSvar/DBQCWidget.cpp | 2 +- src/GSvar/DBTableAdministration.cpp | 6 +- src/GSvar/DBTableWidget.cpp | 7 +- src/GSvar/DBTableWidget.h | 2 +- src/GSvar/ExpressionExonWidget.cpp | 28 +- src/GSvar/ExpressionGeneWidget.cpp | 8 +- src/GSvar/ExpressionOverviewWidget.cpp | 2 +- src/GSvar/FilterCascadeWidget.cpp | 2 +- src/GSvar/GSvarHelper.cpp | 6 +- src/GSvar/GapClosingDialog.cpp | 4 +- src/GSvar/GeneWidget.cpp | 2 +- src/GSvar/IGVCommandWorker.cpp | 6 +- src/GSvar/IgvLogWidget.cpp | 2 +- src/GSvar/ImportDialog.cpp | 4 +- src/GSvar/MainWindow.cpp | 18 +- src/GSvar/MaintenanceDialog.cpp | 38 +- src/GSvar/MidCheckWidget.cpp | 4 +- src/GSvar/MultiSampleDialog.cpp | 2 +- src/GSvar/PathogenicWtDialog.cpp | 2 +- src/GSvar/PreferredTranscriptsWidget.cpp | 4 +- src/GSvar/ProcessedSampleWidget.cpp | 14 +- src/GSvar/RepeatExpansionWidget.cpp | 12 +- src/GSvar/ReportDialog.cpp | 2 +- src/GSvar/ReportVariantDialog.cpp | 10 +- src/GSvar/SequencingRunOverview.cpp | 4 +- src/GSvar/SequencingRunWidget.cpp | 10 +- src/GSvar/SingleSampleAnalysisDialog.cpp | 6 +- src/GSvar/SmallVariantSearchWidget.cpp | 2 +- src/GSvar/SomaticReportVariantDialog.cpp | 4 +- src/GSvar/SplicingWidget.cpp | 2 +- src/GSvar/SvSearchWidget.cpp | 2 +- src/GSvar/SvWidget.cpp | 6 +- src/GSvar/TrioDialog.cpp | 2 +- src/GSvar/VariantTable.cpp | 34 +- src/GSvar/VariantValidationWidget.cpp | 2 +- src/GSvar/VariantWidget.cpp | 6 +- src/GSvarServer/SgeStatusUpdateWorker.cpp | 46 +- src/GenePrioritization/main.cpp | 18 +- src/GenesToTranscripts/main.cpp | 4 +- src/MappingQC/main.cpp | 10 +- src/NGSDAddVariantsGermline/main.cpp | 120 +- src/NGSDAddVariantsSomatic/main.cpp | 76 +- src/NGSDAnnotateCNV/main.cpp | 8 +- src/NGSDAnnotateSV/main.cpp | 2 +- src/NGSDExportAnnotationData/ExportWorker.cpp | 9 +- .../ThreadCoordinator.cpp | 3 +- src/NGSDExportCnvTrack/main.cpp | 2 - src/NGSDExportSV/main.cpp | 20 +- src/NGSDExportStudyGHGA/main.cpp | 6 +- src/NGSDExtractRNACohort/main.cpp | 2 +- src/NGSDImportEnsembl/main.cpp | 25 +- src/NGSDImportGeneInfo/main.cpp | 38 +- src/NGSDImportGenlab/main.cpp | 32 +- src/NGSDImportHGNC/main.cpp | 20 +- src/NGSDImportHPO/main.cpp | 53 +- src/NGSDImportOMIM/main.cpp | 14 +- src/NGSDImportORPHA/main.cpp | 10 +- src/NGSDImportOncotree/main.cpp | 6 +- src/NGSDImportSampleQC/main.cpp | 8 +- src/NGSDInit/main.cpp | 6 +- src/NGSDUpdateSvGenotype/main.cpp | 2 +- src/RohHunter/main.cpp | 54 +- src/SampleAncestry/main.cpp | 4 +- src/SampleGender/main.cpp | 4 +- src/SamplePath/main.cpp | 2 +- src/SampleSimilarity/main.cpp | 16 +- src/SeqPurge/AnalysisWorker.cpp | 59 +- src/SeqPurge/Auxilary.h | 52 +- src/SeqPurge/FastqWriter.cpp | 4 - src/SeqPurge/InputWorker.cpp | 10 +- src/SeqPurge/OutputWorker.cpp | 6 - src/SeqPurge/ThreadCoordinator.cpp | 15 +- src/SeqPurge/ThreadCoordinator.h | 2 +- src/SplicingToBed/main.cpp | 4 +- src/TranscriptComparison/main.cpp | 36 +- src/TranscriptsToBed/main.cpp | 2 +- src/TsvDiff/main.cpp | 64 +- src/TsvSlice/main.cpp | 2 +- src/UpdHunter/main.cpp | 56 +- src/VcfAdd/main.cpp | 6 +- src/VcfAnnotateConsequence/ChunkProcessor.cpp | 10 +- src/VcfAnnotateConsequence/InputWorker.cpp | 4 +- src/VcfAnnotateConsequence/OutputWorker.cpp | 6 +- .../ThreadCoordinator.cpp | 20 +- .../ThreadCoordinator.h | 2 +- src/VcfAnnotateConsequence/main.cpp | 4 +- src/VcfAnnotateFromBed/main.cpp | 8 +- src/VcfAnnotateFromBigWig/main.cpp | 8 +- src/VcfAnnotateFromVcf/ChunkProcessor.cpp | 4 +- src/VcfAnnotateFromVcf/InputWorker.cpp | 4 +- src/VcfAnnotateFromVcf/OutputWorker.cpp | 4 +- src/VcfAnnotateFromVcf/ThreadCoordinator.cpp | 14 +- src/VcfAnnotateFromVcf/main.cpp | 4 +- src/VcfAnnotateMaxEntScan/ChunkProcessor.cpp | 4 +- src/VcfAnnotateMaxEntScan/InputWorker.cpp | 4 +- src/VcfAnnotateMaxEntScan/OutputWorker.cpp | 4 +- .../ThreadCoordinator.cpp | 14 +- src/VcfAnnotateMaxEntScan/main.cpp | 10 +- src/VcfBreakMulti/main.cpp | 4 +- src/VcfCalculatePRS/main.cpp | 2 +- src/VcfSubtract/main.cpp | 2 +- src/cppCORE | 2 +- src/cppGUI | 2 +- src/cppNGS/BamReader.cpp | 9 +- src/cppNGS/BedpeFile.cpp | 4 +- src/cppNGS/FilterCascade.cpp | 20 +- src/cppNGS/Graph.h | 4 +- src/cppNGS/NGSHelper.cpp | 16 +- src/cppNGS/PipelineSettings.cpp | 2 +- src/cppNGS/QCCollection.cpp | 183 +- src/cppNGS/RtfDocument.cpp | 6 +- src/cppNGS/Statistics.cpp | 56 +- src/cppNGS/StatisticsReads.cpp | 2 +- src/cppNGS/Transcript.cpp | 6 +- src/cppNGS/VcfFile.cpp | 6 +- src/cppNGS/WorkerAverageCoverage.cpp | 8 +- src/cppNGS/WorkerAverageCoverage.h | 2 + src/cppNGS/WorkerLowOrHighCoverage.cpp | 22 +- src/cppNGS/WorkerLowOrHighCoverage.h | 8 +- src/cppNGSD-TEST/NGSD_Test.h | 4 +- src/cppNGSD/GenLabDB.cpp | 6 +- src/cppNGSD/GermlineReportGenerator.cpp | 964 +- src/cppNGSD/LoginManager.cpp | 2 +- src/cppNGSD/NGSD.cpp | 88 +- src/cppNGSD/SomaticReportHelper.cpp | 24 +- src/cppNGSD/SomaticReportSettings.cpp | 8 +- src/cppNGSD/SomaticcfDNAReport.cpp | 2 +- src/cppTFW | 2 +- src/cppXML | 2 +- src/cppXML-TEST/XmlValidation_Test.h | 41 + src/cppXML-TEST/cppXML-TEST.pro | 37 + src/cppXML-TEST/cppXML-TEST.qrc | 16 + src/cppXML-TEST/data/GermlineReport.xsd | 1711 ++ src/cppXML-TEST/data/SomaticReport.xsd | 954 + .../data/TumorOnlyNGSReport_v1.xsd | 557 + src/cppXML-TEST/data/germline_report1.xml | 49 + src/cppXML-TEST/data/germline_report2.xml | 97 + src/cppXML-TEST/data/germline_report4.xml | 97 + src/cppXML-TEST/data/somatic_report.xml | 92 + .../data/somatic_report_tumor_normal_1.xml | 21321 ++++++++++++++++ .../data/somatic_report_tumor_normal_2.xml | 21321 ++++++++++++++++ src/cppXML-TEST/data/tumor_only_report.xml | 57 + .../data/tumor_only_report_broken_schema.xml | 52 + .../data/tumor_only_report_broken_xml.xml | 56 + src/cppXML-TEST/main.cpp | 6 + src/libs.pro | 3 + src/tools-TEST/SeqPurge_Test.h | 1 - 178 files changed, 48058 insertions(+), 1626 deletions(-) create mode 100644 src/cppXML-TEST/XmlValidation_Test.h create mode 100644 src/cppXML-TEST/cppXML-TEST.pro create mode 100644 src/cppXML-TEST/cppXML-TEST.qrc create mode 100644 src/cppXML-TEST/data/GermlineReport.xsd create mode 100644 src/cppXML-TEST/data/SomaticReport.xsd create mode 100644 src/cppXML-TEST/data/TumorOnlyNGSReport_v1.xsd create mode 100644 src/cppXML-TEST/data/germline_report1.xml create mode 100644 src/cppXML-TEST/data/germline_report2.xml create mode 100644 src/cppXML-TEST/data/germline_report4.xml create mode 100644 src/cppXML-TEST/data/somatic_report.xml create mode 100644 src/cppXML-TEST/data/somatic_report_tumor_normal_1.xml create mode 100644 src/cppXML-TEST/data/somatic_report_tumor_normal_2.xml create mode 100644 src/cppXML-TEST/data/tumor_only_report.xml create mode 100644 src/cppXML-TEST/data/tumor_only_report_broken_schema.xml create mode 100644 src/cppXML-TEST/data/tumor_only_report_broken_xml.xml create mode 100644 src/cppXML-TEST/main.cpp diff --git a/.github/workflows/linux_machine_gcc.yml b/.github/workflows/linux_machine_gcc.yml index 4946fb175..fa63064ca 100644 --- a/.github/workflows/linux_machine_gcc.yml +++ b/.github/workflows/linux_machine_gcc.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: gcc-build-and-test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 services: mysql: @@ -27,7 +27,7 @@ jobs: - name: Update OS repositories run: sudo apt-get update - name: Setup test environment - run: sudo apt-get -y install make g++ git python3 python3-matplotlib qt5-default libqt5xmlpatterns5-dev libqt5sql5-mysql libqt5charts5-dev libbz2-dev libqt5svg5-dev liblzma-dev zlib1g-dev libcurl4 libcurl4-openssl-dev ca-certificates sqlite3 libqt5sql5-sqlite + run: sudo apt-get -y install make g++ git python3 python3-matplotlib qtbase5-dev qt5-qmake libqt5xmlpatterns5-dev libqt5sql5-mysql libqt5charts5-dev libbz2-dev libqt5svg5-dev liblzma-dev zlib1g-dev libcurl4 libcurl4-openssl-dev ca-certificates sqlite3 libqt5sql5-sqlite - name: Create symlink for python run: sudo ln -fs /bin/python3 /bin/python - name: Update submodules diff --git a/.github/workflows/windows_machine.yml b/.github/workflows/windows_machine.yml index 1f090aa84..e9c5d9176 100644 --- a/.github/workflows/windows_machine.yml +++ b/.github/workflows/windows_machine.yml @@ -13,7 +13,7 @@ jobs: - uses: msys2/setup-msys2@v2 with: msystem: MINGW64 - update: true + update: false release: true install: git base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-zlib mingw-w64-x86_64-bzip2 mingw-w64-x86_64-xz mingw-w64-x86_64-curl mingw-w64-x86_64-dlfcn mingw-w64-x86_64-qt5 mingw-w64-x86_64-libmariadbclient mingw-w64-x86_64-python mingw-w64-x86_64-python-numpy mingw-w64-x86_64-python-matplotlib mingw-w64-x86_64-python-packaging mingw-w64-x86_64-sqlite3 libsqlite libsqlite-devel unzip - name: Update submodules diff --git a/Makefile b/Makefile index 3f186820d..9fa235b4a 100644 --- a/Makefile +++ b/Makefile @@ -111,10 +111,10 @@ clean: find bin -type f -or -type l | grep -v ".ini" | grep -v "GSvar_" | grep -v "libhts" | xargs -l1 rm -rf test_lib: - cd bin && ./cppCORE-TEST && ./cppNGS-TEST && ./cppNGSD-TEST && ./cppREST-TEST + cd bin && ./cppCORE-TEST && ./cppXML-TEST && ./cppNGS-TEST && ./cppNGSD-TEST && ./cppREST-TEST test_lib_windows: - cd bin && ./cppCORE-TEST.exe && ./cppNGS-TEST.exe && ./cppNGSD-TEST.exe && ./cppREST-TEST.exe + cd bin && ./cppCORE-TEST.exe && ./cppXML-TEST.exe && ./cppNGS-TEST.exe && ./cppNGSD-TEST.exe && ./cppREST-TEST.exe test_server: cd bin && ./GSvarServer-TEST diff --git a/src/BamCleanHaloplex/main.cpp b/src/BamCleanHaloplex/main.cpp index 6b2e4a60f..3bb9abca0 100644 --- a/src/BamCleanHaloplex/main.cpp +++ b/src/BamCleanHaloplex/main.cpp @@ -55,8 +55,7 @@ class ConcreteTool { ++c_reads_failed; al.setIsUnmapped(true); - al.setIsSecondaryAlignment(true); - //QTextStream(stdout) << "REMOVED: " << al.name() << " " << reader.chromosome(al.chromosomeID()).str() << ":" << al.start() << "-" << al.end() << endl; + al.setIsSecondaryAlignment(true); } } @@ -65,9 +64,9 @@ class ConcreteTool //statistics output QTextStream out(stdout); - out << "overall reads: " << c_reads << endl; - out << "mapped reads : " << c_reads_mapped << " (" << QString::number(100.0*c_reads_mapped/c_reads, 'f', 2) << "%)" << endl; - out << "removed reads: " << c_reads_failed << " (" << QString::number(100.0*c_reads_failed/c_reads, 'f', 2) << "%)" << endl; + out << "overall reads: " << c_reads << QT_ENDL; + out << "mapped reads : " << c_reads_mapped << " (" << QString::number(100.0*c_reads_mapped/c_reads, 'f', 2) << "%)" << QT_ENDL; + out << "removed reads: " << c_reads_failed << " (" << QString::number(100.0*c_reads_failed/c_reads, 'f', 2) << "%)" << QT_ENDL; } }; diff --git a/src/BamClipOverlap/main.cpp b/src/BamClipOverlap/main.cpp index 720912cf2..b09eceb46 100644 --- a/src/BamClipOverlap/main.cpp +++ b/src/BamClipOverlap/main.cpp @@ -210,16 +210,16 @@ class ConcreteTool } //verbose mode - if(verbose) out << "forward read: name - " << forward_read.name() << ", region - " << reader.chromosome(forward_read.chromosomeID()).str() << ":" << (forward_read.start()-1) << "-" << forward_read.end() << ", insert size: " << forward_read.insertSize() << " bp; mate: " << forward_read.mateStart() << ", CIGAR " << forward_read.cigarDataAsString() << ", overlap: " << overlap << " bp" << endl; - if(verbose) out << "reverse read: name - " << reverse_read.name() << ", region - " << reader.chromosome(reverse_read.chromosomeID()).str() << ":" << (reverse_read.start()-1) << "-" << reverse_read.end() << ", insert size: " << reverse_read.insertSize() << " bp; mate: " << reverse_read.mateStart() << ", CIGAR " << reverse_read.cigarDataAsString() << ", overlap: " << overlap << " bp" << endl; - if(verbose) out << "forward read bases " << forward_read.bases() << endl; - if(verbose) out << "forward read qualities " << forward_read.qualities() << endl; - if(verbose) out << "forward CIGAR " << forward_read.cigarDataAsString(true) << endl; - if(verbose) out << "reverse read bases " << reverse_read.bases() << endl; - if(verbose) out << "reverse read qualities " << reverse_read.qualities() << endl; - if(verbose) out << "reverse CIGAR " << reverse_read.cigarDataAsString(true) << endl; - if(verbose) out << " clip forward read from position " << (forward_read.end()-clip_forward_read+1) << " to " << forward_read.end() << endl; - if(verbose) out << " clip reverse read from position " << reverse_read.start() << " to " << (reverse_read.start()-1+clip_reverse_read) << endl; + if(verbose) out << "forward read: name - " << forward_read.name() << ", region - " << reader.chromosome(forward_read.chromosomeID()).str() << ":" << (forward_read.start()-1) << "-" << forward_read.end() << ", insert size: " << forward_read.insertSize() << " bp; mate: " << forward_read.mateStart() << ", CIGAR " << forward_read.cigarDataAsString() << ", overlap: " << overlap << " bp" << QT_ENDL; + if(verbose) out << "reverse read: name - " << reverse_read.name() << ", region - " << reader.chromosome(reverse_read.chromosomeID()).str() << ":" << (reverse_read.start()-1) << "-" << reverse_read.end() << ", insert size: " << reverse_read.insertSize() << " bp; mate: " << reverse_read.mateStart() << ", CIGAR " << reverse_read.cigarDataAsString() << ", overlap: " << overlap << " bp" << QT_ENDL; + if(verbose) out << "forward read bases " << forward_read.bases() << QT_ENDL; + if(verbose) out << "forward read qualities " << forward_read.qualities() << QT_ENDL; + if(verbose) out << "forward CIGAR " << forward_read.cigarDataAsString(true) << QT_ENDL; + if(verbose) out << "reverse read bases " << reverse_read.bases() << QT_ENDL; + if(verbose) out << "reverse read qualities " << reverse_read.qualities() << QT_ENDL; + if(verbose) out << "reverse CIGAR " << reverse_read.cigarDataAsString(true) << QT_ENDL; + if(verbose) out << " clip forward read from position " << (forward_read.end()-clip_forward_read+1) << " to " << forward_read.end() << QT_ENDL; + if(verbose) out << " clip reverse read from position " << reverse_read.start() << " to " << (reverse_read.start()-1+clip_reverse_read) << QT_ENDL; struct Overlap { @@ -275,7 +275,7 @@ class ConcreteTool }; //check if bases in overlap match - if(verbose) out << " overlap found from " << QString::number(overlap_start) << " to " << QString::number(overlap_end) << endl; + if(verbose) out << " overlap found from " << QString::number(overlap_start) << " to " << QString::number(overlap_end) << QT_ENDL; // bool has_indel = false; //INDEL ist around the clipping position @@ -327,8 +327,8 @@ class ConcreteTool THROW(Exception, QByteArray("Unknown CIGAR character '") + forward_cigar[i] + "'") } } - if(verbose) out << " finished reading overlap forward bases " << forward_overlap.getBases() << endl; - if(verbose) out << " finished reading overlap forward cigar " << forward_overlap.getCigar() << endl; + if(verbose) out << " finished reading overlap forward bases " << forward_overlap.getBases() << QT_ENDL; + if(verbose) out << " finished reading overlap forward cigar " << forward_overlap.getCigar() << QT_ENDL; genome_pos = reverse_read.start()-1; read_pos = 0; @@ -375,8 +375,8 @@ class ConcreteTool THROW(Exception, QByteArray("Unknown CIGAR character '") + reverse_cigar[i] + "'"); } } - if(verbose) out << " finished reading overlap reverse bases " << reverse_overlap.getBases() << endl; - if(verbose) out << " finished reading overlap reverse cigar " << reverse_overlap.getCigar() << endl; + if(verbose) out << " finished reading overlap reverse bases " << reverse_overlap.getBases() << QT_ENDL; + if(verbose) out << " finished reading overlap reverse cigar " << reverse_overlap.getCigar() << QT_ENDL; //correct for insertions for(int i=0;iclose(); - stdout_stream << "Read IDs: " << ids.count() << endl; + stdout_stream << "Read IDs: " << ids.count() << QT_ENDL; //open intput/output streams BamReader reader(getInfile("in"), ref); @@ -75,10 +75,10 @@ class ConcreteTool } } - stdout_stream << "Reads written to 'out': " << c_match<< endl; + stdout_stream << "Reads written to 'out': " << c_match<< QT_ENDL; if (out2!="") { - stdout_stream << "Reads written to 'out2': " << c_other << endl; + stdout_stream << "Reads written to 'out2': " << c_other << QT_ENDL; } } }; diff --git a/src/BamFilter/main.cpp b/src/BamFilter/main.cpp index 7dd5fb571..63bdd2d0a 100644 --- a/src/BamFilter/main.cpp +++ b/src/BamFilter/main.cpp @@ -123,8 +123,8 @@ class ConcreteTool } - out << "pairs passed: " << count_pass << endl; - out << "pairs dropped: " << count_fail << endl; + out << "pairs passed: " << count_pass << QT_ENDL; + out << "pairs dropped: " << count_fail << QT_ENDL; } private: diff --git a/src/BamRemoveVariants/main.cpp b/src/BamRemoveVariants/main.cpp index 4f47ed04a..e9be13815 100644 --- a/src/BamRemoveVariants/main.cpp +++ b/src/BamRemoveVariants/main.cpp @@ -118,8 +118,8 @@ class ConcreteTool } - out << "pairs passed: " << count_pass << endl; - out << "pairs dropped: " << count_fail << endl; + out << "pairs passed: " << count_pass << QT_ENDL; + out << "pairs dropped: " << count_fail << QT_ENDL; } private: diff --git a/src/BamToFastq/main.cpp b/src/BamToFastq/main.cpp index 6d8687715..a4695bd13 100644 --- a/src/BamToFastq/main.cpp +++ b/src/BamToFastq/main.cpp @@ -82,7 +82,7 @@ class ConcreteTool virtual void main() { //init - QTime timer; + QElapsedTimer timer; timer.start(); QTextStream out(stdout); BamReader reader(getInfile("in"), getInfile("ref")); @@ -133,8 +133,6 @@ class ConcreteTool QSharedPointer al = QSharedPointer(new BamAlignment()); while (reader.getNextAlignment(*al)) { - //out << al.name() << " PAIRED=" << al.isPaired() << " SEC=" << al.isSecondaryAlignment() << " PROP=" << al.isProperPair() << endl; - //skip secondary alinments if(al->isSecondaryAlignment() || al->isSupplementaryAlignment()) continue; @@ -170,9 +168,7 @@ class ConcreteTool QByteArray name = al->name(); if (al_cache.contains(name)) { - QSharedPointer mate = al_cache.take(name); - //out << name << " [AL] First: " << al.isRead1() << " Reverse: " << al.isReverseStrand() << " Seq: " << al.QueryBases.data() << endl; - //out << name << " [MA] First: " << mate.isRead1() << " Reverse: " << mate.isReverseStrand() << " Seq: " << mate.QueryBases.data() << endl; + QSharedPointer mate = al_cache.take(name); ReadPair& pair = pair_pool.nextFreePair(); if (al->isRead1()) { @@ -207,25 +203,25 @@ class ConcreteTool //write debug output if(is_pe) { - out << "Pair reads (written) : " << c_paired << endl; - out << "Unpaired reads (skipped) : " << c_unpaired << endl; - out << "Unmatched paired reads (skipped): " << al_cache.size() << endl; + out << "Pair reads (written) : " << c_paired << QT_ENDL; + out << "Unpaired reads (skipped) : " << c_unpaired << QT_ENDL; + out << "Unmatched paired reads (skipped): " << al_cache.size() << QT_ENDL; } else //single-end { - out << "Reads (written) : " << c_single_end << endl; + out << "Reads (written) : " << c_single_end << QT_ENDL; } if (remove_duplicates) { - out << "Duplicate tagged reads (skipped): " << c_duplicates << endl; + out << "Duplicate tagged reads (skipped): " << c_duplicates << QT_ENDL; } if (fix) { - out << "Duplicate name reads (skipped) : " << c_fixed << endl; + out << "Duplicate name reads (skipped) : " << c_fixed << QT_ENDL; } - out << endl; - out << "Maximum cached reads : " << max_cached << endl; - out << "Time elapsed : " << Helper::elapsedTime(timer, true) << endl; + out << QT_ENDL; + out << "Maximum cached reads : " << max_cached << QT_ENDL; + out << "Time elapsed : " << Helper::elapsedTime(timer, true) << QT_ENDL; //terminate FASTQ writer after all reads are written pair_pool.waitAllWritten(); diff --git a/src/BedInfo/main.cpp b/src/BedInfo/main.cpp index f370b98e1..5c42b09fa 100644 --- a/src/BedInfo/main.cpp +++ b/src/BedInfo/main.cpp @@ -46,22 +46,22 @@ class ConcreteTool //output QSharedPointer outfile = Helper::openFileForWriting(getOutfile("out"), true); QTextStream out(outfile.data()); - out << filename << "Regions : " << stats.value("roi_fragments").toString() << endl; - out << filename << "Bases : " << stats.value("roi_bases").toString(0) << endl; - out << filename << "Chromosomes: " << stats.value("roi_chromosomes").toString() << endl; - out << filename << endl; - out << filename << "Is sorted : " << stats.value("roi_is_sorted").toString() << endl; - out << filename << "Is merged : " << stats.value("roi_is_merged").toString() << endl; - out << filename << endl; - out << filename << "Fragment size (min) : " << stats.value("roi_fragment_min").toString() << endl; - out << filename << "Fragment size (max) : " << stats.value("roi_fragment_max").toString() << endl; - out << filename << "Fragment size (mean) : " << stats.value("roi_fragment_mean").toString() << endl; - out << filename << "Fragment size (stdev): " << stats.value("roi_fragment_stdev").toString() << endl; + out << filename << "Regions : " << stats.value("roi_fragments").toString() << QT_ENDL; + out << filename << "Bases : " << stats.value("roi_bases").toString(0) << QT_ENDL; + out << filename << "Chromosomes: " << stats.value("roi_chromosomes").toString() << QT_ENDL; + out << filename << QT_ENDL; + out << filename << "Is sorted : " << stats.value("roi_is_sorted").toString() << QT_ENDL; + out << filename << "Is merged : " << stats.value("roi_is_merged").toString() << QT_ENDL; + out << filename << QT_ENDL; + out << filename << "Fragment size (min) : " << stats.value("roi_fragment_min").toString() << QT_ENDL; + out << filename << "Fragment size (max) : " << stats.value("roi_fragment_max").toString() << QT_ENDL; + out << filename << "Fragment size (mean) : " << stats.value("roi_fragment_mean").toString() << QT_ENDL; + out << filename << "Fragment size (stdev): " << stats.value("roi_fragment_stdev").toString() << QT_ENDL; //optional: check position bounds if (getInfile("fai")!="") { - out << filename << endl; + out << filename << QT_ENDL; //load maxima QMap max; @@ -86,7 +86,7 @@ class ConcreteTool } if (line.end()>max[line.chr().num()]) { - out << filename << "Warning: maximum position " << max[line.chr().num()] << " exceeded for region " << line.chr().str() << ":" << line.start() << "-" << line.end() << endl; + out << filename << "Warning: maximum position " << max[line.chr().num()] << " exceeded for region " << line.chr().str() << ":" << line.start() << "-" << line.end() << QT_ENDL; } } } diff --git a/src/BedLiftOver/main.cpp b/src/BedLiftOver/main.cpp index 6d6c5ee99..4b690d11a 100644 --- a/src/BedLiftOver/main.cpp +++ b/src/BedLiftOver/main.cpp @@ -148,16 +148,16 @@ class ConcreteTool // print statistics: QTextStream out(stdout); long long lifted_in_length = in_length - unlifted_in_length; - out << "LiftOver Statistics:" << endl; - out << "Input regions : " << in_count << endl; - out << "lifted : " << lifted_count << " (" << QString::number(100.0*lifted_count/in_count, 'f', 2) << "%)" << endl; - out << "unlifted : " << unlifted_count << " (" << QString::number(100.0*unlifted_count/in_count, 'f', 2) << "%)" << endl; - out << endl; - out << "Bases input: " << in_length << endl; - out << "lifted : " << lifted_in_length << " (" << QString::number(100.0*lifted_in_length/in_length, 'f', 2) << "%)" << endl; - out << "unlifted : " << unlifted_in_length << " (" << QString::number(100.0*unlifted_in_length/in_length, 'f', 2) << "%)" << endl; - out << endl; - out << "Bases after lifting: " << lifted_length << endl; + out << "LiftOver Statistics:" << QT_ENDL; + out << "Input regions : " << in_count << QT_ENDL; + out << "lifted : " << lifted_count << " (" << QString::number(100.0*lifted_count/in_count, 'f', 2) << "%)" << QT_ENDL; + out << "unlifted : " << unlifted_count << " (" << QString::number(100.0*unlifted_count/in_count, 'f', 2) << "%)" << QT_ENDL; + out << QT_ENDL; + out << "Bases input: " << in_length << QT_ENDL; + out << "lifted : " << lifted_in_length << " (" << QString::number(100.0*lifted_in_length/in_length, 'f', 2) << "%)" << QT_ENDL; + out << "unlifted : " << unlifted_in_length << " (" << QString::number(100.0*unlifted_in_length/in_length, 'f', 2) << "%)" << QT_ENDL; + out << QT_ENDL; + out << "Bases after lifting: " << lifted_length << QT_ENDL; } }; diff --git a/src/BedpeAnnotateCounts/main.cpp b/src/BedpeAnnotateCounts/main.cpp index 663a09e19..38ea19ea7 100644 --- a/src/BedpeAnnotateCounts/main.cpp +++ b/src/BedpeAnnotateCounts/main.cpp @@ -44,7 +44,7 @@ class ConcreteTool QTextStream out(stdout); // start timer - QTime timer; + QElapsedTimer timer; timer.start(); //load annotation files @@ -59,10 +59,10 @@ class ConcreteTool parseBedpeGzHead(QDir(ann_folder).filePath("sv_translocation.bedpe.gz").toUtf8(), processing_system); - out << " done. " << Helper::elapsedTime(timer) << endl; + out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; //load input file - out << "Start BEDPE annotation..." << endl; + out << "Start BEDPE annotation..." << QT_ENDL; BedpeFile bedpe_input_file; bedpe_input_file.load(input_filepath); @@ -218,7 +218,7 @@ class ConcreteTool output_buffer << sv.toTsv() << "\n"; } - out << "BEDPE annotation done. " << Helper::elapsedTime(timer) << endl; + out << "BEDPE annotation done. " << Helper::elapsedTime(timer) << QT_ENDL; //write buffer to file out << "write BEDPE output file..." ; @@ -231,7 +231,7 @@ class ConcreteTool output_file->write(line); } - out << " done. " << Helper::elapsedTime(timer) << endl; + out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; } diff --git a/src/BedpeGeneAnnotation/main.cpp b/src/BedpeGeneAnnotation/main.cpp index c372a0beb..7d4bb776f 100644 --- a/src/BedpeGeneAnnotation/main.cpp +++ b/src/BedpeGeneAnnotation/main.cpp @@ -46,7 +46,7 @@ class ConcreteTool QTextStream out(stdout); // start timer - QTime timer; + QElapsedTimer timer; timer.start(); //generate BED files for whole gene loci @@ -59,7 +59,7 @@ class ConcreteTool } gene_regions.sort(); ChromosomalIndex gene_regions_index(gene_regions); - out << "caching gene start/end finished (runtime: " << Helper::elapsedTime(timer) << ")" << endl; + out << "caching gene start/end finished (runtime: " << Helper::elapsedTime(timer) << ")" << QT_ENDL; timer.restart(); //cache gnomAD o/e LOF values @@ -76,7 +76,7 @@ class ConcreteTool gene_oe_lof[gene_name] = "n/a"; } } - out << "caching gnomAD o/e finished (runtime: " << Helper::elapsedTime(timer) << ")" << endl; + out << "caching gnomAD o/e finished (runtime: " << Helper::elapsedTime(timer) << ")" << QT_ENDL; timer.restart(); // open input file @@ -235,7 +235,7 @@ class ConcreteTool sv_output_file->close(); - out << "annotation complete (runtime: " << Helper::elapsedTime(timer) << ")." << endl; + out << "annotation complete (runtime: " << Helper::elapsedTime(timer) << ")." << QT_ENDL; } }; diff --git a/src/CalculatePRS/main.cpp b/src/CalculatePRS/main.cpp index e545ea075..b67164af6 100644 --- a/src/CalculatePRS/main.cpp +++ b/src/CalculatePRS/main.cpp @@ -127,7 +127,7 @@ class ConcreteTool //print final PRS - out << column_entries["pgs_id"] << ":\t" << prs << endl; + out << column_entries["pgs_id"] << ":\t" << prs << QT_ENDL; } diff --git a/src/CnvGeneAnnotation/main.cpp b/src/CnvGeneAnnotation/main.cpp index e6bb94fc1..043fc22e3 100644 --- a/src/CnvGeneAnnotation/main.cpp +++ b/src/CnvGeneAnnotation/main.cpp @@ -42,12 +42,12 @@ class ConcreteTool QTextStream out(stdout); // start timer - QTime timer; + QElapsedTimer timer; timer.start(); // generate whole gene BED file and index GeneSet gene_names = db.approvedGeneNames(); - out << "Getting gene regions from NGSD for " << gene_names.count() << " genes ..." << endl; + out << "Getting gene regions from NGSD for " << gene_names.count() << " genes ..." << QT_ENDL; BedFile gene_regions; foreach (const QByteArray& gene_name, gene_names) { @@ -55,10 +55,10 @@ class ConcreteTool } if (!gene_regions.isSorted()) gene_regions.sort(); ChromosomalIndex gene_regions_index(gene_regions); - out << "preprocessing done (runtime: " << Helper::elapsedTime(timer) << ")" << endl; + out << "preprocessing done (runtime: " << Helper::elapsedTime(timer) << ")" << QT_ENDL; timer.restart(); - out << "annotating CNV file..." << endl; + out << "annotating CNV file..." << QT_ENDL; // copy comments TSVFileStream cnv_input_file(getInfile("in")); @@ -146,7 +146,7 @@ class ConcreteTool output_buffer << tsv_line.join("\t"); } - out << "Writing output file..." << endl; + out << "Writing output file..." << QT_ENDL; // open output file and write annotated CNVs to file QSharedPointer cnv_output_file = Helper::openFileForWriting(getOutfile("out"), true); QTextStream output_stream(cnv_output_file.data()); @@ -158,7 +158,7 @@ class ConcreteTool output_stream.flush(); cnv_output_file->close(); - out << "annotation done (runtime: " << Helper::elapsedTime(timer) << ")." << endl; + out << "annotation done (runtime: " << Helper::elapsedTime(timer) << ")." << QT_ENDL; } private: bool use_test_db_; diff --git a/src/CnvReferenceCohort/main.cpp b/src/CnvReferenceCohort/main.cpp index e486f0fc0..e2974e036 100644 --- a/src/CnvReferenceCohort/main.cpp +++ b/src/CnvReferenceCohort/main.cpp @@ -250,7 +250,7 @@ class ConcreteTool virtual void main() { //init - QTime timer; + QElapsedTimer timer; QTextStream out(stdout); QString in = getInfile("in"); QStringList exclude_files = getInfileList("exclude"); @@ -269,12 +269,12 @@ class ConcreteTool } merged_excludes.merge(); timer.restart(); - if (debug) out << "merging excludes: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "merging excludes: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //Determine indices to use //load main sample and determine row indices for correlation computation QList main_file = parseGzFileBedFile(in); - if (debug) out << "loading main sample: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "loading main sample: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //compute ChromosomalIndex from merged excludes ChromosomalIndex exclude_idx(merged_excludes); @@ -305,7 +305,7 @@ class ConcreteTool //include the rest correct_indices.setBit(i, is_valid); } - if (debug) out << "computing used indices: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "computing used indices: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; QMap chr_indices; int row_count = 0; @@ -326,7 +326,7 @@ class ConcreteTool } } - if (debug) out << "calculating min/max indices of chromosomes: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "calculating min/max indices of chromosomes: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //Create coverage profile for main_file CoverageProfile cov1; @@ -338,7 +338,7 @@ class ConcreteTool cov1 << line.depth; } - if (debug) out << "creating coverage profile of main sample: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "creating coverage profile of main sample: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //Load other samples and calculate correlation QTime corr_timer; @@ -353,7 +353,7 @@ class ConcreteTool //load coverage profile for ref_file parseGzFileCovProfile(cov2, ref_file, correct_indices, main_file.size(), main_file); - if (debug) out << "loading coverage profile for " << QFileInfo(ref_file).fileName() << ": " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "loading coverage profile for " << QFileInfo(ref_file).fileName() << ": " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //calculate correlation between main_sample and current ref_file QVector corr; @@ -371,7 +371,7 @@ class ConcreteTool double median_correlation = 0.0; if (corr.count()>0) median_correlation = BasicStatistics::median(corr); file2corr << qMakePair(ref_file, median_correlation); - if (debug) out << "calculating correlation for " << QFileInfo(ref_file).fileName() << ": " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "calculating correlation for " << QFileInfo(ref_file).fileName() << ": " << Helper::elapsedTime(timer.restart()) << QT_ENDL; } //sort all reference files by descending correlation coefficent @@ -380,27 +380,27 @@ class ConcreteTool return a.second > b.second; }); - if (debug) out << "loading all coverage profiles and compute correlation: " << Helper::elapsedTime(corr_timer.restart()) << endl; + if (debug) out << "loading all coverage profiles and compute correlation: " << Helper::elapsedTime(corr_timer.restart()) << QT_ENDL; //write number of compared coverage files to stdout - out << "compared number of coverage files: " << file2corr.size() << endl; + out << "compared number of coverage files: " << file2corr.size() << QT_ENDL; //select best n reference files by correlation + compute mean correlation - out << "Selected the following files as reference samples based on correlation: " << endl; + out << "Selected the following files as reference samples based on correlation: " << QT_ENDL; QStringList best_ref_files; double mean_correaltion = 0.0; for (int i = 0; i= cov_max) break; } best_ref_files.sort(); mean_correaltion /= best_ref_files.size(); - out << "Mean correlation to reference samples is: " << mean_correaltion << endl; + out << "Mean correlation to reference samples is: " << mean_correaltion << QT_ENDL; - if (debug) out << "determining best reference samples and calculating mean correlation: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "determining best reference samples and calculating mean correlation: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //Merge coverage profiles and store them in a tsv file QSharedPointer outstream = Helper::openFileForWriting(getOutfile("out"), true); @@ -454,7 +454,7 @@ class ConcreteTool } outstream -> close(); - if (debug) out << "writing output: " << Helper::elapsedTime(timer.restart()) << endl; + if (debug) out << "writing output: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; } }; diff --git a/src/FastaFromBam/main.cpp b/src/FastaFromBam/main.cpp index e69a50862..eb92e862a 100644 --- a/src/FastaFromBam/main.cpp +++ b/src/FastaFromBam/main.cpp @@ -46,7 +46,7 @@ class ConcreteTool { line = line.trimmed(); if (!line.startsWith("@SQ")) continue; - out_stream << line << endl; + out_stream << line << QT_ENDL; QString name = ""; QString md5 = ""; @@ -68,7 +68,7 @@ class ConcreteTool if (name.isEmpty()) THROW(FileParseException, "Invalid @SQ line without name found: " + line) if (md5.isEmpty()) { - out_stream << "Skipped chromosome '" << name << "': @SQ line contains no M5 entry" << endl; + out_stream << "Skipped chromosome '" << name << "': @SQ line contains no M5 entry" << QT_ENDL; continue; } @@ -84,7 +84,7 @@ class ConcreteTool } catch (Exception& e) { - out_stream << "Skipped chromosome '" << name << "': could not download " << url << endl; + out_stream << "Skipped chromosome '" << name << "': could not download " << url << QT_ENDL; } } } diff --git a/src/FastaInfo/main.cpp b/src/FastaInfo/main.cpp index f9707a2b1..4faba86f3 100644 --- a/src/FastaInfo/main.cpp +++ b/src/FastaInfo/main.cpp @@ -115,22 +115,22 @@ class ConcreteTool //output summary QSharedPointer outfile = Helper::openFileForWriting(getOutfile("out"), true); QTextStream stream(outfile.data()); - stream << "== general info ==" << endl; - stream << "sequences : " << counts.count() << endl; + stream << "== general info ==" << QT_ENDL; + stream << "sequences : " << counts.count() << QT_ENDL; long long sum = 0; foreach(const Counts& counts, counts) { sum += counts.all(); } - stream << "characters: " << sum << endl; - stream << endl; + stream << "characters: " << sum << QT_ENDL; + stream << QT_ENDL; //output details - stream << "== characters per sequence ==" << endl; + stream << "== characters per sequence ==" << QT_ENDL; foreach(const QByteArray& sequence, order) { const Counts& c = counts[sequence]; - stream << sequence << ": " << c.all() << " (ACGT:" << c.acgt << " N:" << c.n << " other:" << c.other << ")" << endl; + stream << sequence << ": " << c.all() << " (ACGT:" << c.acgt << " N:" << c.n << " other:" << c.other << ")" << QT_ENDL; } //write BED files diff --git a/src/FastqCheckUMI/main.cpp b/src/FastqCheckUMI/main.cpp index b3810145e..f2337641e 100644 --- a/src/FastqCheckUMI/main.cpp +++ b/src/FastqCheckUMI/main.cpp @@ -73,12 +73,12 @@ class ConcreteTool } - if(barcode_info.size() > 1) THROW(FileParseException, "ERROR: FastQ reads contain multiple UMI types!\n\t" + barcode_info.toList().join("\n\t")); + if(barcode_info.size() > 1) THROW(FileParseException, "ERROR: FastQ reads contain multiple UMI types!\n\t" + barcode_info.values().join("\n\t")); //output QSharedPointer outfile = Helper::openFileForWriting(getOutfile("out"), true); QTextStream out(outfile.data()); - out << barcode_info.toList().first() << endl; + out << barcode_info.values().first() << QT_ENDL; } bool isValidSequence(QByteArray barcode, int& length) diff --git a/src/FastqDownsample/main.cpp b/src/FastqDownsample/main.cpp index db159ae2c..29bc48189 100644 --- a/src/FastqDownsample/main.cpp +++ b/src/FastqDownsample/main.cpp @@ -66,7 +66,7 @@ class ConcreteTool os1.write(read1); os2.write(read2); ++c_passed; - if (test) out << "KEPT PAIR: " << read1.header << endl; + if (test) out << "KEPT PAIR: " << read1.header << QT_ENDL; } } @@ -81,8 +81,8 @@ class ConcreteTool } //write debug output - out << "PE reads read : " << c_read_pairs << endl; - out << "PE reads written: " << c_passed << endl; + out << "PE reads read : " << c_read_pairs << QT_ENDL; + out << "PE reads written: " << c_passed << QT_ENDL; } }; diff --git a/src/FastqMidParser/main.cpp b/src/FastqMidParser/main.cpp index 87c118819..4cbbf1694 100644 --- a/src/FastqMidParser/main.cpp +++ b/src/FastqMidParser/main.cpp @@ -92,7 +92,7 @@ class ConcreteTool } //create a sorted and unique list of values in the map - QList values = QList::fromSet(counts.values().toSet()); + QList values = QList::fromSet(counts.values().toSet()); std::sort(values.begin(), values.end(), std::greater()); //print list ordered by counts @@ -106,7 +106,7 @@ class ConcreteTool { if (sheet.count()==0) { - out << key << "\t" << value << endl; + out << key << "\t" << value << QT_ENDL; } else { @@ -127,7 +127,7 @@ class ConcreteTool } } - out << key << "\t" << value << "\t(nearest=" << min_dist_entry.mid << " name=" << min_dist_entry.name << " dist=" << min_dist_diff.count() << " diff_indices=" << min_dist_diff.join(',') << ")" << endl; + out << key << "\t" << value << "\t(nearest=" << min_dist_entry.mid << " name=" << min_dist_entry.name << " dist=" << min_dist_diff.count() << " diff_indices=" << min_dist_diff.join(',') << ")" << QT_ENDL; } //abort when the maximum number of MIDs is reached diff --git a/src/GSvar/AnalysisInformationWidget.cpp b/src/GSvar/AnalysisInformationWidget.cpp index 41e7eff52..0d3b0af65 100644 --- a/src/GSvar/AnalysisInformationWidget.cpp +++ b/src/GSvar/AnalysisInformationWidget.cpp @@ -69,7 +69,7 @@ void AnalysisInformationWidget::updateGUI() FileLocation file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::BAM); ui_.table->setItem(0, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(0, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(0,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(0,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { BamReader reader(file.filename); @@ -79,7 +79,7 @@ void AnalysisInformationWidget::updateGUI() if (build!=GSvarHelper::build()) { ui_.table->item(0,1)->setText(ui_.table->item(0,1)->text() + " (" + buildToString(build) + ")"); - ui_.table->item(0,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(0,1)->setForeground(QBrush(QColor(Qt::red))); } } catch(...) {} //do nothing (genome build could not be determined) @@ -92,7 +92,7 @@ void AnalysisInformationWidget::updateGUI() file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::GSVAR); ui_.table->setItem(1, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(1, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(1,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(1,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { VariantList vl; @@ -100,7 +100,7 @@ void AnalysisInformationWidget::updateGUI() if (vl.build()!=GSvarHelper::build()) { ui_.table->item(1,1)->setText(ui_.table->item(1,1)->text() + " (" + buildToString(vl.build()) + ")"); - ui_.table->item(1,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(1,1)->setForeground(QBrush(QColor(Qt::red))); } } ui_.table->setItem(1, 2, GUIHelper::createTableItem(QString::number(import_status.small_variants) + " small variants" + rcData(db, "report_configuration_variant", rc_id))); @@ -113,7 +113,7 @@ void AnalysisInformationWidget::updateGUI() file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::COPY_NUMBER_CALLS); ui_.table->setItem(2, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(2, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(2,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(2,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { CnvList cnvs; @@ -122,7 +122,7 @@ void AnalysisInformationWidget::updateGUI() if (genome!="" && stringToBuild(genome)!=GSvarHelper::build()) { ui_.table->item(1,1)->setText(ui_.table->item(1,1)->text() + " (" + genome + ")"); - ui_.table->item(1,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(1,1)->setForeground(QBrush(QColor(Qt::red))); } } ui_.table->setItem(2, 2, GUIHelper::createTableItem(QString::number(import_status.cnvs) + " CNVs" + rcData(db, "report_configuration_cnv", rc_id))); @@ -134,7 +134,7 @@ void AnalysisInformationWidget::updateGUI() file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::STRUCTURAL_VARIANTS); ui_.table->setItem(3, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(3, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(3,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(3,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { BedpeFile bedpe; @@ -143,7 +143,7 @@ void AnalysisInformationWidget::updateGUI() if (genome!="" && stringToBuild(genome)!=GSvarHelper::build()) { ui_.table->item(3,1)->setText(ui_.table->item(3,1)->text() + " (" + genome + ")"); - ui_.table->item(3,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(3,1)->setForeground(QBrush(QColor(Qt::red))); } } ui_.table->setItem(3, 2, GUIHelper::createTableItem(QString::number(import_status.svs) + " SVs" + rcData(db, "report_configuration_sv", rc_id))); @@ -155,7 +155,7 @@ void AnalysisInformationWidget::updateGUI() file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::REPEAT_EXPANSIONS); ui_.table->setItem(4, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(4, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(4,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(4,1)->setForeground(QBrush(QColor(Qt::red))); ui_.table->setItem(4, 2, GUIHelper::createTableItem(QString::number(import_status.res) + " REs" + rcData(db, "report_configuration_re", rc_id))); ui_.table->setItem(4, 3, GUIHelper::createTableItem(call_info.re_call_date)); ui_.table->setItem(4, 4, GUIHelper::createTableItem(call_info.re_caller + " " + call_info.re_caller_version)); @@ -169,7 +169,7 @@ void AnalysisInformationWidget::updateGUI() FileLocation file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::BAM); ui_.table->setItem(0, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(0, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(0,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(0,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { BamReader reader(file.filename); @@ -179,7 +179,7 @@ void AnalysisInformationWidget::updateGUI() if (build!=GSvarHelper::build()) { ui_.table->item(0,1)->setText(ui_.table->item(0,1)->text() + " (" + buildToString(build) + ")"); - ui_.table->item(0,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(0,1)->setForeground(QBrush(QColor(Qt::red))); } } catch(...) {} //do nothing (genome build could not be determined) @@ -190,25 +190,25 @@ void AnalysisInformationWidget::updateGUI() file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::COUNTS); ui_.table->setItem(1, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(1, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(1,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(1,1)->setForeground(QBrush(QColor(Qt::red))); //expression file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::EXPRESSION); ui_.table->setItem(2, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(2, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(2,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(2,1)->setForeground(QBrush(QColor(Qt::red))); //fusions file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::FUSIONS); ui_.table->setItem(3, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(3, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(3,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(3,1)->setForeground(QBrush(QColor(Qt::red))); //splicing info file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::SPLICING_BED); ui_.table->setItem(4, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(4, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(4,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(4,1)->setForeground(QBrush(QColor(Qt::red))); } else if(sample_data.type.startsWith("cfDNA")) { @@ -218,7 +218,7 @@ void AnalysisInformationWidget::updateGUI() FileLocation file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::BAM); ui_.table->setItem(0, 0, GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(0, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(0,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(0,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { BamReader reader(file.filename); @@ -228,7 +228,7 @@ void AnalysisInformationWidget::updateGUI() if (build!=GSvarHelper::build()) { ui_.table->item(0,1)->setText(ui_.table->item(0,1)->text() + " (" + buildToString(build) + ")"); - ui_.table->item(0,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(0,1)->setForeground(QBrush(QColor(Qt::red))); } } catch(...) {} //do nothing (genome build could not be determined) @@ -239,7 +239,7 @@ void AnalysisInformationWidget::updateGUI() file = GlobalServiceProvider::database().processedSamplePath(ps_id_, PathType::GSVAR); ui_.table->setItem(1, 0,GUIHelper::createTableItem(file.fileName())); ui_.table->setItem(1, 1, GUIHelper::createTableItem(file.exists ? "yes" : "no")); - if (!file.exists) ui_.table->item(1,1)->setTextColor(QColor(Qt::red)); + if (!file.exists) ui_.table->item(1,1)->setForeground(QBrush(QColor(Qt::red))); if (file.exists && sample_data.species=="human") { VariantList vl; @@ -247,7 +247,7 @@ void AnalysisInformationWidget::updateGUI() if (vl.build()!=GSvarHelper::build()) { ui_.table->item(1,1)->setText(ui_.table->item(1,1)->text() + " (" + buildToString(vl.build()) + ")"); - ui_.table->item(1,1)->setTextColor(QColor(Qt::red)); + ui_.table->item(1,1)->setForeground(QBrush(QColor(Qt::red))); } } ui_.table->setItem(1, 2, GUIHelper::createTableItem("")); diff --git a/src/GSvar/AnalysisStatusWidget.cpp b/src/GSvar/AnalysisStatusWidget.cpp index 2f40c969d..2d9e920a0 100644 --- a/src/GSvar/AnalysisStatusWidget.cpp +++ b/src/GSvar/AnalysisStatusWidget.cpp @@ -85,7 +85,7 @@ void AnalysisStatusWidget::refreshStatus() try { - QTime timer; + QElapsedTimer timer; timer.start(); //query job IDs @@ -126,7 +126,7 @@ void AnalysisStatusWidget::refreshStatus() if (repeated && !ui_.f_repeated->isChecked()) continue; //filter date - QDateTime f_date = QDateTime(ui_.f_date->date()); + QDateTime f_date = QDateTime(ui_.f_date->date(), QTime(0, 0, 0)); if (job.history.count()==0) { qDebug() << "No history for job " << job_id; @@ -702,7 +702,7 @@ QTableWidgetItem* AnalysisStatusWidget::addItem(QTableWidget* table, int row, in QTableWidgetItem* item = new QTableWidgetItem(text); item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); - item->setBackgroundColor(bg_color); + item->setBackground(QBrush(QColor(bg_color))); table->setItem(row, col, item); return item; diff --git a/src/GSvar/Background/BackgroundJobDialog.cpp b/src/GSvar/Background/BackgroundJobDialog.cpp index 4ee46a70f..acb1cae03 100644 --- a/src/GSvar/Background/BackgroundJobDialog.cpp +++ b/src/GSvar/Background/BackgroundJobDialog.cpp @@ -156,10 +156,10 @@ void BackgroundJobDialog::updateTable(int id) ui_.jobs->setItem(r, 1, GUIHelper::createTableItem(job_info.started.toString(Qt::ISODate).replace('T', ' '))); QTableWidgetItem* item = GUIHelper::createTableItem(job_info.status); - if (job_info.status=="queued") item->setBackgroundColor(Qt::lightGray); - else if (job_info.status=="started") item->setBackgroundColor("#90EE90"); - else if (job_info.status=="finished") item->setBackgroundColor("#44BB44"); - else if (job_info.status=="failed") item->setBackgroundColor("#FF0000"); + if (job_info.status=="queued") item->setBackground(QBrush(QColor(Qt::lightGray))); + else if (job_info.status=="started") item->setBackground(QBrush(QColor("#90EE90"))); + else if (job_info.status=="finished") item->setBackground(QBrush(QColor("#44BB44"))); + else if (job_info.status=="failed") item->setBackground(QBrush(QColor("#FF0000"))); ui_.jobs->setItem(r, 2, item); diff --git a/src/GSvar/Background/BackgroundWorkerBase.cpp b/src/GSvar/Background/BackgroundWorkerBase.cpp index 457f05dde..637875b49 100644 --- a/src/GSvar/Background/BackgroundWorkerBase.cpp +++ b/src/GSvar/Background/BackgroundWorkerBase.cpp @@ -1,6 +1,6 @@ #include "BackgroundWorkerBase.h" #include "Exceptions.h" -#include +#include BackgroundWorkerBase::BackgroundWorkerBase(QString name) : QObject() @@ -38,7 +38,7 @@ const QString& BackgroundWorkerBase::error() const void BackgroundWorkerBase::run() { - QTime timer; + QElapsedTimer timer; timer.start(); try diff --git a/src/GSvar/BurdenTestWidget.cpp b/src/GSvar/BurdenTestWidget.cpp index c7b21c71d..4236d6184 100644 --- a/src/GSvar/BurdenTestWidget.cpp +++ b/src/GSvar/BurdenTestWidget.cpp @@ -116,11 +116,11 @@ void BurdenTestWidget::loadGeneList() selected_genes = db_.genesToApproved(selected_genes, true); GeneSet approved_genes = db_.genesToApproved(selected_genes, false); - QSet invalid_genes = selected_genes.toSet() - approved_genes.toSet(); + QSet invalid_genes = selected_genes.toSet() - approved_genes.toSet(); if (invalid_genes.size() > 0) { - QMessageBox::warning(this, "Invalid genes", "The following genes couldn't be converted into approved gene names and were removed:\n" + invalid_genes.toList().join(", ")); + QMessageBox::warning(this, "Invalid genes", "The following genes couldn't be converted into approved gene names and were removed:\n" + invalid_genes.values().join(", ")); } //apply new gene set @@ -265,7 +265,7 @@ void BurdenTestWidget::validateInputData() } // check overlap (samples) - overlap = sample_ids_cases.keys().toSet() & sample_ids_controls.keys().toSet(); + overlap = LIST_TO_SET(sample_ids_cases.keys()) & LIST_TO_SET(sample_ids_controls.keys()); if(overlap.size() > 0) { QStringList sample_names; @@ -289,7 +289,7 @@ void BurdenTestWidget::validateInputData() { if(sample_ids_cases.value(s_id).size() > 1) { - QSet ps_ids = sample_ids_cases.value(s_id).toSet(); + QSet ps_ids = LIST_TO_SET(sample_ids_cases.value(s_id)); QStringList ps_list; foreach (int id, ps_ids) ps_list << db_.processedSampleName(QString::number(id)); int ps_id = getNewestProcessedSample(ps_ids); @@ -307,7 +307,7 @@ void BurdenTestWidget::validateInputData() { if(sample_ids_controls.value(s_id).size() > 1) { - QSet ps_ids = sample_ids_controls.value(s_id).toSet(); + QSet ps_ids = LIST_TO_SET(sample_ids_controls.value(s_id)); QStringList ps_list; foreach (int id, ps_ids) ps_list << db_.processedSampleName(QString::number(id)); int ps_id = getNewestProcessedSample(ps_ids); @@ -333,7 +333,7 @@ void BurdenTestWidget::validateInputData() QSet same_samples = db_.sameSamples(s_id, SameSampleMode::SAME_PATIENT); //add sample itself same_samples.insert(s_id); - QSet same_sample_overlap = same_samples & sample_ids_cases.keys().toSet(); + QSet same_sample_overlap = same_samples & LIST_TO_SET(sample_ids_cases.keys()); if (same_sample_overlap.size() > 1) { QStringList same_sample_list; @@ -347,7 +347,7 @@ void BurdenTestWidget::validateInputData() warning_table.append(QStringList() << db_.sampleName(QString::number(s_id)) << "cases" << "same-sample/same-patient relation" << same_sample_list.join(", ") << db_.sampleName(QString::number(newest_s_id))); } //check controls and remove all overlaps - same_sample_overlap = same_samples & sample_ids_controls.keys().toSet(); + same_sample_overlap = same_samples & LIST_TO_SET(sample_ids_controls.keys()); if (same_sample_overlap.size() > 0) { QStringList same_sample_list; @@ -381,7 +381,7 @@ void BurdenTestWidget::validateInputData() QSet same_samples = db_.sameSamples(s_id, SameSampleMode::SAME_PATIENT); //add sample itself same_samples.insert(s_id); - QSet same_sample_overlap = same_samples & sample_ids_controls.keys().toSet(); + QSet same_sample_overlap = same_samples & LIST_TO_SET(sample_ids_controls.keys()); if (same_sample_overlap.size() > 1) { //add sample itself @@ -415,7 +415,7 @@ void BurdenTestWidget::validateInputData() stati_to_remove << "Unaffected" << "n/a"; foreach (const QString& relation, relation_types) { - QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & sample_ids_cases.keys().toSet(); + QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & LIST_TO_SET(sample_ids_cases.keys()); if (related_sample_overlap.size() > 1) { QStringList related_sample_list; @@ -442,7 +442,7 @@ void BurdenTestWidget::validateInputData() } //check/remove related samples from controls - related_sample_overlap = db_.relatedSamples(s_id, relation) & sample_ids_controls.keys().toSet(); + related_sample_overlap = db_.relatedSamples(s_id, relation) & LIST_TO_SET(sample_ids_controls.keys()); if (related_sample_overlap.size() > 1) { QStringList related_sample_list; @@ -478,7 +478,7 @@ void BurdenTestWidget::validateInputData() stati_to_remove << "Affected"; foreach (const QString& relation, relation_types) { - QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & sample_ids_controls.keys().toSet(); + QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & LIST_TO_SET(sample_ids_controls.keys()); if (related_sample_overlap.size() > 1) { QStringList related_sample_list; @@ -513,8 +513,8 @@ void BurdenTestWidget::validateInputData() - if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple processing systems (" + processing_systems.toList().join(", ")+ ")!"; - if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple ancestries (" + ancestry.toList().join(", ")+ ")!"; + if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple processing systems (" + processing_systems.values().join(", ")+ ")!"; + if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple ancestries (" + ancestry.values().join(", ")+ ")!"; else @@ -577,11 +577,11 @@ void BurdenTestWidget::validateInputData() QSet control_samples_to_keep; foreach(int s_id, sample_ids_cases.keys()) { - case_samples_to_keep += sample_ids_cases.value(s_id).toSet(); + case_samples_to_keep += LIST_TO_SET(sample_ids_cases.value(s_id)); } foreach(int s_id, sample_ids_controls.keys()) { - control_samples_to_keep += sample_ids_controls.value(s_id).toSet(); + control_samples_to_keep += LIST_TO_SET(sample_ids_controls.value(s_id)); } QSet case_samples_to_remove = case_samples_.subtract(case_samples_to_keep); @@ -894,7 +894,7 @@ void BurdenTestWidget::performBurdenTest() bool include_cnvs = ui_->cb_include_cnvs->isChecked(); - QTime timer; + QElapsedTimer timer; timer.start(); //delete old table and disable sorting @@ -1048,7 +1048,7 @@ void BurdenTestWidget::performBurdenTest() } //new method - QTime tmp_timer; + QElapsedTimer tmp_timer; tmp_timer.start(); //get all variants for this gene QSet variant_ids = getVariantsForRegion(max_ngsd, max_gnomad_af, gene_regions, gene_name, impacts, predict_pathogenic); @@ -1106,8 +1106,8 @@ void BurdenTestWidget::performBurdenTest() std::sort(ps_names_controls_cnv.begin(), ps_names_controls_cnv.end()); //get combined counts - int n_cases_combined = (ps_names_cases.toSet() + ps_names_cases_cnv.toSet()).size(); - int n_controls_combined = (ps_names_controls.toSet() + ps_names_controls_cnv.toSet()).size(); + int n_cases_combined = (LIST_TO_SET(ps_names_cases) + LIST_TO_SET(ps_names_cases_cnv)).size(); + int n_controls_combined = (LIST_TO_SET(ps_names_controls) + LIST_TO_SET(ps_names_controls_cnv)).size(); //calculate p-value (fisher) (SNPs only) p_value = BasicStatistics::fishersExactTest(n_cases_combined, n_controls_combined, case_samples_.size(), control_samples_.size(), "greater"); @@ -1330,7 +1330,7 @@ int BurdenTestWidget::countOccurences(const QSet& variant_ids, const QSet de_novo_var_ids = db_.getValuesInt("SELECT variant_id FROM report_configuration_variant WHERE de_novo=TRUE AND report_configuration_id=:0", QString::number(rc_id)).toSet(); + QSet de_novo_var_ids = LIST_TO_SET(db_.getValuesInt("SELECT variant_id FROM report_configuration_variant WHERE de_novo=TRUE AND report_configuration_id=:0", QString::number(rc_id))); intersection = intersection.intersect(de_novo_var_ids); //no de-novo variants @@ -1338,7 +1338,7 @@ int BurdenTestWidget::countOccurences(const QSet& variant_ids, const QSettw_import_table->item(row_idx, 0)->setBackgroundColor(bg_white); + ui_->tw_import_table->item(row_idx, 0)->setBackground(QBrush(QColor(bg_white))); ui_->tw_import_table->item(row_idx, 0)->setToolTip(""); } @@ -112,12 +112,12 @@ void CfDNAPanelBatchImport::validateTable() { valid = false; db_entries_valid = false; - ui_->tw_import_table->item(row_idx, 0)->setBackgroundColor(bg_red); + ui_->tw_import_table->item(row_idx, 0)->setBackground(QBrush(QColor(bg_red))); ui_->tw_import_table->item(row_idx, 0)->setToolTip("Processed sample '" + ps_name + "' is not a tumor sample!"); } else { - ui_->tw_import_table->item(row_idx, 0)->setBackgroundColor(bg_white); + ui_->tw_import_table->item(row_idx, 0)->setBackground(QBrush(QColor(bg_white))); ui_->tw_import_table->item(row_idx, 0)->setToolTip(""); } @@ -127,12 +127,12 @@ void CfDNAPanelBatchImport::validateTable() { valid = false; db_entries_valid = false; - ui_->tw_import_table->item(row_idx, 1)->setBackgroundColor(bg_red); + ui_->tw_import_table->item(row_idx, 1)->setBackground(QBrush(QColor(bg_red))); ui_->tw_import_table->item(row_idx, 1)->setToolTip("Processing system not found in NGSD!"); } else { - ui_->tw_import_table->item(row_idx, 1)->setBackgroundColor(bg_white); + ui_->tw_import_table->item(row_idx, 1)->setBackground(QBrush(QColor(bg_white))); ui_->tw_import_table->item(row_idx, 1)->setToolTip(""); } @@ -140,13 +140,13 @@ void CfDNAPanelBatchImport::validateTable() if (!QFile::exists(ui_->tw_import_table->item(row_idx, 2)->text())) { valid = false; - ui_->tw_import_table->item(row_idx, 2)->setBackgroundColor(bg_red); + ui_->tw_import_table->item(row_idx, 2)->setBackground(QBrush(QColor(bg_red))); ui_->tw_import_table->item(row_idx, 2)->setToolTip("File does not exist!"); } else { ui_->tw_import_table->item(row_idx, 2)->setToolTip(ui_->tw_import_table->item(row_idx, 2)->text()); - ui_->tw_import_table->item(row_idx, 2)->setBackgroundColor(bg_white); + ui_->tw_import_table->item(row_idx, 2)->setBackground(QBrush(QColor(bg_white))); } //check for already existing panels @@ -155,9 +155,9 @@ void CfDNAPanelBatchImport::validateTable() QList existing_panel = db_.cfdnaPanelInfo(ps_id, sys_id); if (existing_panel.size() > 0) { - ui_->tw_import_table->item(row_idx, 0)->setBackgroundColor(bg_orange); + ui_->tw_import_table->item(row_idx, 0)->setBackground(QBrush(QColor(bg_orange))); ui_->tw_import_table->item(row_idx, 0)->setToolTip("A cfDNA panel with this sample - processing system combination already exists!"); - ui_->tw_import_table->item(row_idx, 1)->setBackgroundColor(bg_orange); + ui_->tw_import_table->item(row_idx, 1)->setBackground(QBrush(QColor(bg_orange))); ui_->tw_import_table->item(row_idx, 1)->setToolTip("A cfDNA panel with this sample - processing system combination already exists!"); // invalid if overwrite is not checked @@ -165,9 +165,9 @@ void CfDNAPanelBatchImport::validateTable() } else { - ui_->tw_import_table->item(row_idx, 0)->setBackgroundColor(bg_white); + ui_->tw_import_table->item(row_idx, 0)->setBackground(QBrush(QColor(bg_white))); ui_->tw_import_table->item(row_idx, 0)->setToolTip(""); - ui_->tw_import_table->item(row_idx, 1)->setBackgroundColor(bg_white); + ui_->tw_import_table->item(row_idx, 1)->setBackground(QBrush(QColor(bg_white))); ui_->tw_import_table->item(row_idx, 1)->setToolTip(""); } } diff --git a/src/GSvar/CnvSearchWidget.cpp b/src/GSvar/CnvSearchWidget.cpp index 0eb85a5d2..5d393a4df 100644 --- a/src/GSvar/CnvSearchWidget.cpp +++ b/src/GSvar/CnvSearchWidget.cpp @@ -84,7 +84,7 @@ void CnvSearchWidget::search() { // parse genes GeneSet genes; - foreach (const QString& gene, ui_.le_genes->text().replace(";", " ").replace(",", "").split(QRegularExpression("\\W+"), QString::SkipEmptyParts)) + foreach (const QString& gene, ui_.le_genes->text().replace(";", " ").replace(",", "").split(QRegularExpression("\\W+"), QT_SKIP_EMPTY_PARTS)) { QByteArray approved_gene_name = db_.geneToApproved(gene.toUtf8()); if (approved_gene_name == "") THROW(ArgumentException, "Invalid gene name '" + gene + "' given!"); @@ -335,7 +335,7 @@ void CnvSearchWidget::changeSearchType() void CnvSearchWidget::openSelectedSampleTabs() { int col = ui_.table->columnIndex("sample"); - foreach (int row, ui_.table->selectedRows().toList()) + foreach (int row, ui_.table->selectedRows().values()) { QString ps = ui_.table->item(row, col)->text(); GlobalServiceProvider::openProcessedSampleTab(ps); diff --git a/src/GSvar/CnvWidget.cpp b/src/GSvar/CnvWidget.cpp index c8b55bb64..591ea547d 100644 --- a/src/GSvar/CnvWidget.cpp +++ b/src/GSvar/CnvWidget.cpp @@ -279,8 +279,8 @@ void CnvWidget::updateGUI() //get report variant indices QSet report_variant_indices; - if(!is_somatic_) report_variant_indices = report_config_->variantIndices(VariantType::CNVS, false).toSet(); - else report_variant_indices = somatic_report_config_->variantIndices(VariantType::CNVS, false).toSet(); + if(!is_somatic_) report_variant_indices = LIST_TO_SET(report_config_->variantIndices(VariantType::CNVS, false)); + else report_variant_indices = LIST_TO_SET(somatic_report_config_->variantIndices(VariantType::CNVS, false)); //show variants @@ -351,7 +351,7 @@ void CnvWidget::applyFilters(bool debug_time) try { - QTime timer; + QElapsedTimer timer; timer.start(); //apply main filter diff --git a/src/GSvar/CohortAnalysisWidget.cpp b/src/GSvar/CohortAnalysisWidget.cpp index cd7ab1ca9..d694a5b70 100644 --- a/src/GSvar/CohortAnalysisWidget.cpp +++ b/src/GSvar/CohortAnalysisWidget.cpp @@ -159,7 +159,7 @@ void CohortAnalysisWidget::updateOutputTable() } } ui_.output->setSortingEnabled(true); - ui_.output->sortByColumn(1); + ui_.output->sortByColumn(1, ui_.output->horizontalHeader()->sortIndicatorOrder()); GUIHelper::resizeTableCellWidths(ui_.output, 400); GUIHelper::resizeTableCellHeightsToFirst(ui_.output); diff --git a/src/GSvar/DBQCWidget.cpp b/src/GSvar/DBQCWidget.cpp index 46401e11e..b27c1f004 100644 --- a/src/GSvar/DBQCWidget.cpp +++ b/src/GSvar/DBQCWidget.cpp @@ -426,7 +426,7 @@ void DBQCWidget::updatePlot() if (!datetime.isValid()) //date can be null { if (!all_dates_unset) continue; //skip data points without date - datetime = QDateTime(QDate(2000, 1, 1)); + datetime.setDate(QDate(2000, 1, 1)); } value2 = datetime.toMSecsSinceEpoch(); } diff --git a/src/GSvar/DBTableAdministration.cpp b/src/GSvar/DBTableAdministration.cpp index ed7ebef0d..ee67bd31a 100644 --- a/src/GSvar/DBTableAdministration.cpp +++ b/src/GSvar/DBTableAdministration.cpp @@ -126,7 +126,7 @@ void DBTableAdministration::edit() } - edit(rows.toList().first()); + edit(rows.values().first()); } void DBTableAdministration::edit(int row) @@ -246,7 +246,7 @@ void DBTableAdministration::resetUserPassword() } //set password - int user_id = ui_.table->getId(rows.toList().first()).toInt(); + int user_id = ui_.table->getId(rows.values().first()).toInt(); QString password = Helper::randomString(15) + Helper::randomString(1, "0123456789"); NGSD db; db.setPassword(user_id, password); @@ -284,7 +284,7 @@ void DBTableAdministration::importStudySamples() QApplication::setOverrideCursor(Qt::BusyCursor); //get study ID and name - int study_id = ui_.table->getId(rows.toList().first()).toInt(); + int study_id = ui_.table->getId(rows.values().first()).toInt(); NGSD db; QString study = db.getValue("SELECT name FROM study WHERE id='"+QString::number(study_id)+"'", false).toString(); diff --git a/src/GSvar/DBTableWidget.cpp b/src/GSvar/DBTableWidget.cpp index 23d06262d..c3c673f4b 100644 --- a/src/GSvar/DBTableWidget.cpp +++ b/src/GSvar/DBTableWidget.cpp @@ -1,6 +1,7 @@ #include "DBTableWidget.h" #include "Exceptions.h" #include "GUIHelper.h" +#include "NGSHelper.h" #include #include @@ -164,7 +165,7 @@ void DBTableWidget::setColumnColors(const QString& column_header, const QListsetBackgroundColor(color); + table_item->setBackground(QBrush(QColor(color))); } } @@ -202,12 +203,12 @@ void DBTableWidget::showTextAsTooltip(const QString& column_header) QSet DBTableWidget::selectedRows() const { - return GUIHelper::selectedTableRows(this).toSet(); + return LIST_TO_SET(GUIHelper::selectedTableRows(this)); } QSet DBTableWidget::selectedColumns() const { - return GUIHelper::selectedTableColumns(this).toSet(); + return LIST_TO_SET(GUIHelper::selectedTableColumns(this)); } const QString& DBTableWidget::getId(int r) const diff --git a/src/GSvar/DBTableWidget.h b/src/GSvar/DBTableWidget.h index 375c4f13a..a62ce3fe2 100644 --- a/src/GSvar/DBTableWidget.h +++ b/src/GSvar/DBTableWidget.h @@ -48,7 +48,7 @@ class DBTableWidget if (predicate(table_item->text())) { - table_item->setBackgroundColor(color); + table_item->setBackground(QBrush(QColor(color))); } } } diff --git a/src/GSvar/ExpressionExonWidget.cpp b/src/GSvar/ExpressionExonWidget.cpp index 7738185f8..fc6a84a37 100644 --- a/src/GSvar/ExpressionExonWidget.cpp +++ b/src/GSvar/ExpressionExonWidget.cpp @@ -65,7 +65,7 @@ void ExpressionExonWidget::loadExpressionFile() try { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //load TSV file @@ -142,7 +142,7 @@ void ExpressionExonWidget::initTable() { QApplication::setOverrideCursor(Qt::BusyCursor); ui_->tw_expression_table->setEnabled(false); - QTime timer; + QElapsedTimer timer; timer.start(); column_names_.clear(); @@ -195,9 +195,11 @@ void ExpressionExonWidget::applyFilters() ui_->tw_expression_table->setEnabled(false); filter_result_.reset(true); - int filtered_lines = expression_data_.count(); - QTime timer; + //debug: + //int filtered_lines = expression_data_.count(); + + QElapsedTimer timer; timer.start(); @@ -227,7 +229,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } //filter by genes @@ -277,7 +279,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } } @@ -322,7 +324,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } //filter by srpb value @@ -364,7 +366,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } //filter by biotype @@ -400,7 +402,7 @@ void ExpressionExonWidget::applyFilters() //debug: ///qDebug() << "\t removed (file based): " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); //filter by statistical data @@ -495,7 +497,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } //filter by log2fc @@ -537,7 +539,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } //filter by zscore @@ -579,7 +581,7 @@ void ExpressionExonWidget::applyFilters() //debug: //qDebug() << "\t removed: " << (filtered_lines - filter_result_.countPassing()) << Helper::elapsedTime(timer); - filtered_lines = filter_result_.countPassing(); + //filtered_lines = filter_result_.countPassing(); } @@ -704,7 +706,7 @@ void ExpressionExonWidget::updateTable() { //fill table widget with expression data QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //disable sorting diff --git a/src/GSvar/ExpressionGeneWidget.cpp b/src/GSvar/ExpressionGeneWidget.cpp index 59ae2a162..718bfa7f5 100644 --- a/src/GSvar/ExpressionGeneWidget.cpp +++ b/src/GSvar/ExpressionGeneWidget.cpp @@ -132,7 +132,7 @@ void ExpressionGeneWidget::applyFilters(int max_rows) try { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //update filter strategy @@ -718,7 +718,7 @@ void ExpressionGeneWidget::loadExpressionData() try { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //skip without database @@ -803,7 +803,7 @@ void ExpressionGeneWidget::initTable() } //init db ensg gene mapping - QTime timer; + QElapsedTimer timer; timer.start(); ensg_mapping_ = db_.getEnsemblGeneMapping(); id2gene_ = db_.getGeneExpressionId2GeneMapping(); @@ -830,7 +830,7 @@ void ExpressionGeneWidget::updateTable(int max_rows) try { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //disable sorting diff --git a/src/GSvar/ExpressionOverviewWidget.cpp b/src/GSvar/ExpressionOverviewWidget.cpp index ad8a4f5b5..5ec897797 100644 --- a/src/GSvar/ExpressionOverviewWidget.cpp +++ b/src/GSvar/ExpressionOverviewWidget.cpp @@ -217,7 +217,7 @@ void ExpressionOverviewWidget::showExpressionData() NGSD db; // debug - QTime timer; + QElapsedTimer timer; timer.start(); //get GeneSet diff --git a/src/GSvar/FilterCascadeWidget.cpp b/src/GSvar/FilterCascadeWidget.cpp index 4564afa97..ba88d6a0e 100644 --- a/src/GSvar/FilterCascadeWidget.cpp +++ b/src/GSvar/FilterCascadeWidget.cpp @@ -55,7 +55,7 @@ void FilterCascadeWidget::markFailedFilters() else { item->setToolTip(filters_[i]->description().join("\n") + "\n\nErrors:\n" + errors.join("\n")); - item->setBackgroundColor(QColor(255,160,110)); + item->setBackground(QBrush(QColor(255,160,110))); } } } diff --git a/src/GSvar/GSvarHelper.cpp b/src/GSvar/GSvarHelper.cpp index aac3a5636..481e6508c 100644 --- a/src/GSvar/GSvarHelper.cpp +++ b/src/GSvar/GSvarHelper.cpp @@ -185,7 +185,7 @@ void GSvarHelper::colorGeneItem(QTableWidgetItem* item, const GeneSet& genes) if (!messages.isEmpty()) { messages.sort(); - item->setBackgroundColor(Qt::yellow); + item->setBackground(QBrush(QColor(Qt::yellow))); item->setToolTip(messages.join('\n')); } } @@ -286,7 +286,7 @@ bool GSvarHelper::colorQcItem(QTableWidgetItem* item, const QString& accession, //set color if (color!=nullptr) { - item->setBackgroundColor(*color); + item->setBackground(QBrush(QColor(*color))); } return color!=nullptr; @@ -571,7 +571,7 @@ CfdnaDiseaseCourseTable GSvarHelper::cfdnaTable(const QString& tumor_ps_name, QS { THROW(ArgumentException, "Multiple processing systems used for cfDNA analysis. Cannot compare samples!"); } - QString system_name = processing_systems.toList().at(0); + QString system_name = processing_systems.values().at(0); // load cfDNA panel diff --git a/src/GSvar/GapClosingDialog.cpp b/src/GSvar/GapClosingDialog.cpp index b59a3bfd7..96a6a6b86 100644 --- a/src/GSvar/GapClosingDialog.cpp +++ b/src/GSvar/GapClosingDialog.cpp @@ -162,7 +162,7 @@ void GapClosingDialog::edit() return; } - edit(rows.toList().first()); + edit(rows.values().first()); } void GapClosingDialog::edit(int row) @@ -191,7 +191,7 @@ void GapClosingDialog::addComment() QString comment = QInputDialog::getText(this, "Comment", "Comment text:").trimmed(); if (comment.isEmpty()) return; - int row = rows.toList().first(); + int row = rows.values().first(); int id = ui_.table->getId(row).toInt(); db_.addGapComment(id, comment); diff --git a/src/GSvar/GeneWidget.cpp b/src/GSvar/GeneWidget.cpp index ab9a89ca1..f15f7f1ea 100644 --- a/src/GSvar/GeneWidget.cpp +++ b/src/GSvar/GeneWidget.cpp @@ -170,7 +170,7 @@ void GeneWidget::updateGUI() } } - hpo_lines << "" + pheno.accession() + " " + pheno.name() + " (sources: " + sources.toList().join(", ") + ")"; + hpo_lines << "" + pheno.accession() + " " + pheno.name() + " (sources: " + sources.values().join(", ") + ")"; } ui_.hpo->setText(hpo_lines.join("
")); diff --git a/src/GSvar/IGVCommandWorker.cpp b/src/GSvar/IGVCommandWorker.cpp index b5fefe703..cab852976 100644 --- a/src/GSvar/IGVCommandWorker.cpp +++ b/src/GSvar/IGVCommandWorker.cpp @@ -19,7 +19,7 @@ void IGVCommandWorker::run() int launch_command_id = -1; if (!commands_.isEmpty() && commands_.at(0).text=="launch IGV") { - QTime timer; + QElapsedTimer timer; timer.start(); launch_command_id = commands_.at(0).id; @@ -27,7 +27,7 @@ void IGVCommandWorker::run() emit commandStarted(launch_command_id); //start IGV - bool started = QProcess::startDetached(igv_data_.executable + " --port " + QString::number(igv_data_.port)); + bool started = QProcess::startDetached(igv_data_.executable, QStringList() << "--port" << QString::number(igv_data_.port)); if (!started) { emit commandFailed(launch_command_id, "Could not start IGV: IGV application '" + igv_data_.executable + "' did not start!", (double)(timer.elapsed())/1000.0); @@ -88,7 +88,7 @@ void IGVCommandWorker::run() continue; } - QTime timer; + QElapsedTimer timer; timer.start(); emit commandStarted(command.id); diff --git a/src/GSvar/IgvLogWidget.cpp b/src/GSvar/IgvLogWidget.cpp index 3278b634d..913e585dd 100644 --- a/src/GSvar/IgvLogWidget.cpp +++ b/src/GSvar/IgvLogWidget.cpp @@ -46,7 +46,7 @@ void IgvLogWidget::updateTable(QString name, QList commands) ui_.table->setItem(row, 0, GUIHelper::createTableItem(command.command)); QTableWidgetItem* item = GUIHelper::createTableItem(IGVSession::statusToString(command.status)); - item->setBackgroundColor(IGVSession::statusToColor(command.status)); + item->setBackground(QBrush(QColor(IGVSession::statusToColor(command.status)))); ui_.table->setItem(row, 1, item); ui_.table->setItem(row, 2, GUIHelper::createTableItem(command.execution_start_time.toString(Qt::ISODate).replace('T', ' '))); ui_.table->setItem(row, 3, GUIHelper::createTableItem(QString::number(command.execution_duration_sec, 'f', 2))); diff --git a/src/GSvar/ImportDialog.cpp b/src/GSvar/ImportDialog.cpp index d6780a77a..5cee25c22 100644 --- a/src/GSvar/ImportDialog.cpp +++ b/src/GSvar/ImportDialog.cpp @@ -289,7 +289,7 @@ bool ImportDialog::addItem(int r, int c, const QString& value, const QString& ac //color item if not valid if(validation_error!="") { - item->setBackgroundColor("#FF9600"); + item->setBackground(QBrush(QColor("#FF9600"))); item->setToolTip(validation_error); return false; } @@ -297,7 +297,7 @@ bool ImportDialog::addItem(int r, int c, const QString& value, const QString& ac //color item if not valid if(!notice.trimmed().isEmpty()) { - item->setBackgroundColor("#BCBCBC"); + item->setBackground(QBrush(QColor("#BCBCBC"))); item->setToolTip(notice); } diff --git a/src/GSvar/MainWindow.cpp b/src/GSvar/MainWindow.cpp index 942f77076..7e9814be8 100644 --- a/src/GSvar/MainWindow.cpp +++ b/src/GSvar/MainWindow.cpp @@ -513,7 +513,7 @@ AnalysisType MainWindow::getCurrentAnalysisType() void MainWindow::userSpecificDebugFunction() { - QTime timer; + QElapsedTimer timer; timer.start(); QString user = Helper::userName(); @@ -2582,7 +2582,7 @@ void MainWindow::loadFile(QString filename, bool show_only_error_issues) } } - QTime timer; + QElapsedTimer timer; timer.start(); //mark IGV as not initialized @@ -3897,7 +3897,7 @@ void MainWindow::generateReportSomaticRTF() SomaticReportHelper report(GSvarHelper::build(), variants_, cnvs_, svs_, somatic_control_tissue_variants_, somatic_report_settings_); //Store XML file with the same somatic report configuration settings - QTime timer; + QElapsedTimer timer; try { @@ -4540,7 +4540,7 @@ void MainWindow::on_actionExportTestData_triggered() { NGSD db; QMap> sql_history; - QTime timer; + QElapsedTimer timer; QStringList base_tables = { "user", "device", @@ -5480,7 +5480,7 @@ void MainWindow::refreshVariantTable(bool keep_widths, bool keep_heights) { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //apply filters @@ -6392,7 +6392,7 @@ void MainWindow::showNotification(QString text) text = text.trimmed(); //update tooltip - QStringList tooltips = notification_label_->toolTip().split("\n", QString::SkipEmptyParts); + QStringList tooltips = notification_label_->toolTip().split("\n", QT_SKIP_EMPTY_PARTS); if (!tooltips.contains(text)) tooltips.prepend(text); notification_label_->setToolTip(tooltips.join("
")); @@ -6479,7 +6479,7 @@ void MainWindow::applyFilters(bool debug_time) try { //apply main filter - QTime timer; + QElapsedTimer timer; timer.start(); const FilterCascade& filter_cascade = ui_.filters->filters(); @@ -6625,7 +6625,7 @@ void MainWindow::applyFilters(bool debug_time) ReportConfigFilter rc_filter = ui_.filters->reportConfigurationFilter(); if (germlineReportSupported() && rc_filter!=ReportConfigFilter::NONE) { - QSet report_variant_indices = report_settings_.report_config->variantIndices(VariantType::SNVS_INDELS, false).toSet(); + QSet report_variant_indices = LIST_TO_SET(report_settings_.report_config->variantIndices(VariantType::SNVS_INDELS, false)); for(int i=0; i report_variant_indices = somatic_report_settings_.report_config.variantIndices(VariantType::SNVS_INDELS, false).toSet(); + QSet report_variant_indices = LIST_TO_SET(somatic_report_settings_.report_config.variantIndices(VariantType::SNVS_INDELS, false)); for(int i=0; i ref_tables = tablesReferencing(db, "variant"); - QSet var_ids_pub = db.getValuesInt("SELECT variant_id FROM variant_publication WHERE variant_table='variant'").toSet(); + QSet var_ids_pub = LIST_TO_SET(db.getValuesInt("SELECT variant_id FROM variant_publication WHERE variant_table='variant'")); foreach (const QString& chr_name, db.getEnum("variant", "chr")) { @@ -182,7 +182,7 @@ void MaintenanceDialog::importStudySamples() //determine processed sample in study QStringList errors; - QSet genlab_ps_ids = genlab.studySamples(study, errors).toSet(); + QSet genlab_ps_ids = LIST_TO_SET(genlab.studySamples(study, errors)); appendOutputLine(" Processed samples in study according to GenLab: " + QString::number(genlab_ps_ids.count())); //add missing processed samples @@ -201,7 +201,7 @@ void MaintenanceDialog::importStudySamples() appendOutputLine(" Added processed sample to NGSD: " + QString::number(c_added)); //show samples that are only in study according to NGSD - QSet extra_ids = db.getValuesInt("SELECT processed_sample_id FROM study_sample WHERE study_id='" + study_id + "'").toSet(); + QSet extra_ids = LIST_TO_SET(db.getValuesInt("SELECT processed_sample_id FROM study_sample WHERE study_id='" + study_id + "'")); extra_ids.subtract(genlab_ps_ids); if (extra_ids.count()>0) { @@ -219,8 +219,8 @@ void MaintenanceDialog::replaceObsolteHPOTerms() { //init NGSD db; - QSet hpo_terms_valid = db.getValues("SELECT hpo_id FROM hpo_term").toSet(); - QSet hpo_terms_obsolete = db.getValues("SELECT hpo_id FROM hpo_obsolete").toSet(); + QSet hpo_terms_valid = LIST_TO_SET(db.getValues("SELECT hpo_id FROM hpo_term")); + QSet hpo_terms_obsolete = LIST_TO_SET(db.getValues("SELECT hpo_id FROM hpo_obsolete")); //process disease info int c_valid = 0; @@ -813,7 +813,7 @@ void MaintenanceDialog::deleteDataOfMergedSamples() //delete QC metrics (except for read count) QString qc_id_read_count = db.getValue("SELECT id FROM qc_terms WHERE qcml_id='QC:2000005'").toString(); c_deleted = 0; - QSet ps_with_qc = db.getValuesInt("SELECT processed_sample_id FROM processed_sample_qc").toSet(); + QSet ps_with_qc = LIST_TO_SET(db.getValuesInt("SELECT processed_sample_id FROM processed_sample_qc")); appendOutputLine("Found " + QString::number(ps_with_qc.count()) + " processed samples with QC data."); foreach(int ps_id, ps_merged) { @@ -831,7 +831,7 @@ void MaintenanceDialog::deleteDataOfMergedSamples() //delete KASP data c_deleted = 0; - QSet ps_with_kasp = db.getValuesInt("SELECT processed_sample_id FROM kasp_status").toSet(); + QSet ps_with_kasp = LIST_TO_SET(db.getValuesInt("SELECT processed_sample_id FROM kasp_status")); appendOutputLine("Found " + QString::number(ps_with_kasp.count()) + " processed samples with KASP data."); foreach(int ps_id, ps_merged) { @@ -854,7 +854,7 @@ void MaintenanceDialog::compareStructureOfTestAndProduction() //check for missing tables QStringList tables_p = db_p.tables(); QStringList tables_t = db_t.tables(); - QSet tables_both = tables_p.toSet().intersect(tables_t.toSet()); + QSet tables_both = LIST_TO_SET(tables_p).intersect(LIST_TO_SET(tables_t)); foreach(QString table_p, tables_p) { if (!tables_both.contains(table_p)) appendOutputLine("Missing table in test database: " + table_p); @@ -873,7 +873,7 @@ void MaintenanceDialog::compareStructureOfTestAndProduction() //missing/extra columns QStringList fields_p = info_p.fieldNames(); QStringList fields_t = info_t.fieldNames(); - QSet fields_both = fields_p.toSet().intersect(fields_t.toSet()); + QSet fields_both = LIST_TO_SET(fields_p).intersect(LIST_TO_SET(fields_t)); foreach(QString field_p, fields_p) { if (!fields_both.contains(field_p)) appendOutputLine("Missing field in test database: " + table+"/"+field_p); @@ -946,10 +946,10 @@ QSet MaintenanceDialog::psWithVariants(NGSD& db) { QSet ps_with_vars; - ps_with_vars += db.getValuesInt("SELECT DISTINCT processed_sample_id FROM detected_variant").toSet(); - ps_with_vars += db.getValuesInt("SELECT processed_sample_id FROM cnv_callset").toSet(); - ps_with_vars += db.getValuesInt("SELECT processed_sample_id FROM sv_callset").toSet(); - ps_with_vars += db.getValuesInt("SELECT processed_sample_id FROM re_callset").toSet(); + ps_with_vars += LIST_TO_SET(db.getValuesInt("SELECT DISTINCT processed_sample_id FROM detected_variant")); + ps_with_vars += LIST_TO_SET(db.getValuesInt("SELECT processed_sample_id FROM cnv_callset")); + ps_with_vars += LIST_TO_SET(db.getValuesInt("SELECT processed_sample_id FROM sv_callset")); + ps_with_vars += LIST_TO_SET(db.getValuesInt("SELECT processed_sample_id FROM re_callset")); return ps_with_vars; } @@ -958,11 +958,11 @@ void MaintenanceDialog::clearUnusedReportConfigs(NGSD& db) { //determine used report configs QSet used_rc_ids; - used_rc_ids += db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_variant").toSet(); - used_rc_ids += db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_cnv").toSet(); - used_rc_ids += db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_sv").toSet(); - used_rc_ids += db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_re").toSet(); - used_rc_ids += db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_other_causal_variant").toSet(); + used_rc_ids += LIST_TO_SET(db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_variant")); + used_rc_ids += LIST_TO_SET(db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_cnv")); + used_rc_ids += LIST_TO_SET(db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_sv")); + used_rc_ids += LIST_TO_SET(db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_re")); + used_rc_ids += LIST_TO_SET(db.getValuesInt("SELECT DISTINCT report_configuration_id FROM report_configuration_other_causal_variant")); //delete unused report configs SqlQuery query = db.getQuery(); diff --git a/src/GSvar/MidCheckWidget.cpp b/src/GSvar/MidCheckWidget.cpp index baa94bab7..62c4522b7 100644 --- a/src/GSvar/MidCheckWidget.cpp +++ b/src/GSvar/MidCheckWidget.cpp @@ -121,8 +121,8 @@ void MidCheckWidget::checkMids() { for (int c=0; ccolumnCount(); ++c) { - ui_.samples->item(clash.s1_index, c)->setBackgroundColor(Qt::yellow); - ui_.samples->item(clash.s2_index, c)->setBackgroundColor(Qt::yellow); + ui_.samples->item(clash.s1_index, c)->setBackground(QBrush(QColor(Qt::yellow))); + ui_.samples->item(clash.s2_index, c)->setBackground(QBrush(QColor(Qt::yellow))); } } } diff --git a/src/GSvar/MultiSampleDialog.cpp b/src/GSvar/MultiSampleDialog.cpp index d2244762e..cb9759b4a 100644 --- a/src/GSvar/MultiSampleDialog.cpp +++ b/src/GSvar/MultiSampleDialog.cpp @@ -74,7 +74,7 @@ void MultiSampleDialog::updateStartButton() void MultiSampleDialog::annotate_only_state_changed() { // get all step check boxes - QList step_boxes = findChildren(QRegExp("^step_")); + QList step_boxes = findChildren(QRegularExpression("^step_")); if(ui_.annotate_only->isChecked()) { diff --git a/src/GSvar/PathogenicWtDialog.cpp b/src/GSvar/PathogenicWtDialog.cpp index 3b78c09e8..881ae22da 100644 --- a/src/GSvar/PathogenicWtDialog.cpp +++ b/src/GSvar/PathogenicWtDialog.cpp @@ -41,7 +41,7 @@ void PathogenicWtDialog::delayedInitialization() ui_.variants->setItem(row, 3, GUIHelper::createTableItem(QString::number(depth), Qt::AlignLeft|Qt::AlignVCenter)); auto item = GUIHelper::createTableItem(geno, Qt::AlignLeft|Qt::AlignVCenter); - if (geno.startsWith("WT")) item->setBackgroundColor(QColor(255,0, 0, 128)); + if (geno.startsWith("WT")) item->setBackground(QBrush(QColor(QColor(255,0, 0, 128)))); ui_.variants->setItem(row, 4, item); } diff --git a/src/GSvar/PreferredTranscriptsWidget.cpp b/src/GSvar/PreferredTranscriptsWidget.cpp index 2193f5430..fa26737a0 100644 --- a/src/GSvar/PreferredTranscriptsWidget.cpp +++ b/src/GSvar/PreferredTranscriptsWidget.cpp @@ -158,10 +158,10 @@ void PreferredTranscriptsWidget::check() { int gene_id = it.key(); - QSet mane = db.getValues("SELECT name FROM gene_transcript WHERE source='Ensembl' AND gene_id=" + QString::number(gene_id) + " AND is_mane_select=1").toSet(); + QSet mane = LIST_TO_SET(db.getValues("SELECT name FROM gene_transcript WHERE source='Ensembl' AND gene_id=" + QString::number(gene_id) + " AND is_mane_select=1")); if (mane.isEmpty()) continue; - QSet mane_not_pt = mane.subtract(it.value().toSet()); + QSet mane_not_pt = mane.subtract(LIST_TO_SET(it.value())); foreach(QString t, mane_not_pt) { invalid << t + " (" + db.geneSymbol(gene_id) + ")"; diff --git a/src/GSvar/ProcessedSampleWidget.cpp b/src/GSvar/ProcessedSampleWidget.cpp index 70f5d3d3c..54b38575e 100644 --- a/src/GSvar/ProcessedSampleWidget.cpp +++ b/src/GSvar/ProcessedSampleWidget.cpp @@ -403,7 +403,7 @@ void ProcessedSampleWidget::showPlot() { NGSD db; - QList selected_rows = ui_->qc_table->selectedRows().toList(); + QList selected_rows = ui_->qc_table->selectedRows().values(); if (selected_rows.count()<1 || selected_rows.count()>2) { QMessageBox::information(this, "Plot error", "Please select one or two quality metric for plotting!"); @@ -467,7 +467,7 @@ void ProcessedSampleWidget::openSampleTab() NGSD db; //check that a relation is selected - QList selected_rows = ui_->sample_relations->selectedRows().toList(); + QList selected_rows = ui_->sample_relations->selectedRows().values(); if (selected_rows.isEmpty()) { QMessageBox::warning(this, "Sample relation - processed sample tab", "Please select at least one relation!"); @@ -518,7 +518,7 @@ void ProcessedSampleWidget::openSampleTab() void ProcessedSampleWidget::openExternalDiseaseDatabase() { - QList selected_rows = ui_->disease_details->selectedRows().toList(); + QList selected_rows = ui_->disease_details->selectedRows().values(); foreach(int row, selected_rows) { QString type = ui_->disease_details->item(row, 0)->text(); @@ -569,7 +569,7 @@ void ProcessedSampleWidget::addRelation() void ProcessedSampleWidget::removeRelation() { //check that a relation is selected - QList selected_rows = ui_->sample_relations->selectedRows().toList(); + QList selected_rows = ui_->sample_relations->selectedRows().values(); if (selected_rows.isEmpty()) { QMessageBox::warning(this, "Sample relation", "Please select a relation!"); @@ -591,8 +591,8 @@ void ProcessedSampleWidget::removeRelation() void ProcessedSampleWidget::editStudy() { - //check that a study - QList selected_rows = ui_->studies->selectedRows().toList(); + //check that a study + QList selected_rows = ui_->studies->selectedRows().values(); if (selected_rows.isEmpty()) { QMessageBox::warning(this, "Study", "Please select a study!"); @@ -650,7 +650,7 @@ void ProcessedSampleWidget::addStudy() void ProcessedSampleWidget::removeStudy() { //check that a study - QList selected_rows = ui_->studies->selectedRows().toList(); + QList selected_rows = ui_->studies->selectedRows().values(); if (selected_rows.isEmpty()) { QMessageBox::warning(this, "Study deletion", "Please select a study!"); diff --git a/src/GSvar/RepeatExpansionWidget.cpp b/src/GSvar/RepeatExpansionWidget.cpp index 8cd665d9c..514e8e0b2 100644 --- a/src/GSvar/RepeatExpansionWidget.cpp +++ b/src/GSvar/RepeatExpansionWidget.cpp @@ -382,7 +382,7 @@ void RepeatExpansionWidget::setCellDecoration(int row, QString column, QString t //set background color if (bg_color.isValid()) { - item->setBackgroundColor(bg_color); + item->setBackground(QBrush(QColor(bg_color))); } } @@ -718,10 +718,10 @@ void RepeatExpansionWidget::setReportConfigHeaderIcons() { if(report_config_==NULL) return; - QSet report_variant_indices = report_config_->variantIndices(VariantType::RES, false).toSet(); + QSet report_variant_indices = LIST_TO_SET(report_config_->variantIndices(VariantType::RES, false)); for(int r=0; rget(VariantType::RES, r); @@ -780,7 +780,7 @@ void RepeatExpansionWidget::updateRowVisibility() int col = GUIHelper::columnIndex(ui_.table, "genotype"); for (int row=0; rowrowCount(); ++row) { - QColor color = ui_.table->item(row, col)->backgroundColor(); + QColor color = ui_.table->item(row, col)->background().color(); if (color!=red_ && color!=orange_ && color!=yellow_) hidden[row] = true; } } @@ -789,7 +789,7 @@ void RepeatExpansionWidget::updateRowVisibility() int col = GUIHelper::columnIndex(ui_.table, "genotype"); for (int row=0; rowrowCount(); ++row) { - if (ui_.table->item(row, col)->backgroundColor()!=red_) hidden[row] = true; + if (ui_.table->item(row, col)->background().color()!=red_) hidden[row] = true; } } @@ -829,7 +829,7 @@ void RepeatExpansionWidget::updateRowVisibility() //RC filter if (ui_.filter_rc->isChecked() && report_config_!=NULL) { - QSet report_variant_indices = report_config_->variantIndices(VariantType::RES, false).toSet(); + QSet report_variant_indices = LIST_TO_SET(report_config_->variantIndices(VariantType::RES, false)); for (int row=0; rowrowCount(); ++row) { if (!report_variant_indices.contains(row)) hidden[row] = true; diff --git a/src/GSvar/ReportDialog.cpp b/src/GSvar/ReportDialog.cpp index 3215ce66b..4288db74b 100644 --- a/src/GSvar/ReportDialog.cpp +++ b/src/GSvar/ReportDialog.cpp @@ -140,7 +140,7 @@ void ReportDialog::initGUI() //multi-sample: additional samples if (variants_.type()==AnalysisType::GERMLINE_MULTISAMPLE) { - QStringList ps_list = variants_.getSampleHeader().sampleNames().toList(); + QStringList ps_list = variants_.getSampleHeader().sampleNames().values(); ps_list.sort(); ps_list.removeAll(""); ps_list.removeAll(ps_); diff --git a/src/GSvar/ReportVariantDialog.cpp b/src/GSvar/ReportVariantDialog.cpp index 7863209e0..bfb0413d2 100644 --- a/src/GSvar/ReportVariantDialog.cpp +++ b/src/GSvar/ReportVariantDialog.cpp @@ -52,14 +52,14 @@ ReportVariantDialog::ReportVariantDialog(QString variant, QList in ui_.exclude_mechanism->setVisible(config.variant_type!=VariantType::RES); //show manual variant override options when needed - foreach(QWidget* widget, findChildren(QRegExp("manual_.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_.*"))) { widget->setVisible(false); } if (config_.variant_type==VariantType::SNVS_INDELS) { ui_.manual_line->setVisible(true); - foreach(QWidget* widget, findChildren(QRegExp("manual_.*small.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_.*small.*"))) { widget->setVisible(true); } @@ -67,7 +67,7 @@ ReportVariantDialog::ReportVariantDialog(QString variant, QList in if (config_.variant_type==VariantType::CNVS) { ui_.manual_line->setVisible(true); - foreach(QWidget* widget, findChildren(QRegExp("manual_.*cnv.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_.*cnv.*"))) { widget->setVisible(true); } @@ -75,7 +75,7 @@ ReportVariantDialog::ReportVariantDialog(QString variant, QList in if (config_.variant_type==VariantType::SVS) { ui_.manual_line->setVisible(true); - foreach(QWidget* widget, findChildren(QRegExp("manual_.*sv.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_.*sv.*"))) { widget->setVisible(true); } @@ -95,7 +95,7 @@ ReportVariantDialog::ReportVariantDialog(QString variant, QList in if (config_.variant_type==VariantType::RES) { ui_.manual_line->setVisible(true); - foreach(QWidget* widget, findChildren(QRegExp("manual_.*re.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_.*re.*"))) { widget->setVisible(true); } diff --git a/src/GSvar/SequencingRunOverview.cpp b/src/GSvar/SequencingRunOverview.cpp index 643dd3b9a..52971b55e 100644 --- a/src/GSvar/SequencingRunOverview.cpp +++ b/src/GSvar/SequencingRunOverview.cpp @@ -131,7 +131,7 @@ void SequencingRunOverview::editRun() QMessageBox::critical(this, "Edit run", "Please select exactly one run!"); return; } - int row = rows.toList().first(); + int row = rows.values().first(); //determine name column int col = ui_.table->columnIndex("name"); @@ -155,7 +155,7 @@ void SequencingRunOverview::moveSamples() QMessageBox::critical(this, "Moving samples", "Please select exactly one run!"); return; } - int row = rows.toList().first(); + int row = rows.values().first(); //check run status int status_col = ui_.table->columnIndex("status"); diff --git a/src/GSvar/SequencingRunWidget.cpp b/src/GSvar/SequencingRunWidget.cpp index 6f74f9787..b6611b8be 100644 --- a/src/GSvar/SequencingRunWidget.cpp +++ b/src/GSvar/SequencingRunWidget.cpp @@ -125,7 +125,7 @@ void SequencingRunWidget::updateRunSampleTable() samples.formatBooleanColumn(samples.columnIndex("scheduled_for_resequencing"), true); // determine QC parameter based on sample types - QSet sample_types = samples.extractColumn(samples.columnIndex("sample_type")).toSet(); + QSet sample_types = LIST_TO_SET(samples.extractColumn(samples.columnIndex("sample_type"))); setQCMetricAccessions(sample_types); // update QC plot button @@ -258,7 +258,7 @@ void SequencingRunWidget::setQuality() query.prepare("UPDATE processed_sample SET quality='" + quality + "' WHERE id=:0"); int col = ui_->samples->columnIndex("sample"); - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach (int row, selected_rows) { QString ps_name = ui_->samples->item(row, col)->text(); @@ -279,7 +279,7 @@ void SequencingRunWidget::scheduleForResequencing() query.prepare("UPDATE processed_sample SET scheduled_for_resequencing=TRUE WHERE id=:0"); int col = ui_->samples->columnIndex("sample"); - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach (int row, selected_rows) { QString ps_name = ui_->samples->item(row, col)->text(); @@ -298,7 +298,7 @@ void SequencingRunWidget::showPlot() //determine selected processed sample IDs QStringList selected_ps_ids; - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach(int row, selected_rows) { selected_ps_ids << ui_->samples->getId(row); @@ -744,7 +744,7 @@ void SequencingRunWidget::updateReadQualityTable() void SequencingRunWidget::openSelectedSampleTabs() { int col = ui_->samples->columnIndex("sample"); - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach (int row, selected_rows) { QString ps = ui_->samples->item(row, col)->text(); diff --git a/src/GSvar/SingleSampleAnalysisDialog.cpp b/src/GSvar/SingleSampleAnalysisDialog.cpp index 1ebbbda9b..465fa6bb9 100644 --- a/src/GSvar/SingleSampleAnalysisDialog.cpp +++ b/src/GSvar/SingleSampleAnalysisDialog.cpp @@ -46,7 +46,7 @@ void SingleSampleAnalysisDialog::setAnalysisSteps() if(sys_types.contains("lrGS")) { - if(sys_types.size() > 1) THROW(ArgumentException, "Error: Multiple processing types selected (" + sys_types.toList().join(", ") + "). Cannot start analysis!"); + if(sys_types.size() > 1) THROW(ArgumentException, "Error: Multiple processing types selected (" + sys_types.values().join(", ") + "). Cannot start analysis!"); steps_ = loadSteps("analysis_steps_single_sample_lr"); ui_.annotate_only->setEnabled(false); ui_.l_annotation_only->setEnabled(false); @@ -272,7 +272,7 @@ QStringList SingleSampleAnalysisDialog::arguments(const QWidget* widget) if (anno_only!=nullptr && anno_only->isChecked()) output << "-annotation_only"; QStringList steps; - QList step_boxes = widget->findChildren(QRegExp("^step_")); + QList step_boxes = widget->findChildren(QRegularExpression("^step_")); if (step_boxes.count()>0) { foreach(QCheckBox* box, step_boxes) @@ -333,7 +333,7 @@ void SingleSampleAnalysisDialog::updateStartButton() void SingleSampleAnalysisDialog::annotate_only_state_changed() { // get all step check boxes - QList step_boxes = findChildren(QRegExp("^step_")); + QList step_boxes = findChildren(QRegularExpression("^step_")); if(ui_.annotate_only->isChecked()) { diff --git a/src/GSvar/SmallVariantSearchWidget.cpp b/src/GSvar/SmallVariantSearchWidget.cpp index d3c9695c4..cc4d06f45 100644 --- a/src/GSvar/SmallVariantSearchWidget.cpp +++ b/src/GSvar/SmallVariantSearchWidget.cpp @@ -275,7 +275,7 @@ void SmallVariantSearchWidget::getVariantsForRegion(Chromosome chr, int start, i QStringList parts2 = part.split(":"); types.insert(parts2[2]); } - QString type = types.toList().join(", "); + QString type = types.values().join(", "); QString coding = parts_match.join(", "); //add sample info diff --git a/src/GSvar/SomaticReportVariantDialog.cpp b/src/GSvar/SomaticReportVariantDialog.cpp index 374783968..ca1027c3a 100644 --- a/src/GSvar/SomaticReportVariantDialog.cpp +++ b/src/GSvar/SomaticReportVariantDialog.cpp @@ -37,7 +37,7 @@ SomaticReportVariantDialog::SomaticReportVariantDialog(QString variant, SomaticR connect(this, SIGNAL(accepted()), this, SLOT(writeBackSettings())); //hide sv override options - foreach(QWidget* widget, findChildren(QRegExp("manual_sv.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_sv.*"))) { widget->setVisible(false); } @@ -70,7 +70,7 @@ SomaticReportVariantDialog::SomaticReportVariantDialog(QString variant, SomaticR ui_.exclude_unclear_effect->setVisible(true); - foreach(QWidget* widget, findChildren(QRegExp("manual_sv.*"))) + foreach(QWidget* widget, findChildren(QRegularExpression("manual_sv.*"))) { widget->setVisible(true); } diff --git a/src/GSvar/SplicingWidget.cpp b/src/GSvar/SplicingWidget.cpp index 31b1abae6..7d8ca133f 100644 --- a/src/GSvar/SplicingWidget.cpp +++ b/src/GSvar/SplicingWidget.cpp @@ -126,7 +126,7 @@ void SplicingWidget::applyFilter() try { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); int row_count = ui_->tw_splicing->rowCount(); diff --git a/src/GSvar/SvSearchWidget.cpp b/src/GSvar/SvSearchWidget.cpp index be06888c1..f6501c121 100644 --- a/src/GSvar/SvSearchWidget.cpp +++ b/src/GSvar/SvSearchWidget.cpp @@ -170,7 +170,7 @@ void SvSearchWidget::search() { // (0) + (1) parse input and validate GeneSet genes; - foreach (const QString& gene, ui_.le_genes->text().replace(";", " ").replace(",", "").split(QRegularExpression("\\W+"), QString::SkipEmptyParts)) + foreach (const QString& gene, ui_.le_genes->text().replace(";", " ").replace(",", "").split(QRegularExpression("\\W+"), QT_SKIP_EMPTY_PARTS)) { QByteArray approved_gene_name = db_.geneToApproved(gene.toUtf8()); if (approved_gene_name == "") THROW(ArgumentException, "Invalid gene name '" + gene + "' given!"); diff --git a/src/GSvar/SvWidget.cpp b/src/GSvar/SvWidget.cpp index 18620450a..c53bbc24f 100644 --- a/src/GSvar/SvWidget.cpp +++ b/src/GSvar/SvWidget.cpp @@ -175,8 +175,8 @@ void SvWidget::initGUI() //get report variant indices QSet report_variant_indices; - if((report_config_ != NULL) && !is_somatic_) report_variant_indices = report_config_->variantIndices(VariantType::SVS, false).toSet(); - if((som_report_config_ != NULL) && is_somatic_) report_variant_indices = som_report_config_->variantIndices(VariantType::SVS, false).toSet(); + if((report_config_ != NULL) && !is_somatic_) report_variant_indices = LIST_TO_SET(report_config_->variantIndices(VariantType::SVS, false)); + if((som_report_config_ != NULL) && is_somatic_) report_variant_indices = LIST_TO_SET(som_report_config_->variantIndices(VariantType::SVS, false)); //fill table widget with data from bedpe file for(int row=0; row step_boxes = findChildren(QRegExp("^step_")); + QList step_boxes = findChildren(QRegularExpression("^step_")); if(ui_.annotate_only->isChecked()) { diff --git a/src/GSvar/VariantTable.cpp b/src/GSvar/VariantTable.cpp index 79cd8bc73..895985d8d 100644 --- a/src/GSvar/VariantTable.cpp +++ b/src/GSvar/VariantTable.cpp @@ -486,7 +486,7 @@ void VariantTable::updateTable(VariantList& variants, const FilterResult& filter setItem(r, 0, createTableItem(variant.chr().str())); if (!variant.chr().isAutosome()) { - item(r,0)->setBackgroundColor(Qt::yellow); + item(r,0)->setBackground(QBrush(QColor(Qt::yellow))); item(r,0)->setToolTip("Not autosome"); } setItem(r, 1, createTableItem(QByteArray::number(variant.start()))); @@ -505,37 +505,37 @@ void VariantTable::updateTable(VariantList& variants, const FilterResult& filter //warning if (anno_index==i_co_sp && anno.contains(":HIGH:")) { - item->setBackgroundColor(Qt::red); + item->setBackground(QBrush(QColor(Qt::red))); is_warning_line = true; } else if (anno_index==i_classification && (anno=="3" || anno=="M" || anno=="R")) { - item->setBackgroundColor(QColor(255, 135, 60)); //orange + item->setBackground(QBrush(QColor(QColor(255, 135, 60)))); //orange is_notice_line = true; } else if (anno_index==i_classification && (anno=="4" || anno=="5")) { - item->setBackgroundColor(Qt::red); + item->setBackground(QBrush(QColor(Qt::red))); is_warning_line = true; } else if (anno_index==i_clinvar && anno.contains("pathogenic") && !anno.contains("conflicting interpretations of pathogenicity")) //matches "pathogenic" and "likely pathogenic" { - item->setBackgroundColor(Qt::red); + item->setBackground(QBrush(QColor(Qt::red))); is_warning_line = true; } else if (anno_index==i_hgmd && anno.contains("CLASS=DM")) //matches both "DM" and "DM?" { - item->setBackgroundColor(Qt::red); + item->setBackground(QBrush(QColor(Qt::red))); is_warning_line = true; } else if (anno_index==i_spliceai && NGSHelper::maxSpliceAiScore(anno) >= 0.8) { - item->setBackgroundColor(Qt::red); + item->setBackground(QBrush(QColor(Qt::red))); is_notice_line = true; } else if (anno_index==i_spliceai && NGSHelper::maxSpliceAiScore(anno) >= 0.5) { - item->setBackgroundColor(QColor(255, 135, 60)); //orange + item->setBackground(QBrush(QColor(QColor(255, 135, 60)))); //orange is_notice_line = true; } else if (anno_index==i_maxentscan && !anno.isEmpty()) @@ -558,12 +558,12 @@ void VariantTable::updateTable(VariantList& variants, const FilterResult& filter //output: max import if (impacts.contains(MaxEntScanImpact::HIGH)) { - item->setBackgroundColor(Qt::red); //orange + item->setBackground(QBrush(QColor(Qt::red))); //orange is_notice_line = true; } else if (impacts.contains(MaxEntScanImpact::MODERATE)) { - item->setBackgroundColor(QColor(255, 135, 60)); //orange + item->setBackground(QBrush(QColor(QColor(255, 135, 60)))); //orange is_notice_line = true; } } @@ -571,30 +571,30 @@ void VariantTable::updateTable(VariantList& variants, const FilterResult& filter //non-pathogenic if (anno_index==i_classification && (anno=="1" || anno=="2")) { - item->setBackgroundColor(Qt::green); + item->setBackground(QBrush(QColor(Qt::green))); is_ngsd_benign = true; } //highlighed if (anno_index==i_validation && anno.contains("TP")) { - item->setBackgroundColor(Qt::yellow); + item->setBackground(QBrush(QColor(Qt::yellow))); } else if (anno_index==i_comment && anno!="") { - item->setBackgroundColor(Qt::yellow); + item->setBackground(QBrush(QColor(Qt::yellow))); } else if (anno_index==i_ihdb_hom && anno=="0") { - item->setBackgroundColor(Qt::yellow); + item->setBackground(QBrush(QColor(Qt::yellow))); } else if (anno_index==i_ihdb_het && anno=="0") { - item->setBackgroundColor(Qt::yellow); + item->setBackground(QBrush(QColor(Qt::yellow))); } else if (anno_index==i_clinvar && anno.contains("(confirmed)")) { - item->setBackgroundColor(Qt::yellow); + item->setBackground(QBrush(QColor(Qt::yellow))); } else if (anno_index==i_genes) { @@ -805,7 +805,7 @@ void VariantTable::clearContents() void VariantTable::adaptColumnWidths() { - QTime timer; + QElapsedTimer timer; timer.start(); //restrict width diff --git a/src/GSvar/VariantValidationWidget.cpp b/src/GSvar/VariantValidationWidget.cpp index 43b4f8435..69ebd48e0 100644 --- a/src/GSvar/VariantValidationWidget.cpp +++ b/src/GSvar/VariantValidationWidget.cpp @@ -136,7 +136,7 @@ void VariantValidationWidget::edit() return; } - edit(rows.toList().first()); + edit(rows.values().first()); } void VariantValidationWidget::edit(int row) diff --git a/src/GSvar/VariantWidget.cpp b/src/GSvar/VariantWidget.cpp index 1465dc5f0..b6fdc0398 100644 --- a/src/GSvar/VariantWidget.cpp +++ b/src/GSvar/VariantWidget.cpp @@ -234,7 +234,7 @@ void VariantWidget::updateGUI() } //sort by processed sample name - ui_.table->sortByColumn(0); + ui_.table->sortByColumn(0, ui_.table->horizontalHeader()->sortIndicatorOrder()); //resize table cols GUIHelper::resizeTableCellWidths(ui_.table, 200); @@ -286,7 +286,7 @@ void VariantWidget::calculateSimilarity() ps_names << ps; QString ps_id = db.processedSampleId(ps); - ps_vars << db.getValues("SELECT variant_id FROM detected_variant WHERE processed_sample_id=" + ps_id + " AND mosaic=0").toSet(); + ps_vars << LIST_TO_SET(db.getValues("SELECT variant_id FROM detected_variant WHERE processed_sample_id=" + ps_id + " AND mosaic=0")); } //calculate and show overlap @@ -337,7 +337,7 @@ QList VariantWidget::selectedRows() const set << item->row(); } - return set.toList(); + return set.values(); } void VariantWidget::openProcessedSampleTabs() diff --git a/src/GSvarServer/SgeStatusUpdateWorker.cpp b/src/GSvarServer/SgeStatusUpdateWorker.cpp index f26130e3a..0b2393361 100644 --- a/src/GSvarServer/SgeStatusUpdateWorker.cpp +++ b/src/GSvarServer/SgeStatusUpdateWorker.cpp @@ -11,7 +11,7 @@ void SgeStatusUpdateWorker::run() { try { - if (debug_) QTextStream(stdout) << "SGE update started" << endl; + if (debug_) QTextStream(stdout) << "SGE update started" << QT_ENDL; NGSD db; @@ -43,12 +43,12 @@ void SgeStatusUpdateWorker::run() } catch (Exception& e) { - if (debug_) QTextStream(stdout) << "SGE job (id=" << QString::number(job_id) << ") update failed: " << e.message() << endl; + if (debug_) QTextStream(stdout) << "SGE job (id=" << QString::number(job_id) << ") update failed: " << e.message() << QT_ENDL; Log::info("SGE job (id=" + QString::number(job_id) + ") update failed: " + e.message()); } catch (...) { - if (debug_) QTextStream(stdout) << "SGE job (id=" << QString::number(job_id) << ") update failed with unkown error" << endl; + if (debug_) QTextStream(stdout) << "SGE job (id=" << QString::number(job_id) << ") update failed with unkown error" << QT_ENDL; Log::info("SGE job (id=" + QString::number(job_id) + ") update failed with unkown error"); } } @@ -58,22 +58,25 @@ void SgeStatusUpdateWorker::run() while(query.next()) { QString job_id = query.value("id").toString(); - if (debug_) QTextStream(stdout) << "Removing job " << job_id << " because it is older than 60 days" << endl; + if (debug_) + { + QTextStream(stdout) << "Removing job " << job_id << " because it is older than 60 days" << QT_ENDL; + } db.getQuery().exec("DELETE FROM `analysis_job_history` WHERE analysis_job_id=" + job_id); db.getQuery().exec("DELETE FROM `analysis_job_sample` WHERE analysis_job_id=" + job_id); db.getQuery().exec("DELETE FROM `analysis_job` WHERE id=" + job_id); } - if (debug_) QTextStream(stdout) << "SGE update done" << endl; + if (debug_) QTextStream(stdout) << "SGE update done" << QT_ENDL; } catch (Exception& e) { - if (debug_) QTextStream(stdout) << "SGE update failed: " << e.message() << endl; + if (debug_) QTextStream(stdout) << "SGE update failed: " << e.message() << QT_ENDL; Log::info("SGE status update failed: " + e.message()); } catch (...) { - if (debug_) QTextStream(stdout) << "SGE update failed with unkown error" << endl; + if (debug_) QTextStream(stdout) << "SGE update failed with unkown error" << QT_ENDL; Log::info("SGE status update failed with unkown error"); } @@ -81,7 +84,7 @@ void SgeStatusUpdateWorker::run() void SgeStatusUpdateWorker::startAnalysis(NGSD& db, const AnalysisJob& job, int job_id) { - if (debug_) QTextStream(stdout) << "Starting job " << job_id << " (type: " << job.type << ")" << endl; + if (debug_) QTextStream(stdout) << "Starting job " << job_id << " (type: " << job.type << ")" << QT_ENDL; //init QString timestamp = QDateTime::currentDateTime().toString("yyyyMMddhhmmss"); @@ -151,7 +154,10 @@ void SgeStatusUpdateWorker::startAnalysis(NGSD& db, const AnalysisJob& job, int //check if single analysis is still running > skip for now if(singleSampleAnalysisRunning(db, job)) { - if (debug_) QTextStream(stdout) << "Job " << job_id << " (" << job.type << ") postponed because at least one single sample analysis is still running" << endl; + if (debug_) + { + QTextStream(stdout) << "Job " << job_id << " (" << job.type << ") postponed because at least one single sample analysis is still running" << QT_ENDL; + } return; } @@ -183,7 +189,10 @@ void SgeStatusUpdateWorker::startAnalysis(NGSD& db, const AnalysisJob& job, int //check if single analysis is still running > skip for now if(singleSampleAnalysisRunning(db, job)) { - if (debug_) QTextStream(stdout) << "Job " << job_id << " (" << job.type << ") postponed because at least one single sample analysis is still running" << endl; + if (debug_) + { + QTextStream(stdout) << "Job " << job_id << " (" << job.type << ") postponed because at least one single sample analysis is still running" << QT_ENDL; + } return; } @@ -211,7 +220,10 @@ void SgeStatusUpdateWorker::startAnalysis(NGSD& db, const AnalysisJob& job, int //check if single analysis is still running > skip for now if(singleSampleAnalysisRunning(db, job)) { - if (debug_) QTextStream(stdout) << "Job " << job_id << " (" << job.type << ") postponed because at least one single sample analysis is still running" << endl; + if (debug_) + { + QTextStream(stdout) << "Job " << job_id << " (" << job.type << ") postponed because at least one single sample analysis is still running" << QT_ENDL; + } return; } @@ -312,7 +324,7 @@ void SgeStatusUpdateWorker::startAnalysis(NGSD& db, const AnalysisJob& job, int //handle qsub output if (Helper::isNumeric(sge_id) && sge_id.toInt()>0) { - if (debug_) QTextStream(stdout) << " Started with SGE id " << sge_id << endl; + if (debug_) QTextStream(stdout) << " Started with SGE id " << sge_id << QT_ENDL; db.getQuery().exec("UPDATE analysis_job SET sge_id='"+sge_id+"' WHERE id="+QString::number(job_id)); db.addAnalysisHistoryEntry(job_id, "started", QByteArrayList()); @@ -331,7 +343,7 @@ void SgeStatusUpdateWorker::startAnalysis(NGSD& db, const AnalysisJob& job, int void SgeStatusUpdateWorker::updateAnalysisStatus(NGSD& db, const AnalysisJob& job, int job_id) { - if (debug_) QTextStream(stdout) << "Updating status of job " << job_id << " (type: " << job.type << " SGE-id: " << job.sge_id << ")" << endl; + if (debug_) QTextStream(stdout) << "Updating status of job " << job_id << " (type: " << job.type << " SGE-id: " << job.sge_id << ")" << QT_ENDL; //check if job is still running int exit_code = Helper::executeCommand("qstat", QStringList() << "-j" << job.sge_id); @@ -349,7 +361,7 @@ void SgeStatusUpdateWorker::updateAnalysisStatus(NGSD& db, const AnalysisJob& jo if (parts.count()<8) continue; QByteArray status = parts[4].trimmed(); - if (debug_) QTextStream(stdout) << " Job queued/running (state: " << status << " queue: " << job.sge_queue << ")" << endl; + if (debug_) QTextStream(stdout) << " Job queued/running (state: " << status << " queue: " << job.sge_queue << ")" << QT_ENDL; if (status=="r" && job.sge_queue.isEmpty()) { @@ -403,12 +415,12 @@ void SgeStatusUpdateWorker::updateAnalysisStatus(NGSD& db, const AnalysisJob& jo } if (sge_exit_code=="0") { - if (debug_) QTextStream(stdout) << " Job finished successfully" << endl; + if (debug_) QTextStream(stdout) << " Job finished successfully" << QT_ENDL; db.addAnalysisHistoryEntry(job_id, "finished", stdout_stderr); } else { - if (debug_) QTextStream(stdout) << " Job failed with exit code: " << sge_exit_code << endl; + if (debug_) QTextStream(stdout) << " Job failed with exit code: " << sge_exit_code << QT_ENDL; stdout_stderr.prepend(("job exit code: " + sge_exit_code).toLatin1()); db.addAnalysisHistoryEntry(job_id, "error", stdout_stderr); } @@ -422,7 +434,7 @@ void SgeStatusUpdateWorker::updateAnalysisStatus(NGSD& db, const AnalysisJob& jo void SgeStatusUpdateWorker::canceledAnalysis(NGSD& db, const AnalysisJob& job, int job_id) { - if (debug_) QTextStream(stdout) << "Canceling job " << job_id << " (type: " << job.type << " SGE-id: " << job.sge_id << ")" << endl; + if (debug_) QTextStream(stdout) << "Canceling job " << job_id << " (type: " << job.type << " SGE-id: " << job.sge_id << ")" << QT_ENDL; //cancel job QByteArrayList output; diff --git a/src/GenePrioritization/main.cpp b/src/GenePrioritization/main.cpp index 5ff818531..5986c5699 100644 --- a/src/GenePrioritization/main.cpp +++ b/src/GenePrioritization/main.cpp @@ -178,7 +178,7 @@ class ConcreteTool writer = Helper::openFileForWriting(debug_file); stream.setDevice(writer.data()); - stream << "iteration\taverage_rank_change\tstart_at_top" << endl; + stream << "iteration\taverage_rank_change\tstart_at_top" << QT_ENDL; QList::NodePointer> node_list = graph.adjacencyList().keys(); sortGenesByScore(node_list); @@ -187,7 +187,7 @@ class ConcreteTool previous_ranks.insert(node_list.at(i).data()->nodeName(), i+1); } - stream << 0 << "\tNaN\t" << getStartGenesAtTop(node_list) << endl; + stream << 0 << "\tNaN\t" << getStartGenesAtTop(node_list) << QT_ENDL; } // perform flooding algorithm @@ -244,7 +244,7 @@ class ConcreteTool } stream << i+1 << "\t" << getAverageRankDifference(current_ranks, previous_ranks) \ - << "\t" << getStartGenesAtTop(node_list) << endl; + << "\t" << getStartGenesAtTop(node_list) << QT_ENDL; previous_ranks = current_ranks; } } @@ -276,8 +276,8 @@ class ConcreteTool writer = Helper::openFileForWriting(debug_file); stream.setDevice(writer.data()); - stream << "step\tprobability_diff_norm" << endl; - stream << steps << "\tNaN" << endl; + stream << "step\tprobability_diff_norm" << QT_ENDL; + stream << steps << "\tNaN" << QT_ENDL; } QTextStream out(stdout); @@ -317,8 +317,8 @@ class ConcreteTool if(debug) { - stream << steps << "\t" << vector_diff << endl; - out << steps << "\t" << vector_diff << endl; + stream << steps << "\t" << vector_diff << QT_ENDL; + out << steps << "\t" << vector_diff << QT_ENDL; } } @@ -339,7 +339,7 @@ class ConcreteTool QSharedPointer writer = Helper::openFileForWriting(out_file); QTextStream stream(writer.data()); - stream << "node\tscore\tstarting_node\tdegree" << endl; + stream << "node\tscore\tstarting_node\tdegree" << QT_ENDL; QList::NodePointer> node_list = graph.adjacencyList().keys(); sortGenesByScore(node_list); @@ -349,7 +349,7 @@ class ConcreteTool { stream << node.data()->nodeName() << "\t" << node.data()->nodeContent().score\ << "\t" << starting_nodes_.contains(node.data()->nodeName()) \ - << "\t" << graph.getDegree(node.data()->nodeName()) << endl; + << "\t" << graph.getDegree(node.data()->nodeName()) << QT_ENDL; } } diff --git a/src/GenesToTranscripts/main.cpp b/src/GenesToTranscripts/main.cpp index 6f818f660..3e942ceb8 100644 --- a/src/GenesToTranscripts/main.cpp +++ b/src/GenesToTranscripts/main.cpp @@ -53,7 +53,7 @@ class ConcreteTool int gene_id = db.geneId(gene); if (gene_id==-1) { - error_stream << "Gene symbol " + gene + " not found in NGSD!" << endl; + error_stream << "Gene symbol " + gene + " not found in NGSD!" << QT_ENDL; continue; } @@ -83,7 +83,7 @@ class ConcreteTool } if (transcripts.isEmpty()) { - error_stream << "No transcript found for gene " + gene + "!" << endl; + error_stream << "No transcript found for gene " + gene + "!" << QT_ENDL; } } } diff --git a/src/MappingQC/main.cpp b/src/MappingQC/main.cpp index 85080229b..f236642ca 100644 --- a/src/MappingQC/main.cpp +++ b/src/MappingQC/main.cpp @@ -77,7 +77,7 @@ class ConcreteTool } //FASTQ QC - QTime timer; + QElapsedTimer timer; timer.start(); QString read_qc = getOutfile("read_qc").trimmed(); if (!read_qc.isEmpty()) @@ -92,7 +92,7 @@ class ConcreteTool } QCCollection metrics_raw_data = stats.getResult(); metrics_raw_data.storeToQCML(read_qc, QStringList() << in, ""); - if (debug) debug_stream << "Performing raw read QC took: " << Helper::elapsedTime(timer) << endl; + if (debug) debug_stream << "Performing raw read QC took: " << Helper::elapsedTime(timer) << QT_ENDL; } //perform main QC @@ -136,7 +136,7 @@ class ConcreteTool parameters << "-roi" << QFileInfo(roi_file).fileName(); if (cfdna) parameters << "-cfdna"; } - if (debug) debug_stream << "Performing main QC took: " << Helper::elapsedTime(timer) << endl; + if (debug) debug_stream << "Performing main QC took: " << Helper::elapsedTime(timer) << QT_ENDL; //sample contamination timer.restart(); @@ -145,7 +145,7 @@ class ConcreteTool { GenomeBuild build = stringToBuild(getEnum("build")); metrics_cont = Statistics::contamination(build, in, ref_file, debug, 20, 50, long_read); - if (debug) debug_stream << "Performing contamination check took: " << Helper::elapsedTime(timer) << endl; + if (debug) debug_stream << "Performing contamination check took: " << Helper::elapsedTime(timer) << QT_ENDL; } //somatic @@ -159,7 +159,7 @@ class ConcreteTool QCCollection custom_depths = Statistics::somaticCustomDepth(custom_bed, in, ref_file, min_mapq); metrics.insert(custom_depths); parameters << "-somatic_custom_bed " + somatic_custom_roi_file; - if (debug) debug_stream << "Performing somatic special QC took: " << Helper::elapsedTime(timer) << endl; + if (debug) debug_stream << "Performing somatic special QC took: " << Helper::elapsedTime(timer) << QT_ENDL; } //post-processing long_read diff --git a/src/NGSDAddVariantsGermline/main.cpp b/src/NGSDAddVariantsGermline/main.cpp index cc652b00d..51c918bf6 100644 --- a/src/NGSDAddVariantsGermline/main.cpp +++ b/src/NGSDAddVariantsGermline/main.cpp @@ -56,25 +56,25 @@ class ConcreteTool QString filename = getInfile("var"); if (filename=="") return; - out << endl; - out << "### importing small variants for " << ps_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing small variants for " << ps_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; //check arguments if (force && var_update) THROW(ArgumentException, "Flags -force and -var_update cannot be used at the same time! Use -force to delete old variants and reimport, and -var_update to only import missing variants.") - QTime timer; + QElapsedTimer timer; timer.start(); - QTime sub_timer; + QElapsedTimer sub_timer; QStringList sub_times; //check if variants were already imported for this PID QString ps_id = db.processedSampleId(ps_name); int count_old = db.importStatus(ps_id).small_variants; - out << "Found " << count_old << " variants already imported into NGSD!" << endl; + out << "Found " << count_old << " variants already imported into NGSD!" << QT_ENDL; if(count_old>0 && !force && !var_update) { - out << "Skipped import because variants were already imported for '" + ps_name + "'. Use the flag '-force' to overwrite them." << endl; + out << "Skipped import because variants were already imported for '" + ps_name + "'. Use the flag '-force' to overwrite them." << QT_ENDL; return; } @@ -87,7 +87,7 @@ class ConcreteTool int c_add, c_update; double max_af = getFloat("max_af"); QList variant_ids = db.addVariants(variants, max_af, c_add, c_update); - out << "Imported variants (added:" << c_add << " updated:" << c_update << ")" << endl; + out << "Imported variants (added:" << c_add << " updated:" << c_update << ")" << QT_ENDL; sub_times << ("adding variants took: " + Helper::elapsedTime(sub_timer)); //skip import of detected variants if same callset was already imported @@ -98,10 +98,10 @@ class ConcreteTool VariantCallingInfo calling_info_ngsd = db.variantCallingInfo(ps_id); if (calling_info_ngsd.small_caller==caller.name && calling_info_ngsd.small_caller_version==caller.version && calling_info_ngsd.small_call_date==calling_date.toString(Qt::ISODate)) { - out << "Skipped import because variants were already imported with the same caller, caller version and calling date!" << endl; + out << "Skipped import because variants were already imported with the same caller, caller version and calling date!" << QT_ENDL; if (!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; } return; @@ -113,7 +113,7 @@ class ConcreteTool { sub_timer.start(); db.deleteVariants(ps_id, VariantType::SNVS_INDELS); - out << "Deleted previous variants" << endl; + out << "Deleted previous variants" << QT_ENDL; sub_times << ("deleted previous detected variants took: " + Helper::elapsedTime(sub_timer)); } @@ -133,7 +133,7 @@ class ConcreteTool //abort if there are no variants in the input file if (variants.count()==0) { - out << "No variants imported (empty GSvar file)." << endl; + out << "No variants imported (empty GSvar file)." << QT_ENDL; return; } @@ -155,7 +155,7 @@ class ConcreteTool variant_ids_new << variant_id; variants_new.append(variants[i]); } - out << "Ignored " << (variants.count()-variants_new.count()) << " already imported variants" << endl; + out << "Ignored " << (variants.count()-variants_new.count()) << " already imported variants" << QT_ENDL; variant_ids = variant_ids_new; variants = variants_new; sub_times << ("Determining already imported variants took: " + Helper::elapsedTime(sub_timer)); @@ -184,19 +184,19 @@ class ConcreteTool //output int c_skipped = variant_ids.count(-1); - out << "Imported " << (variant_ids.count()-c_skipped) << " detected variants" << endl; + out << "Imported " << (variant_ids.count()-c_skipped) << " detected variants" << QT_ENDL; if (debug) { - out << "DEBUG: Skipped " << variant_ids.count(-1) << " high-AF variants!" << endl; + out << "DEBUG: Skipped " << variant_ids.count(-1) << " high-AF variants!" << QT_ENDL; } //output timing if (!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; foreach(QString line, sub_times) { - out << " " << line.trimmed() << endl; + out << " " << line.trimmed() << QT_ENDL; } } } @@ -206,9 +206,9 @@ class ConcreteTool QString filename = getInfile("cnv"); if (filename=="") return; - out << endl; - out << "### importing CNVs for " << ps_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing CNVs for " << ps_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; //prevent import if report config contains CNVs QString ps_id = db.processedSampleId(ps_name); @@ -219,12 +219,12 @@ class ConcreteTool query.exec("SELECT * FROM report_configuration_cnv WHERE report_configuration_id=" + QString::number(report_conf_id)); if (query.size()>0) { - out << "Skipped import of CNVs for sample " + ps_name + ": a report configuration with CNVs exists for this sample!" << endl; + out << "Skipped import of CNVs for sample " + ps_name + ": a report configuration with CNVs exists for this sample!" << QT_ENDL; return; } } - QTime timer; + QElapsedTimer timer; timer.start(); @@ -242,7 +242,7 @@ class ConcreteTool db.getQuery().exec("DELETE FROM cnv WHERE cnv_callset_id='" + last_callset_id + "'"); db.getQuery().exec("DELETE FROM cnv_callset WHERE id='" + last_callset_id + "'"); - out << "Deleted previous CNV callset" << endl; + out << "Deleted previous CNV callset" << QT_ENDL; } //load CNVs @@ -279,11 +279,11 @@ class ConcreteTool //output QString caller = cnvs.callerAsString(); - out << "caller: " << caller << endl; - out << "caller version: " << caller_version << endl; + out << "caller: " << caller << QT_ENDL; + out << "caller version: " << caller_version << QT_ENDL; if (debug) { - out << "DEBUG: callset quality: " << json_doc.toJson(QJsonDocument::Compact) << endl; + out << "DEBUG: callset quality: " << json_doc.toJson(QJsonDocument::Compact) << QT_ENDL; } //import CNV call set @@ -313,18 +313,18 @@ class ConcreteTool ++c_imported; if (debug) { - out << "DEBUG: " << cnvs[i].toString() << " cn:" << db.getValue("SELECT cn FROM cnv WHERE id=" + cnv_id).toString() << " quality: " << db.getValue("SELECT quality_metrics FROM cnv WHERE id=" + cnv_id).toString() << endl; + out << "DEBUG: " << cnvs[i].toString() << " cn:" << db.getValue("SELECT cn FROM cnv WHERE id=" + cnv_id).toString() << " quality: " << db.getValue("SELECT quality_metrics FROM cnv WHERE id=" + cnv_id).toString() << QT_ENDL; } } } - out << "Imported cnvs: " << c_imported << endl; - out << "Skipped low-quality cnvs: " << c_skipped_low_quality << endl; + out << "Imported cnvs: " << c_imported << QT_ENDL; + out << "Skipped low-quality cnvs: " << c_skipped_low_quality << QT_ENDL; //output timing if (!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; } } @@ -333,16 +333,16 @@ class ConcreteTool QString filename = getInfile("sv"); if (filename=="") return; - out << endl; - out << "### importing SVs for " << ps_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing SVs for " << ps_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; - QTime timer; + QElapsedTimer timer; timer.start(); // get processed sample id int ps_id = Helper::toInt(db.processedSampleId(ps_name)); - if(debug) out << "Processed sample id: " << ps_id << endl; + if(debug) out << "Processed sample id: " << ps_id << QT_ENDL; //prevent import if report config contains SVs int report_conf_id = db.reportConfigId(QString::number(ps_id)); @@ -352,7 +352,7 @@ class ConcreteTool query.exec("SELECT * FROM report_configuration_sv WHERE report_configuration_id=" + QString::number(report_conf_id)); if (query.size()>0) { - out << "Skipped import of SVs for sample " + ps_name + ": a report configuration with SVs exists for this sample!" << endl; + out << "Skipped import of SVs for sample " + ps_name + ": a report configuration with SVs exists for this sample!" << QT_ENDL; return; } } @@ -361,7 +361,7 @@ class ConcreteTool QString previous_callset_id = db.getValue("SELECT id FROM sv_callset WHERE processed_sample_id=:0", true, QString::number(ps_id)).toString(); if(previous_callset_id!="" && !force) { - out << "NOTE: SVs were already imported for '" << ps_name << "' - skipping import" << endl; + out << "NOTE: SVs were already imported for '" << ps_name << "' - skipping import" << QT_ENDL; return; } //remove old imports of this processed sample @@ -374,7 +374,7 @@ class ConcreteTool db.getQuery().exec("DELETE FROM sv_translocation WHERE sv_callset_id='" + previous_callset_id + "'"); db.getQuery().exec("DELETE FROM sv_callset WHERE id='" + previous_callset_id + "'"); - out << "Deleted previous SV callset" << endl; + out << "Deleted previous SV callset" << QT_ENDL; } @@ -430,7 +430,7 @@ class ConcreteTool insert_callset.exec(); int callset_id = insert_callset.lastInsertId().toInt(); - if(debug) out << "Callset id: " << callset_id << endl; + if(debug) out << "Callset id: " << callset_id << QT_ENDL; // import structural variants int sv_imported = 0; @@ -466,18 +466,18 @@ class ConcreteTool break; } out << "DEBUG: " << svs[i].positionRange() << " sv: " << BedpeFile::typeToString(svs[i].type()) << " quality: " - << db.getValue("SELECT quality_metrics FROM " + db_table_name + " WHERE id=" + QByteArray::number(sv_id)).toString() << endl; + << db.getValue("SELECT quality_metrics FROM " + db_table_name + " WHERE id=" + QByteArray::number(sv_id)).toString() << QT_ENDL; } } - out << "Imported SVs: " << sv_imported << endl; - out << "Skipped SVs: " << svs.count() - sv_imported << endl; + out << "Imported SVs: " << sv_imported << QT_ENDL; + out << "Skipped SVs: " << svs.count() - sv_imported << QT_ENDL; //output timing if (!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; } } @@ -486,19 +486,19 @@ class ConcreteTool QString filename = getInfile("re"); if (filename=="") return; - out << endl; - out << "### importing REs for " << ps_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing REs for " << ps_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; - QTime timer; + QElapsedTimer timer; timer.start(); // get processed sample id QString ps_id = db.processedSampleId(ps_name); if(debug) { - out << "Processed sample id: " << ps_id << endl; - out << "REs in NGSD: " << db.getValue("SELECT count(*) FROM repeat_expansion").toString() << endl; + out << "Processed sample id: " << ps_id << QT_ENDL; + out << "REs in NGSD: " << db.getValue("SELECT count(*) FROM repeat_expansion").toString() << QT_ENDL; } int report_conf_id = db.reportConfigId(ps_id); @@ -508,7 +508,7 @@ class ConcreteTool query.exec("SELECT * FROM report_configuration_re WHERE report_configuration_id=" + QString::number(report_conf_id)); if (query.size()>0) { - out << "Skipped import of REs for sample " + ps_name + ": a report configuration with REs exists for this sample!" << endl; + out << "Skipped import of REs for sample " + ps_name + ": a report configuration with REs exists for this sample!" << QT_ENDL; return; } } @@ -525,7 +525,7 @@ class ConcreteTool int imported_re_genotypes = db.getValue("SELECT count(*) FROM repeat_expansion_genotype WHERE processed_sample_id=:0", true, ps_id).toInt(); if(imported_re_genotypes>0 && !force) { - out << "NOTE: REs were already imported for '" << ps_name << "' - skipping import" << endl; + out << "NOTE: REs were already imported for '" << ps_name << "' - skipping import" << QT_ENDL; return; } @@ -536,7 +536,7 @@ class ConcreteTool QSqlQuery query = db.getQuery(); query.exec("DELETE FROM repeat_expansion_genotype WHERE processed_sample_id='" + ps_id + "'"); - out << "Deleted " << query.numRowsAffected() << " previous repeat expansion calls" << endl; + out << "Deleted " << query.numRowsAffected() << " previous repeat expansion calls" << QT_ENDL; } //load VCF file @@ -568,7 +568,7 @@ class ConcreteTool int repeat_id = db.repeatExpansionId(re.region(), re.unit(), false); if (repeat_id==-1) { - if (debug) out << "Skipped repeat '" << re.toString(true, false) << "' because it is not in NGSD!" << endl; + if (debug) out << "Skipped repeat '" << re.toString(true, false) << "' because it is not in NGSD!" << QT_ENDL; ++skipped_not_ngsd; continue; } @@ -576,14 +576,14 @@ class ConcreteTool //check genotypes data is available if (re.allele1().isEmpty()) { - if (debug) out << "Skipped repeat '" << re.toString(true, true) << "' because genotype could not be determined." << endl; + if (debug) out << "Skipped repeat '" << re.toString(true, true) << "' because genotype could not be determined." << QT_ENDL; ++skipped_no_gt; continue; } if (!re.isValid()) { - if (debug) out << "Skipped repeat '" << re.toString(true, true) << "' because it is not valid!" << endl; + if (debug) out << "Skipped repeat '" << re.toString(true, true) << "' because it is not valid!" << QT_ENDL; ++skipped_invalid; continue; } @@ -598,15 +598,15 @@ class ConcreteTool ++re_imported; } - out << "Imported REs: " << re_imported << endl; - out << "Skipped REs not found in NGSD: " << skipped_not_ngsd << endl; - out << "Skipped REs without genotype: " << skipped_no_gt << endl; - out << "Skipped REs not valid: " << skipped_invalid << " (should not happen)" << endl; + out << "Imported REs: " << re_imported << QT_ENDL; + out << "Skipped REs not found in NGSD: " << skipped_not_ngsd << QT_ENDL; + out << "Skipped REs without genotype: " << skipped_no_gt << QT_ENDL; + out << "Skipped REs not valid: " << skipped_invalid << " (should not happen)" << QT_ENDL; //output timing if (!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; } } diff --git a/src/NGSDAddVariantsSomatic/main.cpp b/src/NGSDAddVariantsSomatic/main.cpp index 175469251..aaccf1196 100644 --- a/src/NGSDAddVariantsSomatic/main.cpp +++ b/src/NGSDAddVariantsSomatic/main.cpp @@ -43,9 +43,9 @@ class ConcreteTool bool is_tumor_only = n_ps_name.isEmpty(); QString analysis_name = t_ps_name + (is_tumor_only ? "" : "-" + n_ps_name); - out << endl; - out << "### importing small variants for " << analysis_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing small variants for " << analysis_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; QString t_ps_id = db.processedSampleId(t_ps_name); QString n_ps_id = is_tumor_only ? "" : db.processedSampleId(n_ps_name); @@ -61,19 +61,19 @@ class ConcreteTool query.exec("SELECT * FROM somatic_report_configuration_variant WHERE somatic_report_configuration_id=" + QString::number(report_conf_id)); if(query.size()>0) { - out << "Skipped import of small variants for sample " << analysis_name << ": a somatic report configuration with small variants exists for this sample!" << endl; + out << "Skipped import of small variants for sample " << analysis_name << ": a somatic report configuration with small variants exists for this sample!" << QT_ENDL; return; } } } - QTime timer; + QElapsedTimer timer; timer.start(); - QTime sub_timer; + QElapsedTimer sub_timer; QStringList sub_times; int count_old = db.getValue("SELECT count(*) FROM detected_somatic_variant WHERE "+dv_where).toInt(); - out << "Found " << count_old << " variants already imported into NGSD!" << endl; + out << "Found " << count_old << " variants already imported into NGSD!" << QT_ENDL; if(count_old>0 && !var_force) { THROW(ArgumentException, "Variants were already imported for '" + analysis_name + "'. Use the flag '-force' to overwrite them."); @@ -87,7 +87,7 @@ class ConcreteTool SqlQuery query = db.getQuery(); query.exec("DELETE FROM detected_somatic_variant WHERE "+dv_where); - out << "Deleted previous somatic variants." << endl; + out << "Deleted previous somatic variants." << QT_ENDL; sub_times << ("Deleted previous detected somatic variants took: " + Helper::elapsedTime(sub_timer)); } @@ -95,7 +95,7 @@ class ConcreteTool variants.load(filename); if(variants.count() == 0) { - out << "No somatic variants imported (empty GSvar file)." << endl; + out << "No somatic variants imported (empty GSvar file)." << QT_ENDL; return; } @@ -105,7 +105,7 @@ class ConcreteTool int c_add, c_update; QList variant_ids = db.addVariants(variants, 1.0, c_add, c_update); - out << "Imported variants (added:" << c_add << " updated:" << c_update << ")" << endl; + out << "Imported variants (added:" << c_add << " updated:" << c_update << ")" << QT_ENDL; sub_times << ("adding variants took: " + Helper::elapsedTime(sub_timer)); //add detected somatic variants @@ -132,10 +132,10 @@ class ConcreteTool if(!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; foreach(const QString& line, sub_times) { - out << " " << line.trimmed() << endl; + out << " " << line.trimmed() << QT_ENDL; } } } @@ -145,13 +145,13 @@ class ConcreteTool QString filename = getInfile("cnv"); if(filename == "") return; - QTime timer; + QElapsedTimer timer; timer.start(); QString ps_full_name = t_ps_name + "-" + n_ps_name; - out << endl; - out << "### importing somatic CNVs for " << ps_full_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing somatic CNVs for " << ps_full_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; //Prevent import if somatic report config contains CNVS QString t_ps_id = db.processedSampleId(t_ps_name); @@ -165,7 +165,7 @@ class ConcreteTool if(query.size() > 0) { - out << "Skipped import of somatic SNVs for sample " << ps_full_name << ": a somatic report configuration with CNVs exists for this sample" << endl; + out << "Skipped import of somatic SNVs for sample " << ps_full_name << ": a somatic report configuration with CNVs exists for this sample" << QT_ENDL; return; } } @@ -174,7 +174,7 @@ class ConcreteTool if(last_callset_id!="" && !cnv_force) { - out << "Skipped import of CNVs for sample " << ps_full_name << ": a report configuration with somatic CNVs exists for this sample!" << endl; + out << "Skipped import of CNVs for sample " << ps_full_name << ": a report configuration with somatic CNVs exists for this sample!" << QT_ENDL; return; } @@ -184,7 +184,7 @@ class ConcreteTool db.getQuery().exec("DELETE FROM somatic_cnv WHERE somatic_cnv_callset_id ='" + last_callset_id + "'"); db.getQuery().exec("DELETE FROM somatic_cnv_callset WHERE id='" + last_callset_id + "'"); - out << "Deleted previous somatic CNV callset" << endl; + out << "Deleted previous somatic CNV callset" << QT_ENDL; } //Load CNVs @@ -201,12 +201,12 @@ class ConcreteTool QJsonDocument json_doc; json_doc.setObject(call_data.quality_metrics); - out << "caller: " << call_data.caller << endl; - out << "caller version: " << call_data.caller_version << endl; + out << "caller: " << call_data.caller << QT_ENDL; + out << "caller version: " << call_data.caller_version << QT_ENDL; if(debug) { - out << "DEBUG: callset quality: " << json_doc.toJson(QJsonDocument::Compact) << endl; + out << "DEBUG: callset quality: " << json_doc.toJson(QJsonDocument::Compact) << QT_ENDL; } //Import somatic cnv callset @@ -246,12 +246,12 @@ class ConcreteTool } } - out << "Imported somatic cnvs: " << c_imported << endl; - out << "Skipped low-quality cnvs: " << c_skipped_low_quality << endl; + out << "Imported somatic cnvs: " << c_imported << QT_ENDL; + out << "Skipped low-quality cnvs: " << c_skipped_low_quality << QT_ENDL; if(!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; } } @@ -261,18 +261,18 @@ class ConcreteTool QString filename = getInfile("sv"); if (filename=="") return; - out << endl; - out << "### importing SVs for tumor-normal pair " << t_ps_name << "-" << n_ps_name << " ###" << endl; - out << "filename: " << filename << endl; + out << QT_ENDL; + out << "### importing SVs for tumor-normal pair " << t_ps_name << "-" << n_ps_name << " ###" << QT_ENDL; + out << "filename: " << filename << QT_ENDL; - QTime timer; + QElapsedTimer timer; timer.start(); // get processed sample id QString ps_full_name = t_ps_name + "-" + n_ps_name; QString t_ps_id = db.processedSampleId(t_ps_name); QString n_ps_id = db.processedSampleId(n_ps_name); - if(debug) out << "Processed sample ids. Tumor: " << t_ps_id << " Normal: " << n_ps_id << endl; + if(debug) out << "Processed sample ids. Tumor: " << t_ps_id << " Normal: " << n_ps_id << QT_ENDL; //prevent import if report config contains SVs int report_conf_id = db.somaticReportConfigId(t_ps_id, n_ps_id); @@ -283,7 +283,7 @@ class ConcreteTool if(query.size() > 0) { - out << "Skipped import of somatic SNVs for sample " << ps_full_name << ": a somatic report configuration with SVs exists for this sample" << endl; + out << "Skipped import of somatic SNVs for sample " << ps_full_name << ": a somatic report configuration with SVs exists for this sample" << QT_ENDL; return; } } @@ -292,7 +292,7 @@ class ConcreteTool QString previous_callset_id = db.getValue("SELECT id FROM somatic_sv_callset WHERE ps_tumor_id=" + t_ps_id + " AND ps_normal_id=" + n_ps_id, true ).toString(); if(previous_callset_id!="" && !sv_force) { - out << "NOTE: SVs were already imported for '" << ps_full_name << "' - skipping import" << endl; + out << "NOTE: SVs were already imported for '" << ps_full_name << "' - skipping import" << QT_ENDL; return; } @@ -306,7 +306,7 @@ class ConcreteTool db.getQuery().exec("DELETE FROM somatic_sv_translocation WHERE somatic_sv_callset_id='" + previous_callset_id + "'"); db.getQuery().exec("DELETE FROM somatic_sv_callset WHERE id='" + previous_callset_id + "'"); - out << "Deleted previous SV callset" << endl; + out << "Deleted previous SV callset" << QT_ENDL; } // open BEDPE file @@ -362,7 +362,7 @@ class ConcreteTool insert_callset.exec(); int callset_id = insert_callset.lastInsertId().toInt(); - if(debug) out << "Callset id: " << callset_id << endl; + if(debug) out << "Callset id: " << callset_id << QT_ENDL; // import structural variants int sv_imported = 0; @@ -378,17 +378,17 @@ class ConcreteTool QString db_table_name = db.somaticSvTableName(svs[i].type()); out << "DEBUG: " << svs[i].positionRange() << " sv: " << BedpeFile::typeToString(svs[i].type()) << " quality: " - << db.getValue("SELECT quality_metrics FROM " + db_table_name + " WHERE id=" + sv_id).toString() << endl; + << db.getValue("SELECT quality_metrics FROM " + db_table_name + " WHERE id=" + sv_id).toString() << QT_ENDL; } } - out << "Imported SVs: " << sv_imported << endl; - out << "Skipped SVs: " << svs.count() - sv_imported << endl; + out << "Imported SVs: " << sv_imported << QT_ENDL; + out << "Skipped SVs: " << svs.count() - sv_imported << QT_ENDL; if(!no_time) { - out << "Import took: " << Helper::elapsedTime(timer) << endl; + out << "Import took: " << Helper::elapsedTime(timer) << QT_ENDL; } } diff --git a/src/NGSDAnnotateCNV/main.cpp b/src/NGSDAnnotateCNV/main.cpp index 797830c4b..dfb5cafd1 100644 --- a/src/NGSDAnnotateCNV/main.cpp +++ b/src/NGSDAnnotateCNV/main.cpp @@ -47,14 +47,14 @@ class ConcreteTool //init NGSD db(getFlag("test")); QTextStream out(stdout); - QTime timer; + QElapsedTimer timer; timer.start(); // prepare SQL query SqlQuery sql_query = db.getQuery(); sql_query.prepare("SELECT rcc.class, cnv.start, cnv.end FROM cnv INNER JOIN report_configuration_cnv rcc ON cnv.id = rcc.cnv_id WHERE rcc.class IN ('4', '5') AND cnv.chr = :0 AND cnv.start <= :1 AND :2 <= cnv.end "); - out << "annotate TSV file..." << endl; + out << "annotate TSV file..." << QT_ENDL; // copy comments TSVFileStream cnv_input_file(getInfile("in")); @@ -151,7 +151,7 @@ class ConcreteTool output_buffer << tsv_line.join("\t"); } - out << "Writing output file..." << endl; + out << "Writing output file..." << QT_ENDL; // open output file and write annotated CNVs to file QSharedPointer cnv_output_file = Helper::openFileForWriting(getOutfile("out"), true); QTextStream output_stream(cnv_output_file.data()); @@ -164,7 +164,7 @@ class ConcreteTool cnv_output_file->close(); - out << "annotation complete (runtime: " << Helper::elapsedTime(timer) << ")." << endl; + out << "annotation complete (runtime: " << Helper::elapsedTime(timer) << ")." << QT_ENDL; } }; diff --git a/src/NGSDAnnotateSV/main.cpp b/src/NGSDAnnotateSV/main.cpp index 0737a9bbd..b448dc161 100644 --- a/src/NGSDAnnotateSV/main.cpp +++ b/src/NGSDAnnotateSV/main.cpp @@ -188,7 +188,7 @@ class ConcreteTool } - out << "writing annotated SVs to file..." << endl; + out << "writing annotated SVs to file..." << QT_ENDL; // open output file QSharedPointer output_file = Helper::openFileForWriting(getOutfile("out"),false,false); diff --git a/src/NGSDExportAnnotationData/ExportWorker.cpp b/src/NGSDExportAnnotationData/ExportWorker.cpp index 1abbff040..58e9938ce 100644 --- a/src/NGSDExportAnnotationData/ExportWorker.cpp +++ b/src/NGSDExportAnnotationData/ExportWorker.cpp @@ -9,7 +9,7 @@ ExportWorker::ExportWorker(QString chr, const ExportParameters& params, const Sh , params_(params) , shared_data_(shared_data) { - if (params_.verbose) QTextStream(stdout) << "ExportWorker" << endl; + if (params_.verbose) QTextStream(stdout) << "ExportWorker" << QT_ENDL; } ExportWorker::~ExportWorker() @@ -318,7 +318,7 @@ void ExportWorker::run() int current_sample = ngsd_count_query.value(0).toInt(); bool is_tumor_normal = !ngsd_count_query.value(3).isNull(); - QTextStream(stderr) << variant.toString() << " " << is_tumor_normal << " " << current_sample << endl; + QTextStream(stderr) << variant.toString() << " " << is_tumor_normal << " " << current_sample << QT_ENDL; if (is_tumor_normal) { //skip already seen samples for general statistics (there could be several processings of the same sample because of different processing systems or because of experment repeats due to quality issues) @@ -337,7 +337,7 @@ void ExportWorker::run() s_ids_to_done.insert(current_sample); ++somatic_count_to; - QTextStream(stderr) << somatic_count_to << endl; + QTextStream(stderr) << somatic_count_to << QT_ENDL; } } @@ -473,8 +473,7 @@ void ExportWorker::run() emit done(chr_); } catch(Exception& e) - { - //QTextStream(stdout) << "ExportWorker:error " << chr_ << " message:" << e.message() << endl; + { emit error(chr_, e.message()); } diff --git a/src/NGSDExportAnnotationData/ThreadCoordinator.cpp b/src/NGSDExportAnnotationData/ThreadCoordinator.cpp index 16e1b2afc..2169a163d 100644 --- a/src/NGSDExportAnnotationData/ThreadCoordinator.cpp +++ b/src/NGSDExportAnnotationData/ThreadCoordinator.cpp @@ -72,12 +72,11 @@ ThreadCoordinator::~ThreadCoordinator() void ThreadCoordinator::log(QString chr, QString message) { - out_ << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << "\t" << chr << "\t" << message << endl; + out_ << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << "\t" << chr << "\t" << message << QT_ENDL; } void ThreadCoordinator::error(QString chr, QString message) { - //QTextStream(stdout) << "ThreadCoordinator::error " << i << " " << message << endl; THROW(Exception, "Exception in worker for " + chr + ": " + message); } diff --git a/src/NGSDExportCnvTrack/main.cpp b/src/NGSDExportCnvTrack/main.cpp index c95ff488a..c618ab8b3 100644 --- a/src/NGSDExportCnvTrack/main.cpp +++ b/src/NGSDExportCnvTrack/main.cpp @@ -216,8 +216,6 @@ class ConcreteTool int i_end = -1; while (nextOverlappingRange(cnvs, i_start, i_end)) { - //stream2 << "overlap range - index: " << i_start << "-" << i_end << " - size: " << (i_end - i_start + 1) << " - pos: " << cnvs[i_start].start << "-" << cnvs[i_end].end << endl; - //determine all sub-regions of the overlapping range QList positions; for (int i=i_start; i<=i_end; ++i) diff --git a/src/NGSDExportSV/main.cpp b/src/NGSDExportSV/main.cpp index 38ccc0376..e9fe4d896 100644 --- a/src/NGSDExportSV/main.cpp +++ b/src/NGSDExportSV/main.cpp @@ -97,7 +97,7 @@ class ConcreteTool } - std_out << "Collapsing SV density took " << QByteArray::number(debug_time_collapse_density/1000.0) << "s" << endl; + std_out << "Collapsing SV density took " << QByteArray::number(debug_time_collapse_density/1000.0) << "s" << QT_ENDL; } virtual void main() @@ -107,7 +107,7 @@ class ConcreteTool bool test = getFlag("test"); int common_sys_threshold = getInt("common_sys_threshold"); NGSD db(test); - QTime timer; + QElapsedTimer timer; timer.start(); QTextStream std_out(stdout); @@ -146,7 +146,7 @@ class ConcreteTool //get sample counts - std_out << "Get sample counts per processing system..." << endl; + std_out << "Get sample counts per processing system..." << QT_ENDL; SqlQuery q_sample_counts = db.getQuery(); q_sample_counts.exec(QByteArray() + "SELECT ps.processing_system_id, COUNT(sc.id) FROM sv_callset sc INNER JOIN processed_sample ps ON sc.processed_sample_id = ps.id " + "WHERE ps.quality != 'bad' AND NOT EXISTS " @@ -156,7 +156,7 @@ class ConcreteTool { sample_counts.insert(db.getProcessingSystemData(q_sample_counts.value(0).toInt()).name_short, q_sample_counts.value(1).toInt()); } - std_out << " done. " << Helper::elapsedTime(timer) << endl; + std_out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; //get all common processing systems (will be written in seperate files) @@ -167,15 +167,15 @@ class ConcreteTool //get all valid callset ids (are not bad quality and not merged) - std_out << "Get all valid callset ids..." << endl; + std_out << "Get all valid callset ids..." << QT_ENDL; QSet valid_cs_ids = db.getValuesInt(QByteArray() + "SELECT sc.id FROM sv_callset sc INNER JOIN processed_sample ps ON sc.processed_sample_id = ps.id " + "WHERE ps.quality != 'bad' AND NOT EXISTS " + "(SELECT 1 FROM merged_processed_samples mps WHERE mps.processed_sample_id = sc.processed_sample_id)").toSet(); - std_out << " done. " << Helper::elapsedTime(timer) << endl; + std_out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; - std_out << "NGSD preperation done. " << Helper::elapsedTime(timer) << endl; + std_out << "NGSD preperation done. " << Helper::elapsedTime(timer) << QT_ENDL; foreach (StructuralVariantType sv_type, sv_types) @@ -209,7 +209,7 @@ class ConcreteTool THROW(ArgumentException, "Invalid SV type!"); break; } - std_out << "Extract " << StructuralVariantTypeToString(sv_type) << "..." << endl; + std_out << "Extract " << StructuralVariantTypeToString(sv_type) << "..." << QT_ENDL; //init output file QString file_path = QDir(output_folder).filePath(table_name + ".bedpe"); @@ -236,7 +236,7 @@ class ConcreteTool foreach (const QString& chr, chromosomes) { QList ids = db.getValuesInt("SELECT `id` FROM `" + table_name + "`" + filter, chr); - std_out << QByteArray::number(ids.size()) << " " << StructuralVariantTypeToString(sv_type) << " for " + chr + " to export... " << Helper::elapsedTime(timer) << endl; + std_out << QByteArray::number(ids.size()) << " " << StructuralVariantTypeToString(sv_type) << " for " + chr + " to export... " << Helper::elapsedTime(timer) << QT_ENDL; SqlQuery q_callset_id = db.getQuery(); q_callset_id.prepare("SELECT `sv_callset_id` FROM `" + table_name + "` WHERE id=:0"); @@ -391,7 +391,7 @@ class ConcreteTool std_out << "\t getting processing system took " << QByteArray::number(debug_time_get_sys) << "s \n"; std_out << "\t write file took " << QByteArray::number(debug_time_write_file) << "s \n"; std_out << "\t extracting SV density took " << QByteArray::number(debug_time_extract_density) << "s \n"; - std_out << endl; + std_out << QT_ENDL; } } diff --git a/src/NGSDExportStudyGHGA/main.cpp b/src/NGSDExportStudyGHGA/main.cpp index 7ccfe74fe..a72f734c6 100644 --- a/src/NGSDExportStudyGHGA/main.cpp +++ b/src/NGSDExportStudyGHGA/main.cpp @@ -633,7 +633,7 @@ class ConcreteTool NGSD db(data.test_mode); //load processed samples to export - stream << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << " Loading processed sample list..." << endl; + stream << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << " Loading processed sample list..." << QT_ENDL; auto handle = Helper::openFileForReading(getInfile("samples"), false); while(!handle->atEnd()) { @@ -660,7 +660,7 @@ class ConcreteTool data.ps_list << PSData{ps_id, ps, pseudonym, db.getSampleData(s_id), db.getProcessedSampleData(ps_id), db.samplePhenotypes(s_id), patient_id}; } - stream << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << " Writing JSON for " << data.ps_list.count() << " samples..." << endl; + stream << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << " Writing JSON for " << data.ps_list.count() << " samples..." << QT_ENDL; //create JSON QJsonObject root; @@ -685,7 +685,7 @@ class ConcreteTool QJsonDocument doc(root); Helper::storeTextFile(getOutfile("out"), QStringList() << doc.toJson()); - stream << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << " Done" << endl; + stream << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss") << " Done" << QT_ENDL; } }; diff --git a/src/NGSDExtractRNACohort/main.cpp b/src/NGSDExtractRNACohort/main.cpp index a44bcc17a..a23274092 100644 --- a/src/NGSDExtractRNACohort/main.cpp +++ b/src/NGSDExtractRNACohort/main.cpp @@ -98,7 +98,7 @@ class ConcreteTool //get cohort - QVector cohort = db.getRNACohort(sys_id, s_data.tissue, ps_data.project_name, ps_id, cohort_strategy, "genes").toList().toVector(); + QVector cohort = db.getRNACohort(sys_id, s_data.tissue, ps_data.project_name, ps_id, cohort_strategy, "genes").values().toVector(); std::sort(cohort.rbegin(), cohort.rend()); //remove given ps_id if manual file is provided diff --git a/src/NGSDImportEnsembl/main.cpp b/src/NGSDImportEnsembl/main.cpp index cf44b1027..9b547ca08 100644 --- a/src/NGSDImportEnsembl/main.cpp +++ b/src/NGSDImportEnsembl/main.cpp @@ -72,7 +72,6 @@ class ConcreteTool int addTranscript(SqlQuery& query, int gene_id, const QByteArray& name, int version, const QByteArray& source, const Transcript& t, bool is_gencode_basic, bool is_ensembl_canonical, bool is_mane_select, bool is_mane_plus_clinical) { - //QTextStream(stdout) << "Adding transcript name=" << name << " version=" << version << " source=" << source << endl; query.bindValue(0, gene_id); query.bindValue(1, name); query.bindValue(2, version); @@ -105,10 +104,8 @@ class ConcreteTool void addExons(SqlQuery& query, int transcript_id, const BedFile& exons) { - //QTextStream(stdout) << " " << exons.count() << endl; for (int i=0; i gene_ids = db.getValuesInt("SELECT id FROM gene g WHERE " + constraint); - out << "NGSD contains " << gene_ids.count() << " " << (protein_coding? "protein-coding" : "other") << " genes" << endl; - out << " - with at least one Ensembl transcript: " << db.getValues("SELECT DISTINCT g.id FROM gene g, gene_transcript gt WHERE g.id=gt.gene_id AND " + constraint + " AND gt.source='Ensembl'").count() << endl; - out << " - with a CCDS transcript: " << db.getValues("SELECT DISTINCT g.id FROM gene g, gene_transcript gt WHERE g.id=gt.gene_id AND " + constraint + " AND gt.source='CCDS'").count() << endl; - out << " - with MANE transcripts: " << db.getValues("SELECT DISTINCT g.id FROM gene g, gene_transcript gt WHERE g.id=gt.gene_id AND " + constraint + " AND (gt.is_mane_select=1 || gt.is_mane_plus_clinical=1)").count() << endl; + out << "NGSD contains " << gene_ids.count() << " " << (protein_coding? "protein-coding" : "other") << " genes" << QT_ENDL; + out << " - with at least one Ensembl transcript: " << db.getValues("SELECT DISTINCT g.id FROM gene g, gene_transcript gt WHERE g.id=gt.gene_id AND " + constraint + " AND gt.source='Ensembl'").count() << QT_ENDL; + out << " - with a CCDS transcript: " << db.getValues("SELECT DISTINCT g.id FROM gene g, gene_transcript gt WHERE g.id=gt.gene_id AND " + constraint + " AND gt.source='CCDS'").count() << QT_ENDL; + out << " - with MANE transcripts: " << db.getValues("SELECT DISTINCT g.id FROM gene g, gene_transcript gt WHERE g.id=gt.gene_id AND " + constraint + " AND (gt.is_mane_select=1 || gt.is_mane_plus_clinical=1)").count() << QT_ENDL; GeneSet no_chr_genes; GeneSet multi_chr_genes; GeneSet duplicate_ensg; @@ -292,9 +289,9 @@ class ConcreteTool duplicate_ensg << db.geneSymbol(gene_id); } } - out << " - without transcripts: " << no_chr_genes.count() << " (" << no_chr_genes.join(", ") << ")" << endl; - out << " - with transcripts on several chromosomes: " << multi_chr_genes.count() << " (" << multi_chr_genes.join(", ") << ")" << endl; - out << " - with transcripts from several ENSGs: " << duplicate_ensg.count() << " (" << duplicate_ensg.join(", ") << ")" << endl; + out << " - without transcripts: " << no_chr_genes.count() << " (" << no_chr_genes.join(", ") << ")" << QT_ENDL; + out << " - with transcripts on several chromosomes: " << multi_chr_genes.count() << " (" << multi_chr_genes.join(", ") << ")" << QT_ENDL; + out << " - with transcripts from several ENSGs: " << duplicate_ensg.count() << " (" << duplicate_ensg.join(", ") << ")" << QT_ENDL; } virtual void main() @@ -371,19 +368,19 @@ class ConcreteTool if (db.approvedGeneNames().contains(gene)) { ngsd_gene_id = db.geneId(gene); - out << "Notice: HGNC-approved symbol of gene " << gene << "/" << t.geneId() << "/" << t.hgncId() << " determined via gene name" << endl; + out << "Notice: HGNC-approved symbol of gene " << gene << "/" << t.geneId() << "/" << t.hgncId() << " determined via gene name" << QT_ENDL; } } if (ngsd_gene_id==-1) //fallback to gene symbol ID { - out << "Notice: Could not determine HGNC-approved symbol of gene " << gene << "/" << t.geneId() << "/" << t.hgncId() << endl; + out << "Notice: Could not determine HGNC-approved symbol of gene " << gene << "/" << t.geneId() << "/" << t.hgncId() << QT_ENDL; continue; } //skip transcripts in chrY PAR as it is masked - necessary since Ensembl 110 release: https://www.ensembl.info/2023/07/17/ensembl-110-has-been-released/ if (t.chr().isY() && par.overlapsWith(t.chr(), t.start(), t.end())) { - out << "Notice: skipped chrY PAR transcript of " << gene << "/" << t.geneId() << "/" << t.hgncId() << endl; + out << "Notice: skipped chrY PAR transcript of " << gene << "/" << t.geneId() << "/" << t.hgncId() << QT_ENDL; continue; } @@ -424,7 +421,7 @@ class ConcreteTool } //statistics output - out << "Imported " << db.getValue("SELECT count(*) FROM gene_transcript").toInt() << " transcripts into NGSD" << endl; + out << "Imported " << db.getValue("SELECT count(*) FROM gene_transcript").toInt() << " transcripts into NGSD" << QT_ENDL; statistics(db, out, true, gene2ensg); statistics(db, out, false, gene2ensg); } diff --git a/src/NGSDImportGeneInfo/main.cpp b/src/NGSDImportGeneInfo/main.cpp index 454b08d93..8fe986578 100644 --- a/src/NGSDImportGeneInfo/main.cpp +++ b/src/NGSDImportGeneInfo/main.cpp @@ -32,7 +32,7 @@ class ConcreteTool db.tableExists("geneinfo_germline"); //update gene names to approved symbols - out << "Updating gene names..." << endl; + out << "Updating gene names..." << QT_ENDL; { SqlQuery query = db.getQuery(); query.exec("SELECT symbol FROM geneinfo_germline WHERE symbol NOT IN (SELECT symbol FROM gene)"); @@ -42,14 +42,14 @@ class ConcreteTool auto approved = db.geneToApprovedWithMessage(symbol); if (!approved.second.startsWith("KEPT:")) { - out << " skipped " << symbol << ": " << approved.second << endl; + out << " skipped " << symbol << ": " << approved.second << QT_ENDL; } } - out << endl; + out << QT_ENDL; } //import gnomAD o/e scores - out << "Importing gnomAD constraints..." << endl; + out << "Importing gnomAD constraints..." << QT_ENDL; { int c_inserted = 0; @@ -94,7 +94,7 @@ class ConcreteTool auto approved = db.geneToApprovedWithMessage(gene); if (approved.second.startsWith("ERROR:")) { - out << " skipped " << gene << ": " << approved.second << endl; + out << " skipped " << gene << ": " << approved.second << QT_ENDL; continue; } gene = approved.first; @@ -132,13 +132,13 @@ class ConcreteTool ++c_inserted; } - out << " imported constraint info for " << c_inserted << " genes" << endl; - out << endl; + out << " imported constraint info for " << c_inserted << " genes" << QT_ENDL; + out << QT_ENDL; } //gene inheritance from HPO info - out << endl; - out << "Setting gene inheritance based on info from HPO..." << endl; + out << QT_ENDL; + out << "Setting gene inheritance based on info from HPO..." << QT_ENDL; { SqlQuery update_query = db.getQuery(); @@ -171,7 +171,7 @@ class ConcreteTool } else { - out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << endl; + out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << QT_ENDL; } } if (mode=="X-linked dominant inheritance") @@ -182,7 +182,7 @@ class ConcreteTool } else { - out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << endl; + out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << QT_ENDL; } } if (mode=="Mitochondrial inheritance") @@ -193,7 +193,7 @@ class ConcreteTool } else { - out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << endl; + out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << QT_ENDL; } } if (mode=="Autosomal recessive inheritance") @@ -204,7 +204,7 @@ class ConcreteTool } else { - out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << endl; + out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << QT_ENDL; } } if (mode=="Autosomal dominant inheritance") @@ -215,7 +215,7 @@ class ConcreteTool } else { - out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << endl; + out << " skipped invalid inheritance mode '" << mode << "' for gene " << gene << " (chromosome " << chr << ")" << QT_ENDL; } } } @@ -243,15 +243,15 @@ class ConcreteTool } else { - out << " check inheritance manually: gene=" << gene << " chr=" << chr << " old=" << inh_old << " new=" << inh_new << endl; + out << " check inheritance manually: gene=" << gene << " chr=" << chr << " old=" << inh_old << " new=" << inh_new << QT_ENDL; ++c_check; } } - out << " genes without inheritance info: " << c_noinfo << endl; - out << " genes with unchanged inheritance: " << c_unchanged << endl; - out << " genes with updated inheritance: " << c_update << endl; - out << " genes that require manual check: " << c_check << endl; + out << " genes without inheritance info: " << c_noinfo << QT_ENDL; + out << " genes with unchanged inheritance: " << c_unchanged << QT_ENDL; + out << " genes with updated inheritance: " << c_update << QT_ENDL; + out << " genes that require manual check: " << c_check << QT_ENDL; } } }; diff --git a/src/NGSDImportGenlab/main.cpp b/src/NGSDImportGenlab/main.cpp index 1547f780c..111acda27 100644 --- a/src/NGSDImportGenlab/main.cpp +++ b/src/NGSDImportGenlab/main.cpp @@ -93,7 +93,7 @@ class ConcreteTool if (!sample_ids_ngsd.contains(sample2_id)) { - QTextStream(stdout) << "Adding relative relation: " << genlab_relation.sample1 << " - " << genlab_relation.relation << " - " << genlab_relation.sample2 << endl; + QTextStream(stdout) << "Adding relative relation: " << genlab_relation.sample1 << " - " << genlab_relation.relation << " - " << genlab_relation.sample2 << QT_ENDL; SqlQuery insert = db.getQuery(); insert.prepare("INSERT INTO sample_relations (sample1_id, relation, sample2_id) VALUES (:0, :1, :2)"); insert.bindValue(0, db.sampleId(genlab_relation.sample1)); @@ -159,7 +159,7 @@ class ConcreteTool normal_sample_name = best_candidate.normal_sample_name; } - QTextStream(stdout) << "Adding new tumor normal relation: " << tumor_ps_name << " tumor-normal " << normal_ps_name << endl; + QTextStream(stdout) << "Adding new tumor normal relation: " << tumor_ps_name << " tumor-normal " << normal_ps_name << QT_ENDL; SqlQuery insert = db.getQuery(); insert.prepare("INSERT IGNORE INTO sample_relations (sample1_id, relation, sample2_id) VALUES (:0,'tumor-normal',:1)"); @@ -170,7 +170,7 @@ class ConcreteTool //update normal id of tumor if (db.normalSample(tumor_ps_id)=="") { - QTextStream(stdout) << "Updating normal ID for tumor sample: " << tumor_ps_name << " - normal sample is: " << normal_ps_name << endl; + QTextStream(stdout) << "Updating normal ID for tumor sample: " << tumor_ps_name << " - normal sample is: " << normal_ps_name << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE `processed_sample` SET normal_id = " + normal_ps_id + " WHERE id=" + tumor_ps_id); } } @@ -205,7 +205,7 @@ class ConcreteTool //found a related sample in genlab -> import and stop if (!genlab_related_sample.name.isEmpty()) { - QTextStream(stdout) << "Adding DNA-RNA relation based on GenLab v_ngs_dnarna table: " << current_sample_data.name << " same sample " << genlab_related_sample.name << endl; + QTextStream(stdout) << "Adding DNA-RNA relation based on GenLab v_ngs_dnarna table: " << current_sample_data.name << " same sample " << genlab_related_sample.name << QT_ENDL; SqlQuery insert = db.getQuery(); insert.prepare("INSERT INTO sample_relations (sample1_id, relation, sample2_id) VALUES (:0,'same sample',:1)"); insert.bindValue(0, db.sampleId(current_sample_data.name)); @@ -244,7 +244,7 @@ class ConcreteTool if (! best_candidate.name.isEmpty()) { - QTextStream(stdout) << "Adding DNA-RNA relation based on NGSD: " << current_sample_data.name << " same sample " << best_candidate.name << endl; + QTextStream(stdout) << "Adding DNA-RNA relation based on NGSD: " << current_sample_data.name << " same sample " << best_candidate.name << QT_ENDL; SqlQuery insert = db.getQuery(); insert.prepare("INSERT INTO sample_relations (sample1_id, relation, sample2_id) VALUES (:0,'same sample',:1)"); insert.bindValue(0, db.sampleId(current_sample_data.name)); @@ -264,7 +264,7 @@ class ConcreteTool QString gender = genlab.gender(ps_name); if (gender!="" && s_data.gender=="n/a") { - QTextStream(stdout) << "Adding gender: " << gender << endl; + QTextStream(stdout) << "Adding gender: " << gender << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET gender='" + gender + "' WHERE id=" + s_id); } @@ -272,7 +272,7 @@ class ConcreteTool QString patient_identifier = genlab.patientIdentifier(ps_name); if (patient_identifier!="" && s_data.patient_identifier=="") { - QTextStream(stdout) << "Adding patient identifier: " << patient_identifier << endl; + QTextStream(stdout) << "Adding patient identifier: " << patient_identifier << QT_ENDL; if (!dry_run)db.getQuery().exec("UPDATE sample SET patient_identifier='" + patient_identifier + "' WHERE id=" + s_id); } @@ -280,7 +280,7 @@ class ConcreteTool QString yob = genlab.yearOfBirth(ps_name); if (yob!="" && s_data.year_of_birth=="") { - QTextStream(stdout) << "Adding year of birth: " << yob << endl; + QTextStream(stdout) << "Adding year of birth: " << yob << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET year_of_birth='" + yob + "' WHERE id=" + s_id); } @@ -288,7 +288,7 @@ class ConcreteTool QString order_date = genlab.orderEntryDate(ps_name); if (order_date!="" && s_data.order_date=="") { - QTextStream(stdout) << "Adding order date: " << order_date << endl; + QTextStream(stdout) << "Adding order date: " << order_date << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET order_date='" + order_date + "' WHERE id=" + s_id); } @@ -296,7 +296,7 @@ class ConcreteTool QString sampling_date = genlab.samplingDate(ps_name); if (sampling_date!="" && s_data.sampling_date=="") { - QTextStream(stdout) << "Adding sampling date: " << sampling_date << endl; + QTextStream(stdout) << "Adding sampling date: " << sampling_date << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET sampling_date='" + sampling_date + "' WHERE id=" + s_id); } @@ -304,7 +304,7 @@ class ConcreteTool QString tissue = genlab.tissue(ps_name); if (tissue!="" && s_data.tissue=="n/a") { - QTextStream(stdout) << "Adding tissue: " << tissue << endl; + QTextStream(stdout) << "Adding tissue: " << tissue << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET tissue='" + tissue + "' WHERE id=" + s_id); } @@ -314,12 +314,12 @@ class ConcreteTool QString disease_status = disease_data.second; if (disease_group!="n/a" && s_data.disease_group=="n/a") { - QTextStream(stdout) << "Adding disease group: " << disease_group << endl; + QTextStream(stdout) << "Adding disease group: " << disease_group << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET disease_group='" + disease_group + "' WHERE id=" + s_id); } if (disease_status!="n/a" && s_data.disease_status=="n/a") { - QTextStream(stdout) << "Adding disease status: " << disease_status << endl; + QTextStream(stdout) << "Adding disease status: " << disease_status << QT_ENDL; if (!dry_run) db.getQuery().exec("UPDATE sample SET disease_status='" + disease_status + "' WHERE id=" + s_id); } @@ -346,7 +346,7 @@ class ConcreteTool QVariant study_id = db.getValue("SELECT id FROM study WHERE name=:0", true, study); if (!study_id.isValid()) INFO(ArgumentException, "GenLab study name '" + study + "' not found in NGSD! Please add the study to NGSD, or correct the study name in GenLab!"); - QTextStream(stdout) << "Adding study: " << study << endl; + QTextStream(stdout) << "Adding study: " << study << QT_ENDL; if (!dry_run) db.getQuery().exec("INSERT INTO `study_sample`(`study_id`, `processed_sample_id`) VALUES ("+study_id.toString()+", "+ps_id+")"); } @@ -367,7 +367,7 @@ class ConcreteTool { if (!ngsd_values.contains(genlab_v)) { - QTextStream(stdout) << "Adding disease details: " << type << " - " << genlab_v << endl; + QTextStream(stdout) << "Adding disease details: " << type << " - " << genlab_v << QT_ENDL; SampleDiseaseInfo new_entry; new_entry.disease_info = genlab_v; @@ -415,7 +415,7 @@ class ConcreteTool else if (rna_reference_tissue.count()>1) { - QTextStream(stdout) << "WARNING: Cannot determine RNA reference tissue! Sample " + ps_name + " has multiple HPO terms that are mapped to contradicting RNA reference tissues." << endl; + QTextStream(stdout) << "WARNING: Cannot determine RNA reference tissue! Sample " + ps_name + " has multiple HPO terms that are mapped to contradicting RNA reference tissues." << QT_ENDL; } } diff --git a/src/NGSDImportHGNC/main.cpp b/src/NGSDImportHGNC/main.cpp index 43af396c9..ad9a2d1d3 100644 --- a/src/NGSDImportHGNC/main.cpp +++ b/src/NGSDImportHGNC/main.cpp @@ -44,7 +44,7 @@ class ConcreteTool void updateTable(NGSD& db, QString table_name) { QTextStream out(stdout); - out << "Updating entries in " + table_name + " table..." << endl; + out << "Updating entries in " + table_name + " table..." << QT_ENDL; //get all gene names SqlQuery query = db.getQuery(); query.exec("SELECT symbol FROM " + table_name); @@ -80,8 +80,8 @@ class ConcreteTool } } } - out << " updated " << c_upd << " entries" << endl; - out << " deleted " << c_del << " entries" << endl; + out << " updated " << c_upd << " entries" << QT_ENDL; + out << " deleted " << c_del << " entries" << QT_ENDL; } @@ -171,7 +171,7 @@ class ConcreteTool QSharedPointer fp = Helper::openFileForReading(getInfile("in")); //get duplicate ENSG ids - out << "Extract duplicate ENSG ids..." << endl; + out << "Extract duplicate ENSG ids..." << QT_ENDL; while (!fp->atEnd()) { QByteArray line = fp->readLine().trimmed(); @@ -193,16 +193,16 @@ class ConcreteTool ensg_ids.insert(ensg_id); } } - out << "ENSG IDs used for more than one gene (" << QByteArray::number(duplicate_ensg_ids.size()) << "): " << duplicate_ensg_ids.toList().join(", ") << endl; + out << "ENSG IDs used for more than one gene (" << QByteArray::number(duplicate_ensg_ids.size()) << "): " << duplicate_ensg_ids.values().join(", ") << QT_ENDL; //get ENSG->HGNC mapping from ensembl file - out << "Get ENSG -> HGNC mapping from ensembl file..." << endl; + out << "Get ENSG -> HGNC mapping from ensembl file..." << QT_ENDL; QMap ensg_hgnc_mapping; if (duplicate_ensg_ids.size() > 0) ensg_hgnc_mapping = getEnsemblHGNCMapping(duplicate_ensg_ids, getInfile("ensembl")); //final parse for import - out << "Parse HGNC file and import genes into the NGSD..." << endl; + out << "Parse HGNC file and import genes into the NGSD..." << QT_ENDL; fp->seek(0); int n_imported = 0; @@ -274,12 +274,12 @@ class ConcreteTool addAliases(alias_query, gene_id, parts[8], "synonym"); } - out << " " << db.getValue("SELECT count(*) FROM gene").toInt() << " gene symbols imported into the NGSD:" << endl; + out << " " << db.getValue("SELECT count(*) FROM gene").toInt() << " gene symbols imported into the NGSD:" << QT_ENDL; foreach(QString type, valid_types) { - out << " " << db.getValue("SELECT count(*) FROM gene WHERE type='" + type + "'").toInt() << " genes of type '" << type + "'" << endl; + out << " " << db.getValue("SELECT count(*) FROM gene WHERE type='" + type + "'").toInt() << " genes of type '" << type + "'" << QT_ENDL; } - out << " " << db.getValue("SELECT count(*) FROM gene WHERE ensembl_id IS NULL ").toInt() << " genes without Ensembl ID" << endl; + out << " " << db.getValue("SELECT count(*) FROM gene WHERE ensembl_id IS NULL ").toInt() << " genes without Ensembl ID" << QT_ENDL; //update gene symbols in geneinfo_germline and somatic_gene_role table updateTable(db, "geneinfo_germline"); diff --git a/src/NGSDImportHPO/main.cpp b/src/NGSDImportHPO/main.cpp index 0cc916a4a..47033f21f 100644 --- a/src/NGSDImportHPO/main.cpp +++ b/src/NGSDImportHPO/main.cpp @@ -287,7 +287,7 @@ class ConcreteTool id2ngsd.insert(term.id(), qi_term.lastInsertId().toInt()); } - out << "Imported " << id2ngsd.count() << " non-obsolete HPO terms." << endl; + out << "Imported " << id2ngsd.count() << " non-obsolete HPO terms." << QT_ENDL; //insert parent-child relations between (valid) terms int c_ins_parent = 0; @@ -304,7 +304,7 @@ class ConcreteTool int p_db = id2ngsd.value(p_id, -1); if (p_db==-1) { - out << "Notice: Parent term '" << p_id << "' is not a valid term!" << endl; + out << "Notice: Parent term '" << p_id << "' is not a valid term!" << QT_ENDL; continue; } @@ -315,7 +315,7 @@ class ConcreteTool ++c_ins_parent; } } - out << "Imported " << c_ins_parent << " parent-child relations between terms from HPO." << endl; + out << "Imported " << c_ins_parent << " parent-child relations between terms from HPO." << QT_ENDL; //import obsolete terms and link to replacement terms int c_ins_obs = 0; @@ -332,7 +332,7 @@ class ConcreteTool int ngsd_id = id2ngsd.value(replace_id, -1); if (ngsd_id==-1) { - out << "Notice: Replacement term '" << replace_id << "' is not a valid term!" << endl; + out << "Notice: Replacement term '" << replace_id << "' is not a valid term!" << QT_ENDL; continue; } else @@ -350,7 +350,7 @@ class ConcreteTool ++c_ins_obs; if (!replace_id_db.isNull()) ++c_ins_obs_with_replace; } - out << "Imported " << c_ins_obs << " obsolete HPO terms (" << c_ins_obs_with_replace << " with replacement)." << endl; + out << "Imported " << c_ins_obs << " obsolete HPO terms (" << c_ins_obs_with_replace << " with replacement)." << QT_ENDL; return id2ngsd; } @@ -409,7 +409,7 @@ class ConcreteTool if (getInfile("decipher") == "") return; bool debug = getFlag("debug"); QTextStream out(stdout); - if (debug) out << "Parsing Decipher..." << endl; + if (debug) out << "Parsing Decipher..." << QT_ENDL; int countT2D = 0; int countD2G = 0; int countT2G = 0; @@ -545,7 +545,6 @@ class ConcreteTool QByteArray disease = parts[5].trimmed().toLatin1(); // OMIM:XXXXXX, MONDO:XXXXXXX, Orphanet:XXXXX needs mapping from Orphanet and Mondo to Omim if (!disease.startsWith("OMIM:")) { - //out << "OMIM:" << disease << endl; ++c_not_omim; continue; } @@ -555,7 +554,6 @@ class ConcreteTool int gene_db_id = db.geneId(gene_symbol); if (gene_db_id == -1) { - //out << "GENE:" << gene_symbol << endl; ++c_invalid_gene; continue; } @@ -565,7 +563,6 @@ class ConcreteTool PhenotypeEvidenceLevel evidence = translateGenccEvidence(gencc_evi, line); if (evidence == PhenotypeEvidenceLevel::NA || evidence == PhenotypeEvidenceLevel::AGAINST) { - //out << "EVIDENCE:" << gencc_evi << endl; ++c_no_evidence; continue; } @@ -577,10 +574,10 @@ class ConcreteTool } fp->close(); - out << "Imported " << c_imported << " disease-gene relations from GenCC" << endl; - out << " Skipped " << c_not_omim << " lines without OMIM term." << endl; - out << " Skipped " << c_invalid_gene << " lines without valid gene." << endl; - out << " Skipped " << c_no_evidence << " lines without evidence." << endl; + out << "Imported " << c_imported << " disease-gene relations from GenCC" << QT_ENDL; + out << " Skipped " << c_not_omim << " lines without OMIM term." << QT_ENDL; + out << " Skipped " << c_invalid_gene << " lines without valid gene." << QT_ENDL; + out << " Skipped " << c_no_evidence << " lines without evidence." << QT_ENDL; } QByteArrayList reconstructStrings(const QByteArrayList& parts, int expected_size=-1) @@ -896,7 +893,7 @@ class ConcreteTool out << "Imported " << added_d2g << " disease-gene relations, " << added_t2d << " term-disease relations, " << added_t2g << " term-gene relations from HPO (anno).\n"; foreach(const QByteArray& gene, non_hgnc_genes) { - out << "Skipped gene '" << gene << "' because it is not an approved HGNC symbol!" << endl; + out << "Skipped gene '" << gene << "' because it is not an approved HGNC symbol!" << QT_ENDL; } } @@ -906,7 +903,7 @@ class ConcreteTool { int lineCount = 0; int count = 0; - if (debug) out << "Parsing OMIM file..." << endl; + if (debug) out << "Parsing OMIM file..." << QT_ENDL; //parse disease-gene relations int c_skipped_invalid_gene = 0; QSharedPointer fp = Helper::openFileForReading(omim_file); @@ -962,7 +959,7 @@ class ConcreteTool QString clinvar_file = getInfile("clinvar"); if (clinvar_file!="") { - if (debug) out << "Prasing ClinVar..." << endl; + if (debug) out << "Prasing ClinVar..." << QT_ENDL; int added_t2g = 0; int added_d2g = 0; @@ -1027,7 +1024,7 @@ class ConcreteTool int approved_id = db.geneId(gene); if (approved_id==-1) { - if (debug) out << "Skipped gene '" << gene << "' because it is not an approved HGNC symbol!" << endl; + if (debug) out << "Skipped gene '" << gene << "' because it is not an approved HGNC symbol!" << QT_ENDL; ++c_skipped_invalid_gene; continue; } @@ -1066,7 +1063,7 @@ class ConcreteTool if(hgmd_file != "") { int added_t2g = 0; - if (debug) out << "Parsing HGMD Phenobase dump file..." << endl; + if (debug) out << "Parsing HGMD Phenobase dump file..." << QT_ENDL; // define look-up tables QMultiMap phenid2gene_mapping = QMap(); QMultiMap cui2phenid_mapping = QMap(); @@ -1078,7 +1075,7 @@ class ConcreteTool { line_number++; // show progress - if(debug && line_number%100 == 0) out << "\tparsed " << line_number << " lines..." << endl; + if(debug && line_number%100 == 0) out << "\tparsed " << line_number << " lines..." << QT_ENDL; QByteArray line = fp->readLine().trimmed(); if (line.isEmpty()) continue; @@ -1179,7 +1176,7 @@ class ConcreteTool // create hpo-gene relation - if (debug) out << "Creating HPO-gene relation from HGMD file..." << endl; + if (debug) out << "Creating HPO-gene relation from HGMD file..." << QT_ENDL; int i = 0; foreach (const QByteArray& hpo, hpo2cui_mapping.keys()) @@ -1192,7 +1189,7 @@ class ConcreteTool // get all phenotype ids for given cui if(!cui2phenid_mapping.contains(cui)) { - if (debug) out << "No phenotype id found for CUI '" << cui << "' (HGMD file)!" << endl; + if (debug) out << "No phenotype id found for CUI '" << cui << "' (HGMD file)!" << QT_ENDL; continue; } @@ -1201,7 +1198,7 @@ class ConcreteTool // get all genes for a given phenotype id if(!phenid2gene_mapping.contains(phen_id)) { - if (debug) out << "No gene found for phenotype id " << QByteArray::number(phen_id) << " (HGMD file)!" << endl; + if (debug) out << "No gene found for phenotype id " << QByteArray::number(phen_id) << " (HGMD file)!" << QT_ENDL; continue; } @@ -1211,13 +1208,13 @@ class ConcreteTool int approved_id = db.geneId(gene); if (approved_id==-1) { - if (debug) out << "Skipped gene '" << gene << "' because it is not an approved HGNC symbol (HGMD file)!" << endl; + if (debug) out << "Skipped gene '" << gene << "' because it is not an approved HGNC symbol (HGMD file)!" << QT_ENDL; continue; } QByteArray gene_approved = db.geneSymbol(approved_id); // add gene to hpo list: - if (debug) out << "HPO-GENE (HGMD): " << hpo << " - " << gene_approved << " (cui=" << cui << " phenid=" << phen_id << ")" << endl; + if (debug) out << "HPO-GENE (HGMD): " << hpo << " - " << gene_approved << " (cui=" << cui << " phenid=" << phen_id << ")" << QT_ENDL; int term_db_id = id2ngsd.value(hpo, -1); if (term_db_id != -1) { @@ -1241,7 +1238,7 @@ class ConcreteTool } // import gathered data: - out << "Gathering all term2gene relations" << endl; + out << "Gathering all term2gene relations" << QT_ENDL; foreach (int term_id, term2diseases.keys()) { @@ -1275,7 +1272,7 @@ class ConcreteTool } } - out << "Starting import into NGSD" << endl; + out << "Starting import into NGSD" << QT_ENDL; // build insert statements with 10000 tuples each (big insertions are way faster than single element insert statements) QStringList tuples; foreach (int term_id, term2genes.keys()) @@ -1294,7 +1291,7 @@ class ConcreteTool { db.getQuery().exec("INSERT INTO hpo_genes (hpo_term_id, gene, details, evidence) VALUES " + tuples.mid(i, 10000).join(", ") +";"); } - out << "Overall imported term-gene relations: " << db.getValue("SELECT COUNT(*) FROM hpo_genes").toInt() << endl; + out << "Overall imported term-gene relations: " << db.getValue("SELECT COUNT(*) FROM hpo_genes").toInt() << QT_ENDL; out << "Optimizing term-gene relations (removing genes which are present in all leaf nodes from the parent node)...\n"; @@ -1331,7 +1328,7 @@ class ConcreteTool out << " " << subtree_roots[i].name() << ":\t" << subtree_counts.at(i) << "\n"; } - out << removed_genes << " duplicate genes removed during optimization" << endl; + out << removed_genes << " duplicate genes removed during optimization" << QT_ENDL; } void optimizeHpoGeneTable(const Phenotype& root, NGSD& db, const QHash& pt2id, int& removed_genes) diff --git a/src/NGSDImportOMIM/main.cpp b/src/NGSDImportOMIM/main.cpp index 1f66ba5c5..803ea218d 100644 --- a/src/NGSDImportOMIM/main.cpp +++ b/src/NGSDImportOMIM/main.cpp @@ -56,7 +56,7 @@ class ConcreteTool qi_pheno.prepare("INSERT INTO omim_phenotype (omim_gene_id, phenotype) VALUES (:0, :1);"); //import genes - out << "Importing OMIM genes..." << endl; + out << "Importing OMIM genes..." << QT_ENDL; QMap mim2gene_id; QSharedPointer fp = Helper::openFileForReading(getInfile("gene")); while(!fp->atEnd()) @@ -79,7 +79,7 @@ class ConcreteTool QByteArray gene_approved = db.geneToApproved(gene); if (gene_approved.isEmpty()) { - out << "Gene '" << gene << "' could not be converted to approved symbol! Using it anyway." << endl; + out << "Gene '" << gene << "' could not be converted to approved symbol! Using it anyway." << QT_ENDL; gene_approved = gene; } @@ -97,11 +97,11 @@ class ConcreteTool //output int c_genes = db.getValues("SELECT gene FROM omim_gene").count(); int c_genes_distinct = db.getValues("SELECT DISTINCT gene FROM omim_gene").count(); - out << "Imported " << c_genes << " genes (" << (c_genes-c_genes_distinct) << " duplicate genes)" << endl; + out << "Imported " << c_genes << " genes (" << (c_genes-c_genes_distinct) << " duplicate genes)" << QT_ENDL; //import gene-phenotype relations - out << endl; - out << "Importing OMIM gene-phenotype relations..." << endl; + out << QT_ENDL; + out << "Importing OMIM gene-phenotype relations..." << QT_ENDL; fp = Helper::openFileForReading(getInfile("morbid")); while(!fp->atEnd()) { @@ -129,9 +129,9 @@ class ConcreteTool //output - out << "Imported " << db.getValue("SELECT COUNT(*) FROM omim_phenotype").toInt() << " phenotypes" << endl; + out << "Imported " << db.getValue("SELECT COUNT(*) FROM omim_phenotype").toInt() << " phenotypes" << QT_ENDL; int c_genes_pheno = db.getValues("SELECT DISTINCT omim_gene_id FROM omim_phenotype").count(); - out << c_genes_pheno << " out of the " << c_genes << " genes have phenotype information" << endl; + out << c_genes_pheno << " out of the " << c_genes << " genes have phenotype information" << QT_ENDL; } }; diff --git a/src/NGSDImportORPHA/main.cpp b/src/NGSDImportORPHA/main.cpp index 1b32fadc5..35bb03838 100644 --- a/src/NGSDImportORPHA/main.cpp +++ b/src/NGSDImportORPHA/main.cpp @@ -76,7 +76,7 @@ class ConcreteTool } else { - out << "Warning: Skipping non-approved gene name '" << gene << "' for term '" << number << "'!" << endl; + out << "Warning: Skipping non-approved gene name '" << gene << "' for term '" << number << "'!" << QT_ENDL; } } else xml.skipCurrentElement(); @@ -130,7 +130,7 @@ class ConcreteTool } //parse disease-gene relation - out << "Parsing gene-disease relations..." << endl; + out << "Parsing gene-disease relations..." << QT_ENDL; QHash disease_genes = parseDiseaseGeneRelations(db, out); //prepare SQL queries @@ -140,7 +140,7 @@ class ConcreteTool qi_gene.prepare("INSERT INTO disease_gene (disease_term_id, gene) VALUES (:0, :1)"); //import disease terms and genes - out << "Importing ORPHA information..." << endl; + out << "Importing ORPHA information..." << QT_ENDL; { QString terms = getInfile("terms"); QSharedPointer fp = Helper::openFileForReading(terms); @@ -253,9 +253,9 @@ class ConcreteTool //output int c_disease = db.getValue("SELECT COUNT(*) FROM disease_term").toInt(); - out << "Imported " << c_disease << " diseases" << endl; + out << "Imported " << c_disease << " diseases" << QT_ENDL; int c_disease_gene = db.getValue("SELECT COUNT(*) FROM disease_gene").toInt(); - out << "Imported " << c_disease_gene << " disease-gene relations" << endl; + out << "Imported " << c_disease_gene << " disease-gene relations" << QT_ENDL; } }; diff --git a/src/NGSDImportOncotree/main.cpp b/src/NGSDImportOncotree/main.cpp index 06f50e42e..f72e1cb7f 100644 --- a/src/NGSDImportOncotree/main.cpp +++ b/src/NGSDImportOncotree/main.cpp @@ -182,9 +182,9 @@ class ConcreteTool } } } - out << "Imported " << codes.count() << " Oncotree terms." << endl; - out << "Imported " << count_parent_relations << " Oncotree parent-child relations." << endl; - out << "Imported " << count_obsolete << " obsolete Oncotree terms." << endl; + out << "Imported " << codes.count() << " Oncotree terms." << QT_ENDL; + out << "Imported " << count_parent_relations << " Oncotree parent-child relations." << QT_ENDL; + out << "Imported " << count_obsolete << " obsolete Oncotree terms." << QT_ENDL; } QList parsingTree(QJsonObject root) diff --git a/src/NGSDImportSampleQC/main.cpp b/src/NGSDImportSampleQC/main.cpp index e216cfa13..0760aa0e1 100644 --- a/src/NGSDImportSampleQC/main.cpp +++ b/src/NGSDImportSampleQC/main.cpp @@ -34,7 +34,7 @@ class ConcreteTool // check if QC parameters were already imported for this pid int count_old = db.getValue("SELECT count(id) FROM processed_sample_qc WHERE processed_sample_id='" + ps_id + "'").toInt(); - stream << "Found " << count_old << " QC metrics of processed sample '" << ps <<"' already in NGSD." << endl; + stream << "Found " << count_old << " QC metrics of processed sample '" << ps <<"' already in NGSD." << QT_ENDL; if(count_old!=0) { @@ -45,7 +45,7 @@ class ConcreteTool else { db.getQuery().exec("DELETE FROM processed_sample_qc WHERE processed_sample_id='" + ps_id + "'"); - stream << "Deleted existing QC metrics of '" << ps <<"' because the flag '-force' was used." << endl; + stream << "Deleted existing QC metrics of '" << ps <<"' because the flag '-force' was used." << QT_ENDL; } } @@ -74,7 +74,7 @@ class ConcreteTool //output foreach(const QString& error, errors) { - stream << "File " + file + " contains error: " + error << endl; + stream << "File " + file + " contains error: " + error << QT_ENDL; } } @@ -109,7 +109,7 @@ class ConcreteTool query.exec(); } db.commit(); - stream << "Imported " << metrics.count() << " QC metrics for processed sample " + ps << endl; + stream << "Imported " << metrics.count() << " QC metrics for processed sample " + ps << QT_ENDL; } catch (Exception& e) { diff --git a/src/NGSDInit/main.cpp b/src/NGSDInit/main.cpp index e7edc275b..428cefd99 100644 --- a/src/NGSDInit/main.cpp +++ b/src/NGSDInit/main.cpp @@ -37,9 +37,9 @@ class ConcreteTool //output QTextStream out(stdout); - out << "Database initialization succesfully." << endl; - out << "You are now able to login with user name 'admin' and password 'admin' via GSvar." << endl; - out << "**Please change the password on first login!**" << endl; + out << "Database initialization succesfully." << QT_ENDL; + out << "You are now able to login with user name 'admin' and password 'admin' via GSvar." << QT_ENDL; + out << "**Please change the password on first login!**" << QT_ENDL; } }; diff --git a/src/NGSDUpdateSvGenotype/main.cpp b/src/NGSDUpdateSvGenotype/main.cpp index 839b14dd8..9c487de21 100644 --- a/src/NGSDUpdateSvGenotype/main.cpp +++ b/src/NGSDUpdateSvGenotype/main.cpp @@ -123,7 +123,7 @@ class ConcreteTool } out << "Stats:\n"; - out << "Multiple matches: " << QString::number(n_multiple_matches) << endl; + out << "Multiple matches: " << QString::number(n_multiple_matches) << QT_ENDL; } }; diff --git a/src/RohHunter/main.cpp b/src/RohHunter/main.cpp index 87f0f79c8..4350999d4 100644 --- a/src/RohHunter/main.cpp +++ b/src/RohHunter/main.cpp @@ -193,7 +193,7 @@ class ConcreteTool virtual void main() { //init - QTime timer; + QElapsedTimer timer; timer.start(); QTextStream out(stdout); bool inc_chrx = getFlag("inc_chrx"); @@ -208,8 +208,8 @@ class ConcreteTool THROW(FileParseException, "Multi sample is not supported."); } - out << "=== Loading input data ===" << endl; - out << "Variants in VCF: " << vl.count() << endl; + out << "=== Loading input data ===" << QT_ENDL; + out << "Variants in VCF: " << vl.count() << QT_ENDL; //determine quality indices if (!vl.vcfHeader().formatIdDefined("DP")) THROW(ArgumentException, "Could not find 'DP' annotation in vcf header!"); @@ -285,24 +285,24 @@ class ConcreteTool var_info.append(VariantInfo{v.chr(), v.start(), geno_hom, af}); } - out << "Variants passing QC filters: " << var_info.count() << endl; + out << "Variants passing QC filters: " << var_info.count() << QT_ENDL; double hom_perc = 100.0*vars_hom/var_info.count(); - out << "Variants homozygous: " << QByteArray::number(hom_perc, 'f', 2) << "%" << endl; - out << "Variants with AF annotation greater zero: " << QByteArray::number(100.0*vars_known/var_info.count(), 'f', 2) << "%" << endl; - out << endl; + out << "Variants homozygous: " << QByteArray::number(hom_perc, 'f', 2) << "%" << QT_ENDL; + out << "Variants with AF annotation greater zero: " << QByteArray::number(100.0*vars_known/var_info.count(), 'f', 2) << "%" << QT_ENDL; + out << QT_ENDL; //detect raw ROHs - out << "=== Detecting ROHs ===" << endl; + out << "=== Detecting ROHs ===" << QT_ENDL; float roh_min_q = getFloat("roh_min_q"); QList regions = calculateRawRohs(var_info, roh_min_q); - out << "Raw ROH count: " << regions.count() << endl; + out << "Raw ROH count: " << regions.count() << QT_ENDL; //merge raw ROHs double ext_marker_perc = getFloat("ext_marker_perc"); double ext_size_perc = getFloat("ext_size_perc"); mergeRohs(regions, var_info, ext_marker_perc, ext_size_perc); - out << "Merged ROH count: " << regions.count() << endl; - out << endl; + out << "Merged ROH count: " << regions.count() << QT_ENDL; + out << QT_ENDL; //filter regions int roh_min_markers = getInt("roh_min_markers"); @@ -335,7 +335,7 @@ class ConcreteTool annos.insert(anno_file[index].annotations()[0]); } } - QStringList annos_sorted = annos.toList(); + QStringList annos_sorted = annos.values(); std::sort(annos_sorted.begin(), annos_sorted.end()); regions[i].annotations << annos_sorted.join(','); } @@ -367,8 +367,8 @@ class ConcreteTool } //statistics output - out << "=== Statistics output ===" << endl; - out << "Overall ROH count: " << regions.count() << endl; + out << "=== Statistics output ===" << QT_ENDL; + out << "Overall ROH count: " << regions.count() << QT_ENDL; int count_a = 0; double sum_a = 0.0; int count_b = 0; @@ -394,22 +394,22 @@ class ConcreteTool sum_c += bases; } } - out << "Overall ROH size sum: " << QString::number((sum_a+sum_b+sum_c)/1000000.0 ,'f', 2) << "Mb" << endl; - out << "Class A: <0.5 Mb" << endl; - out << "Class A ROH count: " << count_a << endl; - out << "Class A ROH size sum: " << QString::number(sum_a/1000000.0 ,'f', 2) << "Mb" << endl; - out << "Class B: >=0.5 Mb and <1.5 Mb" << endl; - out << "Class B ROH count: " << count_b << endl; - out << "Class B ROH size sum: " << QString::number(sum_b/1000000.0 ,'f', 2) << "Mb" << endl; - out << "Class C: >=1.5 Mb" << endl; - out << "Class C ROH count: " << count_c << endl; - out << "Class C ROH size sum: " << QString::number(sum_c/1000000.0 ,'f', 2) << "Mb" << endl; - out << endl; + out << "Overall ROH size sum: " << QString::number((sum_a+sum_b+sum_c)/1000000.0 ,'f', 2) << "Mb" << QT_ENDL; + out << "Class A: <0.5 Mb" << QT_ENDL; + out << "Class A ROH count: " << count_a << QT_ENDL; + out << "Class A ROH size sum: " << QString::number(sum_a/1000000.0 ,'f', 2) << "Mb" << QT_ENDL; + out << "Class B: >=0.5 Mb and <1.5 Mb" << QT_ENDL; + out << "Class B ROH count: " << count_b << QT_ENDL; + out << "Class B ROH size sum: " << QString::number(sum_b/1000000.0 ,'f', 2) << "Mb" << QT_ENDL; + out << "Class C: >=1.5 Mb" << QT_ENDL; + out << "Class C ROH count: " << count_c << QT_ENDL; + out << "Class C ROH size sum: " << QString::number(sum_c/1000000.0 ,'f', 2) << "Mb" << QT_ENDL; + out << QT_ENDL; //debug output - out << "=== Debug output ===" << endl; - out << "Time: " << Helper::elapsedTime(timer) << endl; + out << "=== Debug output ===" << QT_ENDL; + out << "Time: " << Helper::elapsedTime(timer) << QT_ENDL; } }; diff --git a/src/SampleAncestry/main.cpp b/src/SampleAncestry/main.cpp index c72319108..c96b6c434 100644 --- a/src/SampleAncestry/main.cpp +++ b/src/SampleAncestry/main.cpp @@ -50,7 +50,7 @@ class ConcreteTool GenomeBuild build = stringToBuild(getEnum("build")); //process - out << "#sample\tsnps\tAFR\tEUR\tSAS\tEAS\tpopulation" << endl; + out << "#sample\tsnps\tAFR\tEUR\tSAS\tEAS\tpopulation" << QT_ENDL; foreach(QString filename, in) { AncestryEstimates ancestry = Statistics::ancestry(build, filename, min_snps, score_cutoff, mad_dist); @@ -60,7 +60,7 @@ class ConcreteTool << "\t" << QString::number(ancestry.eur, 'f', 4) << "\t" << QString::number(ancestry.sas, 'f', 4) << "\t" << QString::number(ancestry.eas, 'f', 4) - << "\t" << ancestry.population << endl; + << "\t" << ancestry.population << QT_ENDL; } } }; diff --git a/src/SampleGender/main.cpp b/src/SampleGender/main.cpp index 7e8bb5e4a..e57ca4c04 100644 --- a/src/SampleGender/main.cpp +++ b/src/SampleGender/main.cpp @@ -79,7 +79,7 @@ class ConcreteTool { stream << "\t" << info.key; } - stream << endl; + stream << QT_ENDL; print_header = false; } @@ -89,7 +89,7 @@ class ConcreteTool { stream << "\t" << info.value; } - stream << endl; + stream << QT_ENDL; } } }; diff --git a/src/SamplePath/main.cpp b/src/SamplePath/main.cpp index e03a43103..5cc1a8527 100644 --- a/src/SamplePath/main.cpp +++ b/src/SamplePath/main.cpp @@ -45,7 +45,7 @@ class ConcreteTool QString type = getEnum("type"); - QTextStream(stdout) << db.processedSamplePath(ps_id, FileLocation::stringToType(type)) << endl; + QTextStream(stdout) << db.processedSamplePath(ps_id, FileLocation::stringToType(type)) << QT_ENDL; } }; diff --git a/src/SampleSimilarity/main.cpp b/src/SampleSimilarity/main.cpp index 0a26122a8..f60f6b3e0 100644 --- a/src/SampleSimilarity/main.cpp +++ b/src/SampleSimilarity/main.cpp @@ -70,17 +70,17 @@ class ConcreteTool bool include_gonosomes = getFlag("include_gonosomes"); GenomeBuild build = stringToBuild(getEnum("build")); bool debug = getFlag("debug"); - QTime timer; + QElapsedTimer timer; timer.start(); //write header if (mode=="vcf" || mode=="gsvar") { - out << "#file1\tfile2\toverlap_percent\tcorrelation\tibs2_percent\tcount1\tcount2\tcomments" << endl; + out << "#file1\tfile2\toverlap_percent\tcorrelation\tibs2_percent\tcount1\tcount2\tcomments" << QT_ENDL; } else if (mode=="bam") { - out << "#file1\tfile2\tvariant_count\tcorrelation\tibs0_percent\tibs2_percent\tcomments" << endl; + out << "#file1\tfile2\tvariant_count\tcorrelation\tibs0_percent\tibs2_percent\tcomments" << QT_ENDL; } else { @@ -95,7 +95,7 @@ class ConcreteTool if (roi_hg38_wes_wgs) roi_reg.load(":/Resources/hg38_coding_highconf_all_kits.bed"); if (debug) { - out << "##loaded target region (took: " << Helper::elapsedTime(timer, true) << ")" << endl; + out << "##loaded target region (took: " << Helper::elapsedTime(timer, true) << ")" << QT_ENDL; timer.restart(); } @@ -106,7 +106,7 @@ class ConcreteTool { if (!QFile::exists(filename)) { - out << "##skipped missing file " << filename << endl; + out << "##skipped missing file " << filename << QT_ENDL; continue; } if (mode=="vcf") @@ -124,7 +124,7 @@ class ConcreteTool } if (debug) { - out << "##loaded input file " << filename << " (took: " << Helper::elapsedTime(timer, true) << ")" << endl; + out << "##loaded input file " << filename << " (took: " << Helper::elapsedTime(timer, true) << ")" << QT_ENDL; timer.restart(); } } @@ -158,12 +158,12 @@ class ConcreteTool cols << QString::number(sc.ibs2Perc(), 'f', 2); } cols << sc.messages().join(", "); - out << cols.join("\t") << endl; + out << cols.join("\t") << QT_ENDL; } } if (debug) { - out << "##calculated similarity (took: " << Helper::elapsedTime(timer, true) << ")" << endl; + out << "##calculated similarity (took: " << Helper::elapsedTime(timer, true) << ")" << QT_ENDL; } } diff --git a/src/SeqPurge/AnalysisWorker.cpp b/src/SeqPurge/AnalysisWorker.cpp index 6c713e134..85c7e69df 100644 --- a/src/SeqPurge/AnalysisWorker.cpp +++ b/src/SeqPurge/AnalysisWorker.cpp @@ -11,12 +11,10 @@ AnalysisWorker::AnalysisWorker(AnalysisJob& job, TrimmingParameters& params, Tri , stats_(stats) , ecstats_(ecstats) { - //QTextStream(stdout) << "AnalysisWorker" << endl; } AnalysisWorker::~AnalysisWorker() { - //QTextStream(stdout) << "~AnalysisWorker" << endl; } void AnalysisWorker::correctErrors(int r, QTextStream& debug_out) @@ -39,12 +37,12 @@ void AnalysisWorker::correctErrors(int r, QTextStream& debug_out) { if (mm_count!=0) { - debug_out << "R1: " << job_.r1[r].bases << endl; - debug_out << "Q1: "<< job_.r1[r].qualities << endl; - debug_out << "R2: "<< job_.r2[r].bases << endl; - debug_out << "Q2: "<< job_.r2[r].qualities << endl; + debug_out << "R1: " << job_.r1[r].bases << QT_ENDL; + debug_out << "Q1: "<< job_.r1[r].qualities << QT_ENDL; + debug_out << "R2: "<< job_.r2[r].bases << QT_ENDL; + debug_out << "Q2: "<< job_.r2[r].qualities << QT_ENDL; } - debug_out << " MISMATCH index=" << i << " R1=" << job_.r1[r].bases[i] << "/" << q1 << " R2=" << job_.r2[r].bases[i2]<< "/" << q2 << endl; + debug_out << " MISMATCH index=" << i << " R1=" << job_.r1[r].bases[i] << "/" << q1 << " R2=" << job_.r2[r].bases[i2]<< "/" << q2 << QT_ENDL; } //correct error @@ -53,7 +51,7 @@ void AnalysisWorker::correctErrors(int r, QTextStream& debug_out) char replacement = Sequence::complement(job_.r1[r].bases[i]); if (params_.debug) { - debug_out << " CORRECTED R2: " << job_.r2[r].bases[i2] << " => " << replacement << endl; + debug_out << " CORRECTED R2: " << job_.r2[r].bases[i2] << " => " << replacement << QT_ENDL; } job_.r2[r].bases[i2] = replacement; job_.r2[r].qualities[i2] = job_.r1[r].qualities[i]; @@ -64,7 +62,7 @@ void AnalysisWorker::correctErrors(int r, QTextStream& debug_out) char replacement = Sequence::complement(job_.r2[r].bases[i2]); if (params_.debug) { - debug_out << " CORRECTED R1: " << job_.r1[r].bases[i] << " => " << replacement << endl; + debug_out << " CORRECTED R1: " << job_.r1[r].bases[i] << " => " << replacement << QT_ENDL; } job_.r1[r].bases[i] = replacement; job_.r1[r].qualities[i] = job_.r2[r].qualities[i2]; @@ -81,7 +79,6 @@ void AnalysisWorker::correctErrors(int r, QTextStream& debug_out) void AnalysisWorker::run() { - //QTextStream(stdout) << "AnalysisWorker:run " << job_.index << " thread: " << QThread::currentThreadId() << endl; try { QTextStream debug_out(stdout); @@ -102,12 +99,12 @@ void AnalysisWorker::run() { if (params_.debug) { - debug_out << "#############################################################################" << endl; - debug_out << "Header: " << job_.r1[r].header << endl; - debug_out << "Read 1 in: " << job_.r1[r].bases << endl; - debug_out << "Read 2 in: " << job_.r2[r].bases << endl; - debug_out << "Quality 1: " << job_.r1[r].qualities << endl; - debug_out << "Quality 2: " << job_.r2[r].qualities << endl; + debug_out << "#############################################################################" << QT_ENDL; + debug_out << "Header: " << job_.r1[r].header << QT_ENDL; + debug_out << "Read 1 in: " << job_.r1[r].bases << QT_ENDL; + debug_out << "Read 2 in: " << job_.r2[r].bases << QT_ENDL; + debug_out << "Quality 1: " << job_.r1[r].qualities << QT_ENDL; + debug_out << "Quality 2: " << job_.r2[r].qualities << QT_ENDL; } //check that headers match @@ -169,20 +166,19 @@ void AnalysisWorker::run() ++mismatches; if (mismatches>max_mismatches) break; } - } - //debug_out << offset << matches << mismatches << (100.0*matches/(matches + mismatches)) << endl; + } if ((matches + mismatches)==0 || 100.0*matches/(matches + mismatches) < params_.match_perc) continue; if (params_.debug) { - debug_out << " offset: " << offset << endl; - debug_out << " match_perc: " << (100.0*matches/(matches + mismatches)) << "%" << endl; + debug_out << " offset: " << offset << QT_ENDL; + debug_out << " match_perc: " << (100.0*matches/(matches + mismatches)) << "%" << QT_ENDL; } //calculate the probability of seeing n or more matches at random double p = BasicStatistics::matchProbability(0.25, matches, matches+mismatches); if (p>params_.mep) continue; - if (params_.debug) debug_out << " mep: " << p << endl; + if (params_.debug) debug_out << " mep: " << p << QT_ENDL; //check that at least on one side the adapter is present - if not continue QByteArray adapter1 = seq1.mid(job_.length_r2_orig[r]-offset, params_.adapter_overlap); @@ -240,11 +236,11 @@ void AnalysisWorker::run() if (offset<3) max_mm = 0; if (a1_mismatches<=max_mm || a2_mismatches<=max_mm) { - if (params_.debug) debug_out << " adapter overlap passed! mismatches1:" << a1_mismatches << " mismatches2:" << a2_mismatches << endl; + if (params_.debug) debug_out << " adapter overlap passed! mismatches1:" << a1_mismatches << " mismatches2:" << a2_mismatches << QT_ENDL; } else { - if (params_.debug) debug_out << " adapter overlap failed! mismatches1:" << a1_mismatches << " mismatches2:" << a2_mismatches << endl; + if (params_.debug) debug_out << " adapter overlap failed! mismatches1:" << a1_mismatches << " mismatches2:" << a2_mismatches << QT_ENDL; continue; } } @@ -254,12 +250,12 @@ void AnalysisWorker::run() double p2 = BasicStatistics::matchProbability(0.25, a2_matches, a2_matches+a2_mismatches); if (p1*p2>params_.mep) { - if (params_.debug) debug_out << " adapter overlap failed! mep1:" << p1 << " mep2:" << p2 << endl; + if (params_.debug) debug_out << " adapter overlap failed! mep1:" << p1 << " mep2:" << p2 << QT_ENDL; continue; } else { - if (params_.debug) debug_out << " adapter overlap passed! mep1:" << p1 << " mep2:" << p2 << endl; + if (params_.debug) debug_out << " adapter overlap passed! mep1:" << p1 << " mep2:" << p2 << QT_ENDL; } } @@ -299,7 +295,7 @@ void AnalysisWorker::run() if (params_.debug) { - debug_out << "###Insert sequence hit - offset=" << best_offset << " prob=" << best_p << " adapter1=" << adapter1 << " adapter2=" << adapter2 << endl; + debug_out << "###Insert sequence hit - offset=" << best_offset << " prob=" << best_p << " adapter1=" << adapter1 << " adapter2=" << adapter2 << QT_ENDL; } //error correction @@ -346,7 +342,7 @@ void AnalysisWorker::run() { QByteArray adapter = job_.r1[r].bases.right(job_.length_r1_orig[r]-offset); adapter.truncate(20); - debug_out << "###Adapter 1 hit - offset=" << offset << " prob=" << p << " matches=" << matches << " mismatches=" << mismatches << " invalid=" << invalid << " adapter=" << adapter << endl; + debug_out << "###Adapter 1 hit - offset=" << offset << " prob=" << p << " matches=" << matches << " mismatches=" << mismatches << " invalid=" << invalid << " adapter=" << adapter << QT_ENDL; } //trim read @@ -398,7 +394,7 @@ void AnalysisWorker::run() { QByteArray adapter = job_.r2[r].bases.right(job_.length_r2_orig[r]-offset); adapter.truncate(20); - debug_out << "###Adapter 2 hit - offset=" << offset << " prob=" << p << " matches=" << matches << " mismatches=" << mismatches << " invalid=" << invalid << " adapter=" << adapter << endl; + debug_out << "###Adapter 2 hit - offset=" << offset << " prob=" << p << " matches=" << matches << " mismatches=" << mismatches << " invalid=" << invalid << " adapter=" << adapter << QT_ENDL; } //trim read @@ -447,19 +443,16 @@ void AnalysisWorker::run() if (params_.debug) { - debug_out << "Read 1 out: " << job_.r1[r].bases << endl; - debug_out << "Read 2 out: " << job_.r2[r].bases << endl; + debug_out << "Read 1 out: " << job_.r1[r].bases << QT_ENDL; + debug_out << "Read 2 out: " << job_.r2[r].bases << QT_ENDL; } } job_.status = TO_BE_WRITTEN; emit done(job_.index); - - //QTextStream(stdout) << "AnalysisWorker: index:" << job_.index << " elapsed:" << timer.elapsed() << endl; } catch(Exception& e) { - //QTextStream(stdout) << "AnalysisWorker:error " << job_.index << " thread:" << QThread::currentThreadId() << " message:" << e.message() << endl; emit error(job_.index, e.message()); } } diff --git a/src/SeqPurge/Auxilary.h b/src/SeqPurge/Auxilary.h index 332fd5a00..751826fe6 100644 --- a/src/SeqPurge/Auxilary.h +++ b/src/SeqPurge/Auxilary.h @@ -165,17 +165,17 @@ struct TrimmingStatistics void writeStatistics(QTextStream& out, const TrimmingParameters& params_) { - out << "Reads (forward + reverse): " << read_num << endl; - out << endl; - out << "Reads trimmed by insert match: " << (long)reads_trimmed_insert << endl; - out << "Reads trimmed by adapter match: " << (long)reads_trimmed_adapter << endl; - out << "Reads trimmed by quality: " << (long)reads_trimmed_q << endl; - out << "Reads trimmed by N stretches: " << (long)reads_trimmed_n << endl; + out << "Reads (forward + reverse): " << read_num << QT_ENDL; + out << QT_ENDL; + out << "Reads trimmed by insert match: " << (long)reads_trimmed_insert << QT_ENDL; + out << "Reads trimmed by adapter match: " << (long)reads_trimmed_adapter << QT_ENDL; + out << "Reads trimmed by quality: " << (long)reads_trimmed_q << QT_ENDL; + out << "Reads trimmed by N stretches: " << (long)reads_trimmed_n << QT_ENDL; double reads_trimmed = reads_trimmed_insert + reads_trimmed_adapter; - out << "Trimmed reads: " << (long)reads_trimmed << " of " << read_num << " (" << QString::number(100.0*reads_trimmed/read_num, 'f', 2) << "%)" << endl; - out << "Removed reads: " << (long)reads_removed << " of " << read_num << " (" << QString::number(100.0*reads_removed/read_num, 'f', 2) << "%)" << endl; - out << "Removed bases: " << QString::number(100.0*bases_perc_trim_sum/read_num, 'f', 2) << "%" << endl; - out << endl; + out << "Trimmed reads: " << (long)reads_trimmed << " of " << read_num << " (" << QString::number(100.0*reads_trimmed/read_num, 'f', 2) << "%)" << QT_ENDL; + out << "Removed reads: " << (long)reads_removed << " of " << read_num << " (" << QString::number(100.0*reads_removed/read_num, 'f', 2) << "%)" << QT_ENDL; + out << "Removed bases: " << QString::number(100.0*bases_perc_trim_sum/read_num, 'f', 2) << "%" << QT_ENDL; + out << QT_ENDL; //print consensus adapter sequence QByteArray acons1_seq; @@ -191,8 +191,8 @@ struct TrimmingStatistics else if (acons1[i].t()==max) acons1_seq.append('T'); if (i==39) break; } - out << "Forward adapter sequence (given) : " << params_.a1 << endl; - out << "Forward adapter sequence (consensus): " << acons1_seq << endl; + out << "Forward adapter sequence (given) : " << params_.a1 << QT_ENDL; + out << "Forward adapter sequence (consensus): " << acons1_seq << QT_ENDL; QByteArray acons2_seq; for (int i=0; i nothing to do if (timer_done_.isActive()) return; @@ -126,8 +121,6 @@ void ThreadCoordinator::inputDone(int /*i*/) void ThreadCoordinator::checkDone() { - //QTextStream(stdout) << Helper::dateTime() << " ThreadCoordinator::checkDone" << endl; - //check if all jobs are done for (int i=0; i0) (*streams_out_.summary_stream) << Helper::dateTime() << " writing error corrections summary" << endl; + if (params_.progress>0) (*streams_out_.summary_stream) << Helper::dateTime() << " writing error corrections summary" << QT_ENDL; ec_stats_.writeStatistics((*streams_out_.summary_stream)); } - (*streams_out_.summary_stream) << Helper::dateTime() << " overall runtime: " << Helper::elapsedTime(timer_overall_) << endl; + (*streams_out_.summary_stream) << Helper::dateTime() << " overall runtime: " << Helper::elapsedTime(timer_overall_) << QT_ENDL; emit finished(); } diff --git a/src/SeqPurge/ThreadCoordinator.h b/src/SeqPurge/ThreadCoordinator.h index ce98dc60e..88d0ae84a 100644 --- a/src/SeqPurge/ThreadCoordinator.h +++ b/src/SeqPurge/ThreadCoordinator.h @@ -49,7 +49,7 @@ private slots: TrimmingStatistics stats_; ErrorCorrectionStatistics ec_stats_; - QTime timer_overall_; + QElapsedTimer timer_overall_; QTimer timer_progress_; QTimer timer_done_; }; diff --git a/src/SplicingToBed/main.cpp b/src/SplicingToBed/main.cpp index b843ef2a1..8b9964d26 100644 --- a/src/SplicingToBed/main.cpp +++ b/src/SplicingToBed/main.cpp @@ -523,7 +523,7 @@ class ConcreteTool //tabular output line QByteArrayList out_line = QByteArrayList() << QByteArray(chr.str()) << QByteArray::number(intron_start) << QByteArray::number(intron_end) << strand << - QByteArray::number(unique) << motif << genes.toList().join(",") << event << info; + QByteArray::number(unique) << motif << genes.values().join(",") << event << info; if (report != "") tsv_f->write(out_line.join("\t") + "\n"); //BED output line @@ -564,7 +564,7 @@ class ConcreteTool QMap::const_iterator i = stats.constBegin(); while (i != stats.constEnd()) { - out << i.key() << "\t" << i.value() << "\t" << QByteArray::number(1. * i.value() / stats["all"], 'f', 4) << endl; + out << i.key() << "\t" << i.value() << "\t" << QByteArray::number(1. * i.value() / stats["all"], 'f', 4) << QT_ENDL; ++i; } diff --git a/src/TranscriptComparison/main.cpp b/src/TranscriptComparison/main.cpp index 873b8be5f..4c76237b8 100644 --- a/src/TranscriptComparison/main.cpp +++ b/src/TranscriptComparison/main.cpp @@ -129,28 +129,28 @@ class ConcreteTool { //init QTextStream stream(stdout); - QTime timer; + QElapsedTimer timer; timer.start(); double min_ol = getFloat("min_ol"); //load GFFs - stream << "### loading Ensembl transcripts from GFF ###" << endl; + stream << "### loading Ensembl transcripts from GFF ###" << QT_ENDL; GffSettings s_e; TranscriptList trans_e = NGSHelper::loadGffFile(getInfile("ensembl"), s_e).transcripts; trans_e.sortByPosition(); - stream << "took " << Helper::elapsedTime(timer.restart(), true) << endl; - stream << endl; + stream << "took " << Helper::elapsedTime(timer.restart(), true) << QT_ENDL; + stream << QT_ENDL; - stream << "### loading RefSeq transcripts from GFF ###" << endl; + stream << "### loading RefSeq transcripts from GFF ###" << QT_ENDL; GffSettings s_r; s_r.source = "refseq"; TranscriptList trans_r = NGSHelper::loadGffFile(getInfile("refseq"), s_r).transcripts; trans_r.sortByPosition(); ChromosomalIndex idx_r(trans_r); - stream << "took " << Helper::elapsedTime(timer.restart(), true) << endl; - stream << endl; + stream << "took " << Helper::elapsedTime(timer.restart(), true) << QT_ENDL; + stream << QT_ENDL; - stream << "### loading CCDS transcripts from NGSD ###" << endl; + stream << "### loading CCDS transcripts from NGSD ###" << QT_ENDL; NGSD db(getFlag("test")); TranscriptList trans_c; foreach(const Transcript& t, db.transcripts()) @@ -159,11 +159,11 @@ class ConcreteTool } trans_c.sortByPosition(); ChromosomalIndex idx_c(trans_c); - stream << "loaded CCDS transcripts: " << trans_c.count() << endl; - stream << "took " << Helper::elapsedTime(timer.restart(), true) << endl; - stream << endl; + stream << "loaded CCDS transcripts: " << trans_c.count() << QT_ENDL; + stream << "took " << Helper::elapsedTime(timer.restart(), true) << QT_ENDL; + stream << QT_ENDL; - stream << "### comparing transcripts ###" << endl; + stream << "### comparing transcripts ###" << QT_ENDL; QSharedPointer out = Helper::openFileForWriting(getOutfile("out"), true); out->write("##Ensembl file: "+getInfile("ensembl").toLatin1()+"\n"); out->write("##RefSeq file: "+getInfile("refseq").toLatin1()+"\n"); @@ -283,13 +283,13 @@ class ConcreteTool } } - stream << "Overall Ensembl-RefSeq transcript matches written: " << written_overall << endl; - stream << "Ensembl transcripts with RefSeq match: " << transcripts_matched.count() << endl; - stream << "Ensembl transcripts without RefSeq match: " << (trans_e.count()-transcripts_matched.count()) << endl; - stream << "Ensembl genes with RefSeq match: " << genes_matched.count() << endl; - stream << "Ensembl genes without RefSeq match: " << (genes.count()-genes_matched.count()) << endl; + stream << "Overall Ensembl-RefSeq transcript matches written: " << written_overall << QT_ENDL; + stream << "Ensembl transcripts with RefSeq match: " << transcripts_matched.count() << QT_ENDL; + stream << "Ensembl transcripts without RefSeq match: " << (trans_e.count()-transcripts_matched.count()) << QT_ENDL; + stream << "Ensembl genes with RefSeq match: " << genes_matched.count() << QT_ENDL; + stream << "Ensembl genes without RefSeq match: " << (genes.count()-genes_matched.count()) << QT_ENDL; - stream << "Overall Ensembl-CCDS transcript matches written: " << matched_ccds << endl; + stream << "Overall Ensembl-CCDS transcript matches written: " << matched_ccds << QT_ENDL; } }; diff --git a/src/TranscriptsToBed/main.cpp b/src/TranscriptsToBed/main.cpp index 8a79a8767..3edde2317 100644 --- a/src/TranscriptsToBed/main.cpp +++ b/src/TranscriptsToBed/main.cpp @@ -49,7 +49,7 @@ class ConcreteTool } catch (Exception& e) { - messages << e.message() << endl; + messages << e.message() << QT_ENDL; } } diff --git a/src/TsvDiff/main.cpp b/src/TsvDiff/main.cpp index 06c4316ca..f413b757d 100644 --- a/src/TsvDiff/main.cpp +++ b/src/TsvDiff/main.cpp @@ -189,7 +189,7 @@ class ConcreteTool void print(QTextStream& ostream) const { - ostream << "Matrix: " << endl; + ostream << "Matrix: " << QT_ENDL; foreach(const DirectionVector& element, data_) { for (int i=0; i> findMatchIndices() @@ -243,7 +243,7 @@ class ConcreteTool QVector current = QVector(matrix.m()+1, 0); for (int i = 1; i <= matrix.n(); ++i) { - if (i%10000==0) QTextStream(stderr) << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " " << i << endl; + if (i%10000==0) QTextStream(stderr) << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " " << i << QT_ENDL; for (int j = 1; j <= matrix.m(); ++j) { if (is_equal(s1[i-1], s2[j-1], comp_settings)) @@ -289,7 +289,7 @@ class ConcreteTool { for (int i=0; i> matches = matrix.findMatchIndices(); if (debug==2) { - estream << "Line index matches:" << endl; - foreach(auto m, matches) estream << m.first << "/" << m.second << endl; + estream << "Line index matches:" << QT_ENDL; + foreach(auto m, matches) estream << m.first << "/" << m.second << QT_ENDL; } - if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " printing output..." << endl; + if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " printing output..." << QT_ENDL; //special handling when there are no matches if (matches.isEmpty()) { for (int i=0; i=0; --i) { if (!comp_cols.contains(in1.headers()[i])) @@ -452,26 +452,26 @@ class ConcreteTool removeComments(in1, skip_comments_matching); removeComments(in2, skip_comments_matching); - if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " Comparing comment lines..." << endl; + if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " Comparing comment lines..." << QT_ENDL; compare(in1.comments(), in2.comments(), ostream, summary_comments, comp_settings, debug); } //compare content lines - if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " Comparing content lines..." << endl; + if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " Comparing content lines..." << QT_ENDL; compare(in1, in2, ostream, summary_content, comp_settings, debug); //output bool has_differences = summary_comments.hasDifferences() || summary_content.hasDifferences(); if (has_differences) { - ostream << "Difference summary:" << endl; - if (summary_comments.added) ostream << "comment lines added: " << summary_comments.added << endl; - if (summary_comments.removed) ostream << "comment lines removed: " << summary_comments.removed << endl; - if (summary_content.added) ostream << "content lines added: " << summary_content.added << endl; - if (summary_content.removed) ostream << "content lines removed: " << summary_content.removed << endl; + ostream << "Difference summary:" << QT_ENDL; + if (summary_comments.added) ostream << "comment lines added: " << summary_comments.added << QT_ENDL; + if (summary_comments.removed) ostream << "comment lines removed: " << summary_comments.removed << QT_ENDL; + if (summary_content.added) ostream << "content lines added: " << summary_content.added << QT_ENDL; + if (summary_content.removed) ostream << "content lines removed: " << summary_content.removed << QT_ENDL; } - if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " Overall runtime: " << Helper::elapsedTime(timer) << endl; + if (debug) estream << QDateTime::currentDateTime().toString(Qt::ISODateWithMs) << " Overall runtime: " << Helper::elapsedTime(timer) << QT_ENDL; //set exit code if (has_differences && !no_error) diff --git a/src/TsvSlice/main.cpp b/src/TsvSlice/main.cpp index 2b93e2d9e..456928137 100644 --- a/src/TsvSlice/main.cpp +++ b/src/TsvSlice/main.cpp @@ -44,7 +44,7 @@ class ConcreteTool //remove instead of extract > invert column selection if (getFlag("rm")) { - QSet old = cols.toList().toSet(); + QSet old = cols.toList().toSet(); cols.clear(); for (int c=0; cerr_fm || err_m>err_fm) { - stream << "Error: Mendelian error rates suggest a sample swap!" << endl; + stream << "Error: Mendelian error rates suggest a sample swap!" << QT_ENDL; THROW(ArgumentException, "Mendelian error rates suggest a sample swap!"); } } @@ -366,12 +366,12 @@ class ConcreteTool } } - stream << "Detected " << output.count() << " raw ranges" << endl; + stream << "Detected " << output.count() << " raw ranges" << QT_ENDL; if (debug) { foreach(const UpdRange& range, output) { - stream << " Range: " << range.toString() << endl; + stream << " Range: " << range.toString() << QT_ENDL; } } @@ -406,10 +406,10 @@ class ConcreteTool { if (debug) { - stream << "Merging ranges:" << endl; - stream << " " << ranges[i].toString() << endl; - stream << " " << ranges[i+1].toString() << endl; - stream << " base_diff=" << base_diff << " marker_diff=" << marker_diff << endl; + stream << "Merging ranges:" << QT_ENDL; + stream << " " << ranges[i].toString() << QT_ENDL; + stream << " " << ranges[i+1].toString() << QT_ENDL; + stream << " base_diff=" << base_diff << " marker_diff=" << marker_diff << QT_ENDL; } ranges[i].end = ranges[i+1].end; @@ -420,7 +420,7 @@ class ConcreteTool } } - stream << "Merged adjacent raw regions resulting in " << ranges.count() << " region(s)" << endl; + stream << "Merged adjacent raw regions resulting in " << ranges.count() << " region(s)" << QT_ENDL; } void writeOutput(QList& ranges, double p_biparental, double p_upd, QTextStream& stream) @@ -456,10 +456,10 @@ class ConcreteTool if (debug) { - stream << " Range: " << range.toString() << endl; + stream << " Range: " << range.toString() << QT_ENDL; } } - stream << "Written " << c_passing << " ranges that pass the filters" << endl; + stream << "Written " << c_passing << " ranges that pass the filters" << QT_ENDL; } void writeInformativeVariants(QList& data) @@ -511,17 +511,17 @@ class ConcreteTool QTextStream stream(stdout); //load genotype data - stream << "### Loading variant/genotype data ###" << endl; + stream << "### Loading variant/genotype data ###" << QT_ENDL; QList data = loadVariants(stream); - stream << endl; + stream << QT_ENDL; //check medelian errors - stream << "### Checking for mendelian errors ###" << endl; + stream << "### Checking for mendelian errors ###" << QT_ENDL; checkMendelianErrors(data, stream); - stream << endl; + stream << QT_ENDL; //statistics - stream << "### Performing statistics ###" << endl; + stream << "### Performing statistics ###" << QT_ENDL; int biparental = 0; int upd = 0; QMap chr_upd; @@ -541,16 +541,16 @@ class ConcreteTool ++chr_var[entry.chr.str()]; } double p_biparental = 1.0 * biparental / data.count(); - stream << "bi-parental variants: " << biparental << " (" << QByteArray::number(100.0*p_biparental, 'f', 3) << "%)" << endl; + stream << "bi-parental variants: " << biparental << " (" << QByteArray::number(100.0*p_biparental, 'f', 3) << "%)" << QT_ENDL; int max = *std::max_element(chr_upd.begin(), chr_upd.end()); QByteArray max_chr = chr_upd.key(max); double p_upd = 1.0 * (upd-max) / (data.count()-chr_var[max_chr]); - stream << "UPD variants: " << (upd-max) << " (" << QByteArray::number(100.0*p_upd, 'f', 3) << "%) - excluded chromosome " << max_chr << " containing " << max << " (" << QByteArray::number(100.0*max/chr_var[max_chr], 'f', 3) << "%)" << endl; - stream << endl; + stream << "UPD variants: " << (upd-max) << " (" << QByteArray::number(100.0*p_upd, 'f', 3) << "%) - excluded chromosome " << max_chr << " containing " << max << " (" << QByteArray::number(100.0*max/chr_var[max_chr], 'f', 3) << "%)" << QT_ENDL; + stream << QT_ENDL; //detection - stream << "### Detecting UPDs ###" << endl; + stream << "### Detecting UPDs ###" << QT_ENDL; QList ranges = detectRanges(data, stream); mergeRanges(ranges, stream); diff --git a/src/VcfAdd/main.cpp b/src/VcfAdd/main.cpp index d2a2a8cc6..eaf59e106 100644 --- a/src/VcfAdd/main.cpp +++ b/src/VcfAdd/main.cpp @@ -182,14 +182,14 @@ class ConcreteTool if (out!="") { QTextStream stream(stdout); - stream << "Variants written: " << c_written << endl; + stream << "Variants written: " << c_written << QT_ENDL; if (skip_duplicates) { - stream << "Duplicate variants skipped: " << c_dup << endl; + stream << "Duplicate variants skipped: " << c_dup << QT_ENDL; } if (filter_used) { - stream << "Filter entries added to variants: " << c_filter << endl; + stream << "Filter entries added to variants: " << c_filter << QT_ENDL; } } } diff --git a/src/VcfAnnotateConsequence/ChunkProcessor.cpp b/src/VcfAnnotateConsequence/ChunkProcessor.cpp index 8b539f938..6f1bcbcd2 100644 --- a/src/VcfAnnotateConsequence/ChunkProcessor.cpp +++ b/src/VcfAnnotateConsequence/ChunkProcessor.cpp @@ -18,19 +18,19 @@ ChunkProcessor::ChunkProcessor(AnalysisJob &job, const MetaData& settings, const , reference_(settings.reference) , hgvs_anno_(reference_, settings_.annotation_parameters) { - if (params_.debug) QTextStream(stdout) << "ChunkProcessor(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "ChunkProcessor(): " << job_.index << QT_ENDL; } ChunkProcessor::~ChunkProcessor() { - if (params_.debug) QTextStream(stdout) << "~ChunkProcessor(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~ChunkProcessor(): " << job_.index << QT_ENDL; } // single chunks are processed void ChunkProcessor::run() { ChromosomalIndex transcript_index(settings_.transcripts); - if (params_.debug) QTextStream(stdout) << "ChunkProcessor::run() " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "ChunkProcessor::run() " << job_.index << QT_ENDL; try { // read vcf file @@ -135,8 +135,8 @@ QByteArray ChunkProcessor::annotateVcfLine(const QByteArray& line, const Chromos catch(Exception& e) { QTextStream out(stdout); - out << "Error processing variant " << variant.toString() << " and transcript " << t.nameWithVersion() << ":" << endl; - out << " " << e.message().replace("\n", " \n") << endl; + out << "Error processing variant " << variant.toString() << " and transcript " << t.nameWithVersion() << ":" << QT_ENDL; + out << " " << e.message().replace("\n", " \n") << QT_ENDL; } } } diff --git a/src/VcfAnnotateConsequence/InputWorker.cpp b/src/VcfAnnotateConsequence/InputWorker.cpp index decbcf7e5..b18fe51a9 100644 --- a/src/VcfAnnotateConsequence/InputWorker.cpp +++ b/src/VcfAnnotateConsequence/InputWorker.cpp @@ -9,12 +9,10 @@ InputWorker::InputWorker(AnalysisJob& job, gzFile& in_stream, Parameters& params , in_stream_(in_stream) , params_(params) { -// if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << endl; } InputWorker::~InputWorker() { -// if (params_.debug) QTextStream(stdout) << "~InputWorker(): " << job_.index << endl; } void InputWorker::run() @@ -61,7 +59,7 @@ void InputWorker::run() job_.lines.append(QByteArray(char_array)); } - if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << " job done!" << endl; + if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << " job done!" << QT_ENDL; emit done(job_.index); } catch(Exception& e) diff --git a/src/VcfAnnotateConsequence/OutputWorker.cpp b/src/VcfAnnotateConsequence/OutputWorker.cpp index 6cbf5a964..9b58495db 100644 --- a/src/VcfAnnotateConsequence/OutputWorker.cpp +++ b/src/VcfAnnotateConsequence/OutputWorker.cpp @@ -8,12 +8,12 @@ OutputWorker::OutputWorker(AnalysisJob& job, QSharedPointer out_stream, P , out_stream_(out_stream) , params_(params) { - if (params_.debug) QTextStream(stdout) << "OutputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "OutputWorker(): " << job_.index << QT_ENDL; } OutputWorker::~OutputWorker() { - if (params_.debug) QTextStream(stdout) << "~OutputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~OutputWorker(): " << job_.index << QT_ENDL; } @@ -26,7 +26,7 @@ void OutputWorker::run() { if (job_.chunk_nr!=write_chunk) { - if (params_.debug) QTextStream(stdout) << "OutputWorker::run() job: " << job_.index << " - Cannot write now wrong order. Job has chunk: " << job_.chunk_nr << " next chunk is " << write_chunk << endl; + if (params_.debug) QTextStream(stdout) << "OutputWorker::run() job: " << job_.index << " - Cannot write now wrong order. Job has chunk: " << job_.chunk_nr << " next chunk is " << write_chunk << QT_ENDL; emit retry(job_.index); return; } diff --git a/src/VcfAnnotateConsequence/ThreadCoordinator.cpp b/src/VcfAnnotateConsequence/ThreadCoordinator.cpp index 0e89411dc..c6b19ce35 100644 --- a/src/VcfAnnotateConsequence/ThreadCoordinator.cpp +++ b/src/VcfAnnotateConsequence/ThreadCoordinator.cpp @@ -44,12 +44,12 @@ ThreadCoordinator::ThreadCoordinator(QObject* parent, Parameters params, MetaDat ThreadCoordinator::~ThreadCoordinator() { - if (params_.debug) QTextStream(stdout) << "Destroying ThreadCoordinator" << endl; + if (params_.debug) QTextStream(stdout) << "Destroying ThreadCoordinator" << QT_ENDL; } void ThreadCoordinator::read(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::read(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::read(" << i << ")" << QT_ENDL; InputWorker* worker = new InputWorker(job_pool_[i], in_stream_, params_); connect(worker, SIGNAL(error(int,QString)), this, SLOT(error(int,QString))); @@ -60,7 +60,7 @@ void ThreadCoordinator::read(int i) void ThreadCoordinator::annotate(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::annotate(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::annotate(" << i << ")" << QT_ENDL; ChunkProcessor* worker = new ChunkProcessor(job_pool_[i], meta_, params_); @@ -72,7 +72,7 @@ void ThreadCoordinator::annotate(int i) void ThreadCoordinator::write(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::write(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::write(" << i << ")" << QT_ENDL; OutputWorker* worker = new OutputWorker(job_pool_[i], out_stream_, params_); connect(worker, SIGNAL(error(int,QString)), this, SLOT(error(int,QString))); @@ -104,12 +104,12 @@ void ThreadCoordinator::inputDone(int /*i*/) connect(&timer_done_, SIGNAL(timeout()), this, SLOT(checkDone())); timer_done_.start(100); - QTextStream(stdout) << "Reading input done" << endl; + QTextStream(stdout) << "Reading input done" << QT_ENDL; } void ThreadCoordinator::checkDone() { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::checkDone()" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::checkDone()" << QT_ENDL; //check if all jobs are done for (int i=0; i0 && timer.elapsed()>debug) { - outstream << Helper::dateTime() << " debug - to_be_processed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << endl; + outstream << Helper::dateTime() << " debug - to_be_processed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << QT_ENDL; timer.restart(); } } @@ -198,7 +198,7 @@ class ConcreteTool //wait for all jobs to finish - if (debug>0) outstream << Helper::dateTime() << " input data read completely - waiting for analysis to finish" << endl; + if (debug>0) outstream << Helper::dateTime() << " input data read completely - waiting for analysis to finish" << QT_ENDL; int done = 0; int to_be_written, to_be_processed; while(done < job_pool.count()) @@ -254,13 +254,13 @@ class ConcreteTool //debug output if (debug>0 && timer.elapsed()>debug) { - outstream << Helper::dateTime() << " debug - to_be_analyzed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << endl; + outstream << Helper::dateTime() << " debug - to_be_analyzed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << QT_ENDL; timer.restart(); } } output_worker->terminate(); - if (debug>0) outstream << Helper::dateTime() << " analysis finished" << endl; + if (debug>0) outstream << Helper::dateTime() << " analysis finished" << QT_ENDL; } diff --git a/src/VcfAnnotateFromBigWig/main.cpp b/src/VcfAnnotateFromBigWig/main.cpp index e213bbf6f..3ed8b6dd0 100644 --- a/src/VcfAnnotateFromBigWig/main.cpp +++ b/src/VcfAnnotateFromBigWig/main.cpp @@ -176,7 +176,7 @@ class ConcreteTool //debug output if (debug>0 && timer.elapsed()>debug) { - outstream << Helper::dateTime() << " debug - to_be_processed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << endl; + outstream << Helper::dateTime() << " debug - to_be_processed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << QT_ENDL; timer.restart(); } } @@ -185,7 +185,7 @@ class ConcreteTool in_p->close(); //wait for all jobs to finish - if (debug>0) outstream << Helper::dateTime() << " input data read completely - waiting for analysis to finish" << endl; + if (debug>0) outstream << Helper::dateTime() << " input data read completely - waiting for analysis to finish" << QT_ENDL; int done = 0; int to_be_written, to_be_processed; while(done < job_pool.count()) @@ -241,13 +241,13 @@ class ConcreteTool //debug output if (debug>0 && timer.elapsed()>debug) { - outstream << Helper::dateTime() << " debug - to_be_analyzed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << endl; + outstream << Helper::dateTime() << " debug - to_be_analyzed: " << to_be_processed << " to_be_written: " << to_be_written << " done: " << done << QT_ENDL; timer.restart(); } } output_worker->terminate(); - if (debug>0) outstream << Helper::dateTime() << " analysis finished" << endl; + if (debug>0) outstream << Helper::dateTime() << " analysis finished" << QT_ENDL; } catch(...) diff --git a/src/VcfAnnotateFromVcf/ChunkProcessor.cpp b/src/VcfAnnotateFromVcf/ChunkProcessor.cpp index 242cfa8bc..0c4036d28 100644 --- a/src/VcfAnnotateFromVcf/ChunkProcessor.cpp +++ b/src/VcfAnnotateFromVcf/ChunkProcessor.cpp @@ -11,12 +11,12 @@ ChunkProcessor::ChunkProcessor(AnalysisJob& job, const MetaData& meta, Parameter , meta_(meta) , params_(params) { - if (params_.debug) QTextStream(stdout) << "ChunkProcessor(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "ChunkProcessor(): " << job_.index << QT_ENDL; } ChunkProcessor::~ChunkProcessor() { - if (params_.debug) QTextStream(stdout) << "~ChunkProcessor(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~ChunkProcessor(): " << job_.index << QT_ENDL; } diff --git a/src/VcfAnnotateFromVcf/InputWorker.cpp b/src/VcfAnnotateFromVcf/InputWorker.cpp index 97cdb34c2..bee9ea44c 100644 --- a/src/VcfAnnotateFromVcf/InputWorker.cpp +++ b/src/VcfAnnotateFromVcf/InputWorker.cpp @@ -9,12 +9,12 @@ InputWorker::InputWorker(AnalysisJob& job, gzFile& in_stream, Parameters& params , in_stream_(in_stream) , params_(params) { - if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << QT_ENDL; } InputWorker::~InputWorker() { - if (params_.debug) QTextStream(stdout) << "~InputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~InputWorker(): " << job_.index << QT_ENDL; } void InputWorker::run() diff --git a/src/VcfAnnotateFromVcf/OutputWorker.cpp b/src/VcfAnnotateFromVcf/OutputWorker.cpp index 8bd8bd50c..45bbf2746 100644 --- a/src/VcfAnnotateFromVcf/OutputWorker.cpp +++ b/src/VcfAnnotateFromVcf/OutputWorker.cpp @@ -8,12 +8,12 @@ OutputWorker::OutputWorker(AnalysisJob& job, QSharedPointer out_stream, P , out_stream_(out_stream) , params_(params) { - if (params_.debug) QTextStream(stdout) << "OutputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "OutputWorker(): " << job_.index << QT_ENDL; } OutputWorker::~OutputWorker() { - if (params_.debug) QTextStream(stdout) << "~OutputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~OutputWorker(): " << job_.index << QT_ENDL; } diff --git a/src/VcfAnnotateFromVcf/ThreadCoordinator.cpp b/src/VcfAnnotateFromVcf/ThreadCoordinator.cpp index e88d4a49b..b0778ff26 100644 --- a/src/VcfAnnotateFromVcf/ThreadCoordinator.cpp +++ b/src/VcfAnnotateFromVcf/ThreadCoordinator.cpp @@ -41,12 +41,12 @@ ThreadCoordinator::ThreadCoordinator(QObject* parent, Parameters params, MetaDat ThreadCoordinator::~ThreadCoordinator() { - if (params_.debug) QTextStream(stdout) << "Destroying ThreadCoordinator" << endl; + if (params_.debug) QTextStream(stdout) << "Destroying ThreadCoordinator" << QT_ENDL; } void ThreadCoordinator::read(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::read(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::read(" << i << ")" << QT_ENDL; InputWorker* worker = new InputWorker(job_pool_[i], in_stream_, params_); connect(worker, SIGNAL(error(int,QString)), this, SLOT(error(int,QString))); @@ -57,7 +57,7 @@ void ThreadCoordinator::read(int i) void ThreadCoordinator::annotate(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::annotate(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::annotate(" << i << ")" << QT_ENDL; ChunkProcessor* worker = new ChunkProcessor(job_pool_[i], meta_, params_); connect(worker, SIGNAL(done(int)), this, SLOT(write(int))); @@ -67,7 +67,7 @@ void ThreadCoordinator::annotate(int i) void ThreadCoordinator::write(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::write(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::write(" << i << ")" << QT_ENDL; OutputWorker* worker = new OutputWorker(job_pool_[i], out_stream_, params_); connect(worker, SIGNAL(error(int,QString)), this, SLOT(error(int,QString))); @@ -91,12 +91,12 @@ void ThreadCoordinator::inputDone(int /*i*/) connect(&timer_done_, SIGNAL(timeout()), this, SLOT(checkDone())); timer_done_.start(100); - QTextStream(stdout) << "Reading input done" << endl; + QTextStream(stdout) << "Reading input done" << QT_ENDL; } void ThreadCoordinator::checkDone() { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::checkDone()" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::checkDone()" << QT_ENDL; //check if all jobs are done for (int i=0; i stop timer to prevent it from fireing again timer_done_.stop(); - QTextStream(stdout) << "Annotation jobs finished" << endl; + QTextStream(stdout) << "Annotation jobs finished" << QT_ENDL; emit finished(); } diff --git a/src/VcfAnnotateFromVcf/main.cpp b/src/VcfAnnotateFromVcf/main.cpp index 430f269a6..0c10d3213 100644 --- a/src/VcfAnnotateFromVcf/main.cpp +++ b/src/VcfAnnotateFromVcf/main.cpp @@ -217,13 +217,13 @@ class ConcreteTool out << "INFO ids:\n"; for (int j = 0; j < meta.info_id_list[i].size(); j++) { - out << "\t " << meta.info_id_list[i][j].leftJustified(12) << "-> " << meta.out_info_id_list[i][j] << endl; + out << "\t " << meta.info_id_list[i][j].leftJustified(12) << "-> " << meta.out_info_id_list[i][j] << QT_ENDL; } } } //create coordinator instance - out << "Performing annotation" << endl; + out << "Performing annotation" << QT_ENDL; ThreadCoordinator* coordinator = new ThreadCoordinator(this, params, meta); connect(coordinator, SIGNAL(finished()), QCoreApplication::instance(), SLOT(quit())); } diff --git a/src/VcfAnnotateMaxEntScan/ChunkProcessor.cpp b/src/VcfAnnotateMaxEntScan/ChunkProcessor.cpp index 268e2fa0a..4cac2c831 100644 --- a/src/VcfAnnotateMaxEntScan/ChunkProcessor.cpp +++ b/src/VcfAnnotateMaxEntScan/ChunkProcessor.cpp @@ -22,12 +22,12 @@ ChunkProcessor::ChunkProcessor(AnalysisJob& job, const MetaData& meta, const Par , params_(params) , reference_(meta.reference) { - if (params_.debug) QTextStream(stdout) << "ChunkProcessor(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "ChunkProcessor(): " << job_.index << QT_ENDL; } ChunkProcessor::~ChunkProcessor() { - if (params_.debug) QTextStream(stdout) << "~ChunkProcessor(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~ChunkProcessor(): " << job_.index << QT_ENDL; } // utility functions diff --git a/src/VcfAnnotateMaxEntScan/InputWorker.cpp b/src/VcfAnnotateMaxEntScan/InputWorker.cpp index aa545fe80..1ca1d7857 100644 --- a/src/VcfAnnotateMaxEntScan/InputWorker.cpp +++ b/src/VcfAnnotateMaxEntScan/InputWorker.cpp @@ -9,12 +9,12 @@ InputWorker::InputWorker(AnalysisJob& job, gzFile& in_stream, Parameters& params , in_stream_(in_stream) , params_(params) { - if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "InputWorker(): " << job_.index << QT_ENDL; } InputWorker::~InputWorker() { - if (params_.debug) QTextStream(stdout) << "~InputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~InputWorker(): " << job_.index << QT_ENDL; } void InputWorker::run() diff --git a/src/VcfAnnotateMaxEntScan/OutputWorker.cpp b/src/VcfAnnotateMaxEntScan/OutputWorker.cpp index 8bd8bd50c..45bbf2746 100644 --- a/src/VcfAnnotateMaxEntScan/OutputWorker.cpp +++ b/src/VcfAnnotateMaxEntScan/OutputWorker.cpp @@ -8,12 +8,12 @@ OutputWorker::OutputWorker(AnalysisJob& job, QSharedPointer out_stream, P , out_stream_(out_stream) , params_(params) { - if (params_.debug) QTextStream(stdout) << "OutputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "OutputWorker(): " << job_.index << QT_ENDL; } OutputWorker::~OutputWorker() { - if (params_.debug) QTextStream(stdout) << "~OutputWorker(): " << job_.index << endl; + if (params_.debug) QTextStream(stdout) << "~OutputWorker(): " << job_.index << QT_ENDL; } diff --git a/src/VcfAnnotateMaxEntScan/ThreadCoordinator.cpp b/src/VcfAnnotateMaxEntScan/ThreadCoordinator.cpp index e88d4a49b..b0778ff26 100644 --- a/src/VcfAnnotateMaxEntScan/ThreadCoordinator.cpp +++ b/src/VcfAnnotateMaxEntScan/ThreadCoordinator.cpp @@ -41,12 +41,12 @@ ThreadCoordinator::ThreadCoordinator(QObject* parent, Parameters params, MetaDat ThreadCoordinator::~ThreadCoordinator() { - if (params_.debug) QTextStream(stdout) << "Destroying ThreadCoordinator" << endl; + if (params_.debug) QTextStream(stdout) << "Destroying ThreadCoordinator" << QT_ENDL; } void ThreadCoordinator::read(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::read(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::read(" << i << ")" << QT_ENDL; InputWorker* worker = new InputWorker(job_pool_[i], in_stream_, params_); connect(worker, SIGNAL(error(int,QString)), this, SLOT(error(int,QString))); @@ -57,7 +57,7 @@ void ThreadCoordinator::read(int i) void ThreadCoordinator::annotate(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::annotate(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::annotate(" << i << ")" << QT_ENDL; ChunkProcessor* worker = new ChunkProcessor(job_pool_[i], meta_, params_); connect(worker, SIGNAL(done(int)), this, SLOT(write(int))); @@ -67,7 +67,7 @@ void ThreadCoordinator::annotate(int i) void ThreadCoordinator::write(int i) { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::write(" << i << ")" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::write(" << i << ")" << QT_ENDL; OutputWorker* worker = new OutputWorker(job_pool_[i], out_stream_, params_); connect(worker, SIGNAL(error(int,QString)), this, SLOT(error(int,QString))); @@ -91,12 +91,12 @@ void ThreadCoordinator::inputDone(int /*i*/) connect(&timer_done_, SIGNAL(timeout()), this, SLOT(checkDone())); timer_done_.start(100); - QTextStream(stdout) << "Reading input done" << endl; + QTextStream(stdout) << "Reading input done" << QT_ENDL; } void ThreadCoordinator::checkDone() { - if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::checkDone()" << endl; + if (params_.debug) QTextStream(stdout) << "ThreadCoordinator::checkDone()" << QT_ENDL; //check if all jobs are done for (int i=0; i stop timer to prevent it from fireing again timer_done_.stop(); - QTextStream(stdout) << "Annotation jobs finished" << endl; + QTextStream(stdout) << "Annotation jobs finished" << QT_ENDL; emit finished(); } diff --git a/src/VcfAnnotateMaxEntScan/main.cpp b/src/VcfAnnotateMaxEntScan/main.cpp index d89f61090..48ce4e216 100644 --- a/src/VcfAnnotateMaxEntScan/main.cpp +++ b/src/VcfAnnotateMaxEntScan/main.cpp @@ -80,19 +80,19 @@ class ConcreteTool if (params.in!="" && params.in==params.out) THROW(ArgumentException, "Input and output files must be different when streaming!"); // read in reference genome - QTime timer; + QElapsedTimer timer; timer.start(); QString ref_file = getInfile("ref"); if (ref_file=="") ref_file = Settings::string("reference_genome", true); if (ref_file=="") THROW(CommandLineParsingException, "Reference genome FASTA unset in both command-line and settings.ini file!"); FastaFileIndex reference(ref_file); - out << "Reading reference took: " << Helper::elapsedTime(timer) << endl; + out << "Reading reference took: " << Helper::elapsedTime(timer) << QT_ENDL; // read in matrices timer.start(); QHash score5_rest_ = read_matrix_5prime(":/resources/score5_matrix.tsv"); QHash> score3_rest_ = read_matrix_3prime(":/resources/score3_matrix.tsv"); - out << "Parsing matrices from resources took: " << Helper::elapsedTime(timer) << endl; + out << "Parsing matrices from resources took: " << Helper::elapsedTime(timer) << QT_ENDL; // parse GFF file timer.start(); @@ -103,7 +103,7 @@ class ConcreteTool gff_settings.include_all = all; gff_settings.skip_not_hgnc = false; GffData gff_file = NGSHelper::loadGffFile(gff_path, gff_settings); - out << "Parsing transcripts took: " << Helper::elapsedTime(timer) << endl; + out << "Parsing transcripts took: " << Helper::elapsedTime(timer) << QT_ENDL; gff_file.transcripts.sortByPosition(); QByteArrayList annotation_header_lines; @@ -122,7 +122,7 @@ class ConcreteTool out << "Block (Chunk) size: \t" << params.block_size << "\n"; //create coordinator instance - out << "Performing annotation..." << endl; + out << "Performing annotation..." << QT_ENDL; ThreadCoordinator* coordinator = new ThreadCoordinator(this, params, meta); connect(coordinator, SIGNAL(finished()), QCoreApplication::instance(), SLOT(quit())); } diff --git a/src/VcfBreakMulti/main.cpp b/src/VcfBreakMulti/main.cpp index 7f1cc3b84..7203bc1a2 100644 --- a/src/VcfBreakMulti/main.cpp +++ b/src/VcfBreakMulti/main.cpp @@ -376,11 +376,11 @@ class ConcreteTool: public ToolBase { for (auto it=ignored_info_field_errors.begin(); it!=ignored_info_field_errors.end(); ++it) { - out_stream << "Ignored invalid value count of INFO field '" << it.key() << "' " << QString::number(it.value()) << " times" << endl; + out_stream << "Ignored invalid value count of INFO field '" << it.key() << "' " << QString::number(it.value()) << " times" << QT_ENDL; } for (auto it=ignored_format_field_errors.begin(); it!=ignored_format_field_errors.end(); ++it) { - out_stream << "Ignored invalid value count of FORMAT field '" << it.key() << "' " << QString::number(it.value()) << " times" << endl; + out_stream << "Ignored invalid value count of FORMAT field '" << it.key() << "' " << QString::number(it.value()) << " times" << QT_ENDL; } } } diff --git a/src/VcfCalculatePRS/main.cpp b/src/VcfCalculatePRS/main.cpp index 03b7f2a6d..bf6954875 100644 --- a/src/VcfCalculatePRS/main.cpp +++ b/src/VcfCalculatePRS/main.cpp @@ -393,7 +393,7 @@ class ConcreteTool //print final PRS out << column_entries["pgs_id"] << ": variants_found=" << c_found << " prs=" << prs << " percentile=" << percentile_string << " low_depth_variants=" << c_low_depth - << " variants_imputed=" << c_imputed << endl; + << " variants_imputed=" << c_imputed << QT_ENDL; } output_tsv->flush(); diff --git a/src/VcfSubtract/main.cpp b/src/VcfSubtract/main.cpp index 15010faf5..1fc81605d 100644 --- a/src/VcfSubtract/main.cpp +++ b/src/VcfSubtract/main.cpp @@ -84,7 +84,7 @@ class ConcreteTool //Statistics output QTextStream stream(stdout); - stream << "Variants from in removed: " << removed_count << endl; + stream << "Variants from in removed: " << removed_count << QT_ENDL; } private: diff --git a/src/cppCORE b/src/cppCORE index 58752b76a..eddc2e067 160000 --- a/src/cppCORE +++ b/src/cppCORE @@ -1 +1 @@ -Subproject commit 58752b76ac17cc8036bf3f4dd7424e7778ef7257 +Subproject commit eddc2e06701698826e5f29885ae9f6a37abaa8b7 diff --git a/src/cppGUI b/src/cppGUI index 2d842e796..264fe630d 160000 --- a/src/cppGUI +++ b/src/cppGUI @@ -1 +1 @@ -Subproject commit 2d842e796b7eac54e684a738a18b5fefd545f9a9 +Subproject commit 264fe630d018f38f3f0004b918a17deb1c81b64d diff --git a/src/cppNGS/BamReader.cpp b/src/cppNGS/BamReader.cpp index 3199a80ec..3b186ecd8 100644 --- a/src/cppNGS/BamReader.cpp +++ b/src/cppNGS/BamReader.cpp @@ -91,7 +91,7 @@ QByteArray BamAlignment::cigarDataAsString(bool expand) const } else { - output.append(QString::number(bam_cigar_oplen(cigar[i]))); + output.append(QString::number(bam_cigar_oplen(cigar[i])).toLocal8Bit()); output.append(bam_cigar_opchr(cigar[i])); } } @@ -176,22 +176,15 @@ void BamAlignment::setBases(const Sequence& bases) THROW(ProgrammingException, QByteArray("Cannot store character '") + bases[i] + "' in BAM/CRAM file. Only A,C,G,T,N are allowed!"); } - //std::cout << " base=" << bases[i] << " base_index=" << "(" << std::bitset<8>(base_index) << ")" << std::endl; const int index = (i>>1); //two bases are stored on one byte => divide index by two via shifting uint8_t two_bases = s[index]; //two bases (lower~even index on the left) if (i % 2 == 0) //even index { - //std::cout << " index=" << i << " (even ~ left)" << std::endl; - //std::cout << " old=" << two_bases << "(" << std::bitset<8>(two_bases) << ")" << std::endl; two_bases = (two_bases & 0xf) | (base_index << 4); - //std::cout << " new=" << two_bases << "(" << std::bitset<8>(two_bases) << ")" << std::endl; } else //odd index { - //std::cout << " index=" << i << " (odd ~ right)" << std::endl; - //std::cout << " old=" << two_bases << "(" << std::bitset<8>(two_bases) << ")" << std::endl; two_bases = (two_bases & 0xf0) | base_index; - //std::cout << " new=" << two_bases << "(" << std::bitset<8>(two_bases) << ")" << std::endl; } s[index] = two_bases; } diff --git a/src/cppNGS/BedpeFile.cpp b/src/cppNGS/BedpeFile.cpp index 27d168b29..7f0eee389 100644 --- a/src/cppNGS/BedpeFile.cpp +++ b/src/cppNGS/BedpeFile.cpp @@ -474,7 +474,7 @@ int BedpeFile::annotationIndexByName(const QByteArray& name, bool error_on_misma QMap BedpeFile::parseInfoField(QByteArray unparsed_fields) { QMap map = {}; - QStringList tmp_list = QString(unparsed_fields).replace(">","").replace("<","").replace("##","").simplified().split("\"",QString::SkipEmptyParts); + QStringList tmp_list = QString(unparsed_fields).replace(">", "").replace("<", "").replace("##", "").simplified().split("\"", QT_SKIP_EMPTY_PARTS); bool in_quotes = unparsed_fields.at(0) == '\"'; QStringList parts; @@ -488,7 +488,7 @@ QMap BedpeFile::parseInfoField(QByteArray unparsed_field } else //split by , if outside "" { - parts.append(tmp.split(',',QString::SkipEmptyParts)); + parts.append(tmp.split(',', QT_SKIP_EMPTY_PARTS)); } in_quotes = !in_quotes; } diff --git a/src/cppNGS/FilterCascade.cpp b/src/cppNGS/FilterCascade.cpp index 51fcb0877..9793500a2 100644 --- a/src/cppNGS/FilterCascade.cpp +++ b/src/cppNGS/FilterCascade.cpp @@ -324,7 +324,7 @@ void FilterBase::setGeneric(const QString& name, const QString& value) } else if (type==FilterParameterType::STRINGLIST) { - setStringList(name, value.split(',', QString::SkipEmptyParts)); + setStringList(name, value.split(',', QT_SKIP_EMPTY_PARTS)); } else { @@ -590,7 +590,7 @@ void FilterCascade::moveDown(int index) FilterResult FilterCascade::apply(const VariantList& variants, bool throw_errors, bool debug_time) const { - QTime timer; + QElapsedTimer timer; timer.start(); FilterResult result(variants.count()); @@ -636,7 +636,7 @@ FilterResult FilterCascade::apply(const VariantList& variants, bool throw_errors FilterResult FilterCascade::apply(const CnvList& cnvs, bool throw_errors, bool debug_time) const { - QTime timer; + QElapsedTimer timer; timer.start(); FilterResult result(cnvs.count()); @@ -682,7 +682,7 @@ FilterResult FilterCascade::apply(const CnvList& cnvs, bool throw_errors, bool d FilterResult FilterCascade::apply(const BedpeFile& svs, bool throw_errors, bool debug_time) const { - QTime timer; + QElapsedTimer timer; timer.start(); FilterResult result(svs.count()); @@ -2546,7 +2546,7 @@ void FilterTrio::apply(const VariantList& variants, FilterResult& result) const BedFile par_region = NGSHelper::pseudoAutosomalRegion(stringToBuild(getString("build"))); //pre-calculate genes with heterozygous variants - QSet types = getStringList("types").toSet(); + QSet types = LIST_TO_SET(getStringList("types")); GeneSet genes_comphet; if (types.contains("comp-het")) { @@ -3870,7 +3870,7 @@ void FilterSvFilterColumn::apply(const BedpeFile& svs, FilterResult& result) con { if (!enabled_) return; - QSet filter_entries = getStringList("entries").toSet(); + QSet filter_entries = LIST_TO_SET(getStringList("entries")); QString action = getString("action"); int filter_col_index = svs.annotationIndexByName("FILTER"); @@ -3880,7 +3880,7 @@ void FilterSvFilterColumn::apply(const BedpeFile& svs, FilterResult& result) con { if (!result.flags()[i]) continue; - QSet sv_entries = QString(svs[i].annotations()[filter_col_index]).split(';').toSet(); + QSet sv_entries = LIST_TO_SET(QString(svs[i].annotations()[filter_col_index]).split(';')); if (sv_entries.intersects(filter_entries)) { result.flags()[i] = false; @@ -3893,7 +3893,7 @@ void FilterSvFilterColumn::apply(const BedpeFile& svs, FilterResult& result) con { if (!result.flags()[i]) continue; - QSet sv_entries = QString(svs[i].annotations()[filter_col_index]).split(';').toSet(); + QSet sv_entries = LIST_TO_SET(QString(svs[i].annotations()[filter_col_index]).split(';')); if (!sv_entries.intersects(filter_entries)) { result.flags()[i] = false; @@ -3904,7 +3904,7 @@ void FilterSvFilterColumn::apply(const BedpeFile& svs, FilterResult& result) con { for(int i=0; i sv_entries = QString(svs[i].annotations()[filter_col_index]).split(';').toSet(); + QSet sv_entries = LIST_TO_SET(QString(svs[i].annotations()[filter_col_index]).split(';')); if (sv_entries.intersects(filter_entries)) { result.flags()[i] = true; @@ -4820,7 +4820,7 @@ void FilterSvTrio::apply(const BedpeFile &svs, FilterResult &result) const BedFile par_region = NGSHelper::pseudoAutosomalRegion(stringToBuild(getString("build"))); //pre-calculate genes with heterozygous variants - QSet types = getStringList("types").toSet(); + QSet types = LIST_TO_SET(getStringList("types")); GeneSet genes_comphet; if (types.contains("comp-het")) { diff --git a/src/cppNGS/Graph.h b/src/cppNGS/Graph.h index bd0189ca4..c9ed745cc 100644 --- a/src/cppNGS/Graph.h +++ b/src/cppNGS/Graph.h @@ -476,7 +476,7 @@ void Graph::store(const QString& file) QSharedPointer writer = Helper::openFileForWriting(file); QTextStream stream(writer.data()); - QList> sorted_edge_list = edge_list_.toList(); + QList> sorted_edge_list = edge_list_.values(); std::sort(sorted_edge_list.begin(), sorted_edge_list.end(), [](QPair a, QPair b) @@ -491,7 +491,7 @@ void Graph::store(const QString& file) QPair node_pair; foreach(node_pair, sorted_edge_list) { - stream << node_pair.first << "\t" << node_pair.second << endl; + stream << node_pair.first << "\t" << node_pair.second << QT_ENDL; } } diff --git a/src/cppNGS/NGSHelper.cpp b/src/cppNGS/NGSHelper.cpp index 06fc471f9..88475b67d 100644 --- a/src/cppNGS/NGSHelper.cpp +++ b/src/cppNGS/NGSHelper.cpp @@ -127,7 +127,7 @@ void NGSHelper::createSampleOverview(QStringList in, QString out, int indel_wind } else { - QSet parts = line.trimmed().split('\t').toSet(); + QSet parts = LIST_TO_SET(line.trimmed().split('\t')); for (int i=cols.count()-1; i>=0; --i) { if (!parts.contains(cols[i])) @@ -511,7 +511,7 @@ void NGSHelper::parseRegion(const QString& text, Chromosome& chr, int& start, in simplyfied.replace(":", " "); simplyfied.replace(",", ""); simplyfied = simplyfied.trimmed(); - QStringList parts = simplyfied.split(QRegularExpression("\\W+"), QString::SkipEmptyParts); + QStringList parts = simplyfied.split(QRegularExpression("\\W+"), QT_SKIP_EMPTY_PARTS); //support for chrosomome only if (allow_chr_only && parts.count()==1 && Chromosome(simplyfied).isNonSpecial()) @@ -1088,24 +1088,24 @@ GffData NGSHelper::loadGffFile(QString filename, GffSettings settings) if (settings.print_to_stdout) { QTextStream out(stdout); - out << "Parsed " << data.transcripts.geneCount() << " genes from GFF" << endl; - out << "Parsed " << data.transcripts.count() << " transcripts from GFF" << endl; + out << "Parsed " << data.transcripts.geneCount() << " genes from GFF" << QT_ENDL; + out << "Parsed " << data.transcripts.count() << " transcripts from GFF" << QT_ENDL; if (c_skipped_special_chr>0) { - out << "Notice: " << QByteArray::number(c_skipped_special_chr) << " genes on special chromosomes skipped: " << special_chrs.toList().join(", ") << endl; + out << "Notice: " << QByteArray::number(c_skipped_special_chr) << " genes on special chromosomes skipped: " << special_chrs.values().join(", ") << QT_ENDL; } if (c_skipped_no_name_and_hgnc>0) { - out << "Notice: " << QByteArray::number(c_skipped_no_name_and_hgnc) << " genes without symbol and HGNC identifier skipped." << endl; + out << "Notice: " << QByteArray::number(c_skipped_no_name_and_hgnc) << " genes without symbol and HGNC identifier skipped." << QT_ENDL; } if (c_skipped_not_hgnc>0) { - out << "Notice: " << QByteArray::number(c_skipped_not_hgnc) << " genes without a HGNC identifier skipped." << endl; + out << "Notice: " << QByteArray::number(c_skipped_not_hgnc) << " genes without a HGNC identifier skipped." << QT_ENDL; } if (c_skipped_low_evidence>0) { - out << "Notice: " << QByteArray::number(c_skipped_special_chr) << " transcipts not " << (settings.source=="ensembl" ? "flagged as 'GENCODE basic'" : "from data source RefSeq/BestRefSeq") << " skipped." << endl; + out << "Notice: " << QByteArray::number(c_skipped_special_chr) << " transcipts not " << (settings.source=="ensembl" ? "flagged as 'GENCODE basic'" : "from data source RefSeq/BestRefSeq") << " skipped." << QT_ENDL; } } diff --git a/src/cppNGS/PipelineSettings.cpp b/src/cppNGS/PipelineSettings.cpp index eab5660f6..313072aec 100644 --- a/src/cppNGS/PipelineSettings.cpp +++ b/src/cppNGS/PipelineSettings.cpp @@ -22,7 +22,7 @@ void PipelineSettings::loadSettings(QString ini_file) } // Key-value pair - QStringList parts = line.split("=", QString::SkipEmptyParts); + QStringList parts = line.split("=", QT_SKIP_EMPTY_PARTS); if (parts.size() == 2) { QString key = parts.at(0).trimmed(); diff --git a/src/cppNGS/QCCollection.cpp b/src/cppNGS/QCCollection.cpp index dc4561d33..f5fabb816 100644 --- a/src/cppNGS/QCCollection.cpp +++ b/src/cppNGS/QCCollection.cpp @@ -203,30 +203,33 @@ void QCCollection::storeToQCML(QString filename, const QStringList& source_files QTextStream stream(file.data()); //write header - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << " ]>" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << " ]>" << QT_ENDL; stream << "" << endl; - stream << " " << endl; + stream << ">" << QT_ENDL; + stream << " " << QT_ENDL; //write meta data - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; int idx = 4; foreach(const QString& sf, source_files) { - stream << " " << endl; + stream << " " << QT_ENDL; ++idx; } foreach(const QCValue& md, metadata) { - if(md.accession()=="QC:1000006") stream << " " << endl; - else stream << " " << endl; + if(md.accession()=="QC:1000006") stream << " " << QT_ENDL; + else + { + stream << " " << QT_ENDL; + } ++idx; } @@ -242,94 +245,94 @@ void QCCollection::storeToQCML(QString filename, const QStringList& source_files value = values_[i].toString(precision_overwrite[name]); } - stream << " " << endl; + stream << " " << QT_ENDL; } for (int i=0; i" << endl; - stream << " " << values_[i].asImage() << "" << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " " << values_[i].asImage() << "" << QT_ENDL; + stream << " " << QT_ENDL; } - stream << " " << endl; + stream << " " << QT_ENDL; //write CV list - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; //write stylesheet stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "

Meta data:

" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
AccessionNameValue
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << "

Quality parameters:

" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
AccessionNameValue
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " data:image/png;base64," << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << "
" << endl; + stream << ">" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "

Meta data:

" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
AccessionNameValue
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

Quality parameters:

" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
AccessionNameValue
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " data:image/png;base64," << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; //finalize file - stream << "
" << endl; + stream << "" << QT_ENDL; file->close(); //validate output diff --git a/src/cppNGS/RtfDocument.cpp b/src/cppNGS/RtfDocument.cpp index 2ce9c605a..fc788caeb 100644 --- a/src/cppNGS/RtfDocument.cpp +++ b/src/cppNGS/RtfDocument.cpp @@ -188,7 +188,7 @@ void RtfDocument::save(const QByteArray &file_name) foreach(const RtfSourceCode& part, body_parts_) { - stream << part << endl; + stream << part << QT_ENDL; } stream << footer(); @@ -267,7 +267,7 @@ RtfTableRow& RtfTableRow::setBackgroundColor(int color) { for(RtfTableCell& cell : cells_) { - cell.setBackgroundColor(color); + cell.setBackgroundColor(color); } return *this; } @@ -442,5 +442,5 @@ void RtfTable::sortbyCols(const QList &indices) void RtfTable::swapRows(int i_row_a, int i_row_b) { - rows_.swap(i_row_a, i_row_b); + QLIST_SWAP_ITEMS_AT(rows_, i_row_a, i_row_b); } diff --git a/src/cppNGS/Statistics.cpp b/src/cppNGS/Statistics.cpp index 44a8b6614..ec62bb925 100644 --- a/src/cppNGS/Statistics.cpp +++ b/src/cppNGS/Statistics.cpp @@ -15,7 +15,7 @@ #include "Helper.h" #include "SampleSimilarity.h" #include -#include +#include #include #include "Histogram.h" #include "FilterCascade.h" @@ -1274,7 +1274,7 @@ QCCollection Statistics::region(const BedFile& bed_file, bool merge) double length_stdev = std::sqrt(sq_sum / lengths.size() - length_mean * length_mean); //chromosome list string - QList chr_list = chromosomes.toList(); + QList chr_list = chromosomes.values(); std::sort(chr_list.begin(), chr_list.end()); QString chr_list_str = ""; foreach(Chromosome chr, chr_list) @@ -1857,8 +1857,8 @@ QCCollection Statistics::somatic(GenomeBuild build, QString& tumor_bam, QString& plot1.setYLabel("normal allele frequency"); plot1.setXRange(-0.015,1.015); plot1.setYRange(-0.015,1.015); - QList< QPair > points_black; - QList< QPair > points_green; + QList< std::pair > points_black; + QList< std::pair > points_green; for(int i=0; i point; + std::pair point; point.first = af_tumor; point.second = af_normal; if (!variants[i].filtersPassed()) points_black.append(point); else points_green.append(point); } - QList< QPair > points; + QList< std::pair > points; points << points_black << points_green; QString g = "k"; @@ -2152,7 +2152,7 @@ QCCollection Statistics::somatic(GenomeBuild build, QString& tumor_bam, QString& plot3.addVLine(chrom_starts_norm[c]); } //(2) calculate distance for each chromosome and convert it to x-coordinates - QList< QPair > points3; + QList< std::pair > points3; QString tmp_chr = ""; int tmp_pos = 0; double tmp_offset = 0; @@ -2165,7 +2165,7 @@ QCCollection Statistics::somatic(GenomeBuild build, QString& tumor_bam, QString& if(tmp_chr == variants[i].chr().str()) //same chromosome { //convert distance to x-Axis position - QPair point; + std::pair point; point.first = tmp_offset + double(variants[i].start())/double(genome_size); point.second = variants[i].start() - tmp_pos; if(max < point.second) max = point.second; @@ -2395,13 +2395,13 @@ BedFile Statistics::lowOrHighCoverage(const BedFile& bed_file, const QString& ba if (!random_access && !bed_file.isSorted()) THROW(ArgumentException, "Input BED file has to be sorted for sweep algorithm!"); //create analysis chunks (200 lines) - QTime timer; + QElapsedTimer timer; timer.start(); QList bed_chunks; if (!random_access) { //determine chr chunks - QList> chunks_with_size; + QList> chunks_with_size; foreach(const Chromosome& chr, bed_file.chromosomes()) { //determine start index @@ -2432,12 +2432,12 @@ BedFile Statistics::lowOrHighCoverage(const BedFile& bed_file, const QString& ba { bases += bed_file[i].length(); } - chunks_with_size << qMakePair(bases, WorkerLowOrHighCoverage::Chunk{bed_file, start, end, "", BedFile()}); + chunks_with_size << std::make_pair(bases, WorkerLowOrHighCoverage::Chunk{bed_file, start, end, "", BedFile()}); } //sort chunks by size std::sort(chunks_with_size.begin(), chunks_with_size.end(), - [](const QPair& a, const QPair& b) + [](const std::pair& a, const std::pair& b) { return a.first > b.first; } @@ -2446,7 +2446,7 @@ BedFile Statistics::lowOrHighCoverage(const BedFile& bed_file, const QString& ba //add chunks ordered by size foreach(const auto& entry, chunks_with_size) { - bed_chunks << entry.second; + bed_chunks.append(entry.second); } } else @@ -2463,9 +2463,9 @@ BedFile Statistics::lowOrHighCoverage(const BedFile& bed_file, const QString& ba if (debug) { QTextStream out(stdout); - out << "Using '" << (random_access ? "random access" : "sweep") << "' algorithm!" << endl; - out << "Creating " << bed_chunks.count() << " chunks took " << Helper::elapsedTime(timer) << endl; - out << "Starting processing chunks with " << threads << " threads" << endl; + out << "Using '" << (random_access ? "random access" : "sweep") << "' algorithm!" << QT_ENDL; + out << "Creating " << bed_chunks.count() << " chunks took " << Helper::elapsedTime(timer) << QT_ENDL; + out << "Starting processing chunks with " << threads << " threads" << QT_ENDL; } //create thread pool @@ -2477,15 +2477,15 @@ BedFile Statistics::lowOrHighCoverage(const BedFile& bed_file, const QString& ba { if (!random_access) { - if (debug) QTextStream(stdout) << "Creating BED index" << endl; + if (debug) QTextStream(stdout) << "Creating BED index" << QT_ENDL; ChromosomalIndex bed_index(bed_file); - if (debug) QTextStream(stdout) << "Starting worker " << i << endl; + if (debug) QTextStream(stdout) << "Starting worker " << i << QT_ENDL; WorkerLowOrHighCoverageChr* worker = new WorkerLowOrHighCoverageChr(bed_chunks[i], bed_index, bam_file, cutoff, min_mapq, min_baseq, ref_file, is_high, debug); thread_pool.start(worker); //wait until finished - if (debug) QTextStream(stdout) << "Waiting for workers to finish..." << endl; + if (debug) QTextStream(stdout) << "Waiting for workers to finish..." << QT_ENDL; thread_pool.waitForDone(); } else @@ -2494,13 +2494,13 @@ BedFile Statistics::lowOrHighCoverage(const BedFile& bed_file, const QString& ba thread_pool.start(worker); //wait until finished - if (debug) QTextStream(stdout) << "Waiting for workers to finish..." << endl; + if (debug) QTextStream(stdout) << "Waiting for workers to finish..." << QT_ENDL; thread_pool.waitForDone(); } } //debug output - if (debug) QTextStream(stdout) << "Writing output" << endl; + if (debug) QTextStream(stdout) << "Writing output" << QT_ENDL; //check for errors and merge results BedFile output; @@ -2555,13 +2555,13 @@ void Statistics::avgCoverage(BedFile& bed_file, const QString& bam_file, int min if (!random_access && !bed_file.isSorted()) THROW(ArgumentException, "Input BED file has to be sorted for sweep algorithm!"); //create analysis chunks - QTime timer; + QElapsedTimer timer; timer.start(); QList chunks; if (!random_access) { //determine chr chunks - QList> chunks_with_size; + QList> chunks_with_size; foreach(const Chromosome& chr, bed_file.chromosomes()) { //determine start index @@ -2592,12 +2592,12 @@ void Statistics::avgCoverage(BedFile& bed_file, const QString& bam_file, int min { bases += bed_file[i].length(); } - chunks_with_size << qMakePair(bases, WorkerAverageCoverage::Chunk{bed_file, start, end, ""}); + chunks_with_size << std::make_pair(bases, WorkerAverageCoverage::Chunk{bed_file, start, end, ""}); } //sort chunks by size std::sort(chunks_with_size.begin(), chunks_with_size.end(), - [](const QPair& a, const QPair& b) + [](const std::pair& a, const std::pair& b) { return a.first > b.first; } @@ -2606,7 +2606,7 @@ void Statistics::avgCoverage(BedFile& bed_file, const QString& bam_file, int min //add chunks ordered by size foreach(const auto& entry, chunks_with_size) { - chunks << entry.second; + chunks.append(entry.second); } } else @@ -2624,8 +2624,8 @@ void Statistics::avgCoverage(BedFile& bed_file, const QString& bam_file, int min if (debug) { QTextStream out(stdout); - out << "Using '" << (random_access ? "random access" : "sweep") << "' algorithm!" << endl; - out << "Creating " << chunks.count() << " chunks took " << Helper::elapsedTime(timer) << endl; + out << "Using '" << (random_access ? "random access" : "sweep") << "' algorithm!" << QT_ENDL; + out << "Creating " << chunks.count() << " chunks took " << Helper::elapsedTime(timer) << QT_ENDL; } //create thread pool diff --git a/src/cppNGS/StatisticsReads.cpp b/src/cppNGS/StatisticsReads.cpp index 4f2f6b6c8..f9c64520f 100644 --- a/src/cppNGS/StatisticsReads.cpp +++ b/src/cppNGS/StatisticsReads.cpp @@ -353,7 +353,7 @@ QCCollection StatisticsReads::getResult() bins << ""; } } - plot3.setValues(read_length_hist.yCoords().toList(), bins); + plot3.setValues(read_length_hist.yCoords().toList(), bins); QString plotname3 = Helper::tempFileName(".png"); plot3.store(plotname3); output.insert(QCValue::ImageFromFile("Read length histogram", plotname3, "Histogram of read lengths", "QC:2000132")); diff --git a/src/cppNGS/Transcript.cpp b/src/cppNGS/Transcript.cpp index 9ce7f92c0..1b2ef0bf4 100644 --- a/src/cppNGS/Transcript.cpp +++ b/src/cppNGS/Transcript.cpp @@ -477,8 +477,8 @@ Variant Transcript::hgvsToVariant(QString hgvs_c, const FastaFileIndex& genome_i end = start; //set sequence - ref.append(hgvs_c[length-3].toUpper()); - obs.append(hgvs_c[length-1].toUpper()); + ref.append(hgvs_c[length-3].toUpper().toLatin1()); + obs.append(hgvs_c[length-1].toUpper().toLatin1()); //convert reference to correct strand if(strand_==Transcript::MINUS) @@ -630,7 +630,7 @@ Variant Transcript::hgvsToVariant(QString hgvs_c, const FastaFileIndex& genome_i //sequence ref.append('-'); - obs.append(hgvs_c.mid(ins_pos+3)); + obs.append(hgvs_c.mid(ins_pos+3).toLocal8Bit()); //convert reference to correct strand if(strand_==Transcript::MINUS) diff --git a/src/cppNGS/VcfFile.cpp b/src/cppNGS/VcfFile.cpp index ffaaef46b..1018efbd8 100644 --- a/src/cppNGS/VcfFile.cpp +++ b/src/cppNGS/VcfFile.cpp @@ -160,7 +160,7 @@ void VcfFile::parseVcfEntry(int line_number, const QByteArray& line, QSet cov; cov.fill(0, max_pos+1); //iterate through all alignments - if (debug_) QTextStream(stdout) << "Processing chromosome " << chr.str() << " - max position=" << max_pos << " start index=" << chunk_.start << " end index=" << chunk_.end << endl; + if (debug_) QTextStream(stdout) << "Processing chromosome " << chr.str() << " - max position=" << max_pos << " start index=" << chunk_.start << " end index=" << chunk_.end << QT_ENDL; BamAlignment al; QBitArray base_qualities; reader.setRegion(chr, 0, max_pos); @@ -200,7 +200,7 @@ void WorkerLowOrHighCoverageChr::run() } //debug output - if (debug_) QTextStream(stdout) << "Creating output for chromosome " << chr.str() << endl; + if (debug_) QTextStream(stdout) << "Creating output for chromosome " << chr.str() << QT_ENDL; //create low-coverage regions for processed chunk for (int i=chunk_.start; i<=chunk_.end; ++i) @@ -231,7 +231,7 @@ void WorkerLowOrHighCoverageChr::run() } //debug output - if (debug_) QTextStream(stdout) << "Processing chromosome " << chr.str() << " took " << Helper::elapsedTime(timer) << endl; + if (debug_) QTextStream(stdout) << "Processing chromosome " << chr.str() << " took " << Helper::elapsedTime(timer) << QT_ENDL; } catch(Exception& e) { diff --git a/src/cppNGS/WorkerLowOrHighCoverage.h b/src/cppNGS/WorkerLowOrHighCoverage.h index b8d3e6d86..0576dd0f0 100644 --- a/src/cppNGS/WorkerLowOrHighCoverage.h +++ b/src/cppNGS/WorkerLowOrHighCoverage.h @@ -10,14 +10,16 @@ class WorkerLowOrHighCoverage : public QRunnable { public: struct Chunk - { - const BedFile& data; + { + const BedFile& data; int start; int end; QString error; //In case of error BedFile output; - void operator=(const Chunk& bed_chunk) + Chunk(const Chunk& bed_chunk) = default; + + void operator=(const Chunk& bed_chunk) { if (&data != &bed_chunk.data) { diff --git a/src/cppNGSD-TEST/NGSD_Test.h b/src/cppNGSD-TEST/NGSD_Test.h index b129614f0..c9359a792 100644 --- a/src/cppNGSD-TEST/NGSD_Test.h +++ b/src/cppNGSD-TEST/NGSD_Test.h @@ -3382,10 +3382,10 @@ private slots: else { ++c_fail; - out << v.toString(true) << " (" << cons.normalized << ") transcript=" << trans.name() << " " << cons.toString() << endl; + out << v.toString(true) << " (" << cons.normalized << ") transcript=" << trans.name() << " " << cons.toString() << QT_ENDL; foreach(QByteArray difference, differences) { - out << " " << difference << endl; + out << " " << difference << QT_ENDL; } } } diff --git a/src/cppNGSD/GenLabDB.cpp b/src/cppNGSD/GenLabDB.cpp index d62e3a8da..4e69356c9 100644 --- a/src/cppNGSD/GenLabDB.cpp +++ b/src/cppNGSD/GenLabDB.cpp @@ -374,7 +374,7 @@ QStringList GenLabDB::samplesWithSapID(QString sap_id, ProcessedSampleSearchPara } } - return output.toList(); + return output.values(); } QList GenLabDB::relatives(QString ps_name) @@ -528,7 +528,7 @@ QList GenLabDB::studySamples(QString study, QStringList& errors) } else { - output.unite(ps_ids.toSet()); + output.unite(LIST_TO_SET(ps_ids)); } } @@ -547,7 +547,7 @@ QList GenLabDB::studySamples(QString study, QStringList& errors) } } - return output.toList(); + return output.values(); } QStringList GenLabDB::patientSamples(QString ps_name) diff --git a/src/cppNGSD/GermlineReportGenerator.cpp b/src/cppNGSD/GermlineReportGenerator.cpp index 43347d302..7efddb2b8 100644 --- a/src/cppNGSD/GermlineReportGenerator.cpp +++ b/src/cppNGSD/GermlineReportGenerator.cpp @@ -67,44 +67,44 @@ void GermlineReportGenerator::writeHTML(QString filename) ProcessingSystemData system_data = db_.getProcessingSystemData(db_.processingSystemIdFromProcessedSample(data_.ps)); //report header (meta information) - stream << "

" << trans("Technischer Report zur bioinformatischen Analyse") << "

" << endl; + stream << "

" << trans("Technischer Report zur bioinformatischen Analyse") << "

" << QT_ENDL; - stream << endl; - stream << "

" << trans("Probe") << ": " << data_.ps << " (" << sample_data.name_external << ")" << endl; + stream << QT_ENDL; + stream << "

" << trans("Probe") << ": " << data_.ps << " (" << sample_data.name_external << ")" << QT_ENDL; if (is_trio) { - stream << "
" << endl; - stream << "
" << trans("Vater") << ": " << info_additional[0].name << endl; - stream << "
" << trans("Mutter") << ": " << info_additional[1].name << endl; + stream << "
" << QT_ENDL; + stream << "
" << trans("Vater") << ": " << info_additional[0].name << QT_ENDL; + stream << "
" << trans("Mutter") << ": " << info_additional[1].name << QT_ENDL; } if (is_multi_with_extra_genotypes) { - stream << "
" << endl; + stream << "
" << QT_ENDL; foreach(const SampleInfo& info, info_additional) { - stream << "
" << trans("Zusatzprobe") << ": " << info.name << endl; + stream << "
" << trans("Zusatzprobe") << ": " << info.name << QT_ENDL; } } - stream << "
" << endl; - stream << "
" << trans("Geschlecht") << ": " << trans(processed_sample_data.gender) << endl; - stream << "
" << trans("Prozessierungssystem") << ": " << processed_sample_data.processing_system << endl; - stream << "
" << trans("Prozessierungssystem-Typ") << ": " << processed_sample_data.processing_system_type << endl; + stream << "
" << QT_ENDL; + stream << "
" << trans("Geschlecht") << ": " << trans(processed_sample_data.gender) << QT_ENDL; + stream << "
" << trans("Prozessierungssystem") << ": " << processed_sample_data.processing_system << QT_ENDL; + stream << "
" << trans("Prozessierungssystem-Typ") << ": " << processed_sample_data.processing_system_type << QT_ENDL; QString run_id = db_.getValue("SELECT id FROM sequencing_run WHERE name=:0", false, processed_sample_data.run_name).toString(); - stream << "
" << trans("Sequenziersystem") << ": " << db_.getValue("SELECT d.type FROM device d, sequencing_run r WHERE r.device_id=d.id AND r.id=:0", false, run_id).toString() << endl; - stream << "
" << trans("Readlänge") << ": " << db_.getValue("SELECT recipe FROM sequencing_run WHERE id=:0", false, run_id).toString() << endl; - stream << "
" << trans("Referenzgenom") << ": " << system_data.genome << endl; - stream << "
" << trans("Datum") << ": " << date_.toString("dd.MM.yyyy") << endl; - stream << "
" << trans("Analysepipeline") << ": " << data_.variants.getPipeline() << endl; - stream << "
" << trans("Auswertungssoftware") << ": " << QCoreApplication::applicationName() << " " << QCoreApplication::applicationVersion() << endl; - stream << "

" << endl; + stream << "
" << trans("Sequenziersystem") << ": " << db_.getValue("SELECT d.type FROM device d, sequencing_run r WHERE r.device_id=d.id AND r.id=:0", false, run_id).toString() << QT_ENDL; + stream << "
" << trans("Readlänge") << ": " << db_.getValue("SELECT recipe FROM sequencing_run WHERE id=:0", false, run_id).toString() << QT_ENDL; + stream << "
" << trans("Referenzgenom") << ": " << system_data.genome << QT_ENDL; + stream << "
" << trans("Datum") << ": " << date_.toString("dd.MM.yyyy") << QT_ENDL; + stream << "
" << trans("Analysepipeline") << ": " << data_.variants.getPipeline() << QT_ENDL; + stream << "
" << trans("Auswertungssoftware") << ": " << QCoreApplication::applicationName() << " " << QCoreApplication::applicationVersion() << QT_ENDL; + stream << "

" << QT_ENDL; ///Phenotype information - stream << endl; - stream << "

" << trans("Phänotyp") << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("Phänotyp") << "" << QT_ENDL; QList info = db_.getSampleDiseaseInfo(sample_id, "ICD10 code"); foreach(const SampleDiseaseInfo& entry, info) { - stream << "
ICD10: " << entry.disease_info << endl; + stream << "
ICD10: " << entry.disease_info << QT_ENDL; } info = db_.getSampleDiseaseInfo(sample_id, "HPO term id"); foreach(const SampleDiseaseInfo& entry, info) @@ -112,41 +112,41 @@ void GermlineReportGenerator::writeHTML(QString filename) int hpo_id = db_.phenotypeIdByAccession(entry.disease_info.toUtf8(), false); if (hpo_id!=-1) { - stream << "
HPO: " << entry.disease_info << " (" << db_.phenotype(hpo_id).name() << ")" << endl; + stream << "
HPO: " << entry.disease_info << " (" << db_.phenotype(hpo_id).name() << ")" << QT_ENDL; } } info = db_.getSampleDiseaseInfo(sample_id, "OMIM disease/phenotype identifier"); foreach(const SampleDiseaseInfo& entry, info) { - stream << "
OMIM: " << entry.disease_info << endl; + stream << "
OMIM: " << entry.disease_info << QT_ENDL; } info = db_.getSampleDiseaseInfo(sample_id, "Orpha number"); foreach(const SampleDiseaseInfo& entry, info) { - stream << "
Orphanet: " << entry.disease_info << endl; + stream << "
Orphanet: " << entry.disease_info << QT_ENDL; } - stream << "

" << endl; + stream << "

" << QT_ENDL; ///Target region statistics if (data_.roi.isValid()) { - stream << endl; - stream << "

" << trans("Zielregion") << "" << endl; - stream << "
" << trans("Die Zielregion umfasst mindestens die CCDS (\"consensus coding sequence\") unten genannter Gene ±20 Basen flankierender intronischer Sequenz, kann aber auch zusätzliche Exons und/oder flankierende Basen beinhalten.") << endl; - stream << "
" << trans("Name") << ": " << data_.roi.name << endl; + stream << QT_ENDL; + stream << "

" << trans("Zielregion") << "" << QT_ENDL; + stream << "
" << trans("Die Zielregion umfasst mindestens die CCDS (\"consensus coding sequence\") unten genannter Gene ±20 Basen flankierender intronischer Sequenz, kann aber auch zusätzliche Exons und/oder flankierende Basen beinhalten.") << QT_ENDL; + stream << "
" << trans("Name") << ": " << data_.roi.name << QT_ENDL; if (!data_.roi.genes.isEmpty()) { stream << "
" << trans("Ausgewertete Gene") << ": "; if (data_.report_settings.show_coverage_details && Settings::string("location", true)!="MHH") { - stream << QString::number(data_.roi.genes.count()) << " (" << trans("siehe Abdeckungsstatistik") << ")" << endl; + stream << QString::number(data_.roi.genes.count()) << " (" << trans("siehe Abdeckungsstatistik") << ")" << QT_ENDL; } else { - stream << data_.roi.genes.join(", ") << endl; + stream << data_.roi.genes.join(", ") << QT_ENDL; } } - stream << "

" << endl; + stream << "

" << QT_ENDL; } //get column indices @@ -157,11 +157,11 @@ void GermlineReportGenerator::writeHTML(QString filename) int i_gnomad = data_.variants.annotationIndexByName("gnomAD", true, true); //output: applied filters - stream << endl; - stream << "

" << trans("Filterkriterien") << " " << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("Filterkriterien") << " " << "" << QT_ENDL; for(int i=0; i    - " << data_.filters[i]->toText() << endl; + stream << "
    - " << data_.filters[i]->toText() << QT_ENDL; } stream << "
"; @@ -174,7 +174,7 @@ void GermlineReportGenerator::writeHTML(QString filename) var_count = filter_result.countPassing(); } - stream << "
" << trans("Gefundene SNVs/InDels in Zielregion gesamt") << ": " << var_count << endl; + stream << "
" << trans("Gefundene SNVs/InDels in Zielregion gesamt") << ": " << var_count << QT_ENDL; selected_small_.clear(); selected_cnvs_.clear(); selected_svs_.clear(); @@ -186,19 +186,19 @@ void GermlineReportGenerator::writeHTML(QString filename) if (it->first==VariantType::SVS) selected_svs_ << it->second; if (it->first==VariantType::RES) selected_res_ << it->second; } - stream << "
" << trans("Anzahl SNVs/InDels ausgewählt für Report") << ": " << selected_small_.count() << endl; - stream << "
" << trans("Anzahl CNVs/SVs/REs ausgewählt für Report") << ": " << (selected_cnvs_.count() + selected_svs_.count() + selected_res_.count()) << endl; - stream << "

" << endl; + stream << "
" << trans("Anzahl SNVs/InDels ausgewählt für Report") << ": " << selected_small_.count() << QT_ENDL; + stream << "
" << trans("Anzahl CNVs/SVs/REs ausgewählt für Report") << ": " << (selected_cnvs_.count() + selected_svs_.count() + selected_res_.count()) << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "
" << trans("Sofern vorhanden, werden in den nachfolgenden Tabellen erfasst: pathogene Varianten (Klasse 5)* und wahrscheinlich pathogene Varianten (Klasse 4)*, bei denen jeweils ein Zusammenhang mit der klinischen Fragestellung anzunehmen ist, sowie Varianten unklarer klinischer Signifikanz (Klasse 3)* für welche in Zusammenschau von Literatur und Klinik des Patienten ein Beitrag zur Symptomatik denkbar ist und für die gegebenenfalls eine weitere Einordnung der klinischen Relevanz durch Folgeuntersuchungen sinnvoll erscheint.") << endl; - stream << trans("Teilweise können - in Abhängigkeit von der Art der genetischen Veränderung, der Familienanamnese und der Klinik der Patientin/des Patienten - weiterführende Untersuchungen eine Änderung der Klassifizierung bewirken.") << endl; - stream << "
" << trans("Eine (unkommentierte) Liste aller detektierten Varianten kann bei Bedarf angefordert werden.") << endl; - stream << "
" << trans("Bei konkreten differentialdiagnostischen Hinweisen auf eine konkrete Erkrankung können ggf. weiterführende genetische Untersuchungen bzw. Untersuchungsmethoden indiziert sein.") << endl; - stream << "
" << trans("* Für Informationen zur Klassifizierung von Varianten, siehe allgemeine Zusatzinformationen.") << endl; + stream << "
" << trans("Sofern vorhanden, werden in den nachfolgenden Tabellen erfasst: pathogene Varianten (Klasse 5)* und wahrscheinlich pathogene Varianten (Klasse 4)*, bei denen jeweils ein Zusammenhang mit der klinischen Fragestellung anzunehmen ist, sowie Varianten unklarer klinischer Signifikanz (Klasse 3)* für welche in Zusammenschau von Literatur und Klinik des Patienten ein Beitrag zur Symptomatik denkbar ist und für die gegebenenfalls eine weitere Einordnung der klinischen Relevanz durch Folgeuntersuchungen sinnvoll erscheint.") << QT_ENDL; + stream << trans("Teilweise können - in Abhängigkeit von der Art der genetischen Veränderung, der Familienanamnese und der Klinik der Patientin/des Patienten - weiterführende Untersuchungen eine Änderung der Klassifizierung bewirken.") << QT_ENDL; + stream << "
" << trans("Eine (unkommentierte) Liste aller detektierten Varianten kann bei Bedarf angefordert werden.") << QT_ENDL; + stream << "
" << trans("Bei konkreten differentialdiagnostischen Hinweisen auf eine konkrete Erkrankung können ggf. weiterführende genetische Untersuchungen bzw. Untersuchungsmethoden indiziert sein.") << QT_ENDL; + stream << "
" << trans("* Für Informationen zur Klassifizierung von Varianten, siehe allgemeine Zusatzinformationen.") << QT_ENDL; //output: select small variants - stream << "

" << trans("Einzelbasenveränderungen (SNVs) und Insertionen/Deletionen (InDels) nach klinischer Interpretation im Kontext der Fragestellung") << "" << endl; - stream << "" << endl; + stream << "

" << trans("Einzelbasenveränderungen (SNVs) und Insertionen/Deletionen (InDels) nach klinischer Interpretation im Kontext der Fragestellung") << "" << QT_ENDL; + stream << "
" << QT_ENDL; stream << ""; int colspan = 8; if (is_trio) @@ -215,7 +215,7 @@ void GermlineReportGenerator::writeHTML(QString filename) } colspan += info_additional.count(); } - stream << "" << endl; + stream << "" << QT_ENDL; foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { if (var_conf.variant_type!=VariantType::SNVS_INDELS) continue; @@ -224,14 +224,14 @@ void GermlineReportGenerator::writeHTML(QString filename) Variant variant = data_.variants[var_conf.variant_index]; if (var_conf.isManuallyCurated()) var_conf.updateVariant(variant, genome_idx_, i_genotype); - stream << "" << endl; - stream << "" << QT_ENDL; + stream << ""; QString geno = formatGenotype(data_.build, processed_sample_data.gender.toUtf8(), variant.annotations().at(i_genotype), variant); if (var_conf.de_novo) geno += " (de-novo)"; if (var_conf.mosaic) geno += " (mosaic)"; if (var_conf.comp_het) geno += " (comp-het)"; - stream << "" << endl; + stream << "" << QT_ENDL; if (is_trio) { stream << ""; @@ -257,12 +257,12 @@ void GermlineReportGenerator::writeHTML(QString filename) { inheritance = " (" + gene_info.inheritance + ")"; } - stream << sep << gene << inheritance << endl; + stream << sep << gene << inheritance << QT_ENDL; } - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QByteArray gnomad_percentage = "n/a"; QByteArray freq = variant.annotations().at(i_gnomad).trimmed(); if (!freq.isEmpty()) @@ -276,9 +276,9 @@ void GermlineReportGenerator::writeHTML(QString filename) Log::warn("Could not convert gnomAD AF to number: " + e.message()); } } - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; //OMIM line QString omim = variant.annotations()[i_omim].trimmed(); @@ -290,17 +290,17 @@ void GermlineReportGenerator::writeHTML(QString filename) if (omim_part.count()<10) continue; omim = "OMIM ID: " + omim_part.left(6) + " Details: " + omim_part.mid(8); } - stream << "" << endl; + stream << "" << QT_ENDL; } } if (selected_small_.count()==0) stream << ""; - stream << "
" << trans("Variante") << "" << trans("Genotyp") << "" << trans("Gen(e)") << "" << trans("Details") << "" << trans("Klasse") << "" << trans("Erbgang") << "" << trans("gnomAD Allelfrequenz") << "
(" << trans("Kontrollkohorte") << ")
RNA
" << trans("Gen(e)") << "" << trans("Details") << "" << trans("Klasse") << "" << trans("Erbgang") << "" << trans("gnomAD Allelfrequenz") << "
(" << trans("Kontrollkohorte") << ")
RNA
" << endl; + stream << "
" << QT_ENDL; stream << variant.chr().strNormalized(true) << ":" << variant.start() << " " << variant.ref() << " > " << variant.obs() << "" << geno << "" << geno << "" << formatGenotype(data_.build, "male", variant.annotations().at(info_additional[0].column_index), variant) << "" << formatCodingSplicing(variant) << "" << variant.annotations().at(i_class) << "" << var_conf.inheritance << "" << formatCodingSplicing(variant) << "" << variant.annotations().at(i_class) << "" << var_conf.inheritance << "" << gnomad_percentage << "" << trans(var_conf.rna_info) << "
" << gnomad_percentage << "" << trans(var_conf.rna_info) << "
" << omim << "
" << omim << "
" << trans("Keine") << "
" << endl; + stream << "" << QT_ENDL; //-------------------------------------------------------------------------------------- //CNVs + SVs + REs - stream << "
" << trans("Kopienzahlveränderungen (CNV) und/oder Strukturveränderungen (SV) nach klinischer Interpretation im Kontext der Fragestellung") << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Kopienzahlveränderungen (CNV) und/oder Strukturveränderungen (SV) nach klinischer Interpretation im Kontext der Fragestellung") << "" << QT_ENDL; + stream << "
" << trans("CNV/SV/RE") << "" << trans("Position") << "" << trans("Größe") << "" << trans("Kopienzahl/Genotyp") << "" << trans("Gen(e)") << "" << trans("Klasse") << "" << trans("Erbgang") << "RNA
" << QT_ENDL; + stream << "" << QT_ENDL; colspan = 8; foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { @@ -312,20 +312,20 @@ void GermlineReportGenerator::writeHTML(QString filename) int cn = cnv.copyNumber(data_.cnvs.annotationHeaders()); - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QString cn_str = QString::number(cn); if (var_conf.de_novo) cn_str += " (de-novo)"; if (var_conf.mosaic) cn_str += " (mosaic)"; if (var_conf.comp_het) cn_str += " (comp-het)"; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { @@ -335,26 +335,26 @@ void GermlineReportGenerator::writeHTML(QString filename) BedpeLine sv = data_.svs[var_conf.variant_index]; if (var_conf.isManuallyCurated()) var_conf.updateSv(sv, data_.svs.annotationHeaders(), db_); - stream << "" << endl; + stream << "" << QT_ENDL; //type stream << "" << endl; + stream << trans("Deletion") << "" << QT_ENDL; break; case StructuralVariantType::DUP: - stream << trans("Duplikation") << "" << endl; + stream << trans("Duplikation") << "" << QT_ENDL; break; case StructuralVariantType::INS: - stream << trans("Insertion") << "" << endl; + stream << trans("Insertion") << "" << QT_ENDL; break; case StructuralVariantType::INV: - stream << trans("Inversion") << "" << endl; + stream << trans("Inversion") << "" << QT_ENDL; break; case StructuralVariantType::BND: - stream << trans("Translokation") << "" << endl; + stream << trans("Translokation") << "" << QT_ENDL; break; default: THROW(ArgumentException, "Invalid SV type!") @@ -365,7 +365,7 @@ void GermlineReportGenerator::writeHTML(QString filename) BedFile affected_region = sv.affectedRegion(false); stream << "" << endl; + stream << "" << QT_ENDL; //size int size = sv.size(); @@ -383,20 +383,20 @@ void GermlineReportGenerator::writeHTML(QString filename) if (var_conf.de_novo) stream << " (de-novo)"; if (var_conf.mosaic) stream << " (mosaic)"; if (var_conf.comp_het) stream << " (comp-het)"; - stream << "" << endl; + stream << "" << QT_ENDL; //genes - stream << "" << endl; + stream << "" << QT_ENDL; //classification - stream << "" << endl; + stream << "" << QT_ENDL; //inheritance - stream << "" << endl; + stream << "" << QT_ENDL; //RNA info - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { @@ -406,43 +406,43 @@ void GermlineReportGenerator::writeHTML(QString filename) RepeatLocus re = data_.res[var_conf.variant_index]; if (var_conf.isManuallyCurated()) var_conf.updateRe(re); - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QString geno = trans("expandiert"); if (var_conf.de_novo) geno += " (de-novo)"; if (var_conf.mosaic) geno += " (mosaic)"; if (var_conf.comp_het) geno += " (comp-het)"; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } if (selected_cnvs_.count()==0 && selected_svs_.count()==0 && selected_res_.count()==0) stream << ""; - stream << "
" << trans("CNV/SV/RE") << "" << trans("Position") << "" << trans("Größe") << "" << trans("Kopienzahl/Genotyp") << "" << trans("Gen(e)") << "" << trans("Klasse") << "" << trans("Erbgang") << "RNA
" << (cn<2 ? trans("Deletion") : trans("Duplikation")) << "" << cnv.toString() << "" << QString::number(cnv.size()/1000.0, 'f', 3) << " " << trans("kb") << " / " << std::max(1, cnv.regions()) << " " << trans("Regionen") << "
" << (cn<2 ? trans("Deletion") : trans("Duplikation")) << "" << cnv.toString() << "" << QString::number(cnv.size()/1000.0, 'f', 3) << " " << trans("kb") << " / " << std::max(1, cnv.regions()) << " " << trans("Regionen") << "" << cn_str << "" << cnv.genes().join(", ") << "" << var_conf.classification << "" << var_conf.inheritance << "" << trans(var_conf.rna_info) << "
" << cn_str << "" << cnv.genes().join(", ") << "" << var_conf.classification << "" << var_conf.inheritance << "" << trans(var_conf.rna_info) << "
"; switch (sv.type()) // determine type String { case StructuralVariantType::DEL: - stream << trans("Deletion") << "" << affected_region[0].toString(true); if (sv.type() == StructuralVariantType::BND) stream << " <-> " << affected_region[1].toString(true); - stream << "" << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << var_conf.classification << "" << var_conf.classification << "" << var_conf.inheritance << "" << var_conf.inheritance << "" << trans(var_conf.rna_info) << "
" << trans(var_conf.rna_info) << "
" << trans("Repeat-Expansion") << "" << re.region().toString(true) << "
" << trans("Repeat-Expansion") << "" << re.region().toString(true) << "" << geno << "" << re.name() << "" << var_conf.inheritance << "
" << geno << "" << re.name() << "" << var_conf.inheritance << "
" << trans("Keine") << "
" << endl; + stream << "" << QT_ENDL; //----------------------------------------------------------------------------------- //other causal variant if (data_.report_settings.select_other_causal_variant) { - stream << "

 

" << endl; + stream << "

 

" << QT_ENDL; OtherCausalVariant causal_variant = data_.report_settings.report_config->otherCausalVariant(); - stream << "" << endl; + stream << "
" << QT_ENDL; stream << "" << endl; + << "" << QT_ENDL; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "
" << trans("Variantentyp") << "" << trans("Regionen") << "" << trans("Gen(e)") << "" << trans("Erbgang") - << "" << trans("Kommentar") << "
" << trans("Kommentar") << "
" << trans(convertOtherVariantType(causal_variant.type)) << "" << causal_variant.coordinates << "" << causal_variant.gene << "" << causal_variant.inheritance << "" << causal_variant.comment << "
" << endl; + stream << "" << QT_ENDL; + stream << "" << trans(convertOtherVariantType(causal_variant.type)) << "" << QT_ENDL; + stream << "" << causal_variant.coordinates << "" << QT_ENDL; + stream << "" << causal_variant.gene << "" << QT_ENDL; + stream << "" << causal_variant.inheritance << "" << QT_ENDL; + stream << "" << causal_variant.comment << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } //-------------------------------------------------------------------------------------- @@ -450,17 +450,17 @@ void GermlineReportGenerator::writeHTML(QString filename) //polymorphisms if (data_.report_settings.polymorphisms.count()>0) { - stream << "
" << trans("Indikationsbezogene Polymorphismen") << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Indikationsbezogene Polymorphismen") << "" << QT_ENDL; + stream << "
" << trans("dbSNP") << "" << trans("Gen") << "" << trans("Überprüfte Variante") << "" << trans("Nachgewiesener Genotyp") << "" << trans("Details") << "
" << QT_ENDL; + stream << "" << QT_ENDL; foreach(const ReportPolymorphism& poly, data_.report_settings.polymorphisms) { const Variant& var = poly.v; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QStringList details; QString genotype = ""; if (var.isSNV()) @@ -496,26 +496,26 @@ void GermlineReportGenerator::writeHTML(QString filename) { THROW(ArgumentException, "InDels are not supported as report polymorphisms!"); } - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } - stream << "
" << trans("dbSNP") << "" << trans("Gen") << "" << trans("Überprüfte Variante") << "" << trans("Nachgewiesener Genotyp") << "" << trans("Details") << "
" << poly.rs_number << endl; - stream << "" << poly.gene_symbol << "" << var.toString() << "
" << poly.rs_number << QT_ENDL; + stream << "" << poly.gene_symbol << "" << var.toString() << "" << genotype << "" << details.join(", ") << "
" << genotype << "" << details.join(", ") << "
" << endl; + stream << "" << QT_ENDL; } //-------------------------------------------------------------------------------------- ///classification explaination if (data_.report_settings.show_class_details) { - stream << endl; - stream << "

" << trans("Klassifikation von Varianten") << ":" << endl; - stream << "
" << trans("Die Klassifikation der Varianten erfolgt in Anlehnung an die Publikation von Plon et al. (Hum Mutat 2008)") << endl; - stream << "
" << trans("Klasse 5: Eindeutig pathogene Veränderung / Mutation") << ": " << trans("Veränderung, die bereits in der Fachliteratur mit ausreichender Evidenz als krankheitsverursachend bezogen auf das vorliegende Krankheitsbild beschrieben wurde sowie als pathogen zu wertende Mutationstypen (i.d.R. Frameshift- bzw. Stoppmutationen).") << endl; - stream << "
" << trans("Klasse 4: Wahrscheinlich pathogene Veränderung") << ": " << trans("DNA-Veränderung, die aufgrund ihrer Eigenschaften als sehr wahrscheinlich krankheitsverursachend zu werten ist.") << endl; - stream << "
" << trans("Klasse 3: Variante unklarer Signifikanz (VUS) - Unklare Pathogenität") << ": " << trans("Variante, bei der es unklar ist, ob eine krankheitsverursachende Wirkung besteht. Diese Varianten werden tabellarisch im technischen Report mitgeteilt.") << endl; - stream << "
" << trans("Klasse 2: Sehr wahrscheinlich benigne Veränderungen") << ": " << trans("Aufgrund der Häufigkeit in der Allgemeinbevölkerung oder der Lokalisation bzw. aufgrund von Angaben in der Literatur sehr wahrscheinlich benigne. Werden nicht mitgeteilt, können aber erfragt werden.") << endl; - stream << "
" << trans("Klasse 1: Benigne Veränderungen") << ": " << trans("Werden nicht mitgeteilt, können aber erfragt werden.") << endl; - stream << "

" << endl; + stream << QT_ENDL; + stream << "

" << trans("Klassifikation von Varianten") << ":" << QT_ENDL; + stream << "
" << trans("Die Klassifikation der Varianten erfolgt in Anlehnung an die Publikation von Plon et al. (Hum Mutat 2008)") << QT_ENDL; + stream << "
" << trans("Klasse 5: Eindeutig pathogene Veränderung / Mutation") << ": " << trans("Veränderung, die bereits in der Fachliteratur mit ausreichender Evidenz als krankheitsverursachend bezogen auf das vorliegende Krankheitsbild beschrieben wurde sowie als pathogen zu wertende Mutationstypen (i.d.R. Frameshift- bzw. Stoppmutationen).") << QT_ENDL; + stream << "
" << trans("Klasse 4: Wahrscheinlich pathogene Veränderung") << ": " << trans("DNA-Veränderung, die aufgrund ihrer Eigenschaften als sehr wahrscheinlich krankheitsverursachend zu werten ist.") << QT_ENDL; + stream << "
" << trans("Klasse 3: Variante unklarer Signifikanz (VUS) - Unklare Pathogenität") << ": " << trans("Variante, bei der es unklar ist, ob eine krankheitsverursachende Wirkung besteht. Diese Varianten werden tabellarisch im technischen Report mitgeteilt.") << QT_ENDL; + stream << "
" << trans("Klasse 2: Sehr wahrscheinlich benigne Veränderungen") << ": " << trans("Aufgrund der Häufigkeit in der Allgemeinbevölkerung oder der Lokalisation bzw. aufgrund von Angaben in der Literatur sehr wahrscheinlich benigne. Werden nicht mitgeteilt, können aber erfragt werden.") << QT_ENDL; + stream << "
" << trans("Klasse 1: Benigne Veränderungen") << ": " << trans("Werden nicht mitgeteilt, können aber erfragt werden.") << QT_ENDL; + stream << "

" << QT_ENDL; } ///low-coverage analysis @@ -544,23 +544,23 @@ void GermlineReportGenerator::writeHTML(QString filename) } //print general information about ROI - stream << endl; - stream << "

" << trans("Abdeckungsstatistik Zielregion") << "" << endl; - stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << QString::number(target_region_read_depth, 'f', 2) << endl; + stream << QT_ENDL; + stream << "

" << trans("Abdeckungsstatistik Zielregion") << "" << QT_ENDL; + stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << QString::number(target_region_read_depth, 'f', 2) << QT_ENDL; BedFile mito_bed; mito_bed.append(BedLine("chrMT", 1, 16569)); data_.statistics_service.avgCoverage(mito_bed, data_.ps_bam, data_.threads); - stream << "
" << trans("Durchschnittliche Sequenziertiefe (chrMT)") << ": " << mito_bed[0].annotations()[0] << endl; - stream << "

" << endl; + stream << "
" << trans("Durchschnittliche Sequenziertiefe (chrMT)") << ": " << mito_bed[0].annotations()[0] << QT_ENDL; + stream << "

" << QT_ENDL; //gap report based on the entire target region if (data_.report_settings.cov_based_on_complete_roi) { - stream << "

" << trans("Lückenreport Zielregion") << "" << endl; + stream << "

" << trans("Lückenreport Zielregion") << "" << QT_ENDL; GapDetails details = writeCoverageDetails(stream, data_.roi); gap_percentage_ = details.gap_percentage; gaps_by_gene_ = details.gaps_per_gene; - stream << "

" << endl; + stream << "

" << QT_ENDL; } //gap report based on exons @@ -569,10 +569,10 @@ void GermlineReportGenerator::writeHTML(QString filename) { stream << " ± " << data_.report_settings.cov_exon_padding << " " << trans("Basen"); } - stream << "" << endl; + stream << "" << QT_ENDL; if (data_.roi.genes.isEmpty()) { - stream << "
" << trans("Konnte nicht erstellt werden, weil keine Gene der Zielregion definiert wurden.") << endl; + stream << "
" << trans("Konnte nicht erstellt werden, weil keine Gene der Zielregion definiert wurden.") << QT_ENDL; } else { @@ -614,11 +614,11 @@ void GermlineReportGenerator::writeHTML(QString filename) //output if (!genes_without_roi.isEmpty()) { - stream << "
" << trans("Gene für die keine genomische Region bestimmt werden konnte") << ": " << genes_without_roi.join(", ") << endl; + stream << "
" << trans("Gene für die keine genomische Region bestimmt werden konnte") << ": " << genes_without_roi.join(", ") << QT_ENDL; } writeCoverageDetails(stream, exon_roi); } - stream << "

" << endl; + stream << "

" << QT_ENDL; writeRNACoverageReport(stream); } @@ -626,12 +626,12 @@ void GermlineReportGenerator::writeHTML(QString filename) //OMIM table if (data_.report_settings.show_omim_table) { - stream << endl; - stream << "

" << trans("OMIM Gene und Phenotypen") << "" << endl; - stream << "

" << endl; - stream << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("OMIM Gene und Phenotypen") << "" << QT_ENDL; + stream << "

" << QT_ENDL; + stream << "
" << QT_ENDL; stream << ""; - if (data_.report_settings.show_one_entry_in_omim_table) stream << "" << endl; + if (data_.report_settings.show_one_entry_in_omim_table) stream << "" << QT_ENDL; stream << ""; foreach(const QByteArray& gene, data_.roi.genes) { @@ -682,20 +682,20 @@ void GermlineReportGenerator::writeHTML(QString filename) } } stream << ""; - if (data_.report_settings.show_one_entry_in_omim_table) stream << ""; } } - stream << "
" << trans("Gen") << "" << trans("Gen MIM") << "" << trans("Phenotyp MIM") << "" << trans("Phenotyp") << "" << trans("Hauptphenotyp") << "" << trans("Hauptphenotyp") << "
" << omim_info.gene_symbol << "" << omim_info.mim << "" << accessions.join("
") << "
" << names.join("
") << "
" <" << endl; + if (data_.report_settings.show_one_entry_in_omim_table) stream << "" <" << QT_ENDL; stream << "
" << endl; + stream << "" << QT_ENDL; } //PRS table if (data_.prs.count()>0) { - stream << endl; - stream << "

" << trans("Polygener Risiko-Score (PRS)") << "

" << endl; - stream << "" << endl; - stream << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("Polygener Risiko-Score (PRS)") << "

" << QT_ENDL; + stream << "
" << trans("Erkrankung") << "PRS" << trans("Publikation") << "" << trans("Score") << "" << trans("Z-Score") << "" << trans("Population (geschätzt aus NGS)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; int id_idx = data_.prs.columnIndex("pgs_id"); int trait_idx = data_.prs.columnIndex("trait"); int score_idx = data_.prs.columnIndex("score"); @@ -755,8 +755,8 @@ void GermlineReportGenerator::writeHTML(QString filename) stream << ""; } - stream << "
" << trans("Erkrankung") << "PRS" << trans("Publikation") << "" << trans("Score") << "" << trans("Z-Score") << "" << trans("Population (geschätzt aus NGS)") << "
" << trait << "" << id << "" << row[citation_idx] << "" << score << "" << zscore << "" << population << "
" << endl; - stream << "

" << trans("Die Einschätzung der klinischen Bedeutung eines PRS ist nur unter Verwendung eines entsprechenden validierten Risiko-Kalkulations-Programms und unter Berücksichtigung der ethnischen Zugehörigkeit möglich (z.B. CanRisk.org für Brustkrebs).") << "

" << endl; + stream << "" << QT_ENDL; + stream << "

" << trans("Die Einschätzung der klinischen Bedeutung eines PRS ist nur unter Verwendung eines entsprechenden validierten Risiko-Kalkulations-Programms und unter Berücksichtigung der ethnischen Zugehörigkeit möglich (z.B. CanRisk.org für Brustkrebs).") << "

" << QT_ENDL; } //close stream @@ -1629,49 +1629,49 @@ BedFile GermlineReportGenerator::precalculatedGaps(const BedFile& gaps_roi, cons void GermlineReportGenerator::writeHtmlHeader(QTextStream& stream, QString sample_name) { - stream << "" << endl; - stream << "" << endl; - stream << " " << endl; - stream << " Report " << sample_name << "" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " Report " << sample_name << "" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::writeHtmlFooter(QTextStream& stream) { - stream << " " << endl; - stream << "" << endl; + stream << " " << QT_ENDL; + stream << "" << QT_ENDL; } QString GermlineReportGenerator::trans(const QString& text) @@ -1889,9 +1889,9 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co long long roi_bases = roi.regions.baseCount(); long long gap_bases = low_cov.baseCount(); double gap_percentage = 100.0 * gap_bases/roi_bases; - stream << "
" << trans("Basen") << ": " << QString::number(roi_bases) << endl; - stream << "
" << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << ": " << QString::number(gap_bases) << endl; - stream << "
" << trans("Prozent Lücken") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << endl; + stream << "
" << trans("Basen") << ": " << QString::number(roi_bases) << QT_ENDL; + stream << "
" << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << ": " << QString::number(gap_bases) << QT_ENDL; + stream << "
" << trans("Prozent Lücken") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << QT_ENDL; //group gaps by gene QMap gaps_by_gene; @@ -1912,12 +1912,12 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co incomplete_genes << gene + " (" + QString::number(gaps_by_gene[gene].baseCount()) + ")"; } } - stream << "
" << trans("Komplett abgedeckte Gene") << ": " << complete_genes.join(", ") << endl; - stream << "
" << trans("Unvollständig abgedeckte Gene (fehlende Basen in bp)") << ": " << incomplete_genes.join(", ") << endl; + stream << "
" << trans("Komplett abgedeckte Gene") << ": " << complete_genes.join(", ") << QT_ENDL; + stream << "
" << trans("Unvollständig abgedeckte Gene (fehlende Basen in bp)") << ": " << incomplete_genes.join(", ") << QT_ENDL; //table gaps by gene - stream << "

" << trans("Details Regionen mit Tiefe <") << data_.report_settings.min_depth << ":" << endl; - stream << "

" << endl; + stream << "

" << trans("Details Regionen mit Tiefe <") << data_.report_settings.min_depth << ":" << QT_ENDL; + stream << "

" << QT_ENDL; writeGapsByGeneTable(stream, gaps_by_gene, gap_bases_no_gene); //init gap closing @@ -1930,8 +1930,8 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co { int base_sum = 0; stream << "
" << trans("Lücken die mit Sanger-Sequenzierung geschlossen wurden:") << "
"; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; query.bindValue(0, "closed"); query.exec(); while(query.next()) @@ -1944,11 +1944,11 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co base_sum += end-start+1; gaps_closed.append(BedLine(chr, start, end)); - stream << "" << endl; + stream << "" << QT_ENDL; stream << ""; - stream << "" << endl; + stream << "" << QT_ENDL; } - stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << db_.genesOverlapping(chr, start, end).join(", ") << "" << QString::number(end-start+1) << "" << chr.str() << "" << QString::number(start) << "-" << QString::number(end) << "
" << endl; + stream << "" << QT_ENDL; stream << trans("Basen gesamt:") << QString::number(base_sum); } @@ -1956,8 +1956,8 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co { int base_sum = 0; stream << "

" << trans("Lücken die mit visueller Inspektion der Rohdaten überprüft wurden:") << "
"; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; query.bindValue(0, "checked visually"); query.exec(); while(query.next()) @@ -1970,13 +1970,13 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co base_sum += end-start+1; gaps_closed.append(BedLine(chr, start, end)); - stream << "" << endl; + stream << "" << QT_ENDL; stream << ""; - stream << "" << endl; + stream << "" << QT_ENDL; } - stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << db_.genesOverlapping(chr, start, end).join(", ") << "" << QString::number(end-start+1) << "" << chr.str() << "" << QString::number(start) << "-" << QString::number(end) << "
" << endl; + stream << "" << QT_ENDL; stream << trans("Basen gesamt:") << QString::number(base_sum); - stream << "

" << endl; + stream << "

" << QT_ENDL; } //print gaps that were not closed @@ -1989,16 +1989,16 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co gapsByGene(gaps_remaining, roi.genes, gaps_by_gene, gap_bases_no_gene); //write gap table after closing gaps - stream << "

" << trans("Verbleibende Lücken nach Lückenschluss") << endl; - stream << "

" << endl; + stream << "

" << trans("Verbleibende Lücken nach Lückenschluss") << QT_ENDL; + stream << "

" << QT_ENDL; writeGapsByGeneTable(stream, gaps_by_gene, gap_bases_no_gene); //add gap percentage after closing gaps long long gap_bases_remaining = gaps_remaining.baseCount(); gap_percentage = 100.0 * gap_bases_remaining/roi_bases; stream << "

"; - stream << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_bases_remaining) << endl; - stream << "
" << trans("Prozent Lücken") << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << endl; + stream << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_bases_remaining) << QT_ENDL; + stream << "
" << trans("Prozent Lücken") << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << QT_ENDL; stream << "

"; } @@ -2042,13 +2042,13 @@ void GermlineReportGenerator::writeRNACoverageReport(QTextStream& stream) if (stats[i].accession()=="QC:2000101") avg_cov_housekeeping = stats[i].toString(); if (stats[i].accession()=="QC:2000109") covered_genes = stats[i].toString(); } - stream << endl; - stream << "

" << trans("Abdeckungsstatistik der RNA-Probe") << "" << endl; - stream << "
" << trans("Anzahl der Reads") << ": " << QString::number((double) read_count.toInt()/1000000.0, 'f', 2) << " Mio" << endl; - stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << avg_cov << endl; - stream << "
" << trans("Durchschnittliche Sequenziertiefe der Housekeeping-Gene") << ": " << avg_cov_housekeeping << endl; - stream << "
" << trans("Abgedeckte Gene") << ": " << covered_genes << endl; - stream << "

" << endl; + stream << QT_ENDL; + stream << "

" << trans("Abdeckungsstatistik der RNA-Probe") << "" << QT_ENDL; + stream << "
" << trans("Anzahl der Reads") << ": " << QString::number((double) read_count.toInt()/1000000.0, 'f', 2) << " Mio" << QT_ENDL; + stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << avg_cov << QT_ENDL; + stream << "
" << trans("Durchschnittliche Sequenziertiefe der Housekeeping-Gene") << ": " << avg_cov_housekeeping << QT_ENDL; + stream << "
" << trans("Abgedeckte Gene") << ": " << covered_genes << QT_ENDL; + stream << "

" << QT_ENDL; } } @@ -2122,48 +2122,48 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu QTextStream stream(file.data()); //write header - stream << "" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << "

Probe: " << data_.ps << "

" << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << endl; - stream << "

DNA/RNA#: " << evaluation_sheet_data.dna_rna << "

" << endl; - stream << "

Genom: " << buildToString(evaluation_sheet_data.build, true) << "

" << endl; + stream << "" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

Probe: " << data_.ps << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << QT_ENDL; + stream << "

DNA/RNA#: " << evaluation_sheet_data.dna_rna << "

" << QT_ENDL; + stream << "

Genom: " << buildToString(evaluation_sheet_data.build, true) << "

" << QT_ENDL; QString kasp_text; try { @@ -2181,40 +2181,40 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu { kasp_text = trans("nicht durchgeführt"); } - stream << "

KASP: " << kasp_text << "

" << endl; - stream << "
" << endl; - stream << "

1. Auswerter: " << evaluation_sheet_data.reviewer1 << " Datum: " << evaluation_sheet_data.review_date1.toString("dd.MM.yyyy") << "

" << endl; - stream << "

2. Auswerter: " << evaluation_sheet_data.reviewer2 << " Datum: " << evaluation_sheet_data.review_date2.toString("dd.MM.yyyy") << "

" << endl; - stream << "
" << endl; - stream << "

Auswerteumfang: " << evaluation_sheet_data.analysis_scope << "

" << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
ACMG
angefordert:    "<< ((evaluation_sheet_data.acmg_requested)?"☑":"□") << "
analysiert:    "<< ((evaluation_sheet_data.acmg_analyzed)?"☑":"□") << "
auffällig:    "<< ((evaluation_sheet_data.acmg_noticeable)?"☑":"□") << "
" << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
Filterung erfolgt
Freq.-basiert dominant   "<< ((evaluation_sheet_data.filtered_by_freq_based_dominant)?"☑":"□") << "
Freq.-basiert rezessiv "<< ((evaluation_sheet_data.filtered_by_freq_based_recessive)?"☑":"□") << "
Mitochondrial "<< ((evaluation_sheet_data.filtered_by_mito)?"☑":"□") << "
X-chromosomal "<< ((evaluation_sheet_data.filtered_by_x_chr)?"☑":"□") << "
CNV "<< ((evaluation_sheet_data.filtered_by_cnv)?"☑":"□") << "
Strukturvarianten "<< ((evaluation_sheet_data.filtered_by_svs)?"☑":"□") << "
Repeat Expansions "<< ((evaluation_sheet_data.filtered_by_res)?"☑":"□") << "
Mosaikvarianten "<< ((evaluation_sheet_data.filtered_by_mosaic)?"☑":"□") << "
Phänotyp-basiert "<< ((evaluation_sheet_data.filtered_by_phenotype)?"☑":"□") << "
Multi-Sample-Auswertung "<< ((evaluation_sheet_data.filtered_by_multisample)?"☑":"□") << "
Trio stringent "<< ((evaluation_sheet_data.filtered_by_trio_stringent)?"☑":"□") << "
Trio relaxed "<< ((evaluation_sheet_data.filtered_by_trio_relaxed)?"☑":"□") << "
" << endl; - stream << "
" << endl; - stream << "
" << endl; + stream << "

KASP: " << kasp_text << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

1. Auswerter: " << evaluation_sheet_data.reviewer1 << " Datum: " << evaluation_sheet_data.review_date1.toString("dd.MM.yyyy") << "

" << QT_ENDL; + stream << "

2. Auswerter: " << evaluation_sheet_data.reviewer2 << " Datum: " << evaluation_sheet_data.review_date2.toString("dd.MM.yyyy") << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

Auswerteumfang: " << evaluation_sheet_data.analysis_scope << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
ACMG
angefordert:    "<< ((evaluation_sheet_data.acmg_requested)?"☑":"□") << "
analysiert:    "<< ((evaluation_sheet_data.acmg_analyzed)?"☑":"□") << "
auffällig:    "<< ((evaluation_sheet_data.acmg_noticeable)?"☑":"□") << "
" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
Filterung erfolgt
Freq.-basiert dominant   "<< ((evaluation_sheet_data.filtered_by_freq_based_dominant)?"☑":"□") << "
Freq.-basiert rezessiv "<< ((evaluation_sheet_data.filtered_by_freq_based_recessive)?"☑":"□") << "
Mitochondrial "<< ((evaluation_sheet_data.filtered_by_mito)?"☑":"□") << "
X-chromosomal "<< ((evaluation_sheet_data.filtered_by_x_chr)?"☑":"□") << "
CNV "<< ((evaluation_sheet_data.filtered_by_cnv)?"☑":"□") << "
Strukturvarianten "<< ((evaluation_sheet_data.filtered_by_svs)?"☑":"□") << "
Repeat Expansions "<< ((evaluation_sheet_data.filtered_by_res)?"☑":"□") << "
Mosaikvarianten "<< ((evaluation_sheet_data.filtered_by_mosaic)?"☑":"□") << "
Phänotyp-basiert "<< ((evaluation_sheet_data.filtered_by_phenotype)?"☑":"□") << "
Multi-Sample-Auswertung "<< ((evaluation_sheet_data.filtered_by_multisample)?"☑":"□") << "
Trio stringent "<< ((evaluation_sheet_data.filtered_by_trio_stringent)?"☑":"□") << "
Trio relaxed "<< ((evaluation_sheet_data.filtered_by_trio_relaxed)?"☑":"□") << "
" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "
" << QT_ENDL; //phenotype QString sample_id = db_.sampleId(data_.ps); @@ -2245,22 +2245,22 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu } } - stream << "
" << endl; - stream << " Klinik:" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << " " << clinical_phenotype.trimmed() << endl; - stream << " " << endl; - stream << " " << infos.join("
") << endl; - stream << "
" << endl; + stream << "
" << QT_ENDL; + stream << " Klinik:" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << clinical_phenotype.trimmed() << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << infos.join("
") << QT_ENDL; + stream << "
" << QT_ENDL; //write small variants - stream << "

Kausale Varianten:" << endl; - stream << " " << endl; + stream << "

Kausale Varianten:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeader(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2270,11 +2270,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRow(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige Varianten:" << endl; - stream << " " << endl; + stream << "

Sonstige Varianten:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeader(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2284,12 +2284,12 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRow(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; //CNVs - stream << "

Kausale CNVs:" << endl; - stream << " " << endl; + stream << "

Kausale CNVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderCnv(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2299,11 +2299,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowCnv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige CNVs:" << endl; - stream << " " << endl; + stream << "

Sonstige CNVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderCnv(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2313,12 +2313,12 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowCnv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; //SVs - stream << "

Kausale SVs:" << endl; - stream << " " << endl; + stream << "

Kausale SVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderSv(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2328,11 +2328,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowSv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige SVs:" << endl; - stream << " " << endl; + stream << "

Sonstige SVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderSv(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2342,13 +2342,13 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowSv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; //REs - stream << "

Kausale REs:" << endl; - stream << " " << endl; + stream << "

Kausale REs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderRe(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2358,11 +2358,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowRe(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige REs:" << endl; - stream << " " << endl; + stream << "

Sonstige REs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderRe(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2372,23 +2372,23 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowRe(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; OtherCausalVariant other_causal_var = data_.report_settings.report_config->otherCausalVariant(); if (other_causal_var.isValid()) { - stream << "

Sonstige kausale Varianten:" << endl; - stream << " " << endl; + stream << "

Sonstige kausale Varianten:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderOtherVariant(stream); printVariantSheetRowOtherVariant(stream, other_causal_var); - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; } //write footer - stream << " " << endl; - stream << "" << endl; + stream << " " << QT_ENDL; + stream << "" << QT_ENDL; stream.flush(); //validate written file @@ -2408,26 +2408,26 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu void GermlineReportGenerator::printVariantSheetRowHeader(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " Gen" << endl; - stream << " Typ" << endl; - stream << " Genotyp" << endl; - stream << " Variante" << endl; - stream << " Erbgang" << endl; - stream << " c." << endl; - stream << " p." << endl; + stream << " " << QT_ENDL; + stream << " Gen" << QT_ENDL; + stream << " Typ" << QT_ENDL; + stream << " Genotyp" << QT_ENDL; + stream << " Variante" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; + stream << " c." << QT_ENDL; + stream << " p." << QT_ENDL; if (!causal) { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " gnomAD" << endl; - stream << " NGSD hom/het" << endl; - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " Klasse" << endl; - stream << " In Report" << endl; - stream << " RNA" << endl; - stream << " " << endl; + stream << " gnomAD" << QT_ENDL; + stream << " NGSD hom/het" << QT_ENDL; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " Klasse" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " RNA" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRow(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2479,53 +2479,53 @@ void GermlineReportGenerator::printVariantSheetRow(QTextStream& stream, const Re } //write line - stream << " " << endl; - stream << " " << genes.join(", ") << "" << endl; - stream << " " << types.join(", ") << "" << endl; + stream << " " << QT_ENDL; + stream << " " << genes.join(", ") << "" << QT_ENDL; + stream << " " << types.join(", ") << "" << QT_ENDL; QString geno = v.annotations()[i_genotype]; if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << v.toString(QChar(), 20) << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << endl; - stream << " " << conf.inheritance << "" << endl; - stream << " " << hgvs_cs.join(", ") << "" << endl; - stream << " " << hgvs_ps.join(", ") << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << v.toString(QChar(), 20) << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; + stream << " " << hgvs_cs.join(", ") << "" << QT_ENDL; + stream << " " << hgvs_ps.join(", ") << "" << QT_ENDL; if (!conf.causal) { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << v.annotations()[i_gnomad] << "" << endl; - stream << " " << v.annotations()[i_ngsd_hom] << " / " << v.annotations()[i_ngsd_het] << "" << endl; - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << v.annotations()[i_class] << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << trans(conf.rna_info) << "" << endl; - stream << " " << endl; + stream << " " << v.annotations()[i_gnomad] << "" << QT_ENDL; + stream << " " << v.annotations()[i_ngsd_hom] << " / " << v.annotations()[i_ngsd_het] << "" << QT_ENDL; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << v.annotations()[i_class] << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << trans(conf.rna_info) << "" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderCnv(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " CNV" << endl; - stream << " copy-number" << endl; - stream << " Gene" << endl; - stream << " Erbgang" << endl; + stream << " " << QT_ENDL; + stream << " CNV" << QT_ENDL; + stream << " copy-number" << QT_ENDL; + stream << " Gene" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; if (causal) { - stream << " Infos" << endl; + stream << " Infos" << QT_ENDL; } else { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " Klasse" << endl; - stream << " In Report" << endl; - stream << " RNA" << endl; - stream << " " << endl; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " Klasse" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " RNA" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowCnv(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2535,52 +2535,52 @@ void GermlineReportGenerator::printVariantSheetRowCnv(QTextStream& stream, const //manual curation if (conf.isManuallyCurated()) conf.updateCnv(cnv, data_.cnvs.annotationHeaders(), db_); - stream << " " << endl; - stream << " " << cnv.toString() << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << endl; + stream << " " << QT_ENDL; + stream << " " << cnv.toString() << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << QT_ENDL; QString geno = QString::number(cnv.copyNumber(data_.cnvs.annotationHeaders())); if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << cnv.genes().join(", ") << "" << endl; - stream << " " << conf.inheritance << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << cnv.genes().join(", ") << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; if (conf.causal) { - stream << " regions:" << cnv.regions() << " size:" << QString::number(cnv.size()/1000.0, 'f', 3) << "kb" << endl; + stream << " regions:" << cnv.regions() << " size:" << QString::number(cnv.size()/1000.0, 'f', 3) << "kb" << QT_ENDL; } else { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << conf.classification << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << trans(conf.rna_info) << "" << endl; - stream << " " << endl; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << conf.classification << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << trans(conf.rna_info) << "" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderSv(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " SV" << endl; - stream << " Typ" << endl; - stream << " Gene" << endl; - stream << " Erbgang" << endl; + stream << " " << QT_ENDL; + stream << " SV" << QT_ENDL; + stream << " Typ" << QT_ENDL; + stream << " Gene" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; if (causal) { - stream << " Infos" << endl; + stream << " Infos" << QT_ENDL; } else { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " Klasse" << endl; - stream << " In Report" << endl; - stream << " RNA" << endl; - stream << " " << endl; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " Klasse" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " RNA" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowSv(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2591,52 +2591,52 @@ void GermlineReportGenerator::printVariantSheetRowSv(QTextStream& stream, const if (conf.isManuallyCurated()) conf.updateSv(sv, data_.svs.annotationHeaders(), db_); BedFile affected_region = sv.affectedRegion(false); - stream << " " << endl; + stream << " " << QT_ENDL; stream << " " << affected_region[0].toString(true); if (sv.type() == StructuralVariantType::BND) stream << " <-> " << affected_region[1].toString(true); if (conf.isManuallyCurated()) stream << " (manually curated)"; - stream << "" << endl; + stream << "" << QT_ENDL; QString geno = BedpeFile::typeToString(sv.type()); if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << endl; - stream << " " << conf.inheritance << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; if (conf.causal) { - stream << " estimated size:" << QString::number(data_.svs.estimatedSvSize(conf.variant_index)/1000.0, 'f', 3) << "kb" << endl; + stream << " estimated size:" << QString::number(data_.svs.estimatedSvSize(conf.variant_index)/1000.0, 'f', 3) << "kb" << QT_ENDL; } else { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << conf.classification << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << trans(conf.rna_info) << "" << endl; - stream << " " << endl; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << conf.classification << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << trans(conf.rna_info) << "" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderRe(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " RE" << endl; - stream << " Genotyp" << endl; - stream << " Erbgang" << endl; + stream << " " << QT_ENDL; + stream << " RE" << QT_ENDL; + stream << " Genotyp" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; if (causal) { - stream << " Infos" << endl; + stream << " Infos" << QT_ENDL; } else { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " In Report" << endl; - stream << " " << endl; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowRe(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2646,52 +2646,52 @@ void GermlineReportGenerator::printVariantSheetRowRe(QTextStream& stream, const //manual curation if (conf.isManuallyCurated()) conf.updateRe(re); - stream << " " << endl; - stream << " " << re.toString(true, false) << "" << endl; + stream << " " << QT_ENDL; + stream << " " << re.toString(true, false) << "" << QT_ENDL; QString geno = re.alleles(); if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << conf.inheritance << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; if (conf.causal) { - stream << " " << endl; + stream << " " << QT_ENDL; } else { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << endl; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderOtherVariant(QTextStream& stream) { - stream << " " << endl; - stream << " Variantentyp" << endl; - stream << " Regionen" << endl; - stream << " Gene" << endl; - stream << " Erbgang" << endl; - stream << " Kommentar" << endl; - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " Variantentyp" << QT_ENDL; + stream << " Regionen" << QT_ENDL; + stream << " Gene" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; + stream << " Kommentar" << QT_ENDL; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowOtherVariant(QTextStream& stream, OtherCausalVariant variant) { - stream << " " << endl; - stream << " " << convertOtherVariantType(variant.type) << "" << endl; - stream << " " << variant.coordinates << "" << endl; - stream << " " << variant.gene << "" << endl; - stream << " " << variant.inheritance << "" << endl; - stream << " " << variant.comment<< "" << endl; - stream << " " << variant.comment_reviewer1 << "" << endl; - stream << " " << variant.comment_reviewer2 << "" << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " " << convertOtherVariantType(variant.type) << "" << QT_ENDL; + stream << " " << variant.coordinates << "" << QT_ENDL; + stream << " " << variant.gene << "" << QT_ENDL; + stream << " " << variant.inheritance << "" << QT_ENDL; + stream << " " << variant.comment<< "" << QT_ENDL; + stream << " " << variant.comment_reviewer1 << "" << QT_ENDL; + stream << " " << variant.comment_reviewer2 << "" << QT_ENDL; + stream << " " << QT_ENDL; } QString GermlineReportGenerator::exclusionCriteria(const ReportVariantConfiguration& conf) @@ -2734,12 +2734,12 @@ void GermlineReportGenerator::gapsByGene(const BedFile& low_cov, const GeneSet& void GermlineReportGenerator::writeGapsByGeneTable(QTextStream& stream, QMap& gaps_by_gene, long long& gap_bases_no_gene) { - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; for (auto it=gaps_by_gene.cbegin(); it!=gaps_by_gene.cend(); ++it) { - stream << "" << endl; - stream << "" << QT_ENDL; + stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } if (gap_bases_no_gene>0) { - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } - stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << endl; + stream << "
" << QT_ENDL; const BedFile& gaps = it.value(); QString chr = gaps[0].chr().str(); QStringList coords; @@ -2747,17 +2747,17 @@ void GermlineReportGenerator::writeGapsByGeneTable(QTextStream& stream, QMap" << gaps.baseCount() << "" << chr << "" << coords.join(", ") << endl; + stream << it.key() << "" << gaps.baseCount() << "" << chr << "" << coords.join(", ") << QT_ENDL; - stream << "
" << trans("kein Überlappung mit Gen") << "" << gap_bases_no_gene << "--
" << trans("kein Überlappung mit Gen") << "" << gap_bases_no_gene << "--
" << endl; + stream << "" << QT_ENDL; } diff --git a/src/cppNGSD/LoginManager.cpp b/src/cppNGSD/LoginManager.cpp index c81ab7c7e..d6910ce51 100644 --- a/src/cppNGSD/LoginManager.cpp +++ b/src/cppNGSD/LoginManager.cpp @@ -346,7 +346,7 @@ void LoginManager::checkRoleNotIn(QStringList roles) { //invert role selection for output QStringList roles_db = db.getEnum("user", "user_role"); - roles = roles_db.toSet().subtract(roles.toSet()).toList(); + roles = LIST_TO_SET(roles_db).subtract(LIST_TO_SET(roles)).values(); INFO(AccessDeniedException, "Access denied.\nOnly users with the following roles have access to this functionality: " + roles.join(", ") + ".\nThe user '" + manager.user_login_ + "' has the role '" + NGSD().getUserRole(manager.userId()) + "'!"); } diff --git a/src/cppNGSD/NGSD.cpp b/src/cppNGSD/NGSD.cpp index d13d7877d..41e62b969 100644 --- a/src/cppNGSD/NGSD.cpp +++ b/src/cppNGSD/NGSD.cpp @@ -206,16 +206,16 @@ bool NGSD::userCanAccess(int user_id, int ps_id) switch(permission) { case Permission::PROJECT: - ps_ids += getValuesInt("SELECT id FROM processed_sample WHERE project_id=" + data.toString()).toSet(); + ps_ids += LIST_TO_SET(getValuesInt("SELECT id FROM processed_sample WHERE project_id=" + data.toString())); break; case Permission::PROJECT_TYPE: - ps_ids += getValuesInt("SELECT ps.id FROM processed_sample ps, project p WHERE ps.project_id=p.id AND p.type='" + data.toString() + "'").toSet(); + ps_ids += LIST_TO_SET(getValuesInt("SELECT ps.id FROM processed_sample ps, project p WHERE ps.project_id=p.id AND p.type='" + data.toString() + "'")); break; case Permission::SAMPLE: - ps_ids += getValuesInt("SELECT id FROM processed_sample WHERE sample_id=" + data.toString()).toSet(); + ps_ids += LIST_TO_SET(getValuesInt("SELECT id FROM processed_sample WHERE sample_id=" + data.toString())); break; case Permission::STUDY: - ps_ids += getValuesInt("SELECT processed_sample_id FROM study_sample WHERE study_id=" + data.toString()).toSet(); + ps_ids += LIST_TO_SET(getValuesInt("SELECT processed_sample_id FROM study_sample WHERE study_id=" + data.toString())); break; } } @@ -1916,15 +1916,15 @@ ImportStatusGermline NGSD::importStatus(const QString& ps_id) void NGSD::importGeneExpressionData(const QString& expression_data_file_path, const QString& ps_name, bool force, bool debug) { QTextStream outstream(stdout); - QTime timer; + QElapsedTimer timer; timer.start(); //check ps_name QString ps_id = processedSampleId(ps_name); - if(debug) outstream << "Processed sample: " << ps_name << endl; + if(debug) outstream << "Processed sample: " << ps_name << QT_ENDL; // check if already imported int n_prev_entries = getValue("SELECT COUNT(`id`) FROM `expression` WHERE `processed_sample_id`=:0", false, ps_id).toInt(); - if(debug) outstream << "Previously imported expression values: " << n_prev_entries << endl; + if(debug) outstream << "Previously imported expression values: " << n_prev_entries << QT_ENDL; if (!force && (n_prev_entries > 0)) { @@ -1939,7 +1939,7 @@ void NGSD::importGeneExpressionData(const QString& expression_data_file_path, co { SqlQuery query = getQuery(); query.exec("DELETE FROM `expression` WHERE `processed_sample_id`='"+ps_id+"'"); - if(debug) outstream << QByteArray::number(n_prev_entries) + " previously imported expression values deleted." << endl; + if(debug) outstream << QByteArray::number(n_prev_entries) + " previously imported expression values deleted." << QT_ENDL; } //get ENSG -> id mapping @@ -2004,9 +2004,9 @@ void NGSD::importGeneExpressionData(const QString& expression_data_file_path, co // commit commit(); - if(debug) outstream << "runtime: " << Helper::elapsedTime(timer) << endl; - if(debug) outstream << QByteArray::number(n_imported) + " expression values imported into the NGSD." << endl; - if(debug) outstream << QByteArray::number(n_skipped) + " expression values skipped." << endl; + if(debug) outstream << "runtime: " << Helper::elapsedTime(timer) << QT_ENDL; + if(debug) outstream << QByteArray::number(n_imported) + " expression values imported into the NGSD." << QT_ENDL; + if(debug) outstream << QByteArray::number(n_skipped) + " expression values skipped." << QT_ENDL; } int NGSD::addGeneSymbolToExpressionTable(const QByteArray& gene_symbol) @@ -2026,15 +2026,15 @@ int NGSD::addGeneSymbolToExpressionTable(const QByteArray& gene_symbol) void NGSD::importExonExpressionData(const QString& expression_data_file_path, const QString& ps_name, bool force, bool debug) { QTextStream outstream(stdout); - QTime timer; + QElapsedTimer timer; timer.start(); //check ps_name QString ps_id = processedSampleId(ps_name); - if(debug) outstream << "Processed sample: " << ps_name << endl; + if(debug) outstream << "Processed sample: " << ps_name << QT_ENDL; // check if already imported int n_prev_entries = getValue("SELECT COUNT(`id`) FROM `expression_exon` WHERE `processed_sample_id`=:0", false, ps_id).toInt(); - if(debug) outstream << "Previously imported expression values: " << n_prev_entries << endl; + if(debug) outstream << "Previously imported expression values: " << n_prev_entries << QT_ENDL; if (!force && (n_prev_entries > 0)) { @@ -2049,7 +2049,7 @@ void NGSD::importExonExpressionData(const QString& expression_data_file_path, co { SqlQuery query = getQuery(); query.exec("DELETE FROM `expression_exon` WHERE `processed_sample_id`='"+ps_id+"'"); - if(debug) outstream << QByteArray::number(n_prev_entries) + " previously imported expression values deleted." << endl; + if(debug) outstream << QByteArray::number(n_prev_entries) + " previously imported expression values deleted." << QT_ENDL; } @@ -2082,7 +2082,7 @@ void NGSD::importExonExpressionData(const QString& expression_data_file_path, co valid_exons << exon.toString(true).toUtf8(); } - if(debug) outstream << QByteArray::number(valid_exons.size()) << " unique exons stored in the NGSD (" << Helper::elapsedTime(timer) << ") " << endl; + if(debug) outstream << QByteArray::number(valid_exons.size()) << " unique exons stored in the NGSD (" << Helper::elapsedTime(timer) << ") " << QT_ENDL; @@ -2125,17 +2125,17 @@ void NGSD::importExonExpressionData(const QString& expression_data_file_path, co line_idx++; if(debug && (line_idx % 100000 == 0)) { - outstream << QByteArray::number(line_idx) << " lines parsed..." << endl; + outstream << QByteArray::number(line_idx) << " lines parsed..." << QT_ENDL; } } // commit commit(); - if(debug) outstream << "runtime: " << Helper::elapsedTime(timer) << endl; - if(debug) outstream << QByteArray::number(n_imported) + " expression values imported into the NGSD." << endl; - if(debug) outstream << QByteArray::number(n_skipped) + " expression values skipped (not in NGSD)." << endl; - if(debug) outstream << QByteArray::number(n_duplicates) + " expression values skipped (duplicates)." << endl; + if(debug) outstream << "runtime: " << Helper::elapsedTime(timer) << QT_ENDL; + if(debug) outstream << QByteArray::number(n_imported) + " expression values imported into the NGSD." << QT_ENDL; + if(debug) outstream << QByteArray::number(n_skipped) + " expression values skipped (not in NGSD)." << QT_ENDL; + if(debug) outstream << QByteArray::number(n_duplicates) + " expression values skipped (duplicates)." << QT_ENDL; } @@ -2218,7 +2218,7 @@ QVector NGSD::getGeneExpressionValues(const QByteArray& gene, int sys_id QVector NGSD::getGeneExpressionValues(const QByteArray& gene, QSet cohort, bool log2) { // debug - QVector cohort_sorted = cohort.toList().toVector(); + QVector cohort_sorted = cohort.values().toVector(); std::sort(cohort_sorted.begin(), cohort_sorted.end()); return getGeneExpressionValues(gene, cohort_sorted, log2); @@ -2269,7 +2269,7 @@ QVector NGSD::getExonExpressionValues(const BedLine& exon, QSet coh { QVector expr_values; - QList cohort_sorted = cohort.toList(); + QList cohort_sorted = cohort.values(); std::sort(cohort_sorted.begin(), cohort_sorted.end()); QStringList cohort_str; foreach (int i , cohort_sorted) @@ -2335,7 +2335,7 @@ QMap NGSD::getGeneExpressionGene2IdMapping() QMap NGSD::calculateGeneExpressionStatistics(QSet& cohort, QByteArray gene_symbol, bool debug) { - QTime timer; + QElapsedTimer timer; timer.start(); QMap gene_stats; @@ -2401,7 +2401,7 @@ QMap NGSD::calculateGeneExpressionStatistics(QSet NGSD::calculateExonExpressionStatistics(QSet& cohort, const BedLine& exon, bool debug) { - QTime timer; + QElapsedTimer timer; timer.start(); QMap exon_stats; @@ -2467,7 +2467,7 @@ QMap NGSD::calculateExonExpressionStatistics(QSet NGSD::calculateCohortExpressionStatistics(int sys_id, const QString& tissue_type, QSet& cohort, const QString& project, const QString& ps_id, RnaCohortDeterminationStategy cohort_type, const QStringList& exclude_quality, bool debug) { - QTime timer; + QElapsedTimer timer; timer.start(); //get cohort @@ -2481,7 +2481,7 @@ QMap NGSD::calculateCohortExpressionStatistics(int QSet NGSD::getRNACohort(int sys_id, const QString& tissue_type, const QString& project, const QString& ps_id, RnaCohortDeterminationStategy cohort_type, const QByteArray& mode, const QStringList& exclude_quality, bool debug) { - QTime timer; + QElapsedTimer timer; timer.start(); QSet cohort; @@ -2489,18 +2489,18 @@ QSet NGSD::getRNACohort(int sys_id, const QString& tissue_type, const QStri QSet all_ps_ids; if (mode == "genes") { - all_ps_ids = getValuesInt("SELECT DISTINCT e.processed_sample_id FROM expression e").toSet(); + all_ps_ids = LIST_TO_SET(getValuesInt("SELECT DISTINCT e.processed_sample_id FROM expression e")); } else if (mode == "exons") { - all_ps_ids = getValuesInt("SELECT DISTINCT e.processed_sample_id FROM expression_exon e").toSet(); + all_ps_ids = LIST_TO_SET(getValuesInt("SELECT DISTINCT e.processed_sample_id FROM expression_exon e")); } else { THROW(ArgumentException, "Invalid mode '" + mode + "' given! Valid modes are 'genes' or 'exons'"); } - if(debug) qDebug() << "Get all psample ids with expression data: " << Helper::elapsedTime(timer); + if(debug) qDebug() << "Get all psample ids with expression data: " << Helper::elapsedTime(timer); if ((cohort_type == RNA_COHORT_GERMLINE) || (cohort_type == RNA_COHORT_GERMLINE_PROJECT)) @@ -2530,12 +2530,12 @@ QSet NGSD::getRNACohort(int sys_id, const QString& tissue_type, const QStri query_string_cohort.append(" AND ps.project_id = " + QByteArray::number(project_id)); } - cohort = getValuesInt(query_string_cohort).toSet(); + cohort = LIST_TO_SET(getValuesInt(query_string_cohort)); } else if (cohort_type == RNA_COHORT_SOMATIC) { - QTime timer; + QElapsedTimer timer; timer.start(); //check requirements: @@ -2585,8 +2585,8 @@ QSet NGSD::getRNACohort(int sys_id, const QString& tissue_type, const QStri "AND ps.project_id=" + QString::number(project_id) + " " "AND ps.quality != 'bad' " "AND (sr.relation='same sample' OR sr.relation IS NULL) " - "AND ((sdi.type='ICD10 code' AND sdi.disease_info='" + icd10_disease_info.toList().at(0) + "') " - "OR (sdi.type='HPO term id' AND sdi.disease_info='" + hpo_disease_info.toList().at(0) + "')) "); + "AND ((sdi.type='ICD10 code' AND sdi.disease_info='" + icd10_disease_info.values().at(0) + "') " + "OR (sdi.type='HPO term id' AND sdi.disease_info='" + hpo_disease_info.values().at(0) + "')) "); if (exclude_quality.size() > 0) { @@ -2594,7 +2594,7 @@ QSet NGSD::getRNACohort(int sys_id, const QString& tissue_type, const QStri } - cohort = getValuesInt(query_string_cohort).toSet(); + cohort = LIST_TO_SET(getValuesInt(query_string_cohort)); if(debug) qDebug() << "get ps_ids of cohort (somatic)" << Helper::elapsedTime(timer); @@ -2967,7 +2967,7 @@ BedpeLine NGSD::somaticSv(QString sv_id, StructuralVariantType type, const Bedpe QList annotations; int qual_idx = -1, filter_idx = -1, alt_a_idx = -1, info_a_idx = -1; - annotations = QVector(svs.annotationHeaders().size()).toList(); + annotations = QVector(svs.annotationHeaders().size()).toList(); if (!no_annotation) { // determine indices for annotations @@ -3389,7 +3389,7 @@ BedpeLine NGSD::structuralVariant(int sv_id, StructuralVariantType type, const B QList annotations; int qual_idx = -1, filter_idx = -1, alt_a_idx = -1, info_a_idx = -1, format_idx = -1; - annotations = QVector(svs.annotationHeaders().size()).toList(); + annotations = QVector(svs.annotationHeaders().size()).toList(); format_idx = svs.annotationIndexByName("FORMAT"); if (!no_annotation) { @@ -5504,12 +5504,12 @@ FileInfo NGSD::analysisJobLatestLogInfo(int job_id) foreach(QString file, files) { QFileInfo file_info(file); - QDateTime mod_time = file_info.lastModified(); + QDateTime mod_time = file_info.metadataChangeTime(); if (output.last_modiefied.isNull() || mod_time>output.last_modiefied) { output.file_name = file_info.fileName(); output.file_name_with_path = file_info.filePath(); - output.created = file_info.created(); + output.created = file_info.birthTime(); output.last_modiefied = mod_time; } } @@ -6115,11 +6115,11 @@ QString NGSD::createSampleSheet(int run_id, QStringList& warnings, const NsxAnal //sort adapter to make it testable if (settings.adapter_trimming) { - QStringList adapter_sequences_read1_list = adapter_sequences_read1.toList(); + QStringList adapter_sequences_read1_list = adapter_sequences_read1.values(); adapter_sequences_read1_list.sort(); if (adapter_sequences_read1_list.length() > 0) sample_sheet.append("AdapterRead1," + adapter_sequences_read1_list.join("+")); else warnings << "WARNING: No adapter for read 1 provided! Adapter trimming will not work."; - QStringList adapter_sequences_read2_list = adapter_sequences_read2.toList(); + QStringList adapter_sequences_read2_list = adapter_sequences_read2.values(); adapter_sequences_read2_list.sort(); if (adapter_sequences_read2_list.length() > 0) sample_sheet.append("AdapterRead2," + adapter_sequences_read2_list.join("+")); else warnings << "WARNING: No adapter for read 2 provided! Adapter trimming will not work."; @@ -6522,7 +6522,7 @@ QPair NGSD::geneToApprovedWithMessage(const QString& gene) while(q_syn.next()) { if (!genes.isEmpty()) genes.append(", "); - genes.append(q_syn.value(0).toString()); + genes.append(q_syn.value(0).toString().toLocal8Bit()); } return qMakePair(gene, "ERROR: " + gene + " is a synonymous symbol of the genes " + genes); } @@ -7128,7 +7128,7 @@ BedFile NGSD::geneToRegions(const QByteArray& gene, Transcript::SOURCE source, Q int id = geneId(gene); if (id==-1) { - if (messages) *messages << "Gene name '" << gene << "' is no HGNC-approved symbol. Skipping it!" << endl; + if (messages) *messages << "Gene name '" << gene << "' is no HGNC-approved symbol. Skipping it!" << QT_ENDL; return output; } @@ -7172,7 +7172,7 @@ BedFile NGSD::geneToRegions(const QByteArray& gene, Transcript::SOURCE source, Q if (output.isEmpty() && messages!=nullptr) { - *messages << "No transcripts found for gene '" + gene + "'. Skipping it!" << endl; + *messages << "No transcripts found for gene '" + gene + "'. Skipping it!" << QT_ENDL; } if (!output.isSorted()) output.sort(); diff --git a/src/cppNGSD/SomaticReportHelper.cpp b/src/cppNGSD/SomaticReportHelper.cpp index 44048ca93..fcd1477a2 100644 --- a/src/cppNGSD/SomaticReportHelper.cpp +++ b/src/cppNGSD/SomaticReportHelper.cpp @@ -390,7 +390,7 @@ void SomaticReportHelper::germlineSnvForQbic(QString path_target_folder) stream << "chr" << "\t" << "start" << "\t" << "ref" << "\t" << "alt" << "\t" << "genotype" << "\t"; stream << "gene" << "\t" << "base_change" << "\t" << "aa_change" << "\t" << "transcript" << "\t"; stream << "functional_class" << "\t" << "effect"; - stream << endl; + stream << QT_ENDL; saveReportData("QBIC_germline_snv.tsv", path_target_folder, content); } @@ -405,7 +405,7 @@ void SomaticReportHelper::somaticSnvForQbic(QString path_target_folder) stream << "chr" <<"\t" << "start" << "\t" << "ref" << "\t" << "alt" << "\t"; stream <<"allele_frequency_tumor" << "\t" << "coverage" << "\t"; stream << "gene" << "\t" << "base_change" << "\t" << "aa_change" << "\t"; - stream << "transcript" << "\t" << "functional_class" << "\t" << "effect" << endl; + stream << "transcript" << "\t" << "functional_class" << "\t" << "effect" << QT_ENDL; int i_tumor_af = somatic_vl_.annotationIndexByName("tumor_af",true,true); int i_tumor_depth = somatic_vl_.annotationIndexByName("tumor_dp",true,true); @@ -464,7 +464,7 @@ void SomaticReportHelper::somaticSnvForQbic(QString path_target_folder) stream << effect; - stream << endl; + stream << QT_ENDL; } saveReportData("QBIC_somatic_snv.tsv", path_target_folder, content); } @@ -476,7 +476,7 @@ void SomaticReportHelper::germlineCnvForQbic(QString path_target_folder) stream << "size" << "\t" << "type" << "\t" << "copy_number" << "\t" << "gene" << "\t" << "exons" << "\t" << "transcript" << "\t"; stream << "chr" << "\t" << "start" << "\t" << "end" << "\t" << "effect"; - stream << endl; + stream << QT_ENDL; saveReportData("QBIC_germline_cnv.tsv", path_target_folder, content); } @@ -488,7 +488,7 @@ void SomaticReportHelper::somaticCnvForQbic(QString path_target_folder) QTextStream stream(&content); stream << "size" << "\t" << "type" << "\t" << "copy_number" << "\t" << "gene" << "\t" << "exons" << "\t"; - stream << "transcript" << "\t" << "chr" << "\t" << "start" << "\t" << "end" << "\t" << "effect" << endl; + stream << "transcript" << "\t" << "chr" << "\t" << "start" << "\t" << "end" << "\t" << "effect" << QT_ENDL; for(int i=0; i < cnvs_.count(); ++i) { @@ -575,7 +575,7 @@ void SomaticReportHelper::somaticCnvForQbic(QString path_target_folder) } stream << (gene_effects.empty() ? "NA" : gene_effects.join(";") ); - stream << endl; + stream << QT_ENDL; } saveReportData("QBIC_somatic_cnv.tsv", path_target_folder, content); } @@ -585,7 +585,7 @@ void SomaticReportHelper::somaticSvForQbic(QString path_target_folder) QByteArray content; QTextStream stream(&content); - stream << "type" << "\t" << "gene" << "\t" << "effect" << "\t" << "left_bp" << "\t" << "right_bp" << endl; + stream << "type" << "\t" << "gene" << "\t" << "effect" << "\t" << "left_bp" << "\t" << "right_bp" << QT_ENDL; saveReportData("QBIC_somatic_sv.tsv", path_target_folder, content); } @@ -596,7 +596,7 @@ void SomaticReportHelper::metaDataForQbic(QString path_target_folder) QTextStream stream(&content); stream << "diagnosis" << "\t" << "tumor_content" << "\t" << "pathogenic_germline" << "\t" << "mutational_load" << "\t" << "chromosomal_instability" << "\t" << "quality_flags" << "\t" << "reference_genome"; - stream << endl; + stream << QT_ENDL; stream << settings_.icd10 << "\t" << (BasicStatistics::isValidFloat(histol_tumor_fraction_) ? QString::number(histol_tumor_fraction_, 'f', 4) : "NA") << "\t"; @@ -620,7 +620,7 @@ void SomaticReportHelper::metaDataForQbic(QString path_target_folder) stream << "\t"; stream << db_.getProcessingSystemData(db_.processingSystemIdFromProcessedSample(settings_.tumor_ps)).genome; - stream << endl; + stream << QT_ENDL; saveReportData("QBIC_metadata.tsv", path_target_folder, content); } @@ -1198,7 +1198,7 @@ RtfTable SomaticReportHelper::snvTable(const QSet& indices, bool high_impac ebm_genes_ << transcript.gene; //find somatic SNVs in the same gene: (to keep them at the start) - QList indices_sorted = indices.toList(); + QList indices_sorted = indices.values(); std::sort(indices_sorted.begin(), indices_sorted.end()); foreach(int i, indices_sorted) { @@ -1235,7 +1235,7 @@ RtfTable SomaticReportHelper::snvTable(const QSet& indices, bool high_impac //somatic SNVs int i_tum_af = somatic_vl_.annotationIndexByName("tumor_af"); - QList indices_sorted = indices.toList(); + QList indices_sorted = indices.values(); std::sort(indices_sorted.begin(), indices_sorted.end()); foreach(int i, indices_sorted) { @@ -2176,7 +2176,7 @@ RtfSourceCode SomaticReportHelper::partRelevantVariants() } else { - limitations_expl += settings_.report_config.limitations().replace("\n","\n\\line\n"); + limitations_expl += settings_.report_config.limitations().replace("\n","\n\\line\n").toUtf8(); } out << RtfParagraph(limitations_expl).setFontSize(18).setIndent(0,0,0).setSpaceAfter(30).setSpaceBefore(30).setLineSpacing(276).setHorizontalAlignment("j").RtfCode(); diff --git a/src/cppNGSD/SomaticReportSettings.cpp b/src/cppNGSD/SomaticReportSettings.cpp index 3d7277fca..5ca948be8 100644 --- a/src/cppNGSD/SomaticReportSettings.cpp +++ b/src/cppNGSD/SomaticReportSettings.cpp @@ -25,7 +25,7 @@ double SomaticReportSettings::get_msi_value(NGSD &db) const VariantList SomaticReportSettings::filterVariants(const VariantList &snvs, const SomaticReportSettings& sett, bool throw_errors) { - QSet variant_indices = sett.report_config.variantIndices(VariantType::SNVS_INDELS, false).toSet(); + QSet variant_indices = LIST_TO_SET(sett.report_config.variantIndices(VariantType::SNVS_INDELS, false)); VariantList result; @@ -73,7 +73,7 @@ VariantList SomaticReportSettings::filterVariants(const VariantList &snvs, const VariantList SomaticReportSettings::filterGermlineVariants(const VariantList &germl_snvs, const SomaticReportSettings &sett) { - QSet variant_indices = sett.report_config.variantIndicesGermline().toSet(); + QSet variant_indices = LIST_TO_SET(sett.report_config.variantIndicesGermline()); VariantList result; @@ -98,7 +98,7 @@ VariantList SomaticReportSettings::filterGermlineVariants(const VariantList &ger CnvList SomaticReportSettings::filterCnvs(const CnvList &cnvs, const SomaticReportSettings &sett) { QBitArray cnv_flags(cnvs.count(), true); - QSet cnv_indices = sett.report_config.variantIndices(VariantType::CNVS, false).toSet(); + QSet cnv_indices = LIST_TO_SET(sett.report_config.variantIndices(VariantType::CNVS, false)); for(int index : cnv_indices) { cnv_flags[index] = sett.report_config.variantConfig(index, VariantType::CNVS).showInReport(); @@ -125,7 +125,7 @@ BedpeFile SomaticReportSettings::filterSvs(NGSD& db, const BedpeFile& svs, const result.addAnnotationHeader("START_POS_REPORT"); result.addAnnotationHeader("END_POS_REPORT"); - QSet sv_indicies = sett.report_config.variantIndices(VariantType::SVS, true).toSet(); + QSet sv_indicies = LIST_TO_SET(sett.report_config.variantIndices(VariantType::SVS, true)); if (sv_indicies.count() == 0) return result; diff --git a/src/cppNGSD/SomaticcfDNAReport.cpp b/src/cppNGSD/SomaticcfDNAReport.cpp index 3cf0c74e3..0e286b907 100644 --- a/src/cppNGSD/SomaticcfDNAReport.cpp +++ b/src/cppNGSD/SomaticcfDNAReport.cpp @@ -360,7 +360,7 @@ RtfTable SomaticcfDnaReport::partGeneralInfo() table.addRow( RtfTableRow( {"Tumor-ID: ", data_.table.tumor_sample.name.toUtf8()}, {2000,7921}, RtfParagraph().setFontSize(14)) ); table.addRow( RtfTableRow( {"Plasma-ID(s): ", ids.join(", ")}, {2000,7921}, RtfParagraph().setFontSize(14)) ); - table.addRow( RtfTableRow( {"Prozessierungssystem:", "Patientenspezifisches Panel " + sys.toList().join(", ").toUtf8()}, {2000,7921}, RtfParagraph().setFontSize(14)) ); + table.addRow( RtfTableRow( {"Prozessierungssystem:", "Patientenspezifisches Panel " + sys.values().join(", ").toUtf8()}, {2000,7921}, RtfParagraph().setFontSize(14)) ); return table; } diff --git a/src/cppTFW b/src/cppTFW index 4df63813d..15dd4cae9 160000 --- a/src/cppTFW +++ b/src/cppTFW @@ -1 +1 @@ -Subproject commit 4df63813dc532fc29533e4dcd10e90e1ceebc6d3 +Subproject commit 15dd4cae9b5de3fed386fb442d44133346f66603 diff --git a/src/cppXML b/src/cppXML index 9c355392b..3c9b55d9f 160000 --- a/src/cppXML +++ b/src/cppXML @@ -1 +1 @@ -Subproject commit 9c355392bc1b4e8096c5b2e0f4675b3e68d9a5eb +Subproject commit 3c9b55d9f6913ec335325173146d11597dd9bb9e diff --git a/src/cppXML-TEST/XmlValidation_Test.h b/src/cppXML-TEST/XmlValidation_Test.h new file mode 100644 index 000000000..cb9e45116 --- /dev/null +++ b/src/cppXML-TEST/XmlValidation_Test.h @@ -0,0 +1,41 @@ +#include "TestFramework.h" +#include "XmlHelper.h" + + +TEST_CLASS(XmlValidation_Test) +{ +Q_OBJECT +private slots: + void test_xml_validation() + { + QString xml_error = XmlHelper::isValidXml(":data/germline_report2.xml"); + if(xml_error!= "") + { + THROW(ProgrammingException, "Invalid XML file:\n" + xml_error); + } + IS_TRUE(xml_error.isEmpty()); + + xml_error = XmlHelper::isValidXml(":data/tumor_only_report_broken_xml.xml"); + IS_FALSE(xml_error.isEmpty()); + } + + void test_xml_validation_against_schema() + { + QString xml_error = XmlHelper::isValidXml(":data/somatic_report.xml", ":/data/SomaticReport.xsd"); + if(xml_error!= "") + { + THROW(ProgrammingException, "Invalid somatic report XML file:\n" + xml_error); + } + IS_TRUE(xml_error.isEmpty()); + + xml_error = XmlHelper::isValidXml(":data/germline_report1.xml", ":/data/GermlineReport.xsd"); + if(xml_error!= "") + { + THROW(ProgrammingException, "Invalid germline report XML file:\n" + xml_error); + } + IS_TRUE(xml_error.isEmpty()); + + xml_error = XmlHelper::isValidXml(":data/tumor_only_report_broken_schema.xml", ":/data/TumorOnlyNGSReport_v1.xsd"); + IS_FALSE(xml_error.isEmpty()); + } +}; diff --git a/src/cppXML-TEST/cppXML-TEST.pro b/src/cppXML-TEST/cppXML-TEST.pro new file mode 100644 index 000000000..828648c59 --- /dev/null +++ b/src/cppXML-TEST/cppXML-TEST.pro @@ -0,0 +1,37 @@ +#c++11 support +CONFIG += c++11 + +#base settings +QT += core +QT -= gui +QT += xmlpatterns +QT += xml + +CONFIG += console +CONFIG -= app_bundle +TEMPLATE = app +DESTDIR = ../../bin/ + +#include cppCORE library +INCLUDEPATH += $$PWD/../cppCORE +LIBS += -L$$PWD/../../bin -lcppCORE + +#include XML library +INCLUDEPATH += $$PWD/../cppXML +LIBS += -L$$PWD/../bin -lcppXML + +#include cppTFW library +INCLUDEPATH += $$PWD/../cppTFW + +#make the executable search for .so-files in the same folder under linux +QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\'" + +HEADERS += \ + XmlValidation_Test.h + +SOURCES += \ + main.cpp + +RESOURCES += \ + cppXML-TEST.qrc + diff --git a/src/cppXML-TEST/cppXML-TEST.qrc b/src/cppXML-TEST/cppXML-TEST.qrc new file mode 100644 index 000000000..d401c7fc6 --- /dev/null +++ b/src/cppXML-TEST/cppXML-TEST.qrc @@ -0,0 +1,16 @@ + + + data/somatic_report_tumor_normal_1.xml + data/somatic_report_tumor_normal_2.xml + data/GermlineReport.xsd + data/SomaticReport.xsd + data/TumorOnlyNGSReport_v1.xsd + data/somatic_report.xml + data/germline_report2.xml + data/germline_report4.xml + data/tumor_only_report.xml + data/germline_report1.xml + data/tumor_only_report_broken_xml.xml + data/tumor_only_report_broken_schema.xml + + diff --git a/src/cppXML-TEST/data/GermlineReport.xsd b/src/cppXML-TEST/data/GermlineReport.xsd new file mode 100644 index 000000000..37edb4a4b --- /dev/null +++ b/src/cppXML-TEST/data/GermlineReport.xsd @@ -0,0 +1,1711 @@ + + + + + + + Diagnostic NGS report + + + + + + Meta data about the report generation + + + + + date of report creation + + + + + user that created the report + + + + + + + + + + software that created the report (including version if possible) + + + + + + + + + + Diagnostic outcome. + + + + + + + + + + + + + + + + + + Alias names for chromosomes + + + + + + + + chromosome name used in this file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RefSeq accession of the chromosome + + + + + + + + + + Information about the sample + + + + + + QC terms of the sample as defined in https://github.com/imgag/ngs-bits/blob/master/src/cppNGS/Resources/qcML.obo + + + + + accession of the term + + + + + name of the term + + + + + extended description of the term + + + + + QC metric value + + + + + + + + sample name + + + + + + + + + + external sample name + + + + + + + + processing system name, e.g. 'Panel XY', etc. + + + + + processing system type + + + + + + + + + + + + + + + + sequencer type + + + + + sample comments + + + + + sample ancestry + + + + + + + + + + + + + + + + Information about the related RNA sample + + + + + + QC terms of the sample as defined in https://github.com/imgag/ngs-bits/blob/master/src/cppNGS/Resources/qcML.obo + + + + + accession of the term + + + + + name of the term + + + + + extended description of the term + + + + + QC metric value + + + + + + + + sample name + + + + + + + + + + + + Information about the traget region used for the analysis + + + + + + List of genes contained in target region. + + + + + + Omim information about the gene + + + + + OMIM gene number + + + + + + + + + + OMIM phenotype + + + + + + + + + + OMIM phenotype number + + + + + + + + + + + + Gap overlapping with the gene + + + + + chromosome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start of gap + + + + + + + + + + end of gap + + + + + + + + + + + + + Gene symbol (HGNC) + + + + + + + + + + HGNC identiifer + + + + + + + + + + Bases of the longest (coding) transcript + + + + + + + + target region name + + + + + + + + + + number of disjunct chromosomal regions + + + + + + + + + + number of bases + + + + + + + + + + Minimum depth of a region to be considered as having high coverage, i.e. not a gap + + + + + + + + + + percentage of the target region that was not sequenced at sufficient depth. + + + + + + + + + + + CCDS base count of genes in target region (without padding). + + + + + + + + + + + + Small variants (SNVs and InDels) of interest + + + + + + Representation of a single variant + + + + + + Transcript-specific annotation data + + + + + HGNC gene name + + + + + HGNC identiifer + + + + + + + + + + transcript identifier + + + + + variant type, e.g. missense + + + + + HGVS-compliant cDNA change + + + + + HGVS-compliant protein change + + + + + exon number, e.g. 11/27. The second number is the overal number of exons of the transcript + + + + + Important transcript of the gene. Used e.g. for highlighting in a report. + + + + + + + Gene-disease association (if available) + + + + + Gene symbol (HGNC) + + + + + + + + + + HGNC identiifer + + + + + + + + + + Source database of disease information + + + + + + + + + + + + + Disease identifier in source database + + + + + + + + + + Disease name in source database + + + + + + + + + + + + Gene inheritance mode, independent of phenotype (if available) + + + + + Gene symbol (HGNC) + + + + + + + + + + HGNC identiifer + + + + + + + + + + inheritance mode of the gene + + + + + + + + + + + + + + + + + + + + chromosome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start position in GSvar format: for deletions the start position for the deletion and for insertions the position of base before the insertion. + + + + + end position in GSvar format: for deletions the end position for the deletion and for insertions the position of base before the insertion. + + + + + reference sequence in GSvar format: for deletions the deleted sequence and for insertions '-' + + + + + observed sequence in GSvar format: for deletions '-' and for insertions the inserted sequence. + + + + + variant genotype + + + + + + + + + + + + allele frequency of the observerd sequence + + + + + + + + + + + depth at the variant position + + + + + + + + + + If the variant is causal in the context of the diagnostics phenotype. + + + + + if the variant is de-novo + + + + + if the variant is compound-heterozygous + + + + + if the variant is a mosaic variant + + + + + inheritance mode of the variant (i.e. inheritance mode of the gene for this phenotype) + + + + + + + + + + + + + + + + Variant classification. 1=benign ... 5=pahogenic M=modifier + + + + + + + + + + + + + + + + Classiification comments + + + + + Comments of first assessor + + + + + Comments of second + + + + + RNA information + + + + + + + + + + + + + report type of the variant. Needed to distinguish different report type variants in case "all"was selected. + + + + + + + + + + + + + + + Overall number of variants before filtering + + + + + + + + genome build that the variant positions refer to e.g. GRCh37 + + + + + + + + + + + + + Copy-number variants of interest + + + + + + Representation of a single CNV + + + + + + Genes that overlap the CNV + + + + + HGNC gene name + + + + + HGNC identiifer + + + + + + + + + + + + Links, e.g. to external databases + + + + + Link URL + + + + + Link type + + + + + + + + + + + + + + chromosome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + genomic start position + + + + + genomic end position + + + + + cytogenetic band start position + + + + + cytogenetic band end position + + + + + cnv type + + + + + + + + + + + copy-number + + + + + + + + + + number of regions the CNV consists of (i.e. number of bins in WGS and number of exons in WES/panel) + + + + + + + + + + If the variant is causal in the context of the diagnostics phenotype. + + + + + if the variant is de-novo + + + + + if the variant is compound-heterozygous + + + + + if the variant is a mosaic variant + + + + + inheritance mode of the variant (i.e. inheritance mode of the gene for this phenotype) + + + + + + + + + + + + + + + + Variant classification. 1=benign ... 5=pahogenic M=modifier + + + + + + + + + + + + + + + + Comments of first assessor + + + + + Comments of second + + + + + RNA information + + + + + + + + + + + + + report type of the variant. Needed to distinguish different report type variants in case "all"was selected. + + + + + + + + + + + + HGVS variant type + + + + + HGVS variant suffix (after type) + + + + + + + + CNV caller used + + + + + Overall number of variants before filtering + + + + + + + + genome build that the CNV positions refer to e.g. GRCh37 + + + + + + + + + + + overall CNV calling quality + + + + + + + + + + + + + number of iterations (for ClinCNV caller only) + + + + + number of high-quality CNV calls, i.e. log-likelihood>20 for ClinCNV + + + + + correlation of sample coverage profile to reference pool coverage profile + + + + + + + Structural variants of interest + + + + + + Reprentation of a single structural variant + + + + + + Genes that overlap the SV + + + + + HGNC gene name + + + + + HGNC identiifer + + + + + + + + + + + + + SV type + + + + + + + + + + + + + + chromosome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + genomic start position + + + + + genomic end position + + + + + cytogenetic band start position + + + + + cytogenetic band end position + + + + + variant genotype + + + + + + + + + + + + inserted sequence (only for insertion) + + + + + chromosome of second region (only for breakend) + + + + + genomic start position of second region (only for breakend) + + + + + genomic end position of second region (only for breakend) + + + + + If the variant is causal in the context of the diagnostics phenotype. + + + + + if the variant is de-novo + + + + + if the variant is compound-heterozygous + + + + + if the variant is a mosaic variant + + + + + inheritance mode of the variant (i.e. inheritance mode of the gene for this phenotype) + + + + + + + + + + + + + + + + Variant classification. 1=benign ... 5=pahogenic M=modifier + + + + + + + + + + + + + + + + Comments of first assessor + + + + + Comments of second + + + + + RNA information + + + + + + + + + + + + + report type of the variant. Needed to distinguish different report type variants in case "all"was selected. + + + + + + + + + + + + HGVS variant type + + + + + HGVS variant suffix after type + + + + + HGVS variant type (only for breakend) + + + + + HGVS variant suffix after type (only for breakend) + + + + + + + + SV caller used + + + + + Overall number of variants before filtering + + + + + + + + genome build that the SV positions refer to e.g. GRCh37 + + + + + + + + + + + + + Repeat expansions of interest + + + + + + Reprentation of a single repeat expansion + + + + + name of the RE. use for display purposes only! To dientify a RE, use region and repeat unit + + + + + chromosome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + genomic start position + + + + + genomic end position + + + + + sequence of the repeat unit + + + + + allele 1 repeat count + + + + + allele 2 repeat count + + + + + If the variant is causal in the context of the diagnostics phenotype. + + + + + if the variant is de-novo + + + + + if the variant is compound-heterozygous + + + + + if the variant is a mosaic variant + + + + + inheritance mode of the variant (i.e. inheritance mode of the gene for this phenotype) + + + + + + + + + + + + + + Comments of first assessor + + + + + Comments of second + + + + + report type of the variant. Needed to distinguish different report type variants in case "all"was selected. + + + + + + + + + + + + + + + RE caller used + + + + + genome build that the SV positions refer to e.g. GRCh37 + + + + + + + + + + + + List of polygenic risk scores that were calculated + + + + + + Representation of a single polygenic risk score + + + + + PRS identifier, e.g. PGS id + + + + + + + + + + trait/disease name + + + + + + + + + + Publication, URL or any other reference to where more information about the PRS can be found. + + + + + + + + + + PRS raw score + + + + + PRS percentile in the raw score distribution of the population (only available/valid if the patient has the same ancestry as the population) + + + + + PRS z-score based on the raw score distribution of the population (only available/valid if the patient has the same ancestry as the population) + + + + + + + + + + Other causal variant. Either uncalled variant from above types, or other variant type. + + + + + Variant type + + + + + + + + + + + + + + + Vairiant definition (HGVS nomenclature, coordinates or other concise description) + + + + + Affected/causal gene + + + + + Variant inheritance + + + + + + + + + + + + + + + Description + + + + + + + Generated report text document - base64 encoded + + + + + + + Data format of the document + + + + + + + + + + + + + + + + version of the format + + + + + + + + + + + report type + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/cppXML-TEST/data/SomaticReport.xsd b/src/cppXML-TEST/data/SomaticReport.xsd new file mode 100644 index 000000000..dacdc7c92 --- /dev/null +++ b/src/cppXML-TEST/data/SomaticReport.xsd @@ -0,0 +1,954 @@ + + + + + + Somatic NGS report + + + + + + Meta data about the report generation + + + + + date of report creation + + + + + user that created the report + + + + + + + + + + software that created the report (including version if possible) + + + + + + + + + + + + Meta data about the patient + + + + + + Disease and phenotype information of the patient + + + + + Source database of the disease/phenotype identifier + + + + + + + + + + + Disease/phenotype identifier + + + + + + + + + + + + + SAP patient identifier + + + + + + + Information about the tumor sample + + + + + + QC terms of the sample as defined in https://github.com/imgag/ngs-bits/blob/master/src/cppNGS/Resources/qcML.obo + + + + + accession of the term + + + + + name of the term + + + + + extended description of the term + + + + + QC metric value + + + + + + + + sample name/identifier + + + + + + + + + + processing system name, e.g. 'Panel XY', etc. + + + + + processing system type + + + + + + + + + + + + + Sequencer used for data generation + + + + + Average depth of the sample (in the target region) + + + + + + + + + + Sample type + + + + + + + + + + + + If the sample is FFPE + + + + + Source tissue according to BRENDA tissue ontology + + + + + tumor content determined by pathology + + + + + + + + + + + tumor content determined from the data + + + + + + + + + + + tumor mutation burden in mutations per megabase + + + + + + + + + + Microsatellite instability: unstable sites in percent + + + + + + + + + + + homologous recombination deficiency score (TOP-ART study), DEPRECATED + + + + + + + + homologous recombination deficiency score (sum of LOHs, telomeric allelic imbalances and long state transitions) calculated by scarHRD tool + + + + + + + + + + Information about the normal sample used as reference for the tumor sample + + + + + + QC terms of the sample as defined in https://github.com/imgag/ngs-bits/blob/master/src/cppNGS/Resources/qcML.obo + + + + + accession of the term + + + + + name of the term + + + + + extended description of the term + + + + + QC metric value + + + + + + + + sample name/identifier + + + + + + + + + + processing system name, e.g. 'Panel XY', etc. + + + + + processing system type + + + + + + + + + + + + Sequencer used for data generation + + + + + Average depth of the sample (in the target region) + + + + + + + + + + + + Information about the used analysis pipeline + + + + + name of the used analysis pipeline + + + + + + + + + + version of the analysis pipeline + + + + + + + + + + URL where ithe analysis pipeline is described + + + + + + + + + + Comments. Here the prpeline can be described and tools for individual steps can be listed. At least the variant caller should be given. + + + + + + + Information about the traget region used for the analysis + + + + + + Single target region + + + + + chromosome + + + + + + + + genomic start position + + + + + genomic end position + + + + + + + List of genes contained in target region. + + + + + Gene symbol (HGNC) + + + + + + + + + + HGNC gene identifer + + + + + + + + + + + + + target region name + + + + + + + + + + + + Detected high-quality small variants in the tumor + + + + + + Representation of a single variant + + + + + + The variiant lies in a known hotspot + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + Genes that overlap the variant + + + + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + + HGNC gene name + + + + + + + + + + HGNC gene identifer + + + + + + + + + + Role of the gene in cancer. + + + + + + + + + + + + + + Transcript-specific annotation data + + + + + transcript identifier, i.e. RefSeq NM or Ensembl ENST + + + + + HGNC gene name + + + + + variant type, e.g. missense + + + + + HGVS-compliant cDNA change + + + + + HGVS-compliant protein change + + + + + exon number, e.g. 11/27. The second number is the overal number of exons of the transcript + + + + + variant type according to sequence ontology, see http://www.sequenceontology.org/ + + + + + Most important transcript of the gene that should be used e.g. in a report. + + + + + + + + + Annotation type + + + + + + + + + + + + + + Version of the annotation, e.g. the database or algorithm version + + + + + Sources of the information, e.g. database name + + + + + + + + chromosome + + + + + genomic start position + + + + + genomic end position + + + + + reference base sequence (VCF style for indels) + + + + + observed base sequence (VCF style for indels) + + + + + Tumor allele frequency + + + + + + + + + + + Tumor depth + + + + + Normal sample frequency + + + + + + + + + + + Normal sample depth + + + + + Effect of the variant according VICC standard. + + + + + + + + + + + + + + + + + + + Detected high-quality CNVs in the tumor + + + + + + Representation of a single CNV + + + + + + Genes that overlap the CNV + + + + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + + HGNC gene name + + + + + + + + + + HGNC gene identifer + + + + + + + + + + Role of the gene in cancer. + + + + + + + + + + + + + + + chromosome + + + + + genomic start position + + + + + genomic end position + + + + + cytogenetic band start position + + + + + cytogenetic band end position + + + + + Allele frequency in tumor sample (not considerung the tumor content) + + + + + + + + + + Copy number state + + + + + + + + + + + + CNV type + + + + + + + + + + + + + + + + + Estimated copy-number in tumor + + + + + + + + + + Estimated copy-number in allele A of tumor + + + + + + + + + + Estimated copy-number in allele B of tumor + + + + + + + + + + + + + + + Generated report text document - base64 encoded + + + + + + + Data format of the document + + + + + + + + + + + + + + + base64-encoded report tables/images for re-use in other software + + + + + + + Name of the part. + + + + + + + + + + + + + + + + + + + Data format of the part. + + + + + + + + + + + + + + + + version of the format + + + + + + + + + + + reference genome build that all variant positions refer to + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/TumorOnlyNGSReport_v1.xsd b/src/cppXML-TEST/data/TumorOnlyNGSReport_v1.xsd new file mode 100644 index 000000000..ccffefdc0 --- /dev/null +++ b/src/cppXML-TEST/data/TumorOnlyNGSReport_v1.xsd @@ -0,0 +1,557 @@ + + + + + + Tumor Only NGS report + + + + + + Meta data about the report generation + + + + + date of report creation + + + + + user that created the report + + + + + + + + + + software that created the report (including version if possible) + + + + + + + + + + + + Information about the tumor sample + + + + + + QC terms of the sample as defined in https://github.com/imgag/ngs-bits/blob/master/src/cppNGS/Resources/qcML.obo + + + + + accession of the term + + + + + name of the term + + + + + extended description of the term + + + + + QC metric value + + + + + + + + sample name/identifier + + + + + + + + + + processing system name, e.g. 'Panel XY', etc. + + + + + processing system type, e.g panel, WES etc. + + + + + + + + + + + + Additional information about the sample + + + + + + + Information about the pipeline that was used for the analysis + + + + + name of the used analysis pipeline + + + + + + + + + + version of the analysis pipeline + + + + + + + + + + + + Information about the traget region used for the analysis + + + + + + Single target region + + + + + chromosome + + + + + + + + genomic start position + + + + + genomic end position + + + + + + + List of genes contained in target region. + + + + + + Omim information about the gene + + + + + OMIM gene number + + + + + + + + + + OMIM phenotype + + + + + + + + + + OMIM phenotype number + + + + + + + + + + + + Gap overlapping with the gene + + + + + chromosome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start of gap + + + + + + + + + + end of gap + + + + + + + + + + + + + Gene symbol (HGNC) + + + + + + + + + + HGNC gene identifer + + + + + + + + + + Bases of the longest (coding) transcript + + + + + + + + + + + target region name + + + + + + + + + + + + Detected high-quality small variants in the tumor + + + + + + Representation of a single variant + + + + + + Genes that overlap the variant + + + + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + + + Sources of the information, e.g. database name + + + + + Version of the source + + + + + + + + HGNC gene name + + + + + + + + + + HGNC gene identifer + + + + + + + + + + + + Transcript-specific annotation data + + + + + transcript identifier, i.e. RefSeq NM or Ensembl ENST + + + + + HGNC gene name + + + + + variant type, e.g. missense + + + + + HGVS-compliant cDNA change + + + + + HGVS-compliant protein change + + + + + exon number, e.g. 11/27. The second number is the overal number of exons of the transcript + + + + + variant type according to sequence ontology, see http://www.sequenceontology.org/ + + + + + Most important transcript of the gene that should be used e.g. in a report. + + + + + + + + chromosome + + + + + genomic start position + + + + + genomic end position + + + + + reference base sequence (VCF style for indels) + + + + + observed base sequence (VCF style for indels) + + + + + Tumor allele frequency + + + + + + + + + + + Tumor depth + + + + + Somatic classification of the variant. + + + + + + + + + + + + + + + Germline classification of the variant + + + + + + + + + + + + + + + + + + + + + Generated report text document - base64 encoded + + + + + + + Data format of the document + + + + + + + + + + + + + + + + version of the format + + + + + + + + + + + reference genome build that all variant positions refer to + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/germline_report1.xml b/src/cppXML-TEST/data/germline_report1.xml new file mode 100644 index 000000000..231fb1014 --- /dev/null +++ b/src/cppXML-TEST/data/germline_report1.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/germline_report2.xml b/src/cppXML-TEST/data/germline_report2.xml new file mode 100644 index 000000000..a2f653caf --- /dev/null +++ b/src/cppXML-TEST/data/germline_report2.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/germline_report4.xml b/src/cppXML-TEST/data/germline_report4.xml new file mode 100644 index 000000000..fa89d7655 --- /dev/null +++ b/src/cppXML-TEST/data/germline_report4.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/somatic_report.xml b/src/cppXML-TEST/data/somatic_report.xml new file mode 100644 index 000000000..7dfcd7682 --- /dev/null +++ b/src/cppXML-TEST/data/somatic_report.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SSBhbSB0aGUgc3VtbWFyeSBwYXJ0IG9mIHRoZSBSVEYgcmVwb3J0 + cmVsZXZhbnQgU05WcyBhbmQgSU5ERUxz + dW5jbGVhciBTTlZz + Y2hyb21vc29tYWwgYWJlcnJhdGlvbnM= + RnVzaW9ucw== + UlRGIHBoYXJtYWNvZ2Vub21pY3MgdGFibGU= + Z2VuZXJhbCBtZXRhIGRhdGE= + ODk1MDRFNDcwRDBBMUEwQTAwMDAwMDBENDk0ODQ0NTIwMDAwMDAwMjAwMDAwMDAyMDgwMjAwMDAwMEZERDQ5QTczMDAwMDAwMDk3MDQ4NTk3MzAwMDAyRTIzMDAwMDJFMjMwMTc4QTUzRjc2MDAwMDAwMTY0OTQ0NDE1NDA4RDc2MzYwNjA2MDY4NkU2RTY2RjhGRkZGRkY3RjA2MDYwMDFGQ0QwNTg2Q0MzNzdERUMwMDAwMDAwMDQ5NDU0RTQ0QUU0MjYwODI= + TVRCIHN1bW1hcnk= + SExBIHN1bW1hcnk= + diff --git a/src/cppXML-TEST/data/somatic_report_tumor_normal_1.xml b/src/cppXML-TEST/data/somatic_report_tumor_normal_1.xml new file mode 100644 index 000000000..b6b017cb2 --- /dev/null +++ b/src/cppXML-TEST/data/somatic_report_tumor_normal_1.xml @@ -0,0 +1,21321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQWxsZ2VtZWluZSBnZW5ldGlzY2hlIENoYXJha3RlcmlzdGlrYSAoXHFsCnsKXGZzMTYKRE5BMTIzNDU2XzAxLU5BMTI4NzhfMDMKfSkKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjUwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKVHVtb3JhbnRlaWwgKGhpc3QuL21vbGVrdWxhcikKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAo3MCAlIC8gNjUgJSwgNjIuNiAlCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKTXV0YXRpb25zbGFzdAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CjMsNDEgVmFyL01icDsKXGxpbmUKXHFsCnsKXGZzMTQKVmVyZ2xlaWNoc3dlcnRlOiBUZXN0IHJlZmVyZW5jZSB0ZXh0IGZvciB0aGUgdG1iIG9mIHRoaXMgYW5hbHlzaXMhCn0KfQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApNaWtyb3NhdGVsbGl0ZW4KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAprZWluIEhpbndlaXMgYXVmIGVpbmUgTVNJCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI1MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CkZ1c2lvbmVuL1N0cnVrdHVydmFyaWFudGVuCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKSGlud2Vpc2UgYXVmIHdhaHJzY2hlaW5saWNoIG9ua29nZW5lIFN0cnVrdHVydmFyaWFudGVuCn0KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjUwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKVmlydXMtRE5BCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKSGlud2Vpc2UgYXVmIEhUTFYtMSwgSEJWCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI1MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CkNOVi1MYXN0Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKMTIgJQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApIUkQtU2NvcmUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApIaW53ZWlzZSBhdWYgZWluZSBIUkRccWwKewpcZnMxNAoKXGxpbmUKSFJELVNjb3JlIGNocm9tb3NvbWFsZSBWZXJcdTIyODtuZGVydW5nZW46IDQ4IChIUkQgYmVpIFx1ODgwNTsgNDIpCn0KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjUwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKQW5tZXJrdW5nZW4KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApETkEtTWVuZ2UgaW0gVHVtb3IgenUgZ2VyaW5nLCBQcm9iZSBoZXRlcm9nZW4KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFqClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE0ClxxbAp7ClxmczE0ClxiClR1bW9yYW50ZWlsCn0gKGhpc3QuKTogVm9uIGRlciBQYXRob2xvZ2llIG1pdGdldGVpbHQ7IChtb2xla3VsYXIpOiBEaWUgQmVyZWNobnVuZyBkZXMgVHVtb3JhbnRlaWxzIGJlcnVodCBhdWYgZGVtIEFudGVpbCBkZXIgbmFjaGdld2llc2VuZW4gU05WcyBvZGVyIENOVnMuIFxxbAp7ClxmczE0ClxiCk11dGF0aW9uc2xhc3Q6Cn0gQW56YWhsIGRlciBWYXJpYW50ZW4gaW4gZGVuIGtvZGllcmVuZGVuIHVudGVyc3VjaHRlbiBHZW5lbiBub3JtaWVydCBhdWYgZWluZSBNaWxsaW9uIEJhc2VucGFhcmU7IFxxbAp7ClxmczE0ClxiCk1pa3Jvc2F0ZWxsaXRlbjoKfSBCZXdlcnR1bmcgZGVyIE1pa3Jvc2F0ZWxsaXRlbmluc3RhYmlsaXRcdTIyODt0OyBccWwKewpcZnMxNApcYgpDTlYtTGFzdDoKfSBBbnRlaWwgZGVzIEdlbm9tcywgYmVpIGRlbSBkaWUgS29waWVuemFobCB2ZXJcdTIyODtuZGVydCBpc3QuIFxxbAp7ClxmczE0ClxiCkhSRDoKfSBIb21vbG9nZSBSZWtvbWJpbmF0aW9ucy1EZWZpemllbnouCn1cY2VsbH0KXHJvdwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1xwYXJkClxzYTMwClxzYjI1MApccWwKewpcZnMxOApcYgpQb3RlbnRpZWxsIHJlbGV2YW50ZSBzb21hdGlzY2hlIFZlclx1MjI4O25kZXJ1bmdlbjoKfQpccGFyCgpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGNicGF0NFx0cmhkclxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClB1bmt0bXV0YXRpb25lbiAoU05WcyksIGtsZWluZSBJbnNlcnRpb25lbi9EZWxldGlvbmVuIChJTkRFTHMpIHVuZCBLb3BpZW56YWhsdmFyaWFudGVuIChDTlZzKQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpHZW4KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpWZXJcdTIyODtuZGVydW5nCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKVHlwCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQW50ZWlsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQmVzY2hyZWlidW5nCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKTW9sZWt1bGFyZXIgU2lnbmFsd2VnCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpClBNUzJcc3VwZXIjCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKYy4xNTEwR1x1NjI7VCwgcC5HbHU1MDRUZXJcbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAyNjU4NDkuMTIKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnN0b3BfZ2FpbmVkCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw0OQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnBhdGhvZ2VuZSBWYXJpYW50ZSwgaW4gZGVyIE5vcm1hbHByb2JlIGhldGVyb3p5Z290Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkJSQ0EyXHN1cGVyIwp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CmMuNTg2NENcdTYyO0EsIHAuU2VyMTk1NVRlclxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDM4MDE1Mi44Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApzdG9wX2dhaW5lZAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNTAKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApwYXRob2dlbmUgVmFyaWFudGUsIGluIGRlciBOb3JtYWxwcm9iZSBoZXRlcm96eWdvdAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CkhSRAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpCUkNBMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuNTg0NV81ODY4ZGVsLCBwLkFzcDE5NDlfQXNwMTk1NmRlbFxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDM4MDE1Mi44Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAppbmZyYW1lX2RlbGV0aW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwxMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVua2xhcmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApIUkQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1nZlxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtZ2ZcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpBUEMKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOApjLjY0NkNcdTYyO1QsIHAuQXJnMjE2VGVyXGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMjU3NDMwLjkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnN0b3BfZ2FpbmVkLCBzcGxpY2VfcmVnaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwyMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZhcmlhbnRlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKV05UCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtcmdcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQVBDCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFsCnsKXGZzMTgKYy40NDc2ZGVsLCBwLlRocjE0OTNBcmdmc1RlcjE0XGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMjU3NDMwLjkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CmZyYW1lc2hpZnQKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDU1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApXTlQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1yZ1xjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtcmdcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpBUEMKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOApjLjc3NTdHXHU2MjtULCBwLlNlcjI1ODZJbGVcbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAyNTc0MzAuOQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbWlzc2Vuc2UKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDEwCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKdW5rbGFyZSBWYXJpYW50ZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CldOVAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1yZ1xjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkFQQwp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkxPSApcbGluZQpccWwKewpcZnMxNApjaHI1Cn1ccWwKewpcZnMxNAo7IHExMy4zcTMxLjMKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbm9uLWZvY2FsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwyOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4ClxoaWdobGlnaHQzClZlcmx1c3QgZGVzIFdpbGR0eXBhbGxlbHMKfQpcbGluZQp1bmtsYXJlIEJlZGV1dHVuZyBmXHUyNTI7ciBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtZ2ZcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bWdmXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKRUdGUgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuMjU3M1RcdTYyO0csIHAuTGV1ODU4QXJnXGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMjc1NDkzLjcKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm1pc3NlbnNlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwxNgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZhcmlhbnRlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKUmV6ZXB0b3ItVHlyb3NpbmtpbmFzZQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1yZ1xjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkVHRlIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxOApBTVAgKDI5IEtvcGllbikKXGxpbmUKXHFsCnsKXGZzMTQKY2hyNwp9XHFsCnsKXGZzMTQKOyBwMTEuMgp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApjbHVzdGVyCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZlclx1MjI4O25kZXJ1bmcKXGxpbmUKbVx1MjQ2O2dsLiBcdTIyMDtiZXJleHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCk5PVENIMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuNTE1NUdcdTYyO1QsIHAuR2x1MTcxOVRlclxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDY1MTY3MS4xCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApzdG9wX2dhaW5lZAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNDEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAp3YWhyc2NoLiBvbmtvZ2VuZSBWYXJpYW50ZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpURVJUCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKXGhpZ2hsaWdodDMKPz8/Cn1cbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAzMTA1ODEuMTAKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVwc3RyZWFtX2dlbmUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDIxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQ0RLMTIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxOApERUwgKGhldCkKXGxpbmUKXHFsCnsKXGZzMTQKY2hyMTcKfVxxbAp7ClxmczE0CjsgcTEycTIxLjIKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKY2x1c3Rlcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKSFJECn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkNES04yQQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaG9tKQpcbGluZQpccWwKewpcZnMxNApjaHI5Cn1ccWwKewpcZnMxNAo7IHAyMS4zCn0KfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CmNsdXN0ZXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClplbGx6eWtsdXMvQXBvcHRvc2UKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQ0RLTjJCCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKREVMIChob20pClxsaW5lClxxbAp7ClxmczE0CmNocjkKfVxxbAp7ClxmczE0CjsgcDIxLjMKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKY2x1c3Rlcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKWmVsbHp5a2x1cy9BcG9wdG9zZQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpDSEVLMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIyMgp9XHFsCnsKXGZzMTQKOyBxMTEuMXExMy4zMwp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClplbGx6eWtsdXMvQXBvcHRvc2UsIEhSRAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpGQU5DRwp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHI5Cn1ccWwKewpcZnMxNAo7IHAxMy4zcDIxLjMKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbm9uLWZvY2FsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZlclx1MjI4O25kZXJ1bmcKXGxpbmUKbVx1MjQ2O2dsLiByZWR1emllcnRlIEV4cHJlc3Npb24KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApIUkQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKRkFOQ0wKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxOApERUwgKGhldCkKXGxpbmUKXHFsCnsKXGZzMTQKY2hyMgp9XHFsCnsKXGZzMTQKOyBwMTMuMnAyNS4xCn0KfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm5vbi1mb2NhbAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsMzgKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKSFJECn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCk5GMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIyMgp9XHFsCnsKXGZzMTQKOyBxMTEuMXExMy4zMwp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClBJM0stQUtULU1UT1IKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKUFRFTgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIxMAp9XHFsCnsKXGZzMTQKOyBxMTEuMXEyNi4zCn0KfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm5vbi1mb2NhbAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKUEkzSy1BS1QtTVRPUgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpTTUFENAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIxOAp9XHFsCnsKXGZzMTQKOyBxMTIuMnEyMS4zMQp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClJlemVwdG9yLVR5cm9zaW5raW5hc2UKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFqClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE0ClxxbAp7ClxmczE0ClxiClZlclx1MjI4O25kZXJ1bmc6IAp9S29kaWVyZW5kZSBQb3NpdGlvbiwgXHFsCnsKXGZzMTQKXGIKU05WCn0gUHVua3RtdXRhdGlvbmVuIFxxbAp7ClxmczE0ClxpCihzaW5nbGUgbnVjbGVvdGlkZSB2YXJpYW50KSwgCn1ccWwKewpcZnMxNApcYgpJTkRFTHMKfSBJbnNlcnRpb25lbi9EZWxldGlvbmVuLCBccWwKewpcZnMxNApcYgpDTlYKfSBLb3BpZW56YWhsdmFyaWFudGUsIFxxbAp7ClxmczE0ClxiCkFNUAp9IEFtcGxpZmlrYXRpb24sIFxxbAp7ClxmczE0ClxiCkRFTAp9IERlbGV0aW9uIFxxbAp7ClxmczE0ClxiCkxPSAp9IEtvcGllbm5ldXRyYWxlciBWZXJsdXN0IGRlciBIZXRlcm96eWdvdGllLCBccWwKewpcZnMxNApcYgpXVAp9IFdpbGR0eXBhbGxlbCwgXHFsCnsKXGZzMTQKXGIKTVVUCn0gTXV0aWVydGVzIEFsbGVsOyBccWwKewpcZnMxNApcYgpUeXA6Cn0gQXJ0IGRlciBTTlYgb2RlciBHclx1MjQ2O1x1MjIzO2UgdW5kIEF1c2RlaG51bmcgZGVyIENOVjogXHFsCnsKXGZzMTQKXGIKZm9jYWwKfSAoIGJpcyB6dSAzIEdlbmUpLCBccWwKewpcZnMxNApcYgpDbHVzdGVyCn0gKHdlbmlnZXIgYWxzIDI1JSBkZXMgQ2hyb21vc29tZW5hcm1zKSBccWwKewpcZnMxNApcYgpub24tZm9jYWwKfSAoQ2hyb21vc29tZW5hbnRlaWwpOyBccWwKewpcZnMxNApcYgpBbnRlaWw6Cn0gQW50ZWlsIGRlciBBbGxlbGUgbWl0IGRlciBnZWxpc3RldGVuIFZhcmlhbnRlIChTTlYsIElOREVMKSBiencuIEFudGVpbCBkZXIgWmVsbGVuIG1pdCBkZXIgZW50c3ByZWNoZW5kZW4gS29waWVuemFobHZhcmlhbnRlIChDTlYpIGluIGRlciB1bnRlcnN1Y2h0ZW4gUHJvYmU7IFxxbAp7ClxmczE0ClxiCkJlc2NocmVpYnVuZzogCn1JbmZvcm1hdGlvbmVuIGF1cyBEYXRlbmJhbmtlbiAoei5CLiBDT1NNSUMsIENhbmNlcmhvdHNwb3RzLCBDYW5jZXIgR2Vub21lIEludGVycHJldGVyLCBQdWJNZWQsIE9ua29LQiwgQ2xpblZhciwgT01JTSwgVmFyU29tZSwgTE9WRCwgSEdNRCkgenUgZGVyIFZhcmlhbnRlIHVuZCBmdW5rdGlvbmVsbGUgRGF0ZW4gd2VyZGVuIGludGVncmllcnQgdW5kIGRpZSBPbmtvZ2VuaXRcdTIyODt0IGRlciBWZXJcdTIyODtuZGVydW5nIHdpcmQgbmFjaCBccWwKewpcZnMxNApcaQpWYXJpYW50IEludGVycHJldGF0aW9uIGZvciBDYW5jZXIgQ29uc29ydGl1bQp9IChWSUNDKS1SaWNodGxpbmllbiBiZXdlcnRldC4gSW4gZGllc2VyIFRhYmVsbGUgc2luZCBudXIgb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZ2VuIGRhcmdlc3RlbGx0LgpcbGluZQp7XHN1cGVyI30gYXVjaCBpbiBkZXIgTm9ybWFscHJvYmUgbmFjaGdld2llc2VuLgp9XGNlbGx9Clxyb3cKXHBhcmQKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn0KXHBhcgoKXHBhcmQKXHNhMzAKXHNiMzAKXHNsMjc2XHNsbXVsdDEKXHFqCnsKXGZzMTgKXHFsCnsKXGZzMTgKXGIKRXMgZ2lidCBIaW53ZWlzZSBhdWYgd2FocnNjaGVpbmxpY2ggb25rb2dlbmUgU3RydWt0dXJ2YXJpYW50ZW4gKHMuIEFubGFnZSk6Cn0KXGxpbmUKQmVzY2hyZWlidW5nIERlbGV0aW9uClxsaW5lCkJlc2NocmVpYnVuZyBJbnNlcnRpb24KXGxpbmUKQmVzY2hyZWlidW5nIEludmVyc2lvbgpcbGluZQpCZXNjaHJlaWJ1bmcgQnJlYWtwb2ludApcbGluZQpCZXNjaHJlaWJ1bmcgRHVwbGljYXRpb24KfQpccGFyCgpccGFyZApcc2EzMApcc2IzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOAoKfQpccGFyCgpccGFyZApcc2EzMApcc2IzMApcc2wyNzZcc2xtdWx0MQpccWoKewpcZnMxOApccWwKewpcZnMxOApVbnNlcmUgRGF0ZW4gd2Vpc2VuIGF1ZiBkYXMgVm9ybGllZ2VuIGRlcyBIYXBsb3R5cHMgSExBLUEqMDI6MDEgaW4gZGVyIFR1bW9ycHJvYmUsIGplZG9jaCBuaWNodCBpbiBkZXIgTm9ybWFscHJvYmUsIGhpbiAocy4gQW5sYWdlKS4KfQp9ClxwYXIKClxwYXJkClxzYTMwClxzYjMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4Cgp9ClxwYXIKClxwYXJkClxzYTMwClxzYjMwClxzbDI3NlxzbG11bHQxClxxagp7ClxmczE4ClxxbAp7ClxmczE4ClxiCkxpbWl0YXRpb25lbjogCn1UaGlzIHRleHQgc2hvdWxkIGFwcGVhciBhcyBsaW1pdGF0aW9ucyEKfQpccGFyCgp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1xwYXJkClxzYTMwClxzYjI1MApccWwKewpcZnMxOApcYgpWYXJpYW50ZW4gdW5rbGFyZXIgT25rb2dlbml0XHUyMjg7dDoKfQpccGFyClx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKUHVua3RtdXRhdGlvbmVuIChTTlZzKSwga2xlaW5lIEluc2VydGlvbmVuL0RlbGV0aW9uZW4gKElOREVMcykgdW5kIEtvcGllbnphaGx2YXJpYW50ZW4gKENOVnMpCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiCkdlbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClZlclx1MjI4O25kZXJ1bmcKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpUeXAKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpBbnRlaWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpCZXNjaHJlaWJ1bmcKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpNb2xla3VsYXJlciBTaWduYWx3ZWcKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1nZlxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtZ2ZcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpBTEsKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOApjLjQ0MDRkZWwsIHAuUHJvMTQ2OUFyZ2ZzVGVyOFxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDM4OTA0OC44Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApmcmFtZXNoaWZ0Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwyMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVua2xhcmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApSZXplcHRvci1UeXJvc2lua2luYXNlCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtcmdcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQUxLCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKREVMIChoZXQpClxsaW5lClxxbAp7ClxmczE0CmNocjIKfVxxbAp7ClxmczE0CjsgcDEzLjJwMjUuMQp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKdW5rbGFyZSBTaWduaWZpa2FueiBkZXIgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpIMy0zQQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuMTdBXHU2MjtULCBwLkdsbjZMZXVcbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAzNjY4MTMuMQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbWlzc2Vuc2UKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDI4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKdW5rbGFyZSBWYXJpYW50ZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpTQUNTCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFsCnsKXGZzMTgKYy45MTQyQ1x1NjI7VCwgcC5BcmczMDQ4Q3lzXGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMzgyMjkyLjkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm1pc3NlbnNlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw0NAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVua2xhcmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFqClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE0ClxxbAp7ClxmczE0ClxiClZlclx1MjI4O25kZXJ1bmc6IAp9S29kaWVyZW5kZSBQb3NpdGlvbiwgXHFsCnsKXGZzMTQKXGIKU05WCn0gUHVua3RtdXRhdGlvbmVuIFxxbAp7ClxmczE0ClxpCihzaW5nbGUgbnVjbGVvdGlkZSB2YXJpYW50KSwgCn1ccWwKewpcZnMxNApcYgpJTkRFTHMKfSBJbnNlcnRpb25lbi9EZWxldGlvbmVuLCBccWwKewpcZnMxNApcYgpDTlYKfSBLb3BpZW56YWhsdmFyaWFudGUsIFxxbAp7ClxmczE0ClxiCkFNUAp9IEFtcGxpZmlrYXRpb24sIFxxbAp7ClxmczE0ClxiCkRFTAp9IERlbGV0aW9uIFxxbAp7ClxmczE0ClxiCkxPSAp9IEtvcGllbm5ldXRyYWxlciBWZXJsdXN0IGRlciBIZXRlcm96eWdvdGllLCBccWwKewpcZnMxNApcYgpXVAp9IFdpbGR0eXBhbGxlbCwgXHFsCnsKXGZzMTQKXGIKTVVUCn0gTXV0aWVydGVzIEFsbGVsOyBccWwKewpcZnMxNApcYgpUeXA6Cn0gQXJ0IGRlciBTTlYgb2RlciBHclx1MjQ2O1x1MjIzO2UgdW5kIEF1c2RlaG51bmcgZGVyIENOVjogXHFsCnsKXGZzMTQKXGIKZm9jYWwKfSAoIGJpcyB6dSAzIEdlbmUpLCBccWwKewpcZnMxNApcYgpDbHVzdGVyCn0gKHdlbmlnZXIgYWxzIDI1JSBkZXMgQ2hyb21vc29tZW5hcm1zKSBccWwKewpcZnMxNApcYgpub24tZm9jYWwKfSAoQ2hyb21vc29tZW5hbnRlaWwpOyBccWwKewpcZnMxNApcYgpBbnRlaWw6Cn0gQW50ZWlsIGRlciBBbGxlbGUgbWl0IGRlciBnZWxpc3RldGVuIFZhcmlhbnRlIChTTlYsIElOREVMKSBiencuIEFudGVpbCBkZXIgWmVsbGVuIG1pdCBkZXIgZW50c3ByZWNoZW5kZW4gS29waWVuemFobHZhcmlhbnRlIChDTlYpIGluIGRlciB1bnRlcnN1Y2h0ZW4gUHJvYmU7IFxxbAp7ClxmczE0ClxiCkJlc2NocmVpYnVuZzogCn1JbmZvcm1hdGlvbmVuIGF1cyBEYXRlbmJhbmtlbiAoei5CLiBDT1NNSUMsIENhbmNlcmhvdHNwb3RzLCBDYW5jZXIgR2Vub21lIEludGVycHJldGVyLCBQdWJNZWQsIE9ua29LQiwgQ2xpblZhciwgT01JTSwgVmFyU29tZSwgTE9WRCwgSEdNRCkgenUgZGVyIFZhcmlhbnRlIHVuZCBmdW5rdGlvbmVsbGUgRGF0ZW4gd2VyZGVuIGludGVncmllcnQgdW5kIGRpZSBPbmtvZ2VuaXRcdTIyODt0IGRlciBWZXJcdTIyODtuZGVydW5nIHdpcmQgbmFjaCBccWwKewpcZnMxNApcaQpWYXJpYW50IEludGVycHJldGF0aW9uIGZvciBDYW5jZXIgQ29uc29ydGl1bQp9IChWSUNDKS1SaWNodGxpbmllbiBiZXdlcnRldC4gSW4gZGllc2VyIFRhYmVsbGUgc2luZCBudXIgdW5rbGFyZSBWZXJcdTIyODtuZGVydW5nZW4gZGFyZ2VzdGVsbHQuCn1cY2VsbH0KXHJvdwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQ2hyb21vc29tYWxlIEFiZXJyYXRpb25lbgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNgpcYgpQb3NpdGlvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiCkNOVgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiClR5cAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiCkNOCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTYKXGIKQW50ZWlsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTYKXGIKR2VuZQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIyCn1cbGluZQpccWwKewpcZnMxMgoxMTgxMzIwNCAtIDcyNjkzNDExCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApERUwKfVxsaW5lClxxbAp7ClxmczEyCig2MC45IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKcGFydGlhbCBwLWFybQpcbGluZVxxbAp7ClxmczEyCnAxMy4ycDI1LjEKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKQUxLLCBCSVJDNiwgQ0FELCBFUEFTMSwgRkFOQ0wsIE1BUDRLMywgTVlDTiwgU09TMSwgWFBPMQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI1Cn1cbGluZQpccWwKewpcZnMxMgo3NjU4ODg4NSAtIDE0MDc4NTI3MAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKTE9ICn1cbGluZQpccWwKewpcZnMxMgooNjQuMiBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CnBhcnRpYWwgcS1hcm0KXGxpbmVccWwKewpcZnMxMgpxMTMuM3EzMS4zCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoyCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwyOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkFQQywgTlJHMiwgUkFENTAsIFJBU0ExCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE4MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI3MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ4MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE0CmNocjcKfVxsaW5lClxxbAp7ClxmczEyCjU0NjUxNzQ2IC0gNTU1OTk2NjEKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxxbAp7ClxmczE0CkFNUAp9XGxpbmUKXHFsCnsKXGZzMTIKKDAuOSBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CmNsdXN0ZXIKXGxpbmVccWwKewpcZnMxMgpwMTEuMgp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMjkKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKRUdGUgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI3Cn1cbGluZQpccWwKewpcZnMxMgo3Njk4OTEzNCAtIDgyNTk2MTk5Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApBTVAKfVxsaW5lClxxbAp7ClxmczEyCig1LjYgTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApjbHVzdGVyClxsaW5lXHFsCnsKXGZzMTIKcTExLjIzcTIxLjExCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAozCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwzOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkhHRiwgTUFHSTIsIFBUUE4xMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI5Cn1cbGluZQpccWwKewpcZnMxMgoxIC0gMjAzNDUzNzkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxxbAp7ClxmczE0CkRFTAp9XGxpbmUKXHFsCnsKXGZzMTIKKDIwLjMgTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApwYXJ0aWFsIHAtYXJtClxsaW5lXHFsCnsKXGZzMTIKcDIxLjNwMjQuMwp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApcaQpKQUsyLCBQVFBSRAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI5Cn1cbGluZQpccWwKewpcZnMxMgoyMTg1NDYxMCAtIDIyMDI5NTM3Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApERUwKfVxsaW5lClxxbAp7ClxmczEyCigwLjIgTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApjbHVzdGVyClxsaW5lXHFsCnsKXGZzMTIKcDIxLjMKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjAKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKQ0RLTjJBLCBDREtOMkIKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyOQp9XGxpbmUKXHFsCnsKXGZzMTIKMjIwMzA1MzcgLSAzNTA3OTU0NAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooMTMuMCBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CnBhcnRpYWwgcC1hcm0KXGxpbmVccWwKewpcZnMxMgpwMTMuM3AyMS4zCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkZBTkNHLCBURUsKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyMTAKfVxsaW5lClxxbAp7ClxmczEyCjM5ODU1MzcyIC0gMTMzNzk3NDIxCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApERUwKfVxsaW5lClxxbAp7ClxmczEyCig5My45IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKcS1hcm0KXGxpbmVccWwKewpcZnMxMgpxMTEuMXEyNi4zCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkNDQVIxLCBDQ0RDNiwgQ0RLMSwgRkFTLCBGR0Y4LCBGR0ZSMiwgTlJHMywgUFJGMSwgUFRFTiwgUkVULCBTSE9DMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIxNwp9XGxpbmUKXHFsCnsKXGZzMTIKMzU5ODQ0ODMgLSA0MDIyNTYwNQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooNC4yIE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnExMnEyMS4yCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkNESzEyLCBFUkJCMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIxNwp9XGxpbmUKXHFsCnsKXGZzMTIKNzY1ODM0MzYgLSA4MzE1MTQ0OQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooNi42IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnEyNS4xcTI1LjMKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKUlBUT1IKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyMTgKfVxsaW5lClxxbAp7ClxmczEyCjM3NjA3NzQ0IC0gNTc0MjQyNjQKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxxbAp7ClxmczE0CkRFTAp9XGxpbmUKXHFsCnsKXGZzMTIKKDE5LjggTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApwYXJ0aWFsIHEtYXJtClxsaW5lXHFsCnsKXGZzMTIKcTEyLjJxMjEuMzEKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKUElLM0MzLCBTTUFEMiwgU01BRDQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyMTkKfVxsaW5lClxxbAp7ClxmczEyCjcxMTcwMzUgLSAxMTI3Nzk4MQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooNC4yIE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnAxMy4yCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwzOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkNBUk0xLCBDREtOMkQsIElOU1IsIE1BUDJLNwp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIxOQp9XGxpbmUKXHFsCnsKXGZzMTIKMzg1MDY4MDggLSAzOTA0NjkyNgp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooMC41IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnExMy4yCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwzOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCk1BUDRLMQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIyMgp9XGxpbmUKXHFsCnsKXGZzMTIKMTU3NzA5MjggLSA1MDcyMzY1OAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooMzUuMCBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CmNocgpcbGluZVxxbAp7ClxmczEyCnExMS4xcTEzLjMzCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkJDUiwgQ0hFSzIsIENSS0wsIEhPUk1BRDIsIE1BUEsxLCBORjIsIFBER0ZCCn1cY2VsbH0KXHJvd1xwYXJkClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE4ClxxbAp7ClxmczE0ClxiCkNOVjoKfVxxbAp7ClxmczE0CiBLb3BpZW56YWhsdmFyaWFudGUsIAp9XHFsCnsKXGZzMTQKXGIKQU1QOgp9XHFsCnsKXGZzMTQKIEFtcGxpZmlrYXRpb24sIAp9XHFsCnsKXGZzMTQKXGIKREVMOgp9XHFsCnsKXGZzMTQKIERlbGV0aW9uLCAKfVxxbAp7ClxmczE0ClxiCkxPSDoKfVxxbAp7ClxmczE0CiBLb3BpZW56YWhsbmV1dHJhbGVyIFZlcmx1c3QgZGVyIEhldGVyb3p5Z290aWUsIAp9XHFsCnsKXGZzMTQKXGIKQ046Cn1ccWwKewpcZnMxNAogQ29weSBOdW1iZXIsIAp9XHFsCnsKXGZzMTQKXGIKQW50ZWlsOgp9XHFsCnsKXGZzMTQKIEFudGVpbCBkZXIgWmVsbGVuIG1pdCBkZXIgZW50c3ByZWNoZW5kZW4gS29waWVuemFobHZhcmlhbnRlIGluIGRlciB1bnRlcnN1Y2h0ZW4gUHJvYmUuCn0KfQpccGFyCgp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKU3RydWt0dXJ2YXJpYW50ZW4KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XHRyaGRyXGNlbGx4MTcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XHRyaGRyXGNlbGx4NDcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XHRyaGRyXGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTYKXGIKVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNgpcYgpHZW5vbWlzY2hlIEJydWNocHVua3RlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTYKXGIKQmVzY2hyZWlidW5nCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE3MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDMyMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ3MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkRlbGV0aW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKaW50ZXJnZW5pc2NoClxsaW5lClxxbAp7ClxmczEyCmNocjE6IDMzMDM2ODQ5Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgppbnRlcmdlbmlzY2gKXGxpbmUKXHFsCnsKXGZzMTIKY2hyMTogNTg2MzEzMjQKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CldhaHJzY2hlaW5saWNoIG9ua29nZW4KXGxpbmUKQmVzY2hyZWlidW5nIERlbGV0aW9uCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE3MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDMyMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ3MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Ckluc2VydGlvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CmludGVyZ2VuaXNjaApcbGluZQpccWwKewpcZnMxMgpjaHIyOiAxMjM0NTYKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CmludGVyZ2VuaXNjaApcbGluZQpccWwKewpcZnMxMgpjaHIyOiAxMjM0NTcKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CldhaHJzY2hlaW5saWNoIG9ua29nZW4KXGxpbmUKQmVzY2hyZWlidW5nIEluc2VydGlvbgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzMjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0NzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpJbnZlcnNpb24KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgppbnRlcmdlbmlzY2gKXGxpbmUKXHFsCnsKXGZzMTIKY2hyNjogNDQwMjc5Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgppbnRlcmdlbmlzY2gKXGxpbmUKXHFsCnsKXGZzMTIKY2hyNjogMzM2ODM0ODIKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CldhaHJzY2hlaW5saWNoIG9ua29nZW4KXGxpbmUKQmVzY2hyZWlidW5nIEludmVyc2lvbgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzMjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0NzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpUcmFuc2xva2F0aW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKUFRFTgpcbGluZQpccWwKewpcZnMxMgpjaHIxMDogODc4NjQ1NzAKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CmludGVyZ2VuaXNjaApcbGluZQpccWwKewpcZnMxMgpjaHIyMjogMjkyOTE1NTUKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CldhaHJzY2hlaW5saWNoIG9ua29nZW4KXGxpbmUKQmVzY2hyZWlidW5nIEJyZWFrcG9pbnQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzIwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKRHVwbGlrYXRpb24KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgppbnRlcmdlbmlzY2gKXGxpbmUKXHFsCnsKXGZzMTIKY2hyMTQ6IDU1MDYzMTg2Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgppbnRlcmdlbmlzY2gKXGxpbmUKXHFsCnsKXGZzMTIKY2hyMTQ6IDU1MTc2NjE4Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpXYWhyc2NoZWlubGljaCBvbmtvZ2VuClxsaW5lCkJlc2NocmVpYnVuZyBEdXBsaWNhdGlvbgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKRGllIGF1ZmdlZlx1MjUyO2hydGUgQnJ1Y2hwdW5rdGUgc3RlbGxlbiBhdXMgZGVuIE5HUyBEYXRlbiBhYmdlbGVpdGV0ZSBOXHUyMjg7aGVydW5nc3dlcnRlIHVuZCB3ZW5uIHZvcmhhbmRlbiBkaWUgR2VubmFtZW4gZGFyLgp9XGNlbGx9Clxyb3cKfQ== + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKUGhhcm1ha29nZW5ldGlzY2ggcmVsZXZhbnRlIFBvbHltb3JwaGlzbWVuCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Ck5pY2h0IG5hY2hnZXdpZXNlbgp9XGNlbGx9Clxyb3cKfQ== + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1xwYXJkClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxiCkFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbgp9ClxwYXIKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxxbAp7ClxmczE0Clx1bApUdW1vcgp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXHFsCnsKXGZzMTQKXHVsCk5vcm1hbAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKUHJvemVzc2llcnVuZ3NzeXN0ZW06Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKSGFsb1BsZXggSEJPQyB2NQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClByb2Jlbi1JRAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkROQTEyMzQ1Nl8wMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Ck5BMTI4NzhfMDMKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApHZW5wYW5lbDoKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApWaXJ0dWFsVHVtb3JQYW5lbF92NV9leG9uMjBfYWhvdHQxYTFfMjAyMzA1MDUKXGxpbmUKKDQuNjMgTUIsIEdlbm5hbWVuIHMuIGxldHp0ZSBTZWl0ZSkKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDIwMDBcY2VsbHgzNDgwXGNlbGx4NDk2MFxjZWxseDY0NDBcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApEdXJjaHNjaG5pdHRsaWNoZSBUaWVmZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAoxMzEuMjR4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKMTAzLjI0eAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkF1c3dlcnR1bmdzZGF0dW06Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKMDEuMTIuMjAyMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkR1cmNoc2Nobml0dGxpY2hlIFRpZWZlIEdlbnBhbmVsOgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkFuYWx5c2VwaXBlbGluZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAptZWdTQVAgMjAyMl8wOC01NS1nMjUzOGQxNzMKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDIwMDBcY2VsbHgzNDgwXGNlbGx4NDk2MFxjZWxseDY0NDBcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApDb3ZlcmFnZSA2MHg6Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKbi9hCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKQXVzd2VydHVuZ3Nzb2Z0d2FyZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApjcHBOR1NELVRFU1QgMC4xLWNwcE5HU0QtVEVTVC1WZXJzaW9uCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2VsbHgyMDAwXGNlbGx4MzQ4MFxjZWxseDQ5NjBcY2VsbHg2NDQwXGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKQ292ZXJhZ2UgR2VucGFuZWwgNjB4Ogp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CklDRDEwOgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkNvdmVyYWdlIDIweDoKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAoKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAo5NS45NiUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApNU0ktU2NvcmU6Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKNS43NSUKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDIwMDBcY2VsbHgzNDgwXGNlbGx4NDk2MFxjZWxseDY0NDBcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApDb3ZlcmFnZSBHZW5wYW5lbCAyMHg6Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKbi9hCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKVHVtb3ItUGxvaWRpZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApuL2EKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkluIFJlZ2lvbmVuIG1pdCBlaW5lciBBYmRlY2t1bmcgXHU2Mjs2MCBrXHUyNDY7bm5lbiBzb21hdGlzY2hlIFZhcmlhbnRlbiBtaXQgZWluZXIgRnJlcXVlbnogXHU2Mjs1JSBpbSBUdW1vcmdld2ViZSBtaXQgZWluZXIgU2Vuc2l0aXZpdFx1MjI4O3QgXHU2Mjs5NSwwJSB1bmQgZWluZW0gUG9zaXRpdmUgUHJlZGljdGlvbiBWYWx1ZSBQUFcgXHU2Mjs5OSUgYmVzdGltbXQgd2VyZGVuLiBGXHUyNTI7ciBtaW5kZXN0ZW5zIDk1JSBhbGxlciB1bnRlcnN1Y2h0ZW4gR2VuZSBrYW5uIGRpZSBLb3BpZW56YWhsIGtvcnJla3QgdW50ZXIgZGllc2VuIEJlZGluZ3VuZ2VuIGJlc3RpbW10IHdlcmRlbi4KfVxjZWxsfQpccm93Cn0= + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0bwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGNicGF0NFx0cmhkclxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiCkluZm9ybWF0aW9uZW4genUgbW9sZWt1bGFyZW4gU2lnbmFsd2VnZW4KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4MjQ4MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4NDk2MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4NzQ0MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4OTkyMAoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKXGkKSG9ybW9uZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpCkhSRAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpClBJM0stQUtULU1UT1IKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpcaQpSYXMtUmFmLU1lay1FcmsKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjQ4MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk2MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzQ0MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMAoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTgKQlJDQTIKfSBccWwKewpcZnMxNgpwLlNlcjE5NTVUZXIKfVxsaW5lClxxbAp7ClxmczE4ClsgCn1ccWwKewpcZnMxOApCUkNBMgp9IFxxbAp7ClxmczE2CnAuQXNwMTk0OV9Bc3AxOTU2ZGVsCn1ccWwKewpcZnMxOAogXQp9XGxpbmUKXHFsCnsKXGZzMTgKRkFOQ0wKfSBccWwKewpcZnMxNgpERUwgKGhldCkKfVxsaW5lClxxbAp7ClxmczE4CkZBTkNHCn0gXHFsCnsKXGZzMTYKREVMIChoZXQpCn1cbGluZQpccWwKewpcZnMxOApDREsxMgp9IFxxbAp7ClxmczE2CkRFTCAoaGV0KQp9XGxpbmUKXHFsCnsKXGZzMTgKQ0hFSzIKfSBccWwKewpcZnMxNgpERUwgKGhldCkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxYwp7ClxmczE4ClxxbAp7ClxmczE4ClBURU4KfSBccWwKewpcZnMxNgpERUwgKGhldCkKfVxsaW5lClxxbAp7ClxmczE4Ck5GMgp9IFxxbAp7ClxmczE2CkRFTCAoaGV0KQp9XGxpbmUKXHFsCnsKXGZzMTgKUFRFTgp9IFxxbAp7ClxmczE2ClNWCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWMKewpcZnMxOAoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4MjQ4MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4NDk2MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4NzQ0MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4OTkyMAoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKXGkKUmV6ZXB0b3ItVHlyb3NpbmtpbmFzZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpCldOVAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpClplbGx6eWtsdXMvQXBvcHRvc2UKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpcaQoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjQ4MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk2MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzQ0MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMAoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTgKWyAKfVxxbAp7ClxmczE4CkFMSwp9IFxxbAp7ClxmczE2CnAuUHJvMTQ2OUFyZ2ZzVGVyOAp9XHFsCnsKXGZzMTgKIF0KfVxsaW5lClxxbAp7ClxmczE4CkVHRlIKfSBccWwKewpcZnMxNgpwLkxldTg1OEFyZwp9XGxpbmUKXHFsCnsKXGZzMTgKRUdGUgp9IFxxbAp7ClxmczE2CkFNUCAoMjkgS29waWVuKQp9XGxpbmUKXHFsCnsKXGZzMTgKU01BRDQKfSBccWwKewpcZnMxNgpERUwgKGhldCkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxYwp7ClxmczE4ClxxbAp7ClxmczE4CkFQQwp9IFxxbAp7ClxmczE2CnAuQXJnMjE2VGVyCn1cbGluZQpccWwKewpcZnMxOApBUEMKfSBccWwKewpcZnMxNgpwLlRocjE0OTNBcmdmc1RlcjE0Cn1cbGluZQpccWwKewpcZnMxOApbIAp9XHFsCnsKXGZzMTgKQVBDCn0gXHFsCnsKXGZzMTYKcC5TZXIyNTg2SWxlCn1ccWwKewpcZnMxOAogXQp9XGxpbmUKXHFsCnsKXGZzMTgKQVBDCn0gXHFsCnsKXGZzMTYKTE9ICn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWMKewpcZnMxOApccWwKewpcZnMxOApDREtOMkEKfSBccWwKewpcZnMxNgpERUwgKGhvbSkKfVxsaW5lClxxbAp7ClxmczE4CkNES04yQgp9IFxxbAp7ClxmczE2CkRFTCAoaG9tKQp9XGxpbmUKXHFsCnsKXGZzMTgKQ0hFSzIKfSBccWwKewpcZnMxNgpERUwgKGhldCkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxYwp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWoKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFqCnsKXGZzMTQKXHFsCnsKXGZzMTQKXGIKQmVzY2hyZWlidW5nOiAKfURpZSBuYWNoZ2V3aWVzZW5lbiBwb3RlbnRpZWxsIHJlbGV2YW50ZW4gc29tYXRpc2NoZW4gVmVyXHUyMjg7bmRlcnVuZ2VuIHVuZCBkaWUgdW5rbGFyZW4gVmFyaWFudGVuIChpbiBlY2tpZ2VuIEtsYW1tZXJuKSB3dXJkZW4gbmFjaCBkZW4gd2ljaHRpZ3N0ZW4gbW9sZWt1bGFyZW4gU2lnbmFsd2VnZW4gc29ydGllcnQuIERpZSBadWdlaFx1MjQ2O3JpZ2tlaXQgZWluZXMgR2VucyB6dSBlaW5lbSBiZXN0aW1tdGVuIFNpZ25hbHdlZyB3dXJkZSBkdXJjaCBkYXMgTW9sZWt1bGFyZSBUdW1vcmJvYXJkIFRcdTI1MjtiaW5nZW4gZmVzdGdlc3RlbGx0Lgp9XGNlbGx9Clxyb3cKfQ== + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKSExBCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiCkdlbmUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNgpcYgpCbHV0IChOQTEyODc4XzAzKQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiClR1bW9yIChETkExMjM0NTZfMDEpCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc4MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1BCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKbmljaHQgYmVzdGltbWJhcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpITEEtQSowMjowMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1BKjMyOjAxCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc4MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1CCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKbmljaHQgYmVzdGltbWJhcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpITEEtQiowNzowMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1CKjQ0OjAyCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc4MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1DCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKbmljaHQgYmVzdGltbWJhcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpITEEtQyowNTowMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1DKjA3OjAyCn1cY2VsbH0KXHJvdwp9 + diff --git a/src/cppXML-TEST/data/somatic_report_tumor_normal_2.xml b/src/cppXML-TEST/data/somatic_report_tumor_normal_2.xml new file mode 100644 index 000000000..3ee0b0df9 --- /dev/null +++ b/src/cppXML-TEST/data/somatic_report_tumor_normal_2.xml @@ -0,0 +1,21321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQWxsZ2VtZWluZSBnZW5ldGlzY2hlIENoYXJha3RlcmlzdGlrYSAoXHFsCnsKXGZzMTYKRE5BMTIzNDU2XzAxLU5BMTI4NzhfMDMKfSkKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjUwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKVHVtb3JhbnRlaWwgKGhpc3QuL21vbGVrdWxhcikKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAo3MCAlIC8gY2EuIDQyICUKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI1MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApNdXRhdGlvbnNsYXN0Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKbmljaHQgYmVzdGltbWJhcgp9Cn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI1MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Ck1pa3Jvc2F0ZWxsaXRlbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjUwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKRnVzaW9uZW4vU3RydWt0dXJ2YXJpYW50ZW4KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApuaWNodCBuYWNoZ2V3aWVzZW4KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjUwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKVmlydXMtRE5BCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbmljaHQgbmFjaGdld2llc2VuCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI1MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CkhSRC1TY29yZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CktlaW5lIEhpbndlaXNlIGF1ZiBlaW5lIEhSRFxxbAp7ClxmczE0CgpcbGluZQpIUkQtU2NvcmUgY2hyb21vc29tYWxlIFZlclx1MjI4O25kZXJ1bmdlbjogMyAoSFJEIGJlaSBcdTg4MDU7IDQyKQp9Cn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxagpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWoKewpcZnMxNApccWwKewpcZnMxNApcYgpUdW1vcmFudGVpbAp9IChoaXN0Lik6IFZvbiBkZXIgUGF0aG9sb2dpZSBtaXRnZXRlaWx0OyAobW9sZWt1bGFyKTogRGllIEJlcmVjaG51bmcgZGVzIFR1bW9yYW50ZWlscyBiZXJ1aHQgYXVmIGRlbSBBbnRlaWwgZGVyIG5hY2hnZXdpZXNlbmVuIFNOVnMgb2RlciBDTlZzLiBccWwKewpcZnMxNApcYgpNdXRhdGlvbnNsYXN0Ogp9IEFuemFobCBkZXIgVmFyaWFudGVuIGluIGRlbiBrb2RpZXJlbmRlbiB1bnRlcnN1Y2h0ZW4gR2VuZW4gbm9ybWllcnQgYXVmIGVpbmUgTWlsbGlvbiBCYXNlbnBhYXJlOyBccWwKewpcZnMxNApcYgpNaWtyb3NhdGVsbGl0ZW46Cn0gQmV3ZXJ0dW5nIGRlciBNaWtyb3NhdGVsbGl0ZW5pbnN0YWJpbGl0XHUyMjg7dDsgXHFsCnsKXGZzMTQKXGIKQ05WLUxhc3Q6Cn0gQW50ZWlsIGRlcyBHZW5vbXMsIGJlaSBkZW0gZGllIEtvcGllbnphaGwgdmVyXHUyMjg7bmRlcnQgaXN0LiBccWwKewpcZnMxNApcYgpIUkQ6Cn0gSG9tb2xvZ2UgUmVrb21iaW5hdGlvbnMtRGVmaXppZW56Lgp9XGNlbGx9Clxyb3cKfQ== + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1xwYXJkClxzYTMwClxzYjI1MApccWwKewpcZnMxOApcYgpQb3RlbnRpZWxsIHJlbGV2YW50ZSBzb21hdGlzY2hlIFZlclx1MjI4O25kZXJ1bmdlbjoKfQpccGFyCgpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGNicGF0NFx0cmhkclxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClB1bmt0bXV0YXRpb25lbiAoU05WcyksIGtsZWluZSBJbnNlcnRpb25lbi9EZWxldGlvbmVuIChJTkRFTHMpIHVuZCBLb3BpZW56YWhsdmFyaWFudGVuIChDTlZzKQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpHZW4KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpWZXJcdTIyODtuZGVydW5nCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKVHlwCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQW50ZWlsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQmVzY2hyZWlidW5nCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKTW9sZWt1bGFyZXIgU2lnbmFsd2VnCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpClBNUzJcc3VwZXIjCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKYy4xNTEwR1x1NjI7VCwgcC5HbHU1MDRUZXJcbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAyNjU4NDkuMTIKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnN0b3BfZ2FpbmVkCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw0OQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnBhdGhvZ2VuZSBWYXJpYW50ZSwgaW4gZGVyIE5vcm1hbHByb2JlIGhldGVyb3p5Z290Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkJSQ0EyXHN1cGVyIwp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CmMuNTg2NENcdTYyO0EsIHAuU2VyMTk1NVRlclxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDM4MDE1Mi44Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApzdG9wX2dhaW5lZAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNTAKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApwYXRob2dlbmUgVmFyaWFudGUsIGluIGRlciBOb3JtYWxwcm9iZSBoZXRlcm96eWdvdAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CkhSRAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpCUkNBMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuNTg0NV81ODY4ZGVsLCBwLkFzcDE5NDlfQXNwMTk1NmRlbFxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDM4MDE1Mi44Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAppbmZyYW1lX2RlbGV0aW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwxMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVua2xhcmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApIUkQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1nZlxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtZ2ZcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpBUEMKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOApjLjY0NkNcdTYyO1QsIHAuQXJnMjE2VGVyXGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMjU3NDMwLjkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnN0b3BfZ2FpbmVkLCBzcGxpY2VfcmVnaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwyMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZhcmlhbnRlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKV05UCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtcmdcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQVBDCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFsCnsKXGZzMTgKYy40NDc2ZGVsLCBwLlRocjE0OTNBcmdmc1RlcjE0XGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMjU3NDMwLjkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CmZyYW1lc2hpZnQKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDU1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApXTlQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1yZ1xjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtcmdcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpBUEMKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOApjLjc3NTdHXHU2MjtULCBwLlNlcjI1ODZJbGVcbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAyNTc0MzAuOQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbWlzc2Vuc2UKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDEwCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKdW5rbGFyZSBWYXJpYW50ZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CldOVAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1yZ1xjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkFQQwp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkxPSApcbGluZQpccWwKewpcZnMxNApjaHI1Cn1ccWwKewpcZnMxNAo7IHExMy4zcTMxLjMKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbm9uLWZvY2FsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwyOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4ClxoaWdobGlnaHQzClZlcmx1c3QgZGVzIFdpbGR0eXBhbGxlbHMKfQpcbGluZQp1bmtsYXJlIEJlZGV1dHVuZyBmXHUyNTI7ciBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtZ2ZcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bWdmXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKRUdGUgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuMjU3M1RcdTYyO0csIHAuTGV1ODU4QXJnXGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMjc1NDkzLjcKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm1pc3NlbnNlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwxNgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZhcmlhbnRlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKUmV6ZXB0b3ItVHlyb3NpbmtpbmFzZQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1yZ1xjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkVHRlIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxOApBTVAgKDI5IEtvcGllbikKXGxpbmUKXHFsCnsKXGZzMTQKY2hyNwp9XHFsCnsKXGZzMTQKOyBwMTEuMgp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApjbHVzdGVyCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZlclx1MjI4O25kZXJ1bmcKXGxpbmUKbVx1MjQ2O2dsLiBcdTIyMDtiZXJleHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCk5PVENIMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuNTE1NUdcdTYyO1QsIHAuR2x1MTcxOVRlclxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDY1MTY3MS4xCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApzdG9wX2dhaW5lZAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNDEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAp3YWhyc2NoLiBvbmtvZ2VuZSBWYXJpYW50ZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpURVJUCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKXGhpZ2hsaWdodDMKPz8/Cn1cbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAzMTA1ODEuMTAKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVwc3RyZWFtX2dlbmUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDIxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQ0RLMTIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxOApERUwgKGhldCkKXGxpbmUKXHFsCnsKXGZzMTQKY2hyMTcKfVxxbAp7ClxmczE0CjsgcTEycTIxLjIKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKY2x1c3Rlcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKSFJECn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCkNES04yQQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaG9tKQpcbGluZQpccWwKewpcZnMxNApjaHI5Cn1ccWwKewpcZnMxNAo7IHAyMS4zCn0KfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CmNsdXN0ZXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClplbGx6eWtsdXMvQXBvcHRvc2UKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQ0RLTjJCCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKREVMIChob20pClxsaW5lClxxbAp7ClxmczE0CmNocjkKfVxxbAp7ClxmczE0CjsgcDIxLjMKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKY2x1c3Rlcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKWmVsbHp5a2x1cy9BcG9wdG9zZQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpDSEVLMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIyMgp9XHFsCnsKXGZzMTQKOyBxMTEuMXExMy4zMwp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClplbGx6eWtsdXMvQXBvcHRvc2UsIEhSRAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpGQU5DRwp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHI5Cn1ccWwKewpcZnMxNAo7IHAxMy4zcDIxLjMKfQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbm9uLWZvY2FsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm9ua29nZW5lIFZlclx1MjI4O25kZXJ1bmcKXGxpbmUKbVx1MjQ2O2dsLiByZWR1emllcnRlIEV4cHJlc3Npb24KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApIUkQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKRkFOQ0wKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxOApERUwgKGhldCkKXGxpbmUKXHFsCnsKXGZzMTQKY2hyMgp9XHFsCnsKXGZzMTQKOyBwMTMuMnAyNS4xCn0KfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm5vbi1mb2NhbAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsMzgKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKSFJECn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxpCk5GMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIyMgp9XHFsCnsKXGZzMTQKOyBxMTEuMXExMy4zMwp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClBJM0stQUtULU1UT1IKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4Mjk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDM1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk1MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzkwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKUFRFTgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIxMAp9XHFsCnsKXGZzMTQKOyBxMTEuMXEyNi4zCn0KfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm5vbi1mb2NhbAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApvbmtvZ2VuZSBWZXJcdTIyODtuZGVydW5nClxsaW5lCm1cdTI0NjtnbC4gcmVkdXppZXJ0ZSBFeHByZXNzaW9uCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKUEkzSy1BS1QtTVRPUgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpTTUFENAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE4CkRFTCAoaGV0KQpcbGluZQpccWwKewpcZnMxNApjaHIxOAp9XHFsCnsKXGZzMTQKOyBxMTIuMnEyMS4zMQp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClJlemVwdG9yLVR5cm9zaW5raW5hc2UKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFqClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE0ClxxbAp7ClxmczE0ClxiClZlclx1MjI4O25kZXJ1bmc6IAp9S29kaWVyZW5kZSBQb3NpdGlvbiwgXHFsCnsKXGZzMTQKXGIKU05WCn0gUHVua3RtdXRhdGlvbmVuIFxxbAp7ClxmczE0ClxpCihzaW5nbGUgbnVjbGVvdGlkZSB2YXJpYW50KSwgCn1ccWwKewpcZnMxNApcYgpJTkRFTHMKfSBJbnNlcnRpb25lbi9EZWxldGlvbmVuLCBccWwKewpcZnMxNApcYgpDTlYKfSBLb3BpZW56YWhsdmFyaWFudGUsIFxxbAp7ClxmczE0ClxiCkFNUAp9IEFtcGxpZmlrYXRpb24sIFxxbAp7ClxmczE0ClxiCkRFTAp9IERlbGV0aW9uIFxxbAp7ClxmczE0ClxiCkxPSAp9IEtvcGllbm5ldXRyYWxlciBWZXJsdXN0IGRlciBIZXRlcm96eWdvdGllLCBccWwKewpcZnMxNApcYgpXVAp9IFdpbGR0eXBhbGxlbCwgXHFsCnsKXGZzMTQKXGIKTVVUCn0gTXV0aWVydGVzIEFsbGVsOyBccWwKewpcZnMxNApcYgpUeXA6Cn0gQXJ0IGRlciBTTlYgb2RlciBHclx1MjQ2O1x1MjIzO2UgdW5kIEF1c2RlaG51bmcgZGVyIENOVjogXHFsCnsKXGZzMTQKXGIKZm9jYWwKfSAoIGJpcyB6dSAzIEdlbmUpLCBccWwKewpcZnMxNApcYgpDbHVzdGVyCn0gKHdlbmlnZXIgYWxzIDI1JSBkZXMgQ2hyb21vc29tZW5hcm1zKSBccWwKewpcZnMxNApcYgpub24tZm9jYWwKfSAoQ2hyb21vc29tZW5hbnRlaWwpOyBccWwKewpcZnMxNApcYgpBbnRlaWw6Cn0gQW50ZWlsIGRlciBBbGxlbGUgbWl0IGRlciBnZWxpc3RldGVuIFZhcmlhbnRlIChTTlYsIElOREVMKSBiencuIEFudGVpbCBkZXIgWmVsbGVuIG1pdCBkZXIgZW50c3ByZWNoZW5kZW4gS29waWVuemFobHZhcmlhbnRlIChDTlYpIGluIGRlciB1bnRlcnN1Y2h0ZW4gUHJvYmU7IFxxbAp7ClxmczE0ClxiCkJlc2NocmVpYnVuZzogCn1JbmZvcm1hdGlvbmVuIGF1cyBEYXRlbmJhbmtlbiAoei5CLiBDT1NNSUMsIENhbmNlcmhvdHNwb3RzLCBDYW5jZXIgR2Vub21lIEludGVycHJldGVyLCBQdWJNZWQsIE9ua29LQiwgQ2xpblZhciwgT01JTSwgVmFyU29tZSwgTE9WRCwgSEdNRCkgenUgZGVyIFZhcmlhbnRlIHVuZCBmdW5rdGlvbmVsbGUgRGF0ZW4gd2VyZGVuIGludGVncmllcnQgdW5kIGRpZSBPbmtvZ2VuaXRcdTIyODt0IGRlciBWZXJcdTIyODtuZGVydW5nIHdpcmQgbmFjaCBccWwKewpcZnMxNApcaQpWYXJpYW50IEludGVycHJldGF0aW9uIGZvciBDYW5jZXIgQ29uc29ydGl1bQp9IChWSUNDKS1SaWNodGxpbmllbiBiZXdlcnRldC4gSW4gZGllc2VyIFRhYmVsbGUgc2luZCBudXIgb25rb2dlbmUgVmVyXHUyMjg7bmRlcnVuZ2VuIGRhcmdlc3RlbGx0LgpcbGluZQp7XHN1cGVyI30gYXVjaCBpbiBkZXIgTm9ybWFscHJvYmUgbmFjaGdld2llc2VuLgp9XGNlbGx9Clxyb3cKXHBhcmQKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKCn0KXHBhcgoKXHBhcmQKXHNhMzAKXHNiMzAKXHNsMjc2XHNsbXVsdDEKXHFqCnsKXGZzMTgKXHFsCnsKXGZzMTgKVW5zZXJlIERhdGVuIHdlaXNlbiBhdWYgZGFzIFZvcmxpZWdlbiBkZXMgSGFwbG90eXBzIEhMQS1BKjAyOjAxIGluIGRlciBUdW1vcnByb2JlLCBqZWRvY2ggbmljaHQgaW4gZGVyIE5vcm1hbHByb2JlLCBoaW4gKHMuIEFubGFnZSkuCn0KfQpccGFyCgpccGFyZApcc2EzMApcc2IzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOAoKfQpccGFyCgpccGFyZApcc2EzMApcc2IzMApcc2wyNzZcc2xtdWx0MQpccWoKewpcZnMxOApccWwKewpcZnMxOApcYgpMaW1pdGF0aW9uZW46IAp9VGhpcyB0ZXh0IHNob3VsZCBhcHBlYXIgYXMgbGltaXRhdGlvbnMhCn0KXHBhcgoKfQ== + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1xwYXJkClxzYTMwClxzYjI1MApccWwKewpcZnMxOApcYgpWYXJpYW50ZW4gdW5rbGFyZXIgT25rb2dlbml0XHUyMjg7dDoKfQpccGFyClx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKUHVua3RtdXRhdGlvbmVuIChTTlZzKSwga2xlaW5lIEluc2VydGlvbmVuL0RlbGV0aW9uZW4gKElOREVMcykgdW5kIEtvcGllbnphaGx2YXJpYW50ZW4gKENOVnMpCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFx0cmhkclxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiCkdlbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClZlclx1MjI4O25kZXJ1bmcKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpUeXAKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpBbnRlaWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpCZXNjaHJlaWJ1bmcKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpNb2xla3VsYXJlciBTaWduYWx3ZWcKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsdm1nZlxjZWxseDEwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQzNTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NTBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc5MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtZ2ZcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpBTEsKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWwKewpcZnMxOApjLjQ0MDRkZWwsIHAuUHJvMTQ2OUFyZ2ZzVGVyOFxsaW5lClxxbAp7ClxmczE0CkVOU1QwMDAwMDM4OTA0OC44Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApmcmFtZXNoaWZ0Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCwyMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVua2xhcmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApSZXplcHRvci1UeXJvc2lua2luYXNlCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbHZtcmdcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2x2bXJnXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXGkKQUxLCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTgKREVMIChoZXQpClxsaW5lClxxbAp7ClxmczE0CmNocjIKfVxxbAp7ClxmczE0CjsgcDEzLjJwMjUuMQp9Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApub24tZm9jYWwKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKdW5rbGFyZSBTaWduaWZpa2FueiBkZXIgVmVyXHUyMjg7bmRlcnVuZwpcbGluZQptXHUyNDY7Z2wuIHJlZHV6aWVydGUgRXhwcmVzc2lvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpIMy0zQQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxbAp7ClxmczE4CmMuMTdBXHU2MjtULCBwLkdsbjZMZXVcbGluZQpccWwKewpcZnMxNApFTlNUMDAwMDAzNjY4MTMuMQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKbWlzc2Vuc2UKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOAowLDI4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKdW5rbGFyZSBWYXJpYW50ZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxMDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyOTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MzUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0OTUwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg3OTAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApcaQpTQUNTCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFsCnsKXGZzMTgKYy45MTQyQ1x1NjI7VCwgcC5BcmczMDQ4Q3lzXGxpbmUKXHFsCnsKXGZzMTQKRU5TVDAwMDAwMzgyMjkyLjkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Cm1pc3NlbnNlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKMCw0NAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4CnVua2xhcmUgVmFyaWFudGUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOAoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFqClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE0ClxxbAp7ClxmczE0ClxiClZlclx1MjI4O25kZXJ1bmc6IAp9S29kaWVyZW5kZSBQb3NpdGlvbiwgXHFsCnsKXGZzMTQKXGIKU05WCn0gUHVua3RtdXRhdGlvbmVuIFxxbAp7ClxmczE0ClxpCihzaW5nbGUgbnVjbGVvdGlkZSB2YXJpYW50KSwgCn1ccWwKewpcZnMxNApcYgpJTkRFTHMKfSBJbnNlcnRpb25lbi9EZWxldGlvbmVuLCBccWwKewpcZnMxNApcYgpDTlYKfSBLb3BpZW56YWhsdmFyaWFudGUsIFxxbAp7ClxmczE0ClxiCkFNUAp9IEFtcGxpZmlrYXRpb24sIFxxbAp7ClxmczE0ClxiCkRFTAp9IERlbGV0aW9uIFxxbAp7ClxmczE0ClxiCkxPSAp9IEtvcGllbm5ldXRyYWxlciBWZXJsdXN0IGRlciBIZXRlcm96eWdvdGllLCBccWwKewpcZnMxNApcYgpXVAp9IFdpbGR0eXBhbGxlbCwgXHFsCnsKXGZzMTQKXGIKTVVUCn0gTXV0aWVydGVzIEFsbGVsOyBccWwKewpcZnMxNApcYgpUeXA6Cn0gQXJ0IGRlciBTTlYgb2RlciBHclx1MjQ2O1x1MjIzO2UgdW5kIEF1c2RlaG51bmcgZGVyIENOVjogXHFsCnsKXGZzMTQKXGIKZm9jYWwKfSAoIGJpcyB6dSAzIEdlbmUpLCBccWwKewpcZnMxNApcYgpDbHVzdGVyCn0gKHdlbmlnZXIgYWxzIDI1JSBkZXMgQ2hyb21vc29tZW5hcm1zKSBccWwKewpcZnMxNApcYgpub24tZm9jYWwKfSAoQ2hyb21vc29tZW5hbnRlaWwpOyBccWwKewpcZnMxNApcYgpBbnRlaWw6Cn0gQW50ZWlsIGRlciBBbGxlbGUgbWl0IGRlciBnZWxpc3RldGVuIFZhcmlhbnRlIChTTlYsIElOREVMKSBiencuIEFudGVpbCBkZXIgWmVsbGVuIG1pdCBkZXIgZW50c3ByZWNoZW5kZW4gS29waWVuemFobHZhcmlhbnRlIChDTlYpIGluIGRlciB1bnRlcnN1Y2h0ZW4gUHJvYmU7IFxxbAp7ClxmczE0ClxiCkJlc2NocmVpYnVuZzogCn1JbmZvcm1hdGlvbmVuIGF1cyBEYXRlbmJhbmtlbiAoei5CLiBDT1NNSUMsIENhbmNlcmhvdHNwb3RzLCBDYW5jZXIgR2Vub21lIEludGVycHJldGVyLCBQdWJNZWQsIE9ua29LQiwgQ2xpblZhciwgT01JTSwgVmFyU29tZSwgTE9WRCwgSEdNRCkgenUgZGVyIFZhcmlhbnRlIHVuZCBmdW5rdGlvbmVsbGUgRGF0ZW4gd2VyZGVuIGludGVncmllcnQgdW5kIGRpZSBPbmtvZ2VuaXRcdTIyODt0IGRlciBWZXJcdTIyODtuZGVydW5nIHdpcmQgbmFjaCBccWwKewpcZnMxNApcaQpWYXJpYW50IEludGVycHJldGF0aW9uIGZvciBDYW5jZXIgQ29uc29ydGl1bQp9IChWSUNDKS1SaWNodGxpbmllbiBiZXdlcnRldC4gSW4gZGllc2VyIFRhYmVsbGUgc2luZCBudXIgdW5rbGFyZSBWZXJcdTIyODtuZGVydW5nZW4gZGFyZ2VzdGVsbHQuCn1cY2VsbH0KXHJvdwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKQ2hyb21vc29tYWxlIEFiZXJyYXRpb25lbgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcdHJoZHJcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNgpcYgpQb3NpdGlvbgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiCkNOVgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiClR5cAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiCkNOCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTYKXGIKQW50ZWlsCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTYKXGIKR2VuZQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIyCn1cbGluZQpccWwKewpcZnMxMgoxMTgxMzIwNCAtIDcyNjkzNDExCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApERUwKfVxsaW5lClxxbAp7ClxmczEyCig2MC45IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKcGFydGlhbCBwLWFybQpcbGluZVxxbAp7ClxmczEyCnAxMy4ycDI1LjEKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKQUxLLCBCSVJDNiwgQ0FELCBFUEFTMSwgRkFOQ0wsIE1BUDRLMywgTVlDTiwgU09TMSwgWFBPMQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI1Cn1cbGluZQpccWwKewpcZnMxMgo3NjU4ODg4NSAtIDE0MDc4NTI3MAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKTE9ICn1cbGluZQpccWwKewpcZnMxMgooNjQuMiBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CnBhcnRpYWwgcS1hcm0KXGxpbmVccWwKewpcZnMxMgpxMTMuM3EzMS4zCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoyCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwyOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkFQQywgTlJHMiwgUkFENTAsIFJBU0ExCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE4MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI3MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQwMDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ4MDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxxbAp7ClxmczE0CmNocjcKfVxsaW5lClxxbAp7ClxmczEyCjU0NjUxNzQ2IC0gNTU1OTk2NjEKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxxbAp7ClxmczE0CkFNUAp9XGxpbmUKXHFsCnsKXGZzMTIKKDAuOSBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CmNsdXN0ZXIKXGxpbmVccWwKewpcZnMxMgpwMTEuMgp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMjkKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKRUdGUgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI3Cn1cbGluZQpccWwKewpcZnMxMgo3Njk4OTEzNCAtIDgyNTk2MTk5Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApBTVAKfVxsaW5lClxxbAp7ClxmczEyCig1LjYgTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApjbHVzdGVyClxsaW5lXHFsCnsKXGZzMTIKcTExLjIzcTIxLjExCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAozCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwzOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkhHRiwgTUFHSTIsIFBUUE4xMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI5Cn1cbGluZQpccWwKewpcZnMxMgoxIC0gMjAzNDUzNzkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxxbAp7ClxmczE0CkRFTAp9XGxpbmUKXHFsCnsKXGZzMTIKKDIwLjMgTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApwYXJ0aWFsIHAtYXJtClxsaW5lXHFsCnsKXGZzMTIKcDIxLjNwMjQuMwp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjAsNjUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApcaQpKQUsyLCBQVFBSRAp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHI5Cn1cbGluZQpccWwKewpcZnMxMgoyMTg1NDYxMCAtIDIyMDI5NTM3Cn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApERUwKfVxsaW5lClxxbAp7ClxmczEyCigwLjIgTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApjbHVzdGVyClxsaW5lXHFsCnsKXGZzMTIKcDIxLjMKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjAKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKQ0RLTjJBLCBDREtOMkIKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyOQp9XGxpbmUKXHFsCnsKXGZzMTIKMjIwMzA1MzcgLSAzNTA3OTU0NAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooMTMuMCBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CnBhcnRpYWwgcC1hcm0KXGxpbmVccWwKewpcZnMxMgpwMTMuM3AyMS4zCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkZBTkNHLCBURUsKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyMTAKfVxsaW5lClxxbAp7ClxmczEyCjM5ODU1MzcyIC0gMTMzNzk3NDIxCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApccWwKewpcZnMxNApERUwKfVxsaW5lClxxbAp7ClxmczEyCig5My45IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKcS1hcm0KXGxpbmVccWwKewpcZnMxMgpxMTEuMXEyNi4zCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkNDQVIxLCBDQ0RDNiwgQ0RLMSwgRkFTLCBGR0Y4LCBGR0ZSMiwgTlJHMywgUFJGMSwgUFRFTiwgUkVULCBTSE9DMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIxNwp9XGxpbmUKXHFsCnsKXGZzMTIKMzU5ODQ0ODMgLSA0MDIyNTYwNQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooNC4yIE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnExMnEyMS4yCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkNESzEyLCBFUkJCMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIxNwp9XGxpbmUKXHFsCnsKXGZzMTIKNzY1ODM0MzYgLSA4MzE1MTQ0OQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooNi42IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnEyNS4xcTI1LjMKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDY1Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKUlBUT1IKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyMTgKfVxsaW5lClxxbAp7ClxmczEyCjM3NjA3NzQ0IC0gNTc0MjQyNjQKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxxbAp7ClxmczE0CkRFTAp9XGxpbmUKXHFsCnsKXGZzMTIKKDE5LjggTUIpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNApwYXJ0aWFsIHEtYXJtClxsaW5lXHFsCnsKXGZzMTIKcTEyLjJxMjEuMzEKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CjEKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAowLDM4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXGkKUElLM0MzLCBTTUFEMiwgU01BRDQKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MTgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjcwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MzYwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDAwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDgwMFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKXHFsCnsKXGZzMTQKY2hyMTkKfVxsaW5lClxxbAp7ClxmczEyCjcxMTcwMzUgLSAxMTI3Nzk4MQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooNC4yIE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnAxMy4yCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwzOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkNBUk0xLCBDREtOMkQsIElOU1IsIE1BUDJLNwp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIxOQp9XGxpbmUKXHFsCnsKXGZzMTIKMzg1MDY4MDggLSAzOTA0NjkyNgp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooMC41IE1CKQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKY2x1c3RlcgpcbGluZVxxbAp7ClxmczEyCnExMy4yCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCwzOAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCk1BUDRLMQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgxODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgyNzAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHgzNjAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0MDAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg0ODAwXGNsYnJkcnRcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyYlxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJsXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcnJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxOApccWwKewpcZnMxNApjaHIyMgp9XGxpbmUKXHFsCnsKXGZzMTIKMTU3NzA5MjggLSA1MDcyMzY1OAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTQKREVMCn1cbGluZQpccWwKewpcZnMxMgooMzUuMCBNQikKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE0CmNocgpcbGluZVxxbAp7ClxmczEyCnExMS4xcTEzLjMzCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNAoxCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTQKMCw2NQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxpCkJDUiwgQ0hFSzIsIENSS0wsIEhPUk1BRDIsIE1BUEsxLCBORjIsIFBER0ZCCn1cY2VsbH0KXHJvd1xwYXJkClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE4ClxxbAp7ClxmczE0ClxiCkNOVjoKfVxxbAp7ClxmczE0CiBLb3BpZW56YWhsdmFyaWFudGUsIAp9XHFsCnsKXGZzMTQKXGIKQU1QOgp9XHFsCnsKXGZzMTQKIEFtcGxpZmlrYXRpb24sIAp9XHFsCnsKXGZzMTQKXGIKREVMOgp9XHFsCnsKXGZzMTQKIERlbGV0aW9uLCAKfVxxbAp7ClxmczE0ClxiCkxPSDoKfVxxbAp7ClxmczE0CiBLb3BpZW56YWhsbmV1dHJhbGVyIFZlcmx1c3QgZGVyIEhldGVyb3p5Z290aWUsIAp9XHFsCnsKXGZzMTQKXGIKQ046Cn1ccWwKewpcZnMxNAogQ29weSBOdW1iZXIsIAp9XHFsCnsKXGZzMTQKXGIKQW50ZWlsOgp9XHFsCnsKXGZzMTQKIEFudGVpbCBkZXIgWmVsbGVuIG1pdCBkZXIgZW50c3ByZWNoZW5kZW4gS29waWVuemFobHZhcmlhbnRlIGluIGRlciB1bnRlcnN1Y2h0ZW4gUHJvYmUuCn0KfQpccGFyCgp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKU3RydWt0dXJ2YXJpYW50ZW4KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTgKTmljaHQgbmFjaGdld2llc2VuCn1cY2VsbH0KXHJvdwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XHRyaGRyXGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKUGhhcm1ha29nZW5ldGlzY2ggcmVsZXZhbnRlIFBvbHltb3JwaGlzbWVuCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4Ck5pY2h0IG5hY2hnZXdpZXNlbgp9XGNlbGx9Clxyb3cKfQ== + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1xwYXJkClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE4ClxiCkFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbgp9ClxwYXIKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClxxbAp7ClxmczE0Clx1bApUdW1vcgp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKXHFsCnsKXGZzMTQKXHVsCk5vcm1hbAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKUHJvemVzc2llcnVuZ3NzeXN0ZW06Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKSGFsb1BsZXggSEJPQyB2NQp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClByb2Jlbi1JRAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkROQTEyMzQ1Nl8wMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Ck5BMTI4NzhfMDMKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApHZW5wYW5lbDoKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApWaXJ0dWFsVHVtb3JQYW5lbF92NV9leG9uMjBfYWhvdHQxYTFfMjAyMzA1MDUKXGxpbmUKKDQuNjMgTUIsIEdlbm5hbWVuIHMuIGxldHp0ZSBTZWl0ZSkKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDIwMDBcY2VsbHgzNDgwXGNlbGx4NDk2MFxjZWxseDY0NDBcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApEdXJjaHNjaG5pdHRsaWNoZSBUaWVmZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAoxMzEuMjR4Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKMTAzLjI0eAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkF1c3dlcnR1bmdzZGF0dW06Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKMDEuMTIuMjAyMgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkR1cmNoc2Nobml0dGxpY2hlIFRpZWZlIEdlbnBhbmVsOgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkFuYWx5c2VwaXBlbGluZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAptZWdTQVAgMjAyMl8wOC01NS1nMjUzOGQxNzMKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDIwMDBcY2VsbHgzNDgwXGNlbGx4NDk2MFxjZWxseDY0NDBcY2VsbHg5OTIxCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApDb3ZlcmFnZSA2MHg6Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKbi9hCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKQXVzd2VydHVuZ3Nzb2Z0d2FyZToKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApjcHBOR1NELVRFU1QgMC4xLWNwcE5HU0QtVEVTVC1WZXJzaW9uCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2VsbHgyMDAwXGNlbGx4MzQ4MFxjZWxseDQ5NjBcY2VsbHg2NDQwXGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKQ292ZXJhZ2UgR2VucGFuZWwgNjB4Ogp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CklDRDEwOgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9Clxyb3cKXHRyb3dkXHRyZ3JhcGgxODBcdHJwYWRkYjI4XHRycGFkZGwyOFx0cnBhZGRyMjhcdHJwYWRkdDI4XGNlbGx4MjAwMFxjZWxseDM0ODBcY2VsbHg0OTYwXGNlbGx4NjQ0MFxjZWxseDk5MjEKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0CkNvdmVyYWdlIDIweDoKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAoKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNAo5NS45NiUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApNU0ktU2NvcmU6Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKbi9hCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2VsbHgyMDAwXGNlbGx4MzQ4MFxjZWxseDQ5NjBcY2VsbHg2NDQwXGNlbGx4OTkyMQoKe1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKQ292ZXJhZ2UgR2VucGFuZWwgMjB4Ogp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0Cm4vYQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE0ClR1bW9yLVBsb2lkaWU6Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTQKbi9hCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2VsbHg5OTIyCgp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNApJbiBSZWdpb25lbiBtaXQgZWluZXIgQWJkZWNrdW5nIFx1NjI7NjAga1x1MjQ2O25uZW4gc29tYXRpc2NoZSBWYXJpYW50ZW4gbWl0IGVpbmVyIEZyZXF1ZW56IFx1NjI7NSUgaW0gVHVtb3JnZXdlYmUgbWl0IGVpbmVyIFNlbnNpdGl2aXRcdTIyODt0IFx1NjI7OTUsMCUgdW5kIGVpbmVtIFBvc2l0aXZlIFByZWRpY3Rpb24gVmFsdWUgUFBXIFx1NjI7OTklIGJlc3RpbW10IHdlcmRlbi4gRlx1MjUyO3IgbWluZGVzdGVucyA5NSUgYWxsZXIgdW50ZXJzdWNodGVuIEdlbmUga2FubiBkaWUgS29waWVuemFobCBrb3JyZWt0IHVudGVyIGRpZXNlbiBCZWRpbmd1bmdlbiBiZXN0aW1tdCB3ZXJkZW4uCn1cY2VsbH0KXHJvdwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0bwp9 + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGNicGF0NFx0cmhkclxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiCkluZm9ybWF0aW9uZW4genUgbW9sZWt1bGFyZW4gU2lnbmFsd2VnZW4KfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4MjQ4MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4NDk2MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4NzQ0MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ1XGNlbGx4OTkyMAoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKXGkKSG9ybW9uZQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpCkhSRAp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpClBJM0stQUtULU1UT1IKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpcaQpSYXMtUmFmLU1lay1FcmsKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4MjQ4MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NDk2MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4NzQ0MFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNlbGx4OTkyMAoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTgKQlJDQTIKfSBccWwKewpcZnMxNgpwLlNlcjE5NTVUZXIKfVxsaW5lClxxbAp7ClxmczE4ClsgCn1ccWwKewpcZnMxOApCUkNBMgp9IFxxbAp7ClxmczE2CnAuQXNwMTk0OV9Bc3AxOTU2ZGVsCn1ccWwKewpcZnMxOAogXQp9XGxpbmUKXHFsCnsKXGZzMTgKRkFOQ0wKfSBccWwKewpcZnMxNgpERUwgKGhldCkKfVxsaW5lClxxbAp7ClxmczE4CkZBTkNHCn0gXHFsCnsKXGZzMTYKREVMIChoZXQpCn1cbGluZQpccWwKewpcZnMxOApDREsxMgp9IFxxbAp7ClxmczE2CkRFTCAoaGV0KQp9XGxpbmUKXHFsCnsKXGZzMTgKQ0hFSzIKfSBccWwKewpcZnMxNgpERUwgKGhldCkKfQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxYwp7ClxmczE4ClxxbAp7ClxmczE4ClBURU4KfSBccWwKewpcZnMxNgpERUwgKGhldCkKfVxsaW5lClxxbAp7ClxmczE4Ck5GMgp9IFxxbAp7ClxmczE2CkRFTCAoaGV0KQp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGNicGF0NVxjZWxseDI0ODBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGNicGF0NVxjZWxseDQ5NjBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGNicGF0NVxjZWxseDc0NDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGNicGF0NVxjZWxseDk5MjAKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE4ClxiClxpClJlemVwdG9yLVR5cm9zaW5raW5hc2UKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpcaQpXTlQKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxOApcYgpcaQpaZWxsenlrbHVzL0Fwb3B0b3NlCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKXGkKCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDI0ODBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDQ5NjBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc0NDBcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjAKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxzbDI3NlxzbG11bHQxClxxYwp7ClxmczE4ClxxbAp7ClxmczE4ClsgCn1ccWwKewpcZnMxOApBTEsKfSBccWwKewpcZnMxNgpwLlBybzE0NjlBcmdmc1RlcjgKfVxxbAp7ClxmczE4CiBdCn1cbGluZQpccWwKewpcZnMxOApFR0ZSCn0gXHFsCnsKXGZzMTYKcC5MZXU4NThBcmcKfVxsaW5lClxxbAp7ClxmczE4CkVHRlIKfSBccWwKewpcZnMxNgpBTVAgKDI5IEtvcGllbikKfVxsaW5lClxxbAp7ClxmczE4ClNNQUQ0Cn0gXHFsCnsKXGZzMTYKREVMIChoZXQpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWMKewpcZnMxOApccWwKewpcZnMxOApBUEMKfSBccWwKewpcZnMxNgpwLkFyZzIxNlRlcgp9XGxpbmUKXHFsCnsKXGZzMTgKQVBDCn0gXHFsCnsKXGZzMTYKcC5UaHIxNDkzQXJnZnNUZXIxNAp9XGxpbmUKXHFsCnsKXGZzMTgKWyAKfVxxbAp7ClxmczE4CkFQQwp9IFxxbAp7ClxmczE2CnAuU2VyMjU4NklsZQp9XHFsCnsKXGZzMTgKIF0KfVxsaW5lClxxbAp7ClxmczE4CkFQQwp9IFxxbAp7ClxmczE2CkxPSAp9Cn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHNsMjc2XHNsbXVsdDEKXHFjCnsKXGZzMTgKXHFsCnsKXGZzMTgKQ0RLTjJBCn0gXHFsCnsKXGZzMTYKREVMIChob20pCn1cbGluZQpccWwKewpcZnMxOApDREtOMkIKfSBccWwKewpcZnMxNgpERUwgKGhvbSkKfVxsaW5lClxxbAp7ClxmczE4CkNIRUsyCn0gXHFsCnsKXGZzMTYKREVMIChoZXQpCn0KfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApcc2wyNzZcc2xtdWx0MQpccWMKewpcZnMxOAoKfVxjZWxsfQpccm93Clx0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFqClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxagp7ClxmczE0ClxxbAp7ClxmczE0ClxiCkJlc2NocmVpYnVuZzogCn1EaWUgbmFjaGdld2llc2VuZW4gcG90ZW50aWVsbCByZWxldmFudGVuIHNvbWF0aXNjaGVuIFZlclx1MjI4O25kZXJ1bmdlbiB1bmQgZGllIHVua2xhcmVuIFZhcmlhbnRlbiAoaW4gZWNraWdlbiBLbGFtbWVybikgd3VyZGVuIG5hY2ggZGVuIHdpY2h0aWdzdGVuIG1vbGVrdWxhcmVuIFNpZ25hbHdlZ2VuIHNvcnRpZXJ0LiBEaWUgWnVnZWhcdTI0NjtyaWdrZWl0IGVpbmVzIEdlbnMgenUgZWluZW0gYmVzdGltbXRlbiBTaWduYWx3ZWcgd3VyZGUgZHVyY2ggZGFzIE1vbGVrdWxhcmUgVHVtb3Jib2FyZCBUXHUyNTI7YmluZ2VuIGZlc3RnZXN0ZWxsdC4KfVxjZWxsfQpccm93Cn0= + e1xydGZcYW5zaQpcZGVmZjAKe1xmb250dGJse1xmMCBDYWxpYnJpO319ClxwYXBlcncxMTkwNQpccGFwZXJoMTU4NDAKXG1hcmdsMTMwMwpcbWFyZ3I2ODAKXG1hcmd0MTEzNApcbWFyZ2IxMTM0CntcY29sb3J0Ymw7XHJlZDE4OFxncmVlbjIzMFxibHVlMTM4O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTA7XHJlZDE5MVxncmVlbjE5MVxibHVlMTkxO1xyZWQyNDBcZ3JlZW4yNDBcYmx1ZTI0MDt9ClxkZWZsYW5nMTAzMVxwbGFpblxmczE4XHdpZG93Y3RybFxoeXBoYXV0b1x0cm93ZFx0cmdyYXBoMTgwXHRycGFkZGIyOFx0cnBhZGRsMjhcdHJwYWRkcjI4XHRycGFkZHQyOFxjbGJyZHJ0XGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmJcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRybFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJyXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsY2JwYXQ0XGNlbGx4OTkyMgoKe1xpbnRibCBccGFyZApccWMKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFjCnsKXGZzMTgKXGIKSExBCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiCkdlbmUKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxYwpcc2EzMApcc2IzMApcbGkzMApccmkzMApccWMKewpcZnMxNgpcYgpCbHV0IChOQTEyODc4XzAzKQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFjClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxYwp7ClxmczE2ClxiClR1bW9yIChETkExMjM0NTZfMDEpCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc4MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1BCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKbmljaHQgYmVzdGltbWJhcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpITEEtQSowMjowMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1BKjMyOjAxCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc4MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1CCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKbmljaHQgYmVzdGltbWJhcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpITEEtQiowNzowMgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1CKjQ0OjAyCn1cY2VsbH0KXHJvdwpcdHJvd2RcdHJncmFwaDE4MFx0cnBhZGRiMjhcdHJwYWRkbDI4XHRycGFkZHIyOFx0cnBhZGR0MjhcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDE1MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDM2MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDU3MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDc4MjJcY2xicmRydFxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjbGJyZHJiXGJyZHJ3MVxicmRyaGFpclxicmRyY2Y0XGNsYnJkcmxcYnJkcncxXGJyZHJoYWlyXGJyZHJjZjRcY2xicmRyclxicmRydzFcYnJkcmhhaXJcYnJkcmNmNFxjZWxseDk5MjIKCntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1DCn1cY2VsbH0Ke1xpbnRibCBccGFyZApccWwKXHNhMzAKXHNiMzAKXGxpMzAKXHJpMzAKXHFsCnsKXGZzMTYKbmljaHQgYmVzdGltbWJhcgp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2Cm5pY2h0IGJlc3RpbW1iYXIKfVxjZWxsfQp7XGludGJsIFxwYXJkClxxbApcc2EzMApcc2IzMApcbGkzMApccmkzMApccWwKewpcZnMxNgpITEEtQyowNTowMQp9XGNlbGx9CntcaW50YmwgXHBhcmQKXHFsClxzYTMwClxzYjMwClxsaTMwClxyaTMwClxxbAp7ClxmczE2CkhMQS1DKjA3OjAyCn1cY2VsbH0KXHJvdwp9 + diff --git a/src/cppXML-TEST/data/tumor_only_report.xml b/src/cppXML-TEST/data/tumor_only_report.xml new file mode 100644 index 000000000..359815ed3 --- /dev/null +++ b/src/cppXML-TEST/data/tumor_only_report.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/tumor_only_report_broken_schema.xml b/src/cppXML-TEST/data/tumor_only_report_broken_schema.xml new file mode 100644 index 000000000..a00b4edcb --- /dev/null +++ b/src/cppXML-TEST/data/tumor_only_report_broken_schema.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cppXML-TEST/data/tumor_only_report_broken_xml.xml b/src/cppXML-TEST/data/tumor_only_report_broken_xml.xml new file mode 100644 index 000000000..528a1dc35 --- /dev/null +++ b/src/cppXML-TEST/data/tumor_only_report_broken_xml.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cppXML-TEST/main.cpp b/src/cppXML-TEST/main.cpp new file mode 100644 index 000000000..579f9b083 --- /dev/null +++ b/src/cppXML-TEST/main.cpp @@ -0,0 +1,6 @@ +#include "TestFramework.h" + +int main(int argc, char *argv[]) +{ + return TFW::run(argc, argv); +} diff --git a/src/libs.pro b/src/libs.pro index 88e0db07b..bd592c94a 100644 --- a/src/libs.pro +++ b/src/libs.pro @@ -2,6 +2,7 @@ TEMPLATE = subdirs SUBDIRS = cppCORE \ cppCORE-TEST \ cppXML \ + cppXML-TEST \ cppNGS \ cppNGS-TEST \ cppNGSD \ @@ -11,6 +12,7 @@ SUBDIRS = cppCORE \ cppCORE-TEST.depends = cppCORE cppXML.depends = cppCORE +cppXML-TEST.depends = cppXML cppNGS.depends = cppXML cppNGS-TEST.depends = cppNGS cppNGSD.depends = cppNGS @@ -21,4 +23,5 @@ cppREST.depends = cppNGS cppREST.depends = cppNGSD cppREST-TEST.depends = cppREST + OTHER_FILES += ToDos.txt diff --git a/src/tools-TEST/SeqPurge_Test.h b/src/tools-TEST/SeqPurge_Test.h index 8fca76c99..3314d9ad6 100644 --- a/src/tools-TEST/SeqPurge_Test.h +++ b/src/tools-TEST/SeqPurge_Test.h @@ -220,7 +220,6 @@ private slots: QString out2 = "out/SeqPurge_"+suffix+"_R2.fastq.gz"; timer.restart(); EXECUTE("SeqPurge", "-in1 " + TESTDATA("data_in/SeqPurge_in1.fastq.gz") + " -in2 " + TESTDATA("data_in/SeqPurge_in2.fastq.gz") + " -out1 "+out1+" -out2 "+out2+" -ncut 0 -qcut 0 -min_len 15 -qc out/SeqPurge_"+suffix+".qcML -summary out/SeqPurge_"+suffix+".log -block_size 100 -threads " + QString::number(i)); - //QTextStream(stdout) << " threads: " << i << " time: " << Helper::elapsedTime(timer, true) << endl; //compare fastq statistics QString out1_stats = "out/SeqPurge_"+suffix+"_R1.stats"; From c154634d3320eee296971190b94ce245ad6c23e6 Mon Sep 17 00:00:00 2001 From: Alexandr Chernov Date: Wed, 19 Feb 2025 18:05:45 +0100 Subject: [PATCH 2/3] Refactored tools for Qt 5.15 --- src/BamRemoveVariants/main.cpp | 8 +- src/BedCoverage/main.cpp | 2 +- src/BedpeAnnotateCounts/main.cpp | 10 +- src/CnvReferenceCohort/main.cpp | 2 +- src/FastqMidParser/main.cpp | 2 +- src/GSvar/BurdenTestWidget.cpp | 40 +- src/GSvar/SequencingRunWidget.cpp | 14 +- src/GenePrioritization/main.cpp | 4 +- src/GraphStringDb/StringDbParser.h | 4 +- src/NGSDAddVariantsGermline/main.cpp | 2 +- src/NGSDExportSV/main.cpp | 14 +- src/NGSDSameSample/main.cpp | 6 +- src/SplicingToBed/main.cpp | 18 +- src/TsvDiff/main.cpp | 6 +- src/TsvSlice/main.cpp | 2 +- src/VcfAnnotateFromBed/main.cpp | 4 +- src/VcfAnnotateFromBigWig/main.cpp | 2 +- src/VcfAnnotateFromVcf/main.cpp | 2 +- src/VcfStreamSort/main.cpp | 2 +- src/VcfStrip/main.cpp | 4 +- src/cppCORE | 2 +- src/cppNGS/BamReader.cpp | 2 +- src/cppNGS/Transcript.cpp | 2 +- src/cppNGSD/GermlineReportGenerator.cpp | 964 ++++++++++++------------ src/cppNGSD/NGSD.cpp | 2 +- src/tools-TEST/SeqPurge_Test.h | 2 +- 26 files changed, 561 insertions(+), 561 deletions(-) diff --git a/src/BamRemoveVariants/main.cpp b/src/BamRemoveVariants/main.cpp index 9716fe5e8..c6f8da3a1 100644 --- a/src/BamRemoveVariants/main.cpp +++ b/src/BamRemoveVariants/main.cpp @@ -271,10 +271,10 @@ class ConcreteTool } - out << "pairs passed: " << count_pass << endl; - out << "pairs dropped: " << count_fail << endl; - out << "reads modified: " << count_modified << endl; - out << "skipped reads: " << count_skipped << endl; + out << "pairs passed: " << count_pass << QT_ENDL; + out << "pairs dropped: " << count_fail << QT_ENDL; + out << "reads modified: " << count_modified << QT_ENDL; + out << "skipped reads: " << count_skipped << QT_ENDL; } private: diff --git a/src/BedCoverage/main.cpp b/src/BedCoverage/main.cpp index a839769a1..ab506596c 100644 --- a/src/BedCoverage/main.cpp +++ b/src/BedCoverage/main.cpp @@ -56,7 +56,7 @@ class ConcreteTool foreach(QString bam, bams) { Statistics::avgCoverage(file, bam, getInt("min_mapq"), getInt("threads"), getInt("decimals"), getInfile("ref"), getFlag("random_access"), getFlag("debug")); - header += "\t" + QFileInfo(bam).baseName(); + header += "\t" + QFileInfo(bam).baseName().toUtf8(); } //store diff --git a/src/BedpeAnnotateCounts/main.cpp b/src/BedpeAnnotateCounts/main.cpp index a88223892..454e47d77 100644 --- a/src/BedpeAnnotateCounts/main.cpp +++ b/src/BedpeAnnotateCounts/main.cpp @@ -55,7 +55,7 @@ class ConcreteTool QTextStream out(stdout); // start timer - QTime timer; + QElapsedTimer timer; timer.start(); //load annotation files @@ -68,10 +68,10 @@ class ConcreteTool count_indices[StructuralVariantType::INV].load(QDir(ann_folder).filePath("sv_inversion.bedpe.gz").toUtf8()); count_indices[StructuralVariantType::BND].load(QDir(ann_folder).filePath("sv_translocation.bedpe.gz").toUtf8()); - out << " done. " << Helper::elapsedTime(timer) << endl; + out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; //load input file - out << "Start BEDPE annotation..." << endl; + out << "Start BEDPE annotation..." << QT_ENDL; BedpeFile bedpe_input_file; bedpe_input_file.load(input_filepath); @@ -316,7 +316,7 @@ class ConcreteTool output_buffer << sv.toTsv() << "\n"; } - out << "BEDPE annotation done. " << Helper::elapsedTime(timer) << endl; + out << "BEDPE annotation done. " << Helper::elapsedTime(timer) << QT_ENDL; //write buffer to file out << "write BEDPE output file..." ; @@ -329,7 +329,7 @@ class ConcreteTool output_file->write(line); } - out << " done. " << Helper::elapsedTime(timer) << endl; + out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; } diff --git a/src/CnvReferenceCohort/main.cpp b/src/CnvReferenceCohort/main.cpp index e2974e036..d1928116f 100644 --- a/src/CnvReferenceCohort/main.cpp +++ b/src/CnvReferenceCohort/main.cpp @@ -341,7 +341,7 @@ class ConcreteTool if (debug) out << "creating coverage profile of main sample: " << Helper::elapsedTime(timer.restart()) << QT_ENDL; //Load other samples and calculate correlation - QTime corr_timer; + QElapsedTimer corr_timer; QList> file2corr; CoverageProfile cov2(cov1.size()); diff --git a/src/FastqMidParser/main.cpp b/src/FastqMidParser/main.cpp index 4cbbf1694..a143014a6 100644 --- a/src/FastqMidParser/main.cpp +++ b/src/FastqMidParser/main.cpp @@ -92,7 +92,7 @@ class ConcreteTool } //create a sorted and unique list of values in the map - QList values = QList::fromSet(counts.values().toSet()); + QList values = SET_TO_LIST(LIST_TO_SET(counts.values())); std::sort(values.begin(), values.end(), std::greater()); //print list ordered by counts diff --git a/src/GSvar/BurdenTestWidget.cpp b/src/GSvar/BurdenTestWidget.cpp index 7b0757048..5a59af0cb 100644 --- a/src/GSvar/BurdenTestWidget.cpp +++ b/src/GSvar/BurdenTestWidget.cpp @@ -120,7 +120,7 @@ void BurdenTestWidget::loadGeneList() if (invalid_genes.size() > 0) { - QMessageBox::warning(this, "Invalid genes", "The following genes couldn't be converted into approved gene names and were removed:\n" + invalid_genes.toList().join(", ")); + QMessageBox::warning(this, "Invalid genes", "The following genes couldn't be converted into approved gene names and were removed:\n" + invalid_genes.values().join(", ")); } //apply new gene set @@ -265,7 +265,7 @@ void BurdenTestWidget::validateInputData() } // check overlap (samples) - overlap = sample_ids_cases.keys().toSet() & sample_ids_controls.keys().toSet(); + overlap = LIST_TO_SET(sample_ids_cases.keys()) & LIST_TO_SET(sample_ids_controls.keys()); if(overlap.size() > 0) { QStringList sample_names; @@ -289,7 +289,7 @@ void BurdenTestWidget::validateInputData() { if(sample_ids_cases.value(s_id).size() > 1) { - QSet ps_ids = sample_ids_cases.value(s_id).toSet(); + QSet ps_ids = LIST_TO_SET(sample_ids_cases.value(s_id)); QStringList ps_list; foreach (int id, ps_ids) ps_list << db_.processedSampleName(QString::number(id)); int ps_id = getNewestProcessedSample(ps_ids); @@ -307,7 +307,7 @@ void BurdenTestWidget::validateInputData() { if(sample_ids_controls.value(s_id).size() > 1) { - QSet ps_ids = sample_ids_controls.value(s_id).toSet(); + QSet ps_ids = LIST_TO_SET(sample_ids_controls.value(s_id)); QStringList ps_list; foreach (int id, ps_ids) ps_list << db_.processedSampleName(QString::number(id)); int ps_id = getNewestProcessedSample(ps_ids); @@ -333,7 +333,7 @@ void BurdenTestWidget::validateInputData() QSet same_samples = db_.sameSamples(s_id, SameSampleMode::SAME_PATIENT); //add sample itself same_samples.insert(s_id); - QSet same_sample_overlap = same_samples & sample_ids_cases.keys().toSet(); + QSet same_sample_overlap = same_samples & LIST_TO_SET(sample_ids_cases.keys()); if (same_sample_overlap.size() > 1) { QStringList same_sample_list; @@ -347,7 +347,7 @@ void BurdenTestWidget::validateInputData() warning_table.append(QStringList() << db_.sampleName(QString::number(s_id)) << "cases" << "same-sample/same-patient relation" << same_sample_list.join(", ") << db_.sampleName(QString::number(newest_s_id))); } //check controls and remove all overlaps - same_sample_overlap = same_samples & sample_ids_controls.keys().toSet(); + same_sample_overlap = same_samples & LIST_TO_SET(sample_ids_controls.keys()); if (same_sample_overlap.size() > 0) { QStringList same_sample_list; @@ -381,7 +381,7 @@ void BurdenTestWidget::validateInputData() QSet same_samples = db_.sameSamples(s_id, SameSampleMode::SAME_PATIENT); //add sample itself same_samples.insert(s_id); - QSet same_sample_overlap = same_samples & sample_ids_controls.keys().toSet(); + QSet same_sample_overlap = same_samples & LIST_TO_SET(sample_ids_controls.keys()); if (same_sample_overlap.size() > 1) { //add sample itself @@ -415,7 +415,7 @@ void BurdenTestWidget::validateInputData() stati_to_remove << "Unaffected" << "n/a"; foreach (const QString& relation, relation_types) { - QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & sample_ids_cases.keys().toSet(); + QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & LIST_TO_SET(sample_ids_cases.keys()); if (related_sample_overlap.size() > 1) { QStringList related_sample_list; @@ -442,7 +442,7 @@ void BurdenTestWidget::validateInputData() } //check/remove related samples from controls - related_sample_overlap = db_.relatedSamples(s_id, relation) & sample_ids_controls.keys().toSet(); + related_sample_overlap = db_.relatedSamples(s_id, relation) & LIST_TO_SET(sample_ids_controls.keys()); if (related_sample_overlap.size() > 1) { QStringList related_sample_list; @@ -478,7 +478,7 @@ void BurdenTestWidget::validateInputData() stati_to_remove << "Affected"; foreach (const QString& relation, relation_types) { - QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & sample_ids_controls.keys().toSet(); + QSet related_sample_overlap = db_.relatedSamples(s_id, relation) & LIST_TO_SET(sample_ids_controls.keys()); if (related_sample_overlap.size() > 1) { QStringList related_sample_list; @@ -513,8 +513,8 @@ void BurdenTestWidget::validateInputData() - if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple processing systems (" + processing_systems.toList().join(", ")+ ")!"; - if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple ancestries (" + ancestry.toList().join(", ")+ ")!"; + if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple processing systems (" + processing_systems.values().join(", ")+ ")!"; + if (processing_systems.size() > 1) warnings << "WARNING: The cohort contains multiple ancestries (" + ancestry.values().join(", ")+ ")!"; else @@ -577,11 +577,11 @@ void BurdenTestWidget::validateInputData() QSet control_samples_to_keep; foreach(int s_id, sample_ids_cases.keys()) { - case_samples_to_keep += sample_ids_cases.value(s_id).toSet(); + case_samples_to_keep += LIST_TO_SET(sample_ids_cases.value(s_id)); } foreach(int s_id, sample_ids_controls.keys()) { - control_samples_to_keep += sample_ids_controls.value(s_id).toSet(); + control_samples_to_keep += LIST_TO_SET(sample_ids_controls.value(s_id)); } QSet case_samples_to_remove = case_samples_.subtract(case_samples_to_keep); @@ -894,7 +894,7 @@ void BurdenTestWidget::performBurdenTest() bool include_cnvs = ui_->cb_include_cnvs->isChecked(); - QTime timer; + QElapsedTimer timer; timer.start(); //delete old table and disable sorting @@ -1052,7 +1052,7 @@ void BurdenTestWidget::performBurdenTest() } //new method - QTime tmp_timer; + QElapsedTimer tmp_timer; tmp_timer.start(); //get all variants for this gene QSet variant_ids = getVariantsForRegion(max_ngsd, max_gnomad_af, gene_regions, gene_name, impacts, predict_pathogenic); @@ -1110,8 +1110,8 @@ void BurdenTestWidget::performBurdenTest() // std::sort(ps_names_controls_cnv.begin(), ps_names_controls_cnv.end()); //get combined counts - int n_cases_combined = (ps_names_cases.keys().toSet() + ps_names_cases_cnv.keys().toSet()).size(); - int n_controls_combined = (ps_names_controls.keys().toSet() + ps_names_controls_cnv.keys().toSet()).size(); + int n_cases_combined = (LIST_TO_SET(ps_names_cases.keys()) + LIST_TO_SET(ps_names_cases_cnv.keys())).size(); + int n_controls_combined = (LIST_TO_SET(ps_names_controls.keys()) + LIST_TO_SET(ps_names_controls_cnv.keys())).size(); //calculate p-value (fisher) (SNPs only) p_value = BasicStatistics::fishersExactTest(n_cases_combined, n_controls_combined, case_samples_.size(), control_samples_.size(), "greater"); @@ -1344,7 +1344,7 @@ int BurdenTestWidget::countOccurences(const QSet& variant_ids, const QSet de_novo_var_ids = db_.getValuesInt("SELECT variant_id FROM report_configuration_variant WHERE de_novo=TRUE AND report_configuration_id=:0", QString::number(rc_id)).toSet(); + QSet de_novo_var_ids = LIST_TO_SET(db_.getValuesInt("SELECT variant_id FROM report_configuration_variant WHERE de_novo=TRUE AND report_configuration_id=:0", QString::number(rc_id))); intersection = intersection.intersect(de_novo_var_ids); //no de-novo variants @@ -1352,7 +1352,7 @@ int BurdenTestWidget::countOccurences(const QSet& variant_ids, const QSet sample_types = samples.extractColumn(samples.columnIndex("sample_type")).toSet(); - QSet system_types = samples.extractColumn(samples.columnIndex("sys_type")).toSet(); + QSet sample_types = LIST_TO_SET(samples.extractColumn(samples.columnIndex("sample_type"))); + QSet system_types = LIST_TO_SET(samples.extractColumn(samples.columnIndex("sys_type"))); setQCMetricAccessions(sample_types, system_types); // update QC plot button @@ -432,7 +432,7 @@ void SequencingRunWidget::setQuality() query.prepare("UPDATE processed_sample SET quality='" + quality + "' WHERE id=:0"); int col = ui_->samples->columnIndex("sample"); - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach (int row, selected_rows) { QString ps_name = ui_->samples->item(row, col)->text(); @@ -453,7 +453,7 @@ void SequencingRunWidget::scheduleForResequencing() query.prepare("UPDATE processed_sample SET scheduled_for_resequencing=TRUE WHERE id=:0"); int col = ui_->samples->columnIndex("sample"); - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach (int row, selected_rows) { QString ps_name = ui_->samples->item(row, col)->text(); @@ -472,7 +472,7 @@ void SequencingRunWidget::showPlot() //determine selected processed sample IDs QStringList selected_ps_ids; - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach(int row, selected_rows) { selected_ps_ids << ui_->samples->getId(row); @@ -560,7 +560,7 @@ void SequencingRunWidget::sendStatusEmail() if (is_batch_view_) { // get run status of all runs - QSet run_statuses = db.getValues("SELECT status FROM sequencing_run WHERE id IN (" + run_ids_.join(", ") + ");").toSet(); + QSet run_statuses = LIST_TO_SET(db.getValues("SELECT status FROM sequencing_run WHERE id IN (" + run_ids_.join(", ") + ");")); run_statuses.remove("analysis_finished"); run_statuses.remove("run_finished"); @@ -994,7 +994,7 @@ void SequencingRunWidget::updateReadQualityTable() void SequencingRunWidget::openSelectedSampleTabs() { int col = ui_->samples->columnIndex("sample"); - QList selected_rows = ui_->samples->selectedRows().toList(); + QList selected_rows = ui_->samples->selectedRows().values(); foreach (int row, selected_rows) { QString ps = ui_->samples->item(row, col)->text(); diff --git a/src/GenePrioritization/main.cpp b/src/GenePrioritization/main.cpp index 5986c5699..c05306aff 100644 --- a/src/GenePrioritization/main.cpp +++ b/src/GenePrioritization/main.cpp @@ -125,7 +125,7 @@ class ConcreteTool while(!in.atEnd()) { - QStringList line = in.readLine().split("\t", QString::SkipEmptyParts); + QStringList line = in.readLine().split("\t", QT_SKIP_EMPTY_PARTS); if(line.size() == 2) { NodeContent node_content_1{}; @@ -153,7 +153,7 @@ class ConcreteTool // read file line by line, changing node content of the disease genes while(!in.atEnd()) { - QStringList line = in.readLine().split("\t", QString::SkipEmptyParts); + QStringList line = in.readLine().split("\t", QT_SKIP_EMPTY_PARTS); if(graph.hasNode(line.at(0))) { diff --git a/src/GraphStringDb/StringDbParser.h b/src/GraphStringDb/StringDbParser.h index 5bd0ba30c..2331660d4 100644 --- a/src/GraphStringDb/StringDbParser.h +++ b/src/GraphStringDb/StringDbParser.h @@ -87,7 +87,7 @@ void StringDbParser::parseAliasFile() while(!in.atEnd()) { - QStringList line = in.readLine().split("\t", QString::SkipEmptyParts); + QStringList line = in.readLine().split("\t", QT_SKIP_EMPTY_PARTS); if(line.size() == 3) { @@ -120,7 +120,7 @@ void StringDbParser::parseStringDbFile() // read file line by line, adding all proteins with a HGNC alias and their interactions to the graph while(!in.atEnd()) { - QStringList line = in.readLine().split(" ", QString::SkipEmptyParts); + QStringList line = in.readLine().split(" ", QT_SKIP_EMPTY_PARTS); if(line.size() == 3) { diff --git a/src/NGSDAddVariantsGermline/main.cpp b/src/NGSDAddVariantsGermline/main.cpp index 51c918bf6..bcdfcb9be 100644 --- a/src/NGSDAddVariantsGermline/main.cpp +++ b/src/NGSDAddVariantsGermline/main.cpp @@ -146,7 +146,7 @@ class ConcreteTool QList variant_ids_new; VariantList variants_new; variants_new.copyMetaData(variants); - QSet existing_var_ids = db.getValuesInt("SELECT variant_id FROM detected_variant WHERE processed_sample_id='" + ps_id + "'").toSet(); + QSet existing_var_ids = LIST_TO_SET(db.getValuesInt("SELECT variant_id FROM detected_variant WHERE processed_sample_id='" + ps_id + "'")); for (int i=0; i valid_cs_ids = db.getValuesInt(QByteArray() + "SELECT sc.id FROM sv_callset sc INNER JOIN processed_sample ps ON sc.processed_sample_id = ps.id " + QSet valid_cs_ids = LIST_TO_SET(db.getValuesInt(QByteArray() + "SELECT sc.id FROM sv_callset sc INNER JOIN processed_sample ps ON sc.processed_sample_id = ps.id " + "WHERE ps.quality != 'bad' AND NOT EXISTS " - + "(SELECT 1 FROM merged_processed_samples mps WHERE mps.processed_sample_id = sc.processed_sample_id)").toSet(); + + "(SELECT 1 FROM merged_processed_samples mps WHERE mps.processed_sample_id = sc.processed_sample_id)")); std_out << " done. " << Helper::elapsedTime(timer) << QT_ENDL; diff --git a/src/NGSDSameSample/main.cpp b/src/NGSDSameSample/main.cpp index 9fae9832f..92c9ef50f 100644 --- a/src/NGSDSameSample/main.cpp +++ b/src/NGSDSameSample/main.cpp @@ -44,11 +44,11 @@ class ConcreteTool int provided_s_id = db.sampleId(ps_name).toInt(); //get filter parameter - QSet filter_sample_types = getString("sample_type").split(',').toSet(); + QSet filter_sample_types = LIST_TO_SET(getString("sample_type").split(',')); filter_sample_types.remove(""); - QSet filter_system_types = getString("system_type").split(',').toSet(); + QSet filter_system_types = LIST_TO_SET(getString("system_type").split(',')); filter_system_types.remove(""); - QSet filter_systems = getString("system").split(',').toSet(); + QSet filter_systems = LIST_TO_SET(getString("system").split(',')); filter_systems.remove(""); //validate filter parameters diff --git a/src/SplicingToBed/main.cpp b/src/SplicingToBed/main.cpp index 8b9964d26..8d1fc03d7 100644 --- a/src/SplicingToBed/main.cpp +++ b/src/SplicingToBed/main.cpp @@ -169,7 +169,7 @@ class ConcreteTool QMap sharedTranscripts(QMap a, QMap b, QByteArray prefix_a="E", QByteArray prefix_b="E") { QMap result; - QSet shared_transcripts = a.keys().toSet().intersect(b.keys().toSet()); + QSet shared_transcripts = LIST_TO_SET(a.keys()).intersect(LIST_TO_SET(b.keys())); foreach (QByteArray gene_tx, shared_transcripts) { result.insert(gene_tx + ":" + prefix_a + QByteArray::number(a[gene_tx]) + "-" + prefix_b + QByteArray::number(b[gene_tx]), @@ -280,7 +280,7 @@ class ConcreteTool //same transcript found for left and right exon QMap matchesL_matchesR = sharedTranscripts(matchesL, matchesR); - foreach (QByteArray gene_tx, matchesL_matchesR.uniqueKeys()) + foreach (QByteArray gene_tx, SET_TO_LIST(LIST_TO_SET(matchesL_matchesR.keys()))) { int diff = matchesL_matchesR.value(gene_tx); if (diff == 1) @@ -313,9 +313,9 @@ class ConcreteTool QList geneOverlapsR = genesByOverlap(db, chr, intron_end, strand); //string representations - QByteArray matchesL_overlapsR_str = matchesL_overlapsR.uniqueKeys().join(","); - QByteArray overlapsL_matchesR_str = overlapsL_matchesR.uniqueKeys().join(","); - QByteArray overlapsL_overlapsR_str = overlapsL_overlapsR.uniqueKeys().join(","); + QByteArray matchesL_overlapsR_str = SET_TO_LIST(LIST_TO_SET(matchesL_overlapsR.keys())).join(","); + QByteArray overlapsL_matchesR_str = SET_TO_LIST(LIST_TO_SET(overlapsL_matchesR.keys())).join(","); + QByteArray overlapsL_overlapsR_str = SET_TO_LIST(LIST_TO_SET(overlapsL_overlapsR.keys())).join(","); QByteArray matchesL_str = mapToKvStr(matchesL).join(","); QByteArray matchesR_str = mapToKvStr(matchesR).join(","); QByteArray overlapsL_str = mapToKvStr(overlapsL).join(","); @@ -328,7 +328,7 @@ class ConcreteTool { if (!overlapsR.isEmpty() && !matchesL_overlapsR.isEmpty()) { - foreach (QByteArray gene_tx, matchesL_overlapsR.uniqueKeys()) + foreach (QByteArray gene_tx, SET_TO_LIST(LIST_TO_SET(matchesL_overlapsR.keys()))) { int diff = matchesL_overlapsR.value(gene_tx); if (diff == 1) @@ -359,7 +359,7 @@ class ConcreteTool { if (!overlapsL.isEmpty() && !overlapsL_matchesR.isEmpty()) { - foreach (QByteArray gene_tx, overlapsL_matchesR.uniqueKeys()) + foreach (QByteArray gene_tx, SET_TO_LIST(LIST_TO_SET(overlapsL_matchesR.keys()))) { int diff = overlapsL_matchesR.value(gene_tx); if (diff == 1) @@ -391,7 +391,7 @@ class ConcreteTool { if (!overlapsL.isEmpty() && !overlapsR.isEmpty() && !overlapsL_overlapsR.isEmpty()) { - foreach (QByteArray gene_tx, overlapsL_overlapsR.uniqueKeys()) + foreach (QByteArray gene_tx, SET_TO_LIST(LIST_TO_SET(overlapsL_overlapsR.keys()))) { int diff = overlapsL_overlapsR.value(gene_tx); if (diff == 1) @@ -572,7 +572,7 @@ class ConcreteTool { gene_f->write("#symbol\t" + keys.join("\t") + "\taberrant_frac\n"); //per-gene stats - foreach (QByteArray g, gene_stats.uniqueKeys()) + foreach (QByteArray g, SET_TO_LIST(LIST_TO_SET(gene_stats.keys()))) { QList fields; fields.append(g); diff --git a/src/TsvDiff/main.cpp b/src/TsvDiff/main.cpp index f413b757d..a70f31687 100644 --- a/src/TsvDiff/main.cpp +++ b/src/TsvDiff/main.cpp @@ -382,7 +382,7 @@ class ConcreteTool bool skip_comments = getFlag("skip_comments"); QStringList skip_comments_matching = getString("skip_comments_matching").split(","); skip_comments_matching.removeAll(""); - QSet skip_cols = getString("skip_cols").split(",").toSet(); + QSet skip_cols = LIST_TO_SET(getString("skip_cols").split(",")); skip_cols.remove(""); QSharedPointer out = Helper::openFileForWriting(getOutfile("out"), true); QTextStream ostream(out.data()); @@ -403,11 +403,11 @@ class ConcreteTool in2.load(getInfile("in2"), true); //determine columns used for comperison - QSet comp_cols = getString("comp").split(",").toSet(); + QSet comp_cols = LIST_TO_SET(getString("comp").split(",")); comp_cols.remove(""); if (comp_cols.isEmpty()) // "comp" not set => use all columns { - comp_cols = in1.headers().toSet() + in2.headers().toSet(); + comp_cols = LIST_TO_SET(in1.headers()) + LIST_TO_SET(in2.headers()); } foreach(QString col, skip_cols) { diff --git a/src/TsvSlice/main.cpp b/src/TsvSlice/main.cpp index 456928137..eb66dcd2f 100644 --- a/src/TsvSlice/main.cpp +++ b/src/TsvSlice/main.cpp @@ -44,7 +44,7 @@ class ConcreteTool //remove instead of extract > invert column selection if (getFlag("rm")) { - QSet old = cols.toList().toSet(); + QSet old = LIST_TO_SET(cols.toList()); cols.clear(); for (int c=0; c " + replacement.value + "; "; + mapping_string += replacement.key.toUtf8() + " -> " + replacement.value.toUtf8() + "; "; } setExtendedDescription(QStringList() << "Characters which are not allowed in the INFO column based on the VCF 4.2 definition are URL encoded." << "The following characters are replaced:" << mapping_string); @@ -115,7 +115,7 @@ class ConcreteTool int current_chunk = 0; //debug - QTime timer; + QElapsedTimer timer; QTextStream outstream(stdout); if (debug>0) timer.start(); diff --git a/src/VcfAnnotateFromBigWig/main.cpp b/src/VcfAnnotateFromBigWig/main.cpp index 3ed8b6dd0..ea4e7ada1 100644 --- a/src/VcfAnnotateFromBigWig/main.cpp +++ b/src/VcfAnnotateFromBigWig/main.cpp @@ -105,7 +105,7 @@ class ConcreteTool int current_chunk = 0; //debug - QTime timer; + QElapsedTimer timer; QTextStream outstream(stdout); if (debug>0) timer.start(); diff --git a/src/VcfAnnotateFromVcf/main.cpp b/src/VcfAnnotateFromVcf/main.cpp index 0c10d3213..c0307d008 100644 --- a/src/VcfAnnotateFromVcf/main.cpp +++ b/src/VcfAnnotateFromVcf/main.cpp @@ -189,7 +189,7 @@ class ConcreteTool { tmp.append(ids); } - QSet unique_output_ids = QSet::fromList(tmp); + QSet unique_output_ids = LIST_TO_SET(tmp); if (unique_output_ids.size() < tmp.size()) { THROW(FileParseException, "The given output INFO ids contain duplicates!") diff --git a/src/VcfStreamSort/main.cpp b/src/VcfStreamSort/main.cpp index b19cfd44e..f1b14f47a 100644 --- a/src/VcfStreamSort/main.cpp +++ b/src/VcfStreamSort/main.cpp @@ -138,7 +138,7 @@ class ConcreteTool } //insert line - lines.insertMulti(VcfCoords{pos, parts[3], parts[4], parts[7]}, line); + lines.insert(VcfCoords{pos, parts[3], parts[4], parts[7]}, line); //write overflow lines if (lines.count()>n) diff --git a/src/VcfStrip/main.cpp b/src/VcfStrip/main.cpp index abdf67082..a687e1c46 100644 --- a/src/VcfStrip/main.cpp +++ b/src/VcfStrip/main.cpp @@ -53,8 +53,8 @@ class ConcreteTool: public ToolBase QSharedPointer out_p = Helper::openFileForWriting(out, true); //get list of formats and infos to keep - QSet formats_keep = getString("format").toUtf8().split(',').toSet().subtract(QSet{""}); - QSet infos_keep = getString("info").toUtf8().split(',').toSet().subtract(QSet{""}); + QSet formats_keep = LIST_TO_SET(getString("format").toUtf8().split(',')).subtract(QSet{""}); + QSet infos_keep = LIST_TO_SET(getString("info").toUtf8().split(',')).subtract(QSet{""}); while(!in_p->atEnd()) { diff --git a/src/cppCORE b/src/cppCORE index eddc2e067..aee521380 160000 --- a/src/cppCORE +++ b/src/cppCORE @@ -1 +1 @@ -Subproject commit eddc2e06701698826e5f29885ae9f6a37abaa8b7 +Subproject commit aee521380849d6342cbfa4e58207c96634831e82 diff --git a/src/cppNGS/BamReader.cpp b/src/cppNGS/BamReader.cpp index 8d2ec58f9..8c32ae568 100644 --- a/src/cppNGS/BamReader.cpp +++ b/src/cppNGS/BamReader.cpp @@ -91,7 +91,7 @@ QByteArray BamAlignment::cigarDataAsString(bool expand) const } else { - output.append(QString::number(bam_cigar_oplen(cigar[i])).toLocal8Bit()); + output.append(QString::number(bam_cigar_oplen(cigar[i])).toUtf8()); output.append(bam_cigar_opchr(cigar[i])); } } diff --git a/src/cppNGS/Transcript.cpp b/src/cppNGS/Transcript.cpp index 1b2ef0bf4..be59f2332 100644 --- a/src/cppNGS/Transcript.cpp +++ b/src/cppNGS/Transcript.cpp @@ -630,7 +630,7 @@ Variant Transcript::hgvsToVariant(QString hgvs_c, const FastaFileIndex& genome_i //sequence ref.append('-'); - obs.append(hgvs_c.mid(ins_pos+3).toLocal8Bit()); + obs.append(hgvs_c.mid(ins_pos+3).toUtf8()); //convert reference to correct strand if(strand_==Transcript::MINUS) diff --git a/src/cppNGSD/GermlineReportGenerator.cpp b/src/cppNGSD/GermlineReportGenerator.cpp index 91ab1dfcd..54a450f21 100644 --- a/src/cppNGSD/GermlineReportGenerator.cpp +++ b/src/cppNGSD/GermlineReportGenerator.cpp @@ -67,48 +67,48 @@ void GermlineReportGenerator::writeHTML(QString filename) ProcessingSystemData system_data = db_.getProcessingSystemData(db_.processingSystemIdFromProcessedSample(data_.ps)); //report header (meta information) - stream << "

" << trans("Technischer Report zur bioinformatischen Analyse") << "

" << endl; + stream << "

" << trans("Technischer Report zur bioinformatischen Analyse") << "

" << QT_ENDL; - stream << endl; - stream << "

" << trans("Probe") << ": " << data_.ps << " (" << sample_data.name_external << ")" << endl; + stream << QT_ENDL; + stream << "

" << trans("Probe") << ": " << data_.ps << " (" << sample_data.name_external << ")" << QT_ENDL; if (is_trio) { - stream << "
" << endl; - stream << "
" << trans("Vater") << ": " << info_additional[0].name << endl; - stream << "
" << trans("Mutter") << ": " << info_additional[1].name << endl; + stream << "
" << QT_ENDL; + stream << "
" << trans("Vater") << ": " << info_additional[0].name << QT_ENDL; + stream << "
" << trans("Mutter") << ": " << info_additional[1].name << QT_ENDL; } if (is_multi_with_extra_genotypes) { - stream << "
" << endl; + stream << "
" << QT_ENDL; foreach(const SampleInfo& info, info_additional) { - stream << "
" << trans("Zusatzprobe") << ": " << info.name << endl; + stream << "
" << trans("Zusatzprobe") << ": " << info.name << QT_ENDL; } } - stream << "
" << endl; - stream << "
" << trans("Geschlecht") << ": " << trans(processed_sample_data.gender) << endl; - stream << "
" << trans("Prozessierungssystem") << ": " << processed_sample_data.processing_system << endl; - stream << "
" << trans("Prozessierungssystem-Typ") << ": " << processed_sample_data.processing_system_type << endl; + stream << "
" << QT_ENDL; + stream << "
" << trans("Geschlecht") << ": " << trans(processed_sample_data.gender) << QT_ENDL; + stream << "
" << trans("Prozessierungssystem") << ": " << processed_sample_data.processing_system << QT_ENDL; + stream << "
" << trans("Prozessierungssystem-Typ") << ": " << processed_sample_data.processing_system_type << QT_ENDL; QString run_id = db_.getValue("SELECT id FROM sequencing_run WHERE name=:0", false, processed_sample_data.run_name).toString(); - stream << "
" << trans("Sequenziersystem") << ": " << db_.getValue("SELECT d.type FROM device d, sequencing_run r WHERE r.device_id=d.id AND r.id=:0", false, run_id).toString() << endl; + stream << "
" << trans("Sequenziersystem") << ": " << db_.getValue("SELECT d.type FROM device d, sequencing_run r WHERE r.device_id=d.id AND r.id=:0", false, run_id).toString() << QT_ENDL; //ignore read length for lrGS if (processed_sample_data.processing_system_type != "lrGS") { - stream << "
" << trans("Readlänge") << ": " << db_.getValue("SELECT recipe FROM sequencing_run WHERE id=:0", false, run_id).toString() << endl; + stream << "
" << trans("Readlänge") << ": " << db_.getValue("SELECT recipe FROM sequencing_run WHERE id=:0", false, run_id).toString() << QT_ENDL; } - stream << "
" << trans("Referenzgenom") << ": " << system_data.genome << endl; - stream << "
" << trans("Datum") << ": " << date_.toString("dd.MM.yyyy") << endl; - stream << "
" << trans("Analysepipeline") << ": " << data_.variants.getPipeline() << endl; - stream << "
" << trans("Auswertungssoftware") << ": " << QCoreApplication::applicationName() << " " << QCoreApplication::applicationVersion() << endl; - stream << "

" << endl; + stream << "
" << trans("Referenzgenom") << ": " << system_data.genome << QT_ENDL; + stream << "
" << trans("Datum") << ": " << date_.toString("dd.MM.yyyy") << QT_ENDL; + stream << "
" << trans("Analysepipeline") << ": " << data_.variants.getPipeline() << QT_ENDL; + stream << "
" << trans("Auswertungssoftware") << ": " << QCoreApplication::applicationName() << " " << QCoreApplication::applicationVersion() << QT_ENDL; + stream << "

" << QT_ENDL; ///Phenotype information - stream << endl; - stream << "

" << trans("Phänotyp") << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("Phänotyp") << "" << QT_ENDL; QList info = db_.getSampleDiseaseInfo(sample_id, "ICD10 code"); foreach(const SampleDiseaseInfo& entry, info) { - stream << "
ICD10: " << entry.disease_info << endl; + stream << "
ICD10: " << entry.disease_info << QT_ENDL; } info = db_.getSampleDiseaseInfo(sample_id, "HPO term id"); foreach(const SampleDiseaseInfo& entry, info) @@ -116,41 +116,41 @@ void GermlineReportGenerator::writeHTML(QString filename) int hpo_id = db_.phenotypeIdByAccession(entry.disease_info.toUtf8(), false); if (hpo_id!=-1) { - stream << "
HPO: " << entry.disease_info << " (" << db_.phenotype(hpo_id).name() << ")" << endl; + stream << "
HPO: " << entry.disease_info << " (" << db_.phenotype(hpo_id).name() << ")" << QT_ENDL; } } info = db_.getSampleDiseaseInfo(sample_id, "OMIM disease/phenotype identifier"); foreach(const SampleDiseaseInfo& entry, info) { - stream << "
OMIM: " << entry.disease_info << endl; + stream << "
OMIM: " << entry.disease_info << QT_ENDL; } info = db_.getSampleDiseaseInfo(sample_id, "Orpha number"); foreach(const SampleDiseaseInfo& entry, info) { - stream << "
Orphanet: " << entry.disease_info << endl; + stream << "
Orphanet: " << entry.disease_info << QT_ENDL; } - stream << "

" << endl; + stream << "

" << QT_ENDL; ///Target region statistics if (data_.roi.isValid()) { - stream << endl; - stream << "

" << trans("Zielregion") << "" << endl; - stream << "
" << trans("Die Zielregion umfasst mindestens die CCDS (\"consensus coding sequence\") unten genannter Gene ±20 Basen flankierender intronischer Sequenz, kann aber auch zusätzliche Exons und/oder flankierende Basen beinhalten.") << endl; - stream << "
" << trans("Name") << ": " << data_.roi.name << endl; + stream << QT_ENDL; + stream << "

" << trans("Zielregion") << "" << QT_ENDL; + stream << "
" << trans("Die Zielregion umfasst mindestens die CCDS (\"consensus coding sequence\") unten genannter Gene ±20 Basen flankierender intronischer Sequenz, kann aber auch zusätzliche Exons und/oder flankierende Basen beinhalten.") << QT_ENDL; + stream << "
" << trans("Name") << ": " << data_.roi.name << QT_ENDL; if (!data_.roi.genes.isEmpty()) { stream << "
" << trans("Ausgewertete Gene") << ": "; if (data_.report_settings.show_coverage_details && Settings::string("location", true)!="MHH") { - stream << QString::number(data_.roi.genes.count()) << " (" << trans("siehe Abdeckungsstatistik") << ")" << endl; + stream << QString::number(data_.roi.genes.count()) << " (" << trans("siehe Abdeckungsstatistik") << ")" << QT_ENDL; } else { - stream << data_.roi.genes.join(", ") << endl; + stream << data_.roi.genes.join(", ") << QT_ENDL; } } - stream << "

" << endl; + stream << "

" << QT_ENDL; } //get column indices @@ -161,11 +161,11 @@ void GermlineReportGenerator::writeHTML(QString filename) int i_gnomad = data_.variants.annotationIndexByName("gnomAD", true, true); //output: applied filters - stream << endl; - stream << "

" << trans("Filterkriterien") << " " << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("Filterkriterien") << " " << "" << QT_ENDL; for(int i=0; i    - " << data_.filters[i]->toText() << endl; + stream << "
    - " << data_.filters[i]->toText() << QT_ENDL; } stream << "
"; @@ -178,7 +178,7 @@ void GermlineReportGenerator::writeHTML(QString filename) var_count = filter_result.countPassing(); } - stream << "
" << trans("Gefundene SNVs/InDels in Zielregion gesamt") << ": " << var_count << endl; + stream << "
" << trans("Gefundene SNVs/InDels in Zielregion gesamt") << ": " << var_count << QT_ENDL; selected_small_.clear(); selected_cnvs_.clear(); selected_svs_.clear(); @@ -190,19 +190,19 @@ void GermlineReportGenerator::writeHTML(QString filename) if (it->first==VariantType::SVS) selected_svs_ << it->second; if (it->first==VariantType::RES) selected_res_ << it->second; } - stream << "
" << trans("Anzahl SNVs/InDels ausgewählt für Report") << ": " << selected_small_.count() << endl; - stream << "
" << trans("Anzahl CNVs/SVs/REs ausgewählt für Report") << ": " << (selected_cnvs_.count() + selected_svs_.count() + selected_res_.count()) << endl; - stream << "

" << endl; + stream << "
" << trans("Anzahl SNVs/InDels ausgewählt für Report") << ": " << selected_small_.count() << QT_ENDL; + stream << "
" << trans("Anzahl CNVs/SVs/REs ausgewählt für Report") << ": " << (selected_cnvs_.count() + selected_svs_.count() + selected_res_.count()) << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "
" << trans("Sofern vorhanden, werden in den nachfolgenden Tabellen erfasst: pathogene Varianten (Klasse 5)* und wahrscheinlich pathogene Varianten (Klasse 4)*, bei denen jeweils ein Zusammenhang mit der klinischen Fragestellung anzunehmen ist, sowie Varianten unklarer klinischer Signifikanz (Klasse 3)* für welche in Zusammenschau von Literatur und Klinik des Patienten ein Beitrag zur Symptomatik denkbar ist und für die gegebenenfalls eine weitere Einordnung der klinischen Relevanz durch Folgeuntersuchungen sinnvoll erscheint.") << endl; - stream << trans("Teilweise können - in Abhängigkeit von der Art der genetischen Veränderung, der Familienanamnese und der Klinik der Patientin/des Patienten - weiterführende Untersuchungen eine Änderung der Klassifizierung bewirken.") << endl; - stream << "
" << trans("Eine (unkommentierte) Liste aller detektierten Varianten kann bei Bedarf angefordert werden.") << endl; - stream << "
" << trans("Bei konkreten differentialdiagnostischen Hinweisen auf eine konkrete Erkrankung können ggf. weiterführende genetische Untersuchungen bzw. Untersuchungsmethoden indiziert sein.") << endl; - stream << "
" << trans("* Für Informationen zur Klassifizierung von Varianten, siehe allgemeine Zusatzinformationen.") << endl; + stream << "
" << trans("Sofern vorhanden, werden in den nachfolgenden Tabellen erfasst: pathogene Varianten (Klasse 5)* und wahrscheinlich pathogene Varianten (Klasse 4)*, bei denen jeweils ein Zusammenhang mit der klinischen Fragestellung anzunehmen ist, sowie Varianten unklarer klinischer Signifikanz (Klasse 3)* für welche in Zusammenschau von Literatur und Klinik des Patienten ein Beitrag zur Symptomatik denkbar ist und für die gegebenenfalls eine weitere Einordnung der klinischen Relevanz durch Folgeuntersuchungen sinnvoll erscheint.") << QT_ENDL; + stream << trans("Teilweise können - in Abhängigkeit von der Art der genetischen Veränderung, der Familienanamnese und der Klinik der Patientin/des Patienten - weiterführende Untersuchungen eine Änderung der Klassifizierung bewirken.") << QT_ENDL; + stream << "
" << trans("Eine (unkommentierte) Liste aller detektierten Varianten kann bei Bedarf angefordert werden.") << QT_ENDL; + stream << "
" << trans("Bei konkreten differentialdiagnostischen Hinweisen auf eine konkrete Erkrankung können ggf. weiterführende genetische Untersuchungen bzw. Untersuchungsmethoden indiziert sein.") << QT_ENDL; + stream << "
" << trans("* Für Informationen zur Klassifizierung von Varianten, siehe allgemeine Zusatzinformationen.") << QT_ENDL; //output: select small variants - stream << "

" << trans("Einzelbasenveränderungen (SNVs) und Insertionen/Deletionen (InDels) nach klinischer Interpretation im Kontext der Fragestellung") << "" << endl; - stream << "" << endl; + stream << "

" << trans("Einzelbasenveränderungen (SNVs) und Insertionen/Deletionen (InDels) nach klinischer Interpretation im Kontext der Fragestellung") << "" << QT_ENDL; + stream << "
" << QT_ENDL; stream << ""; int colspan = 8; if (is_trio) @@ -219,7 +219,7 @@ void GermlineReportGenerator::writeHTML(QString filename) } colspan += info_additional.count(); } - stream << "" << endl; + stream << "" << QT_ENDL; foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { if (var_conf.variant_type!=VariantType::SNVS_INDELS) continue; @@ -228,14 +228,14 @@ void GermlineReportGenerator::writeHTML(QString filename) Variant variant = data_.variants[var_conf.variant_index]; if (var_conf.isManuallyCurated()) var_conf.updateVariant(variant, genome_idx_, i_genotype); - stream << "" << endl; - stream << "" << QT_ENDL; + stream << ""; QString geno = formatGenotype(data_.build, processed_sample_data.gender.toUtf8(), variant.annotations().at(i_genotype), variant); if (var_conf.de_novo) geno += " (de-novo)"; if (var_conf.mosaic) geno += " (mosaic)"; if (var_conf.comp_het) geno += " (comp-het)"; - stream << "" << endl; + stream << "" << QT_ENDL; if (is_trio) { stream << ""; @@ -261,12 +261,12 @@ void GermlineReportGenerator::writeHTML(QString filename) { inheritance = " (" + gene_info.inheritance + ")"; } - stream << sep << gene << inheritance << endl; + stream << sep << gene << inheritance << QT_ENDL; } - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QByteArray gnomad_percentage = "n/a"; QByteArray freq = variant.annotations().at(i_gnomad).trimmed(); if (!freq.isEmpty()) @@ -280,9 +280,9 @@ void GermlineReportGenerator::writeHTML(QString filename) Log::warn("Could not convert gnomAD AF to number: " + e.message()); } } - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; //OMIM line QString omim = variant.annotations()[i_omim].trimmed(); @@ -294,17 +294,17 @@ void GermlineReportGenerator::writeHTML(QString filename) if (omim_part.count()<10) continue; omim = "OMIM ID: " + omim_part.left(6) + " Details: " + omim_part.mid(8); } - stream << "" << endl; + stream << "" << QT_ENDL; } } if (selected_small_.count()==0) stream << ""; - stream << "
" << trans("Variante") << "" << trans("Genotyp") << "" << trans("Gen(e)") << "" << trans("Details") << "" << trans("Klasse") << "" << trans("Erbgang") << "" << trans("gnomAD Allelfrequenz") << "
(" << trans("Kontrollkohorte") << ")
RNA
" << trans("Gen(e)") << "" << trans("Details") << "" << trans("Klasse") << "" << trans("Erbgang") << "" << trans("gnomAD Allelfrequenz") << "
(" << trans("Kontrollkohorte") << ")
RNA
" << endl; + stream << "
" << QT_ENDL; stream << variant.chr().strNormalized(true) << ":" << variant.start() << " " << variant.ref() << " > " << variant.obs() << "" << geno << "" << geno << "" << formatGenotype(data_.build, "male", variant.annotations().at(info_additional[0].column_index), variant) << "" << formatCodingSplicing(variant) << "" << variant.annotations().at(i_class) << "" << var_conf.inheritance << "" << formatCodingSplicing(variant) << "" << variant.annotations().at(i_class) << "" << var_conf.inheritance << "" << gnomad_percentage << "" << trans(var_conf.rna_info) << "
" << gnomad_percentage << "" << trans(var_conf.rna_info) << "
" << omim << "
" << omim << "
" << trans("Keine") << "
" << endl; + stream << "" << QT_ENDL; //-------------------------------------------------------------------------------------- //CNVs + SVs + REs - stream << "
" << trans("Kopienzahlveränderungen (CNV) und/oder Strukturveränderungen (SV) nach klinischer Interpretation im Kontext der Fragestellung") << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Kopienzahlveränderungen (CNV) und/oder Strukturveränderungen (SV) nach klinischer Interpretation im Kontext der Fragestellung") << "" << QT_ENDL; + stream << "
" << trans("CNV/SV/RE") << "" << trans("Position") << "" << trans("Größe") << "" << trans("Kopienzahl/Genotyp") << "" << trans("Gen(e)") << "" << trans("Klasse") << "" << trans("Erbgang") << "RNA
" << QT_ENDL; + stream << "" << QT_ENDL; colspan = 8; foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { @@ -316,20 +316,20 @@ void GermlineReportGenerator::writeHTML(QString filename) int cn = cnv.copyNumber(data_.cnvs.annotationHeaders()); - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QString cn_str = QString::number(cn); if (var_conf.de_novo) cn_str += " (de-novo)"; if (var_conf.mosaic) cn_str += " (mosaic)"; if (var_conf.comp_het) cn_str += " (comp-het)"; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { @@ -339,26 +339,26 @@ void GermlineReportGenerator::writeHTML(QString filename) BedpeLine sv = data_.svs[var_conf.variant_index]; if (var_conf.isManuallyCurated()) var_conf.updateSv(sv, data_.svs.annotationHeaders(), db_); - stream << "" << endl; + stream << "" << QT_ENDL; //type stream << "" << endl; + stream << trans("Deletion") << "" << QT_ENDL; break; case StructuralVariantType::DUP: - stream << trans("Duplikation") << "" << endl; + stream << trans("Duplikation") << "" << QT_ENDL; break; case StructuralVariantType::INS: - stream << trans("Insertion") << "" << endl; + stream << trans("Insertion") << "" << QT_ENDL; break; case StructuralVariantType::INV: - stream << trans("Inversion") << "" << endl; + stream << trans("Inversion") << "" << QT_ENDL; break; case StructuralVariantType::BND: - stream << trans("Translokation") << "" << endl; + stream << trans("Translokation") << "" << QT_ENDL; break; default: THROW(ArgumentException, "Invalid SV type!") @@ -369,7 +369,7 @@ void GermlineReportGenerator::writeHTML(QString filename) BedFile affected_region = sv.affectedRegion(false); stream << "" << endl; + stream << "" << QT_ENDL; //size int size = sv.size(); @@ -387,20 +387,20 @@ void GermlineReportGenerator::writeHTML(QString filename) if (var_conf.de_novo) stream << " (de-novo)"; if (var_conf.mosaic) stream << " (mosaic)"; if (var_conf.comp_het) stream << " (comp-het)"; - stream << "" << endl; + stream << "" << QT_ENDL; //genes - stream << "" << endl; + stream << "" << QT_ENDL; //classification - stream << "" << endl; + stream << "" << QT_ENDL; //inheritance - stream << "" << endl; + stream << "" << QT_ENDL; //RNA info - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } foreach(const ReportVariantConfiguration& var_conf, data_.report_settings.report_config->variantConfig()) { @@ -410,43 +410,43 @@ void GermlineReportGenerator::writeHTML(QString filename) RepeatLocus re = data_.res[var_conf.variant_index]; if (var_conf.isManuallyCurated()) var_conf.updateRe(re); - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QString geno = trans("expandiert"); if (var_conf.de_novo) geno += " (de-novo)"; if (var_conf.mosaic) geno += " (mosaic)"; if (var_conf.comp_het) geno += " (comp-het)"; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } if (selected_cnvs_.count()==0 && selected_svs_.count()==0 && selected_res_.count()==0) stream << ""; - stream << "
" << trans("CNV/SV/RE") << "" << trans("Position") << "" << trans("Größe") << "" << trans("Kopienzahl/Genotyp") << "" << trans("Gen(e)") << "" << trans("Klasse") << "" << trans("Erbgang") << "RNA
" << (cn<2 ? trans("Deletion") : trans("Duplikation")) << "" << cnv.toString() << "" << QString::number(cnv.size()/1000.0, 'f', 3) << " " << trans("kb") << " / " << std::max(1, cnv.regions()) << " " << trans("Regionen") << "
" << (cn<2 ? trans("Deletion") : trans("Duplikation")) << "" << cnv.toString() << "" << QString::number(cnv.size()/1000.0, 'f', 3) << " " << trans("kb") << " / " << std::max(1, cnv.regions()) << " " << trans("Regionen") << "" << cn_str << "" << cnv.genes().join(", ") << "" << var_conf.classification << "" << var_conf.inheritance << "" << trans(var_conf.rna_info) << "
" << cn_str << "" << cnv.genes().join(", ") << "" << var_conf.classification << "" << var_conf.inheritance << "" << trans(var_conf.rna_info) << "
"; switch (sv.type()) // determine type String { case StructuralVariantType::DEL: - stream << trans("Deletion") << "" << affected_region[0].toString(true); if (sv.type() == StructuralVariantType::BND) stream << " <-> " << affected_region[1].toString(true); - stream << "" << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << var_conf.classification << "" << var_conf.classification << "" << var_conf.inheritance << "" << var_conf.inheritance << "" << trans(var_conf.rna_info) << "
" << trans(var_conf.rna_info) << "
" << trans("Repeat-Expansion") << "" << re.region().toString(true) << "
" << trans("Repeat-Expansion") << "" << re.region().toString(true) << "" << geno << "" << re.name() << "" << var_conf.inheritance << "
" << geno << "" << re.name() << "" << var_conf.inheritance << "
" << trans("Keine") << "
" << endl; + stream << "" << QT_ENDL; //----------------------------------------------------------------------------------- //other causal variant if (data_.report_settings.select_other_causal_variant) { - stream << "

 

" << endl; + stream << "

 

" << QT_ENDL; OtherCausalVariant causal_variant = data_.report_settings.report_config->otherCausalVariant(); - stream << "" << endl; + stream << "
" << QT_ENDL; stream << "" << endl; + << "" << QT_ENDL; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; - stream << "
" << trans("Variantentyp") << "" << trans("Regionen") << "" << trans("Gen(e)") << "" << trans("Erbgang") - << "" << trans("Kommentar") << "
" << trans("Kommentar") << "
" << trans(convertOtherVariantType(causal_variant.type)) << "" << causal_variant.coordinates << "" << causal_variant.gene << "" << causal_variant.inheritance << "" << causal_variant.comment << "
" << endl; + stream << "" << QT_ENDL; + stream << "" << trans(convertOtherVariantType(causal_variant.type)) << "" << QT_ENDL; + stream << "" << causal_variant.coordinates << "" << QT_ENDL; + stream << "" << causal_variant.gene << "" << QT_ENDL; + stream << "" << causal_variant.inheritance << "" << QT_ENDL; + stream << "" << causal_variant.comment << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } //-------------------------------------------------------------------------------------- @@ -454,17 +454,17 @@ void GermlineReportGenerator::writeHTML(QString filename) //polymorphisms if (data_.report_settings.polymorphisms.count()>0) { - stream << "
" << trans("Indikationsbezogene Polymorphismen") << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Indikationsbezogene Polymorphismen") << "" << QT_ENDL; + stream << "
" << trans("dbSNP") << "" << trans("Gen") << "" << trans("Überprüfte Variante") << "" << trans("Nachgewiesener Genotyp") << "" << trans("Details") << "
" << QT_ENDL; + stream << "" << QT_ENDL; foreach(const ReportPolymorphism& poly, data_.report_settings.polymorphisms) { const Variant& var = poly.v; - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; QStringList details; QString genotype = ""; if (var.isSNV()) @@ -500,26 +500,26 @@ void GermlineReportGenerator::writeHTML(QString filename) { THROW(ArgumentException, "InDels are not supported as report polymorphisms!"); } - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } - stream << "
" << trans("dbSNP") << "" << trans("Gen") << "" << trans("Überprüfte Variante") << "" << trans("Nachgewiesener Genotyp") << "" << trans("Details") << "
" << poly.rs_number << endl; - stream << "" << poly.gene_symbol << "" << var.toString() << "
" << poly.rs_number << QT_ENDL; + stream << "" << poly.gene_symbol << "" << var.toString() << "" << genotype << "" << details.join(", ") << "
" << genotype << "" << details.join(", ") << "
" << endl; + stream << "" << QT_ENDL; } //-------------------------------------------------------------------------------------- ///classification explaination if (data_.report_settings.show_class_details) { - stream << endl; - stream << "

" << trans("Klassifikation von Varianten") << ":" << endl; - stream << "
" << trans("Die Klassifikation der Varianten erfolgt in Anlehnung an die Publikation von Plon et al. (Hum Mutat 2008)") << endl; - stream << "
" << trans("Klasse 5: Eindeutig pathogene Veränderung / Mutation") << ": " << trans("Veränderung, die bereits in der Fachliteratur mit ausreichender Evidenz als krankheitsverursachend bezogen auf das vorliegende Krankheitsbild beschrieben wurde sowie als pathogen zu wertende Mutationstypen (i.d.R. Frameshift- bzw. Stoppmutationen).") << endl; - stream << "
" << trans("Klasse 4: Wahrscheinlich pathogene Veränderung") << ": " << trans("DNA-Veränderung, die aufgrund ihrer Eigenschaften als sehr wahrscheinlich krankheitsverursachend zu werten ist.") << endl; - stream << "
" << trans("Klasse 3: Variante unklarer Signifikanz (VUS) - Unklare Pathogenität") << ": " << trans("Variante, bei der es unklar ist, ob eine krankheitsverursachende Wirkung besteht. Diese Varianten werden tabellarisch im technischen Report mitgeteilt.") << endl; - stream << "
" << trans("Klasse 2: Sehr wahrscheinlich benigne Veränderungen") << ": " << trans("Aufgrund der Häufigkeit in der Allgemeinbevölkerung oder der Lokalisation bzw. aufgrund von Angaben in der Literatur sehr wahrscheinlich benigne. Werden nicht mitgeteilt, können aber erfragt werden.") << endl; - stream << "
" << trans("Klasse 1: Benigne Veränderungen") << ": " << trans("Werden nicht mitgeteilt, können aber erfragt werden.") << endl; - stream << "

" << endl; + stream << QT_ENDL; + stream << "

" << trans("Klassifikation von Varianten") << ":" << QT_ENDL; + stream << "
" << trans("Die Klassifikation der Varianten erfolgt in Anlehnung an die Publikation von Plon et al. (Hum Mutat 2008)") << QT_ENDL; + stream << "
" << trans("Klasse 5: Eindeutig pathogene Veränderung / Mutation") << ": " << trans("Veränderung, die bereits in der Fachliteratur mit ausreichender Evidenz als krankheitsverursachend bezogen auf das vorliegende Krankheitsbild beschrieben wurde sowie als pathogen zu wertende Mutationstypen (i.d.R. Frameshift- bzw. Stoppmutationen).") << QT_ENDL; + stream << "
" << trans("Klasse 4: Wahrscheinlich pathogene Veränderung") << ": " << trans("DNA-Veränderung, die aufgrund ihrer Eigenschaften als sehr wahrscheinlich krankheitsverursachend zu werten ist.") << QT_ENDL; + stream << "
" << trans("Klasse 3: Variante unklarer Signifikanz (VUS) - Unklare Pathogenität") << ": " << trans("Variante, bei der es unklar ist, ob eine krankheitsverursachende Wirkung besteht. Diese Varianten werden tabellarisch im technischen Report mitgeteilt.") << QT_ENDL; + stream << "
" << trans("Klasse 2: Sehr wahrscheinlich benigne Veränderungen") << ": " << trans("Aufgrund der Häufigkeit in der Allgemeinbevölkerung oder der Lokalisation bzw. aufgrund von Angaben in der Literatur sehr wahrscheinlich benigne. Werden nicht mitgeteilt, können aber erfragt werden.") << QT_ENDL; + stream << "
" << trans("Klasse 1: Benigne Veränderungen") << ": " << trans("Werden nicht mitgeteilt, können aber erfragt werden.") << QT_ENDL; + stream << "

" << QT_ENDL; } ///low-coverage analysis @@ -548,23 +548,23 @@ void GermlineReportGenerator::writeHTML(QString filename) } //print general information about ROI - stream << endl; - stream << "

" << trans("Abdeckungsstatistik Zielregion") << "" << endl; - stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << QString::number(target_region_read_depth, 'f', 2) << endl; + stream << QT_ENDL; + stream << "

" << trans("Abdeckungsstatistik Zielregion") << "" << QT_ENDL; + stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << QString::number(target_region_read_depth, 'f', 2) << QT_ENDL; BedFile mito_bed; mito_bed.append(BedLine("chrMT", 1, 16569)); data_.statistics_service.avgCoverage(mito_bed, data_.ps_bam, data_.threads); - stream << "
" << trans("Durchschnittliche Sequenziertiefe (chrMT)") << ": " << mito_bed[0].annotations()[0] << endl; - stream << "

" << endl; + stream << "
" << trans("Durchschnittliche Sequenziertiefe (chrMT)") << ": " << mito_bed[0].annotations()[0] << QT_ENDL; + stream << "

" << QT_ENDL; //gap report based on the entire target region if (data_.report_settings.cov_based_on_complete_roi) { - stream << "

" << trans("Lückenreport Zielregion") << "" << endl; + stream << "

" << trans("Lückenreport Zielregion") << "" << QT_ENDL; GapDetails details = writeCoverageDetails(stream, data_.roi); gap_percentage_ = details.gap_percentage; gaps_by_gene_ = details.gaps_per_gene; - stream << "

" << endl; + stream << "

" << QT_ENDL; } //gap report based on exons @@ -573,10 +573,10 @@ void GermlineReportGenerator::writeHTML(QString filename) { stream << " ± " << data_.report_settings.cov_exon_padding << " " << trans("Basen"); } - stream << "" << endl; + stream << "" << QT_ENDL; if (data_.roi.genes.isEmpty()) { - stream << "
" << trans("Konnte nicht erstellt werden, weil keine Gene der Zielregion definiert wurden.") << endl; + stream << "
" << trans("Konnte nicht erstellt werden, weil keine Gene der Zielregion definiert wurden.") << QT_ENDL; } else { @@ -618,11 +618,11 @@ void GermlineReportGenerator::writeHTML(QString filename) //output if (!genes_without_roi.isEmpty()) { - stream << "
" << trans("Gene für die keine genomische Region bestimmt werden konnte") << ": " << genes_without_roi.join(", ") << endl; + stream << "
" << trans("Gene für die keine genomische Region bestimmt werden konnte") << ": " << genes_without_roi.join(", ") << QT_ENDL; } writeCoverageDetails(stream, exon_roi); } - stream << "

" << endl; + stream << "

" << QT_ENDL; writeRNACoverageReport(stream); } @@ -630,12 +630,12 @@ void GermlineReportGenerator::writeHTML(QString filename) //OMIM table if (data_.report_settings.show_omim_table) { - stream << endl; - stream << "

" << trans("OMIM Gene und Phenotypen") << "" << endl; - stream << "

" << endl; - stream << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("OMIM Gene und Phenotypen") << "" << QT_ENDL; + stream << "

" << QT_ENDL; + stream << "
" << QT_ENDL; stream << ""; - if (data_.report_settings.show_one_entry_in_omim_table) stream << "" << endl; + if (data_.report_settings.show_one_entry_in_omim_table) stream << "" << QT_ENDL; stream << ""; foreach(const QByteArray& gene, data_.roi.genes) { @@ -686,20 +686,20 @@ void GermlineReportGenerator::writeHTML(QString filename) } } stream << ""; - if (data_.report_settings.show_one_entry_in_omim_table) stream << ""; } } - stream << "
" << trans("Gen") << "" << trans("Gen MIM") << "" << trans("Phenotyp MIM") << "" << trans("Phenotyp") << "" << trans("Hauptphenotyp") << "" << trans("Hauptphenotyp") << "
" << omim_info.gene_symbol << "" << omim_info.mim << "" << accessions.join("
") << "
" << names.join("
") << "
" <" << endl; + if (data_.report_settings.show_one_entry_in_omim_table) stream << "" <" << QT_ENDL; stream << "
" << endl; + stream << "" << QT_ENDL; } //PRS table if (data_.prs.count()>0) { - stream << endl; - stream << "

" << trans("Polygener Risiko-Score (PRS)") << "

" << endl; - stream << "" << endl; - stream << "" << endl; + stream << QT_ENDL; + stream << "

" << trans("Polygener Risiko-Score (PRS)") << "

" << QT_ENDL; + stream << "
" << trans("Erkrankung") << "PRS" << trans("Publikation") << "" << trans("Score") << "" << trans("Z-Score") << "" << trans("Population (geschätzt aus NGS)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; int id_idx = data_.prs.columnIndex("pgs_id"); int trait_idx = data_.prs.columnIndex("trait"); int score_idx = data_.prs.columnIndex("score"); @@ -759,8 +759,8 @@ void GermlineReportGenerator::writeHTML(QString filename) stream << ""; } - stream << "
" << trans("Erkrankung") << "PRS" << trans("Publikation") << "" << trans("Score") << "" << trans("Z-Score") << "" << trans("Population (geschätzt aus NGS)") << "
" << trait << "" << id << "" << row[citation_idx] << "" << score << "" << zscore << "" << population << "
" << endl; - stream << "

" << trans("Die Einschätzung der klinischen Bedeutung eines PRS ist nur unter Verwendung eines entsprechenden validierten Risiko-Kalkulations-Programms und unter Berücksichtigung der ethnischen Zugehörigkeit möglich (z.B. CanRisk.org für Brustkrebs).") << "

" << endl; + stream << "" << QT_ENDL; + stream << "

" << trans("Die Einschätzung der klinischen Bedeutung eines PRS ist nur unter Verwendung eines entsprechenden validierten Risiko-Kalkulations-Programms und unter Berücksichtigung der ethnischen Zugehörigkeit möglich (z.B. CanRisk.org für Brustkrebs).") << "

" << QT_ENDL; } //close stream @@ -1633,49 +1633,49 @@ BedFile GermlineReportGenerator::precalculatedGaps(const BedFile& gaps_roi, cons void GermlineReportGenerator::writeHtmlHeader(QTextStream& stream, QString sample_name) { - stream << "" << endl; - stream << "" << endl; - stream << " " << endl; - stream << " Report " << sample_name << "" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " Report " << sample_name << "" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::writeHtmlFooter(QTextStream& stream) { - stream << " " << endl; - stream << "" << endl; + stream << " " << QT_ENDL; + stream << "" << QT_ENDL; } QString GermlineReportGenerator::trans(const QString& text) @@ -1893,9 +1893,9 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co long long roi_bases = roi.regions.baseCount(); long long gap_bases = low_cov.baseCount(); double gap_percentage = 100.0 * gap_bases/roi_bases; - stream << "
" << trans("Basen") << ": " << QString::number(roi_bases) << endl; - stream << "
" << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << ": " << QString::number(gap_bases) << endl; - stream << "
" << trans("Prozent Lücken") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << endl; + stream << "
" << trans("Basen") << ": " << QString::number(roi_bases) << QT_ENDL; + stream << "
" << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << ": " << QString::number(gap_bases) << QT_ENDL; + stream << "
" << trans("Prozent Lücken") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << QT_ENDL; //group gaps by gene QMap gaps_by_gene; @@ -1916,12 +1916,12 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co incomplete_genes << gene + " (" + QString::number(gaps_by_gene[gene].baseCount()) + ")"; } } - stream << "
" << trans("Komplett abgedeckte Gene") << ": " << complete_genes.join(", ") << endl; - stream << "
" << trans("Unvollständig abgedeckte Gene (fehlende Basen in bp)") << ": " << incomplete_genes.join(", ") << endl; + stream << "
" << trans("Komplett abgedeckte Gene") << ": " << complete_genes.join(", ") << QT_ENDL; + stream << "
" << trans("Unvollständig abgedeckte Gene (fehlende Basen in bp)") << ": " << incomplete_genes.join(", ") << QT_ENDL; //table gaps by gene - stream << "

" << trans("Details Regionen mit Tiefe <") << data_.report_settings.min_depth << ":" << endl; - stream << "

" << endl; + stream << "

" << trans("Details Regionen mit Tiefe <") << data_.report_settings.min_depth << ":" << QT_ENDL; + stream << "

" << QT_ENDL; writeGapsByGeneTable(stream, gaps_by_gene, gap_bases_no_gene); //init gap closing @@ -1934,8 +1934,8 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co { int base_sum = 0; stream << "
" << trans("Lücken die mit Sanger-Sequenzierung geschlossen wurden:") << "
"; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; query.bindValue(0, "closed"); query.exec(); while(query.next()) @@ -1948,11 +1948,11 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co base_sum += end-start+1; gaps_closed.append(BedLine(chr, start, end)); - stream << "" << endl; + stream << "" << QT_ENDL; stream << ""; - stream << "" << endl; + stream << "" << QT_ENDL; } - stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << db_.genesOverlapping(chr, start, end).join(", ") << "" << QString::number(end-start+1) << "" << chr.str() << "" << QString::number(start) << "-" << QString::number(end) << "
" << endl; + stream << "" << QT_ENDL; stream << trans("Basen gesamt:") << QString::number(base_sum); } @@ -1960,8 +1960,8 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co { int base_sum = 0; stream << "

" << trans("Lücken die mit visueller Inspektion der Rohdaten überprüft wurden:") << "
"; - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; query.bindValue(0, "checked visually"); query.exec(); while(query.next()) @@ -1974,13 +1974,13 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co base_sum += end-start+1; gaps_closed.append(BedLine(chr, start, end)); - stream << "" << endl; + stream << "" << QT_ENDL; stream << ""; - stream << "" << endl; + stream << "" << QT_ENDL; } - stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << db_.genesOverlapping(chr, start, end).join(", ") << "" << QString::number(end-start+1) << "" << chr.str() << "" << QString::number(start) << "-" << QString::number(end) << "
" << endl; + stream << "" << QT_ENDL; stream << trans("Basen gesamt:") << QString::number(base_sum); - stream << "

" << endl; + stream << "

" << QT_ENDL; } //print gaps that were not closed @@ -1993,16 +1993,16 @@ GapDetails GermlineReportGenerator::writeCoverageDetails(QTextStream& stream, co gapsByGene(gaps_remaining, roi.genes, gaps_by_gene, gap_bases_no_gene); //write gap table after closing gaps - stream << "

" << trans("Verbleibende Lücken nach Lückenschluss") << endl; - stream << "

" << endl; + stream << "

" << trans("Verbleibende Lücken nach Lückenschluss") << QT_ENDL; + stream << "

" << QT_ENDL; writeGapsByGeneTable(stream, gaps_by_gene, gap_bases_no_gene); //add gap percentage after closing gaps long long gap_bases_remaining = gaps_remaining.baseCount(); gap_percentage = 100.0 * gap_bases_remaining/roi_bases; stream << "

"; - stream << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_bases_remaining) << endl; - stream << "
" << trans("Prozent Lücken") << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << endl; + stream << trans("Basen mit Tiefe <") << data_.report_settings.min_depth << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_bases_remaining) << QT_ENDL; + stream << "
" << trans("Prozent Lücken") << " " << trans("nach Lückenschluss") << ": " << QString::number(gap_percentage, 'f', 2) << "%" << QT_ENDL; stream << "

"; } @@ -2046,13 +2046,13 @@ void GermlineReportGenerator::writeRNACoverageReport(QTextStream& stream) if (stats[i].accession()=="QC:2000101") avg_cov_housekeeping = stats[i].toString(); if (stats[i].accession()=="QC:2000109") covered_genes = stats[i].toString(); } - stream << endl; - stream << "

" << trans("Abdeckungsstatistik der RNA-Probe") << "" << endl; - stream << "
" << trans("Anzahl der Reads") << ": " << QString::number((double) read_count.toInt()/1000000.0, 'f', 2) << " Mio" << endl; - stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << avg_cov << endl; - stream << "
" << trans("Durchschnittliche Sequenziertiefe der Housekeeping-Gene") << ": " << avg_cov_housekeeping << endl; - stream << "
" << trans("Abgedeckte Gene") << ": " << covered_genes << endl; - stream << "

" << endl; + stream << QT_ENDL; + stream << "

" << trans("Abdeckungsstatistik der RNA-Probe") << "" << QT_ENDL; + stream << "
" << trans("Anzahl der Reads") << ": " << QString::number((double) read_count.toInt()/1000000.0, 'f', 2) << " Mio" << QT_ENDL; + stream << "
" << trans("Durchschnittliche Sequenziertiefe") << ": " << avg_cov << QT_ENDL; + stream << "
" << trans("Durchschnittliche Sequenziertiefe der Housekeeping-Gene") << ": " << avg_cov_housekeeping << QT_ENDL; + stream << "
" << trans("Abgedeckte Gene") << ": " << covered_genes << QT_ENDL; + stream << "

" << QT_ENDL; } } @@ -2126,48 +2126,48 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu QTextStream stream(file.data()); //write header - stream << "" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << "

Probe: " << data_.ps << "

" << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << endl; - stream << "

DNA/RNA#: " << evaluation_sheet_data.dna_rna << "

" << endl; - stream << "

Genom: " << buildToString(evaluation_sheet_data.build, true) << "

" << endl; + stream << "" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

Probe: " << data_.ps << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << QT_ENDL; + stream << "

DNA/RNA#: " << evaluation_sheet_data.dna_rna << "

" << QT_ENDL; + stream << "

Genom: " << buildToString(evaluation_sheet_data.build, true) << "

" << QT_ENDL; QString kasp_text; try { @@ -2185,40 +2185,40 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu { kasp_text = trans("nicht durchgeführt"); } - stream << "

KASP: " << kasp_text << "

" << endl; - stream << "
" << endl; - stream << "

1. Auswerter: " << evaluation_sheet_data.reviewer1 << " Datum: " << evaluation_sheet_data.review_date1.toString("dd.MM.yyyy") << "

" << endl; - stream << "

2. Auswerter: " << evaluation_sheet_data.reviewer2 << " Datum: " << evaluation_sheet_data.review_date2.toString("dd.MM.yyyy") << "

" << endl; - stream << "
" << endl; - stream << "

Auswerteumfang: " << evaluation_sheet_data.analysis_scope << "

" << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
ACMG
angefordert:    "<< ((evaluation_sheet_data.acmg_requested)?"☑":"□") << "
analysiert:    "<< ((evaluation_sheet_data.acmg_analyzed)?"☑":"□") << "
auffällig:    "<< ((evaluation_sheet_data.acmg_noticeable)?"☑":"□") << "
" << endl; - stream << "
" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
Filterung erfolgt
Freq.-basiert dominant   "<< ((evaluation_sheet_data.filtered_by_freq_based_dominant)?"☑":"□") << "
Freq.-basiert rezessiv "<< ((evaluation_sheet_data.filtered_by_freq_based_recessive)?"☑":"□") << "
Mitochondrial "<< ((evaluation_sheet_data.filtered_by_mito)?"☑":"□") << "
X-chromosomal "<< ((evaluation_sheet_data.filtered_by_x_chr)?"☑":"□") << "
CNV "<< ((evaluation_sheet_data.filtered_by_cnv)?"☑":"□") << "
Strukturvarianten "<< ((evaluation_sheet_data.filtered_by_svs)?"☑":"□") << "
Repeat Expansions "<< ((evaluation_sheet_data.filtered_by_res)?"☑":"□") << "
Mosaikvarianten "<< ((evaluation_sheet_data.filtered_by_mosaic)?"☑":"□") << "
Phänotyp-basiert "<< ((evaluation_sheet_data.filtered_by_phenotype)?"☑":"□") << "
Multi-Sample-Auswertung "<< ((evaluation_sheet_data.filtered_by_multisample)?"☑":"□") << "
Trio stringent "<< ((evaluation_sheet_data.filtered_by_trio_stringent)?"☑":"□") << "
Trio relaxed "<< ((evaluation_sheet_data.filtered_by_trio_relaxed)?"☑":"□") << "
" << endl; - stream << "
" << endl; - stream << "
" << endl; + stream << "

KASP: " << kasp_text << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

1. Auswerter: " << evaluation_sheet_data.reviewer1 << " Datum: " << evaluation_sheet_data.review_date1.toString("dd.MM.yyyy") << "

" << QT_ENDL; + stream << "

2. Auswerter: " << evaluation_sheet_data.reviewer2 << " Datum: " << evaluation_sheet_data.review_date2.toString("dd.MM.yyyy") << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "

Auswerteumfang: " << evaluation_sheet_data.analysis_scope << "

" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
ACMG
angefordert:    "<< ((evaluation_sheet_data.acmg_requested)?"☑":"□") << "
analysiert:    "<< ((evaluation_sheet_data.acmg_analyzed)?"☑":"□") << "
auffällig:    "<< ((evaluation_sheet_data.acmg_noticeable)?"☑":"□") << "
" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
Filterung erfolgt
Freq.-basiert dominant   "<< ((evaluation_sheet_data.filtered_by_freq_based_dominant)?"☑":"□") << "
Freq.-basiert rezessiv "<< ((evaluation_sheet_data.filtered_by_freq_based_recessive)?"☑":"□") << "
Mitochondrial "<< ((evaluation_sheet_data.filtered_by_mito)?"☑":"□") << "
X-chromosomal "<< ((evaluation_sheet_data.filtered_by_x_chr)?"☑":"□") << "
CNV "<< ((evaluation_sheet_data.filtered_by_cnv)?"☑":"□") << "
Strukturvarianten "<< ((evaluation_sheet_data.filtered_by_svs)?"☑":"□") << "
Repeat Expansions "<< ((evaluation_sheet_data.filtered_by_res)?"☑":"□") << "
Mosaikvarianten "<< ((evaluation_sheet_data.filtered_by_mosaic)?"☑":"□") << "
Phänotyp-basiert "<< ((evaluation_sheet_data.filtered_by_phenotype)?"☑":"□") << "
Multi-Sample-Auswertung "<< ((evaluation_sheet_data.filtered_by_multisample)?"☑":"□") << "
Trio stringent "<< ((evaluation_sheet_data.filtered_by_trio_stringent)?"☑":"□") << "
Trio relaxed "<< ((evaluation_sheet_data.filtered_by_trio_relaxed)?"☑":"□") << "
" << QT_ENDL; + stream << "
" << QT_ENDL; + stream << "
" << QT_ENDL; //phenotype QString sample_id = db_.sampleId(data_.ps); @@ -2249,22 +2249,22 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu } } - stream << "
" << endl; - stream << " Klinik:" << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << " " << endl; - stream << "
" << endl; - stream << " " << clinical_phenotype.trimmed() << endl; - stream << " " << endl; - stream << " " << infos.join("
") << endl; - stream << "
" << endl; + stream << "
" << QT_ENDL; + stream << " Klinik:" << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << QT_ENDL; + stream << "
" << QT_ENDL; + stream << " " << clinical_phenotype.trimmed() << QT_ENDL; + stream << " " << QT_ENDL; + stream << " " << infos.join("
") << QT_ENDL; + stream << "
" << QT_ENDL; //write small variants - stream << "

Kausale Varianten:" << endl; - stream << " " << endl; + stream << "

Kausale Varianten:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeader(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2274,11 +2274,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRow(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige Varianten:" << endl; - stream << " " << endl; + stream << "

Sonstige Varianten:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeader(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2288,12 +2288,12 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRow(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; //CNVs - stream << "

Kausale CNVs:" << endl; - stream << " " << endl; + stream << "

Kausale CNVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderCnv(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2303,11 +2303,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowCnv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige CNVs:" << endl; - stream << " " << endl; + stream << "

Sonstige CNVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderCnv(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2317,12 +2317,12 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowCnv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; //SVs - stream << "

Kausale SVs:" << endl; - stream << " " << endl; + stream << "

Kausale SVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderSv(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2332,11 +2332,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowSv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige SVs:" << endl; - stream << " " << endl; + stream << "

Sonstige SVs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderSv(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2346,13 +2346,13 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowSv(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; //REs - stream << "

Kausale REs:" << endl; - stream << " " << endl; + stream << "

Kausale REs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderRe(stream, true); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2362,11 +2362,11 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowRe(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; - stream << "

Sonstige REs:" << endl; - stream << " " << endl; + stream << "

Sonstige REs:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderRe(stream, false); foreach(const ReportVariantConfiguration& conf, data_.report_settings.report_config->variantConfig()) { @@ -2376,23 +2376,23 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu printVariantSheetRowRe(stream, conf); } } - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; OtherCausalVariant other_causal_var = data_.report_settings.report_config->otherCausalVariant(); if (other_causal_var.isValid()) { - stream << "

Sonstige kausale Varianten:" << endl; - stream << " " << endl; + stream << "

Sonstige kausale Varianten:" << QT_ENDL; + stream << "

" << QT_ENDL; printVariantSheetRowHeaderOtherVariant(stream); printVariantSheetRowOtherVariant(stream, other_causal_var); - stream << "
" << endl; - stream << "

" << endl; + stream << " " << QT_ENDL; + stream << "

" << QT_ENDL; } //write footer - stream << " " << endl; - stream << "" << endl; + stream << " " << QT_ENDL; + stream << "" << QT_ENDL; stream.flush(); //validate written file @@ -2412,26 +2412,26 @@ void GermlineReportGenerator::writeEvaluationSheet(QString filename, const Evalu void GermlineReportGenerator::printVariantSheetRowHeader(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " Gen" << endl; - stream << " Typ" << endl; - stream << " Genotyp" << endl; - stream << " Variante" << endl; - stream << " Erbgang" << endl; - stream << " c." << endl; - stream << " p." << endl; + stream << " " << QT_ENDL; + stream << " Gen" << QT_ENDL; + stream << " Typ" << QT_ENDL; + stream << " Genotyp" << QT_ENDL; + stream << " Variante" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; + stream << " c." << QT_ENDL; + stream << " p." << QT_ENDL; if (!causal) { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " gnomAD" << endl; - stream << " NGSD hom/het" << endl; - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " Klasse" << endl; - stream << " In Report" << endl; - stream << " RNA" << endl; - stream << " " << endl; + stream << " gnomAD" << QT_ENDL; + stream << " NGSD hom/het" << QT_ENDL; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " Klasse" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " RNA" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRow(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2483,53 +2483,53 @@ void GermlineReportGenerator::printVariantSheetRow(QTextStream& stream, const Re } //write line - stream << " " << endl; - stream << " " << genes.join(", ") << "" << endl; - stream << " " << types.join(", ") << "" << endl; + stream << " " << QT_ENDL; + stream << " " << genes.join(", ") << "" << QT_ENDL; + stream << " " << types.join(", ") << "" << QT_ENDL; QString geno = v.annotations()[i_genotype]; if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << v.toString(QChar(), 20) << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << endl; - stream << " " << conf.inheritance << "" << endl; - stream << " " << hgvs_cs.join(", ") << "" << endl; - stream << " " << hgvs_ps.join(", ") << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << v.toString(QChar(), 20) << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; + stream << " " << hgvs_cs.join(", ") << "" << QT_ENDL; + stream << " " << hgvs_ps.join(", ") << "" << QT_ENDL; if (!conf.causal) { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << v.annotations()[i_gnomad] << "" << endl; - stream << " " << v.annotations()[i_ngsd_hom] << " / " << v.annotations()[i_ngsd_het] << "" << endl; - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << v.annotations()[i_class] << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << trans(conf.rna_info) << "" << endl; - stream << " " << endl; + stream << " " << v.annotations()[i_gnomad] << "" << QT_ENDL; + stream << " " << v.annotations()[i_ngsd_hom] << " / " << v.annotations()[i_ngsd_het] << "" << QT_ENDL; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << v.annotations()[i_class] << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << trans(conf.rna_info) << "" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderCnv(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " CNV" << endl; - stream << " copy-number" << endl; - stream << " Gene" << endl; - stream << " Erbgang" << endl; + stream << " " << QT_ENDL; + stream << " CNV" << QT_ENDL; + stream << " copy-number" << QT_ENDL; + stream << " Gene" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; if (causal) { - stream << " Infos" << endl; + stream << " Infos" << QT_ENDL; } else { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " Klasse" << endl; - stream << " In Report" << endl; - stream << " RNA" << endl; - stream << " " << endl; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " Klasse" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " RNA" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowCnv(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2539,52 +2539,52 @@ void GermlineReportGenerator::printVariantSheetRowCnv(QTextStream& stream, const //manual curation if (conf.isManuallyCurated()) conf.updateCnv(cnv, data_.cnvs.annotationHeaders(), db_); - stream << " " << endl; - stream << " " << cnv.toString() << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << endl; + stream << " " << QT_ENDL; + stream << " " << cnv.toString() << (conf.isManuallyCurated() ? " (manually curated)" : "") << "" << QT_ENDL; QString geno = QString::number(cnv.copyNumber(data_.cnvs.annotationHeaders())); if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << cnv.genes().join(", ") << "" << endl; - stream << " " << conf.inheritance << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << cnv.genes().join(", ") << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; if (conf.causal) { - stream << " regions:" << cnv.regions() << " size:" << QString::number(cnv.size()/1000.0, 'f', 3) << "kb" << endl; + stream << " regions:" << cnv.regions() << " size:" << QString::number(cnv.size()/1000.0, 'f', 3) << "kb" << QT_ENDL; } else { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << conf.classification << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << trans(conf.rna_info) << "" << endl; - stream << " " << endl; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << conf.classification << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << trans(conf.rna_info) << "" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderSv(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " SV" << endl; - stream << " Typ" << endl; - stream << " Gene" << endl; - stream << " Erbgang" << endl; + stream << " " << QT_ENDL; + stream << " SV" << QT_ENDL; + stream << " Typ" << QT_ENDL; + stream << " Gene" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; if (causal) { - stream << " Infos" << endl; + stream << " Infos" << QT_ENDL; } else { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " Klasse" << endl; - stream << " In Report" << endl; - stream << " RNA" << endl; - stream << " " << endl; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " Klasse" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " RNA" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowSv(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2595,52 +2595,52 @@ void GermlineReportGenerator::printVariantSheetRowSv(QTextStream& stream, const if (conf.isManuallyCurated()) conf.updateSv(sv, data_.svs.annotationHeaders(), db_); BedFile affected_region = sv.affectedRegion(false); - stream << " " << endl; + stream << " " << QT_ENDL; stream << " " << affected_region[0].toString(true); if (sv.type() == StructuralVariantType::BND) stream << " <-> " << affected_region[1].toString(true); if (conf.isManuallyCurated()) stream << " (manually curated)"; - stream << "" << endl; + stream << "" << QT_ENDL; QString geno = BedpeFile::typeToString(sv.type()); if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << endl; - stream << " " << conf.inheritance << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << sv.genes(data_.svs.annotationHeaders()).join(", ") << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; if (conf.causal) { - stream << " estimated size:" << QString::number(data_.svs.estimatedSvSize(conf.variant_index)/1000.0, 'f', 3) << "kb" << endl; + stream << " estimated size:" << QString::number(data_.svs.estimatedSvSize(conf.variant_index)/1000.0, 'f', 3) << "kb" << QT_ENDL; } else { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << conf.classification << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << trans(conf.rna_info) << "" << endl; - stream << " " << endl; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << conf.classification << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << trans(conf.rna_info) << "" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderRe(QTextStream& stream, bool causal) { - stream << " " << endl; - stream << " RE" << endl; - stream << " Genotyp" << endl; - stream << " Erbgang" << endl; + stream << " " << QT_ENDL; + stream << " RE" << QT_ENDL; + stream << " Genotyp" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; if (causal) { - stream << " Infos" << endl; + stream << " Infos" << QT_ENDL; } else { - stream << " Ausschlussgrund" << endl; + stream << " Ausschlussgrund" << QT_ENDL; } - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " In Report" << endl; - stream << " " << endl; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " In Report" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowRe(QTextStream& stream, const ReportVariantConfiguration& conf) @@ -2650,52 +2650,52 @@ void GermlineReportGenerator::printVariantSheetRowRe(QTextStream& stream, const //manual curation if (conf.isManuallyCurated()) conf.updateRe(re); - stream << " " << endl; - stream << " " << re.toString(true, false) << "" << endl; + stream << " " << QT_ENDL; + stream << " " << re.toString(true, false) << "" << QT_ENDL; QString geno = re.alleles(); if (conf.de_novo) geno += " (de-novo)"; if (conf.mosaic) geno += " (mosaic)"; if (conf.comp_het) geno += " (comp-het)"; - stream << " " << geno << "" << endl; - stream << " " << conf.inheritance << "" << endl; + stream << " " << geno << "" << QT_ENDL; + stream << " " << conf.inheritance << "" << QT_ENDL; if (conf.causal) { - stream << " " << endl; + stream << " " << QT_ENDL; } else { - stream << " " << exclusionCriteria(conf) << "" << endl; + stream << " " << exclusionCriteria(conf) << "" << QT_ENDL; } - stream << " " << conf.comments << "" << endl; - stream << " " << conf.comments2 << "" << endl; - stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << endl; - stream << " " << endl; + stream << " " << conf.comments << "" << QT_ENDL; + stream << " " << conf.comments2 << "" << QT_ENDL; + stream << " " << (conf.showInReport() ? "ja" : "nein") << " (" << conf.report_type << ")" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowHeaderOtherVariant(QTextStream& stream) { - stream << " " << endl; - stream << " Variantentyp" << endl; - stream << " Regionen" << endl; - stream << " Gene" << endl; - stream << " Erbgang" << endl; - stream << " Kommentar" << endl; - stream << " Kommentar 1. Auswerter" << endl; - stream << " Kommentar 2. Auswerter" << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " Variantentyp" << QT_ENDL; + stream << " Regionen" << QT_ENDL; + stream << " Gene" << QT_ENDL; + stream << " Erbgang" << QT_ENDL; + stream << " Kommentar" << QT_ENDL; + stream << " Kommentar 1. Auswerter" << QT_ENDL; + stream << " Kommentar 2. Auswerter" << QT_ENDL; + stream << " " << QT_ENDL; } void GermlineReportGenerator::printVariantSheetRowOtherVariant(QTextStream& stream, OtherCausalVariant variant) { - stream << " " << endl; - stream << " " << convertOtherVariantType(variant.type) << "" << endl; - stream << " " << variant.coordinates << "" << endl; - stream << " " << variant.gene << "" << endl; - stream << " " << variant.inheritance << "" << endl; - stream << " " << variant.comment<< "" << endl; - stream << " " << variant.comment_reviewer1 << "" << endl; - stream << " " << variant.comment_reviewer2 << "" << endl; - stream << " " << endl; + stream << " " << QT_ENDL; + stream << " " << convertOtherVariantType(variant.type) << "" << QT_ENDL; + stream << " " << variant.coordinates << "" << QT_ENDL; + stream << " " << variant.gene << "" << QT_ENDL; + stream << " " << variant.inheritance << "" << QT_ENDL; + stream << " " << variant.comment<< "" << QT_ENDL; + stream << " " << variant.comment_reviewer1 << "" << QT_ENDL; + stream << " " << variant.comment_reviewer2 << "" << QT_ENDL; + stream << " " << QT_ENDL; } QString GermlineReportGenerator::exclusionCriteria(const ReportVariantConfiguration& conf) @@ -2738,12 +2738,12 @@ void GermlineReportGenerator::gapsByGene(const BedFile& low_cov, const GeneSet& void GermlineReportGenerator::writeGapsByGeneTable(QTextStream& stream, QMap& gaps_by_gene, long long& gap_bases_no_gene) { - stream << "" << endl; - stream << "" << endl; + stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << QT_ENDL; + stream << "" << QT_ENDL; for (auto it=gaps_by_gene.cbegin(); it!=gaps_by_gene.cend(); ++it) { - stream << "" << endl; - stream << "" << QT_ENDL; + stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } if (gap_bases_no_gene>0) { - stream << "" << endl; - stream << "" << endl; - stream << "" << endl; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; + stream << "" << QT_ENDL; } - stream << "
" << trans("Gen") << "" << trans("Basen") << "" << trans("Chromosom") << "" << trans("Koordinaten (hg38)") << "
" << endl; + stream << "
" << QT_ENDL; const BedFile& gaps = it.value(); QString chr = gaps[0].chr().str(); QStringList coords; @@ -2751,17 +2751,17 @@ void GermlineReportGenerator::writeGapsByGeneTable(QTextStream& stream, QMap" << gaps.baseCount() << "" << chr << "" << coords.join(", ") << endl; + stream << it.key() << "" << gaps.baseCount() << "" << chr << "" << coords.join(", ") << QT_ENDL; - stream << "
" << trans("kein Überlappung mit Gen") << "" << gap_bases_no_gene << "--
" << trans("kein Überlappung mit Gen") << "" << gap_bases_no_gene << "--
" << endl; + stream << "" << QT_ENDL; } diff --git a/src/cppNGSD/NGSD.cpp b/src/cppNGSD/NGSD.cpp index d585ec590..7bf07532c 100644 --- a/src/cppNGSD/NGSD.cpp +++ b/src/cppNGSD/NGSD.cpp @@ -6522,7 +6522,7 @@ QPair NGSD::geneToApprovedWithMessage(const QString& gene) while(q_syn.next()) { if (!genes.isEmpty()) genes.append(", "); - genes.append(q_syn.value(0).toString().toLocal8Bit()); + genes.append(q_syn.value(0).toString().toUtf8()); } return qMakePair(gene, "ERROR: " + gene + " is a synonymous symbol of the genes " + genes); } diff --git a/src/tools-TEST/SeqPurge_Test.h b/src/tools-TEST/SeqPurge_Test.h index 3314d9ad6..2ec969011 100644 --- a/src/tools-TEST/SeqPurge_Test.h +++ b/src/tools-TEST/SeqPurge_Test.h @@ -212,7 +212,7 @@ private slots: //multi-thread test void test_multithread() { - QTime timer; + QElapsedTimer timer; for (int i=1; i<=8; ++i) { QString suffix = QString::number(i) + "threads"; From 296bd628596338dac3a33ef37fb5079f710b94ec Mon Sep 17 00:00:00 2001 From: Alexandr Chernov Date: Thu, 20 Feb 2025 12:41:17 +0100 Subject: [PATCH 3/3] GSvar: resolved conflicts after merge --- src/GSvar/ExpressionExonWidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/GSvar/ExpressionExonWidget.cpp b/src/GSvar/ExpressionExonWidget.cpp index 01710a186..a18a50ada 100644 --- a/src/GSvar/ExpressionExonWidget.cpp +++ b/src/GSvar/ExpressionExonWidget.cpp @@ -65,7 +65,7 @@ void ExpressionExonWidget::loadExpressionFile() try { QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //load TSV file @@ -142,7 +142,7 @@ void ExpressionExonWidget::initTable() { QApplication::setOverrideCursor(Qt::BusyCursor); ui_->tw_expression_table->setEnabled(false); - QTime timer; + QElapsedTimer timer; timer.start(); column_names_.clear(); @@ -196,7 +196,7 @@ void ExpressionExonWidget::applyFilters() filter_result_.reset(true); - QTime timer; + QElapsedTimer timer; timer.start(); @@ -670,7 +670,7 @@ void ExpressionExonWidget::updateTable() { //fill table widget with expression data QApplication::setOverrideCursor(Qt::BusyCursor); - QTime timer; + QElapsedTimer timer; timer.start(); //disable sorting